func MessThingIndex(state *lua.State) int { log.Println("HEY WE MADE IT") printStackTypes(state) state.GetMetaTable(1) state.LGetMetaTable(ThingMetaTableName) isThing := state.RawEqual(-1, -2) state.Pop(2) if !isThing { log.Println("!!! OMG ARG #1 IS NOT A MESS.THING !!!") } fieldName := state.CheckString(2) log.Println("Arg #2 checks out, it's a string") thing := checkThing(state, 1) log.Println("So we're tryin'a look up", fieldName, "on thing", thing.Id) if member, ok := MessThingMembers[fieldName]; ok { return member(state, thing) } // That wasn't one of our members, so look it up in our Table. if data, ok := thing.Table[fieldName]; ok { // TODO: instead of pushing a whole map if the script asks for one, maybe we should use another kind of userdata that tracks the name & can access its submembers until the script asks for the leaf (or a non-existent branch)? pushValue(state, data) return 1 } // uh... I guess we didn't do anything, so...? return 0 }
func isValueProxy(L *lua.State, idx int) bool { res := false if L.IsUserdata(idx) { L.GetMetaTable(idx) if !L.IsNil(-1) { L.GetField(-1, "luago.value") res = !L.IsNil(-1) L.Pop(1) } L.Pop(1) } return res }