From bb3465c3758a684f054f4c3591aa8e93f88ff3e0 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sat, 24 May 2008 00:03:15 +0000 Subject: [PATCH] Fix getmetatable when metatable contains __metatable tag --- src/core/org/luaj/lib/BaseLib.java | 7 ++++++- src/core/org/luaj/vm/LTable.java | 2 +- src/core/org/luaj/vm/LuaState.java | 18 +++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/core/org/luaj/lib/BaseLib.java b/src/core/org/luaj/lib/BaseLib.java index 7dd57dd5..98d65496 100644 --- a/src/core/org/luaj/lib/BaseLib.java +++ b/src/core/org/luaj/lib/BaseLib.java @@ -175,8 +175,13 @@ public class BaseLib extends LFunction { vm.resettop(); vm.pushnil(); } else { - vm.insert(1); + vm.replace(1); vm.settop(1); + vm.getfield(-1,LValue.TM_METATABLE); + if ( vm.isnil(-1) ) + vm.pop(1); + else + vm.remove(1); } break; } diff --git a/src/core/org/luaj/vm/LTable.java b/src/core/org/luaj/vm/LTable.java index 9e3b117b..2bf99d24 100644 --- a/src/core/org/luaj/vm/LTable.java +++ b/src/core/org/luaj/vm/LTable.java @@ -270,7 +270,7 @@ public class LTable extends LValue { } /** Valid for tables */ - public org.luaj.vm.LTable luaGetMetatable() { + public LTable luaGetMetatable() { return this.m_metatable; } diff --git a/src/core/org/luaj/vm/LuaState.java b/src/core/org/luaj/vm/LuaState.java index 0e517c05..8c4dfd8d 100644 --- a/src/core/org/luaj/vm/LuaState.java +++ b/src/core/org/luaj/vm/LuaState.java @@ -899,7 +899,11 @@ public class LuaState extends Lua { return calls[cc-callStackDepth]; } - private LValue mtget(LValue t, LString tag) { + private void indexError(LValue nontable) { + error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)", 1 ); + } + + private LValue luaV_getmetafield(LValue t, LString tag) { LTable mt = t.luaGetMetatable(); if ( mt == null ) return null; @@ -907,10 +911,6 @@ public class LuaState extends Lua { return h.isNil()? null: h; } - private void indexError(LValue nontable) { - error( "attempt to index ? (a "+nontable.luaGetTypeName()+" value)", 1 ); - } - public LValue luaV_gettable(LValue table, LValue key) { LValue h=LNil.NIL,t=table; for ( int loop=0; loop