|
@@ -3,7 +3,7 @@
|
|
|
** TecCGraf - PUC-Rio
|
|
|
*/
|
|
|
|
|
|
-char *rcs_opcode="$Id: opcode.c,v 3.2 1994/11/04 10:47:49 roberto Exp roberto $";
|
|
|
+char *rcs_opcode="$Id: opcode.c,v 3.3 1994/11/07 15:20:56 roberto Exp $";
|
|
|
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
@@ -32,6 +32,12 @@ static Object *stack = NULL;
|
|
|
static Object *top = NULL;
|
|
|
|
|
|
|
|
|
+/* macros to convert from lua_Object to (Object *) and back */
|
|
|
+
|
|
|
+#define Address(lo) ((lo)+stack-1)
|
|
|
+#define Ref(st) ((st)-stack+1)
|
|
|
+
|
|
|
+
|
|
|
static int CBase = 0; /* when Lua calls C or C calls Lua, points to the */
|
|
|
/* first slot after the last parameter. */
|
|
|
static int CnResults = 0; /* when Lua calls C, has the number of parameters; */
|
|
@@ -44,6 +50,12 @@ static int lua_execute (Byte *pc, int base);
|
|
|
static void do_call (Object *func, int base, int nResults, int whereRes);
|
|
|
|
|
|
|
|
|
+Object *luaI_Address (lua_Object o)
|
|
|
+{
|
|
|
+ return Address(o);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
** Fallbacks
|
|
|
*/
|
|
@@ -87,8 +99,8 @@ void luaI_setfallback (void)
|
|
|
{
|
|
|
if (strcmp(fallBacks[i].kind, name) == 0)
|
|
|
{
|
|
|
- lua_pushobject(&fallBacks[i].function);
|
|
|
- fallBacks[i].function = *func;
|
|
|
+ lua_pushobject(Ref(&fallBacks[i].function));
|
|
|
+ fallBacks[i].function = *Address(func);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -96,6 +108,7 @@ void luaI_setfallback (void)
|
|
|
lua_pushnil();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/*
|
|
|
** Error messages
|
|
|
*/
|
|
@@ -373,12 +386,12 @@ static int do_protectedrun (Object *function, int nResults)
|
|
|
/*
|
|
|
** Execute the given lua function. Return 0 on success or 1 on error.
|
|
|
*/
|
|
|
-int lua_callfunction (Object *function)
|
|
|
+int lua_callfunction (lua_Object function)
|
|
|
{
|
|
|
if (function == NULL)
|
|
|
return 1;
|
|
|
else
|
|
|
- return do_protectedrun (function, MULT_RET);
|
|
|
+ return do_protectedrun (Address(function), MULT_RET);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -420,73 +433,77 @@ int lua_dostring (char *string)
|
|
|
|
|
|
|
|
|
/*
|
|
|
-** Get a parameter, returning the object handle or NULL on error.
|
|
|
+** Get a parameter, returning the object handle or 0 on error.
|
|
|
** 'number' must be 1 to get the first parameter.
|
|
|
*/
|
|
|
-Object *lua_getparam (int number)
|
|
|
+lua_Object lua_getparam (int number)
|
|
|
{
|
|
|
- if (number <= 0 || number > CnResults) return NULL;
|
|
|
- return (stack+(CBase-CnResults+number-1));
|
|
|
+ if (number <= 0 || number > CnResults) return 0;
|
|
|
+ /* Ref(stack+(CBase-CnResults+number-1)) ==
|
|
|
+ stack+(CBase-CnResults+number-1)-stack+1 == */
|
|
|
+ return CBase-CnResults+number;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Given an object handle, return its number value. On error, return 0.0.
|
|
|
*/
|
|
|
-real lua_getnumber (Object *object)
|
|
|
+real lua_getnumber (lua_Object object)
|
|
|
{
|
|
|
- if (object == NULL || tag(object) == LUA_T_NIL) return 0.0;
|
|
|
- if (tonumber (object)) return 0.0;
|
|
|
- else return (nvalue(object));
|
|
|
+ if (object == 0 || tag(Address(object)) == LUA_T_NIL) return 0.0;
|
|
|
+ if (tonumber (Address(object))) return 0.0;
|
|
|
+ else return (nvalue(Address(object)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Given an object handle, return its string pointer. On error, return NULL.
|
|
|
*/
|
|
|
-char *lua_getstring (Object *object)
|
|
|
+char *lua_getstring (lua_Object object)
|
|
|
{
|
|
|
- if (object == NULL || tag(object) == LUA_T_NIL) return NULL;
|
|
|
- if (tostring (object)) return NULL;
|
|
|
- else return (svalue(object));
|
|
|
+ if (object == 0 || tag(Address(object)) == LUA_T_NIL) return NULL;
|
|
|
+ if (tostring (Address(object))) return NULL;
|
|
|
+ else return (svalue(Address(object)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Given an object handle, return a copy of its string. On error, return NULL.
|
|
|
*/
|
|
|
-char *lua_copystring (Object *object)
|
|
|
+char *lua_copystring (lua_Object object)
|
|
|
{
|
|
|
- if (object == NULL || tag(object) == LUA_T_NIL) return NULL;
|
|
|
- if (tostring (object)) return NULL;
|
|
|
- else return (strdup(svalue(object)));
|
|
|
+ if (object == 0 || tag(Address(object)) == LUA_T_NIL) return NULL;
|
|
|
+ if (tostring (Address(object))) return NULL;
|
|
|
+ else return (strdup(svalue(Address(object))));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Given an object handle, return its cfuntion pointer. On error, return NULL.
|
|
|
*/
|
|
|
-lua_CFunction lua_getcfunction (Object *object)
|
|
|
+lua_CFunction lua_getcfunction (lua_Object object)
|
|
|
{
|
|
|
- if (object == NULL) return NULL;
|
|
|
- if (tag(object) != LUA_T_CFUNCTION) return NULL;
|
|
|
- else return (fvalue(object));
|
|
|
+ if (object == 0) return NULL;
|
|
|
+ if (tag(Address(object)) != LUA_T_CFUNCTION) return NULL;
|
|
|
+ else return (fvalue(Address(object)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Given an object handle, return its user data. On error, return NULL.
|
|
|
*/
|
|
|
-void *lua_getuserdata (Object *object)
|
|
|
+void *lua_getuserdata (lua_Object object)
|
|
|
{
|
|
|
- if (object == NULL) return NULL;
|
|
|
- if (tag(object) != LUA_T_USERDATA) return NULL;
|
|
|
- else return (uvalue(object));
|
|
|
+ if (object == 0) return NULL;
|
|
|
+ if (tag(Address(object)) != LUA_T_USERDATA) return NULL;
|
|
|
+ else return (uvalue(Address(object)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** Get a global object. Return the object handle or NULL on error.
|
|
|
*/
|
|
|
-Object *lua_getglobal (char *name)
|
|
|
+lua_Object lua_getglobal (char *name)
|
|
|
{
|
|
|
int n = lua_findsymbol(name);
|
|
|
- if (n < 0) return NULL;
|
|
|
- return &s_object(n);
|
|
|
+ if (n < 0) return 0;
|
|
|
+ *(top-1) = s_object(n);
|
|
|
+ top++;
|
|
|
+ return Ref(top-1);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -541,15 +558,24 @@ int lua_pushuserdata (void *u)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
-** Push an object to stack.
|
|
|
+** Push a lua_Object to stack.
|
|
|
*/
|
|
|
-int lua_pushobject (Object *o)
|
|
|
+int lua_pushobject (lua_Object o)
|
|
|
{
|
|
|
lua_checkstack(top-stack+1);
|
|
|
- *top++ = *o;
|
|
|
+ *top++ = *Address(o);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+** Push an object on the stack.
|
|
|
+*/
|
|
|
+void luaI_pushobject (Object *o)
|
|
|
+{
|
|
|
+ lua_checkstack(top-stack+1);
|
|
|
+ *top++ = *o;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
** Store top of the stack at a global variable array field.
|
|
|
** Return 1 on error, 0 on success.
|
|
@@ -558,60 +584,16 @@ int lua_storeglobal (char *name)
|
|
|
{
|
|
|
int n = lua_findsymbol (name);
|
|
|
if (n < 0) return 1;
|
|
|
- if (top-stack <= CBase) return 1;
|
|
|
s_object(n) = *(--top);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-/*
|
|
|
-** Store top of the stack at an array field. Return 1 on error, 0 on success.
|
|
|
-*/
|
|
|
-int lua_storefield (lua_Object object, char *field)
|
|
|
-{
|
|
|
- if (tag(object) != LUA_T_ARRAY)
|
|
|
- return 1;
|
|
|
- else
|
|
|
- {
|
|
|
- Object ref, *h;
|
|
|
- tag(&ref) = LUA_T_STRING;
|
|
|
- svalue(&ref) = lua_createstring(field);
|
|
|
- h = lua_hashdefine(avalue(object), &ref);
|
|
|
- if (h == NULL) return 1;
|
|
|
- if (tag(top-1) == LUA_T_MARK) return 1;
|
|
|
- *h = *(--top);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
-** Store top of the stack at an array index. Return 1 on error, 0 on success.
|
|
|
-*/
|
|
|
-int lua_storeindexed (lua_Object object, float index)
|
|
|
-{
|
|
|
- if (tag(object) != LUA_T_ARRAY)
|
|
|
- return 1;
|
|
|
- else
|
|
|
- {
|
|
|
- Object ref, *h;
|
|
|
- tag(&ref) = LUA_T_NUMBER;
|
|
|
- nvalue(&ref) = index;
|
|
|
- h = lua_hashdefine(avalue(object), &ref);
|
|
|
- if (h == NULL) return 1;
|
|
|
- if (tag(top-1) == LUA_T_MARK) return 1;
|
|
|
- *h = *(--top);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
int lua_type (lua_Object o)
|
|
|
{
|
|
|
- if (o == NULL)
|
|
|
+ if (o == 0)
|
|
|
return LUA_T_NIL;
|
|
|
else
|
|
|
- return tag(o);
|
|
|
+ return tag(Address(o));
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1063,3 +1045,4 @@ static int lua_execute (Byte *pc, int base)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|