Преглед изворни кода

LUA intermediate code interpreter

Waldemar Celes пре 32 година
родитељ
комит
64097041c4
2 измењених фајлова са 42 додато и 4 уклоњено
  1. 39 2
      opcode.c
  2. 3 2
      opcode.h

+ 39 - 2
opcode.c

@@ -1,9 +1,10 @@
 /*
 ** opcode.c
 ** TecCGraf - PUC-Rio
-** 26 Apr 93
 */
 
+char *rcs_opcode="$Id: $";
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -137,6 +138,8 @@ static int lua_tostring (Object *obj)
 */
 int lua_execute (Byte *pc)
 {
+ Object *oldbase = base;
+ base = top;
  while (1)
  {
   switch ((OpCode)*pc++)
@@ -252,7 +255,7 @@ int lua_execute (Byte *pc)
    case STOREFIELD:
     if (tag(top-3) != T_ARRAY)
     {
-     lua_error ("internal error - table expected");
+     lua_reportbug ("internal error - table expected");
      return 1;
     }
     *(lua_hashdefine (avalue(top-3), top-2)) = *(top-1);
@@ -516,6 +519,7 @@ int lua_execute (Byte *pc)
    break;
    
    case HALT:
+    base = oldbase;
    return 0;		/* success */
    
    case SETFUNCTION:
@@ -577,6 +581,7 @@ int lua_dostring (char *string)
 {
  if (lua_openstring (string)) return 1;
  if (lua_parse ()) return 1;
+ lua_closestring();
  return 0;
 }
 
@@ -612,6 +617,7 @@ Object *lua_getparam (int number)
 */
 real lua_getnumber (Object *object)
 {
+ if (object == NULL || tag(object) == T_NIL) return 0.0;
  if (tonumber (object)) return 0.0;
  else                   return (nvalue(object));
 }
@@ -621,6 +627,7 @@ real lua_getnumber (Object *object)
 */
 char *lua_getstring (Object *object)
 {
+ if (object == NULL || tag(object) == T_NIL) return NULL;
  if (tostring (object)) return NULL;
  else                   return (svalue(object));
 }
@@ -630,6 +637,7 @@ char *lua_getstring (Object *object)
 */
 char *lua_copystring (Object *object)
 {
+ if (object == NULL || tag(object) == T_NIL) return NULL;
  if (tostring (object)) return NULL;
  else                   return (strdup(svalue(object)));
 }
@@ -639,6 +647,7 @@ char *lua_copystring (Object *object)
 */
 lua_CFunction lua_getcfunction (Object *object)
 {
+ if (object == NULL) return NULL;
  if (tag(object) != T_CFUNCTION) return NULL;
  else                            return (fvalue(object));
 }
@@ -648,6 +657,7 @@ lua_CFunction lua_getcfunction (Object *object)
 */
 void *lua_getuserdata (Object *object)
 {
+ if (object == NULL) return NULL;
  if (tag(object) != T_USERDATA) return NULL;
  else                           return (uvalue(object));
 }
@@ -658,6 +668,7 @@ void *lua_getuserdata (Object *object)
 */
 Object *lua_getfield (Object *object, char *field)
 {
+ if (object == NULL) return NULL;
  if (tag(object) != T_ARRAY)
   return NULL;
  else
@@ -675,6 +686,7 @@ Object *lua_getfield (Object *object, char *field)
 */
 Object *lua_getindexed (Object *object, float index)
 {
+ if (object == NULL) return NULL;
  if (tag(object) != T_ARRAY)
   return NULL;
  else
@@ -931,3 +943,28 @@ void lua_print (void)
  }
 }
 
+/*
+** Internal function: do a file
+*/
+void lua_internaldofile (void)
+{
+ lua_Object obj = lua_getparam (1);
+ if (lua_isstring(obj) && !lua_dofile(lua_getstring(obj)))
+  lua_pushnumber(1);
+ else
+  lua_pushnil();
+}
+
+/*
+** Internal function: do a string
+*/
+void lua_internaldostring (void)
+{
+ lua_Object obj = lua_getparam (1);
+ if (lua_isstring(obj) && !lua_dostring(lua_getstring(obj)))
+  lua_pushnumber(1);
+ else
+  lua_pushnil();
+}
+
+

+ 3 - 2
opcode.h

@@ -1,7 +1,6 @@
 /*
-** opcode.h
 ** TeCGraf - PUC-Rio
-** 16 Apr 92
+** $Id: $
 */
 
 #ifndef opcode_h
@@ -140,5 +139,7 @@ int     lua_parse      (void); 		/* from "lua.stx" module */
 void    lua_type       (void);
 void 	lua_obj2number (void);
 void 	lua_print      (void);
+void 	lua_internaldofile (void);
+void 	lua_internaldostring (void);
 
 #endif