mirror of https://github.com/lua/lua.git
Roberto Ierusalimschy
28 years ago
4 changed files with 131 additions and 187 deletions
@ -1,146 +0,0 @@ |
|||
#include <string.h> |
|||
|
|||
#include "luadebug.h" |
|||
#include "table.h" |
|||
#include "luamem.h" |
|||
#include "func.h" |
|||
#include "opcode.h" |
|||
#include "inout.h" |
|||
|
|||
|
|||
static TFunc *function_root = NULL; |
|||
|
|||
|
|||
static void luaI_insertfunction (TFunc *f) |
|||
{ |
|||
lua_pack(); |
|||
f->next = function_root; |
|||
function_root = f; |
|||
f->marked = 0; |
|||
} |
|||
|
|||
/*
|
|||
** Initialize TFunc struct |
|||
*/ |
|||
void luaI_initTFunc (TFunc *f) |
|||
{ |
|||
f->next = NULL; |
|||
f->marked = 0; |
|||
f->code = NULL; |
|||
f->lineDefined = 0; |
|||
f->fileName = lua_parsedfile; |
|||
f->consts = NULL; |
|||
f->nconsts = 0; |
|||
f->locvars = NULL; |
|||
luaI_insertfunction(f); |
|||
} |
|||
|
|||
|
|||
|
|||
/*
|
|||
** Free function |
|||
*/ |
|||
static void luaI_freefunc (TFunc *f) |
|||
{ |
|||
luaI_free(f->code); |
|||
luaI_free(f->locvars); |
|||
luaI_free(f->consts); |
|||
luaI_free(f); |
|||
} |
|||
|
|||
|
|||
void luaI_funcfree (TFunc *l) |
|||
{ |
|||
while (l) { |
|||
TFunc *next = l->next; |
|||
luaI_freefunc(l); |
|||
l = next; |
|||
} |
|||
} |
|||
|
|||
|
|||
void luaI_funcmark (TFunc *f) |
|||
{ |
|||
f->marked = 1; |
|||
if (!f->fileName->marked) |
|||
f->fileName->marked = 1; |
|||
if (f->consts) { |
|||
int i; |
|||
for (i=0; i<f->nconsts; i++) |
|||
lua_markobject(&f->consts[i]); |
|||
} |
|||
} |
|||
|
|||
|
|||
/*
|
|||
** Garbage collection function. |
|||
*/ |
|||
TFunc *luaI_funccollector (long *acum) |
|||
{ |
|||
TFunc *curr = function_root; |
|||
TFunc *prev = NULL; |
|||
TFunc *frees = NULL; |
|||
long counter = 0; |
|||
while (curr) { |
|||
TFunc *next = curr->next; |
|||
if (!curr->marked) { |
|||
if (prev == NULL) |
|||
function_root = next; |
|||
else |
|||
prev->next = next; |
|||
curr->next = frees; |
|||
frees = curr; |
|||
++counter; |
|||
} |
|||
else { |
|||
curr->marked = 0; |
|||
prev = curr; |
|||
} |
|||
curr = next; |
|||
} |
|||
*acum += counter; |
|||
return frees; |
|||
} |
|||
|
|||
|
|||
void lua_funcinfo (lua_Object func, char **filename, int *linedefined) |
|||
{ |
|||
TObject *f = luaI_Address(func); |
|||
if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION) |
|||
{ |
|||
*filename = f->value.tf->fileName->str; |
|||
*linedefined = f->value.tf->lineDefined; |
|||
} |
|||
else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION) |
|||
{ |
|||
*filename = "(C)"; |
|||
*linedefined = -1; |
|||
} |
|||
} |
|||
|
|||
|
|||
/*
|
|||
** Look for n-esim local variable at line "line" in function "func". |
|||
** Returns NULL if not found. |
|||
*/ |
|||
char *luaI_getlocalname (TFunc *func, int local_number, int line) |
|||
{ |
|||
int count = 0; |
|||
char *varname = NULL; |
|||
LocVar *lv = func->locvars; |
|||
if (lv == NULL) |
|||
return NULL; |
|||
for (; lv->line != -1 && lv->line < line; lv++) |
|||
{ |
|||
if (lv->varname) /* register */ |
|||
{ |
|||
if (++count == local_number) |
|||
varname = lv->varname->str; |
|||
} |
|||
else /* unregister */ |
|||
if (--count < local_number) |
|||
varname = NULL; |
|||
} |
|||
return varname; |
|||
} |
|||
|
@ -1,41 +0,0 @@ |
|||
/*
|
|||
** $Id: func.h,v 1.11 1997/07/29 20:38:45 roberto Exp roberto $ |
|||
*/ |
|||
|
|||
#ifndef func_h |
|||
#define func_h |
|||
|
|||
#include "types.h" |
|||
#include "lua.h" |
|||
#include "tree.h" |
|||
|
|||
typedef struct LocVar |
|||
{ |
|||
TaggedString *varname; /* NULL signals end of scope */ |
|||
int line; |
|||
} LocVar; |
|||
|
|||
|
|||
/*
|
|||
** Function Headers |
|||
*/ |
|||
typedef struct TFunc |
|||
{ |
|||
struct TFunc *next; |
|||
int marked; |
|||
Byte *code; |
|||
int lineDefined; |
|||
TaggedString *fileName; |
|||
struct TObject *consts; |
|||
int nconsts; |
|||
LocVar *locvars; |
|||
} TFunc; |
|||
|
|||
TFunc *luaI_funccollector (long *cont); |
|||
void luaI_funcfree (TFunc *l); |
|||
void luaI_funcmark (TFunc *f); |
|||
void luaI_initTFunc (TFunc *f); |
|||
|
|||
char *luaI_getlocalname (TFunc *func, int local_number, int line); |
|||
|
|||
#endif |
@ -0,0 +1,105 @@ |
|||
/*
|
|||
** $Id: $ |
|||
** Lua Funcion auxiliar |
|||
** See Copyright Notice in lua.h |
|||
*/ |
|||
|
|||
|
|||
#include <stdlib.h> |
|||
|
|||
#include "lfunc.h" |
|||
#include "lmem.h" |
|||
|
|||
|
|||
TProtoFunc *luaF_root = NULL; |
|||
Closure *luaF_rootcl = NULL; |
|||
|
|||
|
|||
static void luaI_insertfunction (TProtoFunc *f) |
|||
{ |
|||
++luaO_nentities; |
|||
f->head.next = (GCnode *)luaF_root; |
|||
luaF_root = f; |
|||
f->head.marked = 0; |
|||
} |
|||
|
|||
|
|||
Closure *luaF_newclosure (int nelems) |
|||
{ |
|||
Closure *c = (Closure *)luaM_malloc(sizeof(Closure)+nelems*sizeof(TObject)); |
|||
++luaO_nentities; |
|||
c->head.next = (GCnode *)luaF_rootcl; |
|||
luaF_rootcl = c; |
|||
c->head.marked = 0; |
|||
return c; |
|||
} |
|||
|
|||
|
|||
TProtoFunc *luaF_newproto (void) |
|||
{ |
|||
TProtoFunc *f = luaM_new(TProtoFunc); |
|||
f->code = NULL; |
|||
f->lineDefined = 0; |
|||
f->fileName = NULL; |
|||
f->consts = NULL; |
|||
f->nconsts = 0; |
|||
f->nupvalues = 0; |
|||
f->locvars = NULL; |
|||
luaI_insertfunction(f); |
|||
return f; |
|||
} |
|||
|
|||
|
|||
|
|||
static void freefunc (TProtoFunc *f) |
|||
{ |
|||
luaM_free(f->code); |
|||
luaM_free(f->locvars); |
|||
luaM_free(f->consts); |
|||
luaM_free(f); |
|||
} |
|||
|
|||
|
|||
void luaF_freeproto (TProtoFunc *l) |
|||
{ |
|||
while (l) { |
|||
TProtoFunc *next = (TProtoFunc *)l->head.next; |
|||
freefunc(l); |
|||
l = next; |
|||
} |
|||
} |
|||
|
|||
|
|||
void luaF_freeclosure (Closure *l) |
|||
{ |
|||
while (l) { |
|||
Closure *next = (Closure *)l->head.next; |
|||
luaM_free(l); |
|||
l = next; |
|||
} |
|||
} |
|||
|
|||
|
|||
/*
|
|||
** Look for n-esim local variable at line "line" in function "func". |
|||
** Returns NULL if not found. |
|||
*/ |
|||
char *luaF_getlocalname (TProtoFunc *func, int local_number, int line) |
|||
{ |
|||
int count = 0; |
|||
char *varname = NULL; |
|||
LocVar *lv = func->locvars; |
|||
if (lv == NULL) |
|||
return NULL; |
|||
for (; lv->line != -1 && lv->line < line; lv++) { |
|||
if (lv->varname) { /* register */ |
|||
if (++count == local_number) |
|||
varname = lv->varname->str; |
|||
} |
|||
else /* unregister */ |
|||
if (--count < local_number) |
|||
varname = NULL; |
|||
} |
|||
return varname; |
|||
} |
|||
|
@ -0,0 +1,26 @@ |
|||
/*
|
|||
** $Id: $ |
|||
** Lua Function structures |
|||
** See Copyright Notice in lua.h |
|||
*/ |
|||
|
|||
#ifndef lfunc_h |
|||
#define lfunc_h |
|||
|
|||
|
|||
#include "lobject.h" |
|||
|
|||
|
|||
extern TProtoFunc *luaF_root; |
|||
extern Closure *luaF_rootcl; |
|||
|
|||
|
|||
TProtoFunc *luaF_newproto (void); |
|||
Closure *luaF_newclosure (int nelems); |
|||
void luaF_freeproto (TProtoFunc *l); |
|||
void luaF_freeclosure (Closure *l); |
|||
|
|||
char *luaF_getlocalname (TProtoFunc *func, int local_number, int line); |
|||
|
|||
|
|||
#endif |
Loading…
Reference in new issue