Implementacao da definicao e chamada de METODOS.

This commit is contained in:
Waldemar Celes 1994-08-05 16:31:09 -03:00
parent be7aa3854b
commit 41fd23287a
3 changed files with 148 additions and 35 deletions

155
lua.stx
View File

@ -1,6 +1,6 @@
%{ %{
char *rcs_luastx = "$Id: lua.stx,v 2.5 1994/07/19 21:27:18 celes Exp $"; char *rcs_luastx = "$Id: lua.stx,v 2.6 1994/08/03 14:15:46 celes Exp celes $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -77,6 +77,16 @@ static void code_float (float n)
code_byte(code.m.c4); code_byte(code.m.c4);
} }
static void code_code (Byte *b)
{
CodeCode code;
code.b = b;
code_byte(code.m.c1);
code_byte(code.m.c2);
code_byte(code.m.c3);
code_byte(code.m.c4);
}
static void code_word_at (Byte *p, Word n) static void code_word_at (Byte *p, Word n)
{ {
CodeWord code; CodeWord code;
@ -185,6 +195,21 @@ static void code_number (float f)
incr_ntemp(); incr_ntemp();
} }
static void init_function (void)
{
if (code == NULL) /* first function */
{
code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte));
if (code == NULL)
{
lua_error("not enough memory");
err = 1;
}
maxcode = CODE_BLOCK;
}
}
%} %}
@ -205,9 +230,10 @@ static void code_number (float f)
%token IF THEN ELSE ELSEIF WHILE DO REPEAT UNTIL END %token IF THEN ELSE ELSEIF WHILE DO REPEAT UNTIL END
%token RETURN %token RETURN
%token LOCAL %token LOCAL
%token FUNCTION
%token <vFloat> NUMBER %token <vFloat> NUMBER
%token <vWord> FUNCTION STRING %token <vWord> STRING
%token <pChar> NAME %token <pChar> NAME
%token <vInt> DEBUG %token <vInt> DEBUG
%type <vLong> PrepJump %type <vLong> PrepJump
@ -215,7 +241,8 @@ static void code_number (float f)
%type <vInt> fieldlist, localdeclist %type <vInt> fieldlist, localdeclist
%type <vInt> ffieldlist, ffieldlist1 %type <vInt> ffieldlist, ffieldlist1
%type <vInt> lfieldlist, lfieldlist1 %type <vInt> lfieldlist, lfieldlist1
%type <vLong> var, objectname %type <vInt> functionvalue
%type <vLong> var, singlevar, objectname
%left AND OR %left AND OR
@ -240,21 +267,13 @@ functionlist : /* empty */
maincode=pc; initcode=basepc; maxmain=maxcurr; maincode=pc; initcode=basepc; maxmain=maxcurr;
} }
| functionlist function | functionlist function
| functionlist method
| functionlist setdebug | functionlist setdebug
; ;
function : FUNCTION NAME function : FUNCTION NAME
{ {
if (code == NULL) /* first function */ init_function();
{
code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte));
if (code == NULL)
{
lua_error("not enough memory");
err = 1;
}
maxcode = CODE_BLOCK;
}
pc=0; basepc=code; maxcurr=maxcode; pc=0; basepc=code; maxcurr=maxcode;
nlocalvar=0; nlocalvar=0;
$<vWord>$ = lua_findsymbol($2); $<vWord>$ = lua_findsymbol($2);
@ -284,11 +303,62 @@ function : FUNCTION NAME
memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte));
code = basepc; maxcode=maxcurr; code = basepc; maxcode=maxcurr;
#if LISTING #if LISTING
PrintCode(code,code+pc); PrintCode(code,code+pc);
#endif #endif
} }
; ;
method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME
{
init_function();
pc=0; basepc=code; maxcurr=maxcode;
nlocalvar=0;
localvar[nlocalvar]=lua_findsymbol("self"); /* self param. */
add_nlocalvar(1);
$<vWord>$ = lua_findconstant($5);
}
'(' parlist ')'
{
if (lua_debug)
{
code_byte(SETFUNCTION);
code_word(lua_nfile-1);
code_word($<vWord>6);
}
lua_codeadjust (0);
}
block
END
{
Byte *b;
if (lua_debug) code_byte(RESET);
code_byte(RETCODE); code_byte(nlocalvar);
b = calloc (pc, sizeof(Byte));
if (b == NULL)
{
lua_error("not enough memory");
err = 1;
}
memcpy (b, basepc, pc*sizeof(Byte));
code = basepc; maxcode=maxcurr;
#if LISTING
PrintCode(code,code+pc);
#endif
/* assign function to table field */
pc=maincode; basepc=initcode; maxcurr=maxmain;
nlocalvar=0;
lua_pushvar($<vWord>3+1);
code_byte(PUSHSTRING);
code_word($<vWord>6);
code_byte(PUSHFUNCTION);
code_code(b);
code_byte(STOREINDEXED0);
maincode=pc; initcode=basepc; maxmain=maxcurr;
}
;
statlist : /* empty */ statlist : /* empty */
| statlist stat sc | statlist stat sc
; ;
@ -499,10 +569,23 @@ dimension : /* empty */ { code_byte(PUSHNIL); incr_ntemp();}
| expr1 | expr1
; ;
functioncall : functionvalue {code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp();} functioncall : functionvalue
'(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;} {
code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp();
if ($1 != 0) lua_pushvar($1);
}
'(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;}
functionvalue : var {lua_pushvar ($1); } functionvalue : var {lua_pushvar ($1); $$ = 0; }
| singlevar ':' NAME
{
$$ = $1;
lua_pushvar($1);
code_byte(PUSHSTRING);
code_word(lua_findconstant($3));
incr_ntemp();
lua_pushvar(0);
}
; ;
exprlist : /* empty */ { $$ = 1; } exprlist : /* empty */ { $$ = 1; }
@ -590,16 +673,7 @@ varlist1 : var
} }
; ;
var : NAME var : singlevar { $$ = $1; }
{
Word s = lua_findsymbol($1);
int local = lua_localname (s);
if (local == -1) /* global var */
$$ = s + 1; /* return positive value */
else
$$ = -(local+1); /* return negative value */
}
| var {lua_pushvar ($1);} '[' expr1 ']' | var {lua_pushvar ($1);} '[' expr1 ']'
{ {
$$ = 0; /* indexed variable */ $$ = 0; /* indexed variable */
@ -612,6 +686,17 @@ var : NAME
} }
; ;
singlevar : NAME
{
Word s = lua_findsymbol($1);
int local = lua_localname (s);
if (local == -1) /* global var */
$$ = s + 1; /* return positive value */
else
$$ = -(local+1); /* return negative value */
}
;
localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;}
| localdeclist ',' NAME | localdeclist ',' NAME
{ {
@ -799,6 +884,16 @@ static void PrintCode (Byte *code, Byte *end)
printf ("%d PUSHSTRING %d\n", n, c.w); printf ("%d PUSHSTRING %d\n", n, c.w);
} }
break; break;
case PUSHFUNCTION:
{
CodeCode c;
int n = p-code;
p++;
get_code(c,p);
printf ("%d PUSHFUNCTION %p\n", n, c.b);
}
break;
case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3:
case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
case PUSHLOCAL8: case PUSHLOCAL9: case PUSHLOCAL8: case PUSHLOCAL9:

