commit b1e9b37883ebc3f9926f6693350a73d6cbb94b6e
parent 467288e5b35d6f264bdded9b4d09dbaa0597f967
Author: Waldemar Celes <celes@tecgraf.puc-rio.br>
Date: Wed, 3 Aug 1994 11:15:27 -0300
Implementacao de funcoes para tratar Lua function em C e
correcoes de bugs nas tabelas dinamicas.
Diffstat:
4 files changed, 42 insertions(+), 10 deletions(-)
diff --git a/lua.h b/lua.h
@@ -2,7 +2,7 @@
** LUA - Linguagem para Usuarios de Aplicacao
** Grupo de Tecnologia em Computacao Grafica
** TeCGraf - PUC-Rio
-** $Id: $
+** $Id: lua.h,v 1.1 1993/12/17 18:41:19 celes Exp celes $
*/
@@ -20,6 +20,7 @@ void lua_error (char *s);
int lua_dofile (char *filename);
int lua_dostring (char *string);
int lua_call (char *functionname, int nparam);
+int lua_callfunction (lua_Object function, int nparam);
lua_Object lua_getparam (int number);
float lua_getnumber (lua_Object object);
@@ -48,6 +49,7 @@ int lua_isnil (lua_Object object);
int lua_isnumber (lua_Object object);
int lua_isstring (lua_Object object);
int lua_istable (lua_Object object);
+int lua_isfunction (lua_Object object);
int lua_iscfunction (lua_Object object);
int lua_isuserdata (lua_Object object);
diff --git a/lua.stx b/lua.stx
@@ -1,6 +1,6 @@
%{
-char *rcs_luastx = "$Id: lua.stx,v 2.4 1994/04/20 16:22:21 celes Exp celes $";
+char *rcs_luastx = "$Id: lua.stx,v 2.5 1994/07/19 21:27:18 celes Exp $";
#include <stdio.h>
#include <stdlib.h>
@@ -113,10 +113,16 @@ static void flush_list (int m, int n)
if (m == 0)
code_byte(STORELIST0);
else
+ if (m < 255)
{
code_byte(STORELIST);
code_byte(m);
}
+ else
+ {
+ lua_error ("list constructor too long");
+ err = 1;
+ }
code_byte(n);
ntemp-=n;
}
@@ -459,14 +465,14 @@ expr : '(' expr ')' { $$ = $2; }
typeconstructor: '@'
{
- code_byte(PUSHBYTE);
- $<vLong>$ = pc; code_byte(0);
+ code_byte(PUSHWORD);
+ $<vLong>$ = pc; code_word(0);
incr_ntemp();
code_byte(CREATEARRAY);
}
objectname fieldlist
{
- basepc[$<vLong>2] = $4;
+ code_word_at(basepc+$<vLong>2, $4);
if ($3 < 0) /* there is no function to be called */
{
$$ = 1;
diff --git a/opcode.c b/opcode.c
@@ -3,7 +3,7 @@
** TecCGraf - PUC-Rio
*/
-char *rcs_opcode="$Id: opcode.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $";
+char *rcs_opcode="$Id: opcode.c,v 2.2 1994/07/19 21:27:18 celes Exp celes $";
#include <stdio.h>
#include <stdlib.h>
@@ -26,7 +26,7 @@ char *rcs_opcode="$Id: opcode.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $";
#define STACK_BUFFER (STACKGAP+128)
-static Word maxstack;
+static Long maxstack;
static Object *stack=NULL;
static Object *top, *base;
@@ -684,6 +684,22 @@ int lua_call (char *functionname, int nparam)
}
/*
+** Execute the given lua function. Return 0 on success or 1 on error.
+*/
+int lua_callfunction (Object *function, int nparam)
+{
+ static Byte startcode[] = {CALLFUNC, HALT};
+ int i;
+ if (tag(function) != T_FUNCTION) return 1;
+ for (i=1; i<=nparam; i++)
+ *(top-i+2) = *(top-i);
+ top += 2;
+ tag(top-nparam-1) = T_MARK;
+ *(top-nparam-2) = *function;
+ return (lua_execute (startcode));
+}
+
+/*
** Get a parameter, returning the object handle or NULL on error.
** 'number' must be 1 to get the first parameter.
*/
@@ -954,6 +970,14 @@ int lua_istable (Object *object)
}
/*
+** Given an object handle, return if it is a lua function.
+*/
+int lua_isfunction (Object *object)
+{
+ return (object != NULL && tag(object) == T_FUNCTION);
+}
+
+/*
** Given an object handle, return if it is a cfunction one.
*/
int lua_iscfunction (Object *object)
diff --git a/table.c b/table.c
@@ -3,7 +3,7 @@
** Module to control static tables
*/
-char *rcs_table="$Id: table.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $";
+char *rcs_table="$Id: table.c,v 2.2 1994/07/19 21:27:18 celes Exp celes $";
#include <stdlib.h>
#include <string.h>
@@ -23,11 +23,11 @@ char *rcs_table="$Id: table.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $";
Symbol *lua_table;
static Word lua_ntable = 0;
-static Word lua_maxsymbol = 0;
+static Long lua_maxsymbol = 0;
char **lua_constant;
static Word lua_nconstant = 0;
-static Word lua_maxconstant = 0;
+static Long lua_maxconstant = 0;