瀏覽代碼

Lua Function structures

Roberto Ierusalimschy 28 年之前
父節點
當前提交
ff08b0f406
共有 4 個文件被更改,包括 131 次插入187 次删除
  1. 0 146
      func.c
  2. 0 41
      func.h
  3. 105 0
      lfunc.c
  4. 26 0
      lfunc.h

+ 0 - 146
func.c

@@ -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;
-}
-

+ 0 - 41
func.h

@@ -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

+ 105 - 0
lfunc.c

@@ -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;
+}
+

+ 26 - 0
lfunc.h

@@ -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