View File

@ -3,7 +3,7 @@
** TecCGraf - PUC-Rio ** TecCGraf - PUC-Rio
*/ */
char *rcs_opcode="$Id: opcode.c,v 2.2 1994/07/19 21:27:18 celes Exp celes $"; char *rcs_opcode="$Id: opcode.c,v 2.3 1994/08/03 14:15:46 celes Exp celes $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -211,6 +211,14 @@ int lua_execute (Byte *pc)
tag(top) = T_STRING; svalue(top++) = lua_constant[code.w]; tag(top) = T_STRING; svalue(top++) = lua_constant[code.w];
} }
break; break;
case PUSHFUNCTION:
{
CodeCode code;
get_code(code,pc);
tag(top) = T_FUNCTION; bvalue(top++) = code.b;
}
break;
case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2:
case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5:
@ -235,7 +243,7 @@ int lua_execute (Byte *pc)
return 1; return 1;
} }
{ {
Object *h = lua_hashdefine (avalue(top-1), top); Object *h = lua_hashget (avalue(top-1), top);
if (h == NULL) return 1; if (h == NULL) return 1;
*(top-1) = *h; *(top-1) = *h;
} }
@ -773,7 +781,7 @@ Object *lua_getfield (Object *object, char *field)
Object ref; Object ref;
tag(&ref) = T_STRING; tag(&ref) = T_STRING;
svalue(&ref) = lua_createstring(field); svalue(&ref) = lua_createstring(field);
return (lua_hashdefine(avalue(object), &ref)); return (lua_hashget(avalue(object), &ref));
} }
} }
@ -791,7 +799,7 @@ Object *lua_getindexed (Object *object, float index)
Object ref; Object ref;
tag(&ref) = T_NUMBER; tag(&ref) = T_NUMBER;
nvalue(&ref) = index; nvalue(&ref) = index;
return (lua_hashdefine(avalue(object), &ref)); return (lua_hashget(avalue(object), &ref));
} }
} }
@ -1025,6 +1033,7 @@ void lua_print (void)
{ {
if (lua_isnumber(obj)) printf("%g\n",lua_getnumber (obj)); if (lua_isnumber(obj)) printf("%g\n",lua_getnumber (obj));
else if (lua_isstring(obj)) printf("%s\n",lua_getstring (obj)); else if (lua_isstring(obj)) printf("%s\n",lua_getstring (obj));
else if (lua_isfunction(obj)) printf("function: %p\n",bvalue(obj));
else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction (obj)); else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction (obj));
else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata (obj)); else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata (obj));
else if (lua_istable(obj)) printf("table: %p\n",obj); else if (lua_istable(obj)) printf("table: %p\n",obj);

View File

@ -1,6 +1,6 @@
/* /*
** TeCGraf - PUC-Rio ** TeCGraf - PUC-Rio
** $Id: opcode.h,v 2.1 1994/04/20 22:07:57 celes Exp celes $ ** $Id: opcode.h,v 2.2 1994/07/19 21:27:18 celes Exp celes $
*/ */
#ifndef opcode_h #ifndef opcode_h
@ -34,6 +34,12 @@ typedef union
float f; float f;
} CodeFloat; } CodeFloat;
typedef union
{
struct {char c1; char c2; char c3; char c4;} m;
Byte *b;
} CodeCode;
typedef enum typedef enum
{ {
PUSHNIL, PUSHNIL,
@ -42,6 +48,7 @@ typedef enum
PUSHWORD, PUSHWORD,
PUSHFLOAT, PUSHFLOAT,
PUSHSTRING, PUSHSTRING,
PUSHFUNCTION,
PUSHLOCAL0, PUSHLOCAL1, PUSHLOCAL2, PUSHLOCAL3, PUSHLOCAL4, PUSHLOCAL0, PUSHLOCAL1, PUSHLOCAL2, PUSHLOCAL3, PUSHLOCAL4,
PUSHLOCAL5, PUSHLOCAL6, PUSHLOCAL7, PUSHLOCAL8, PUSHLOCAL9, PUSHLOCAL5, PUSHLOCAL6, PUSHLOCAL7, PUSHLOCAL8, PUSHLOCAL9,
PUSHLOCAL, PUSHLOCAL,
@ -143,6 +150,8 @@ typedef struct
#define get_word(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;} #define get_word(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;}
#define get_float(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\ #define get_float(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\
code.m.c3 = *pc++; code.m.c4 = *pc++;} code.m.c3 = *pc++; code.m.c4 = *pc++;}
#define get_code(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\
code.m.c3 = *pc++; code.m.c4 = *pc++;}