Browse Source

Module to manipulate function headers.

Roberto Ierusalimschy 30 years ago
parent
commit
f132ac03bc
2 changed files with 79 additions and 0 deletions
  1. 59 0
      func.c
  2. 20 0
      func.h

+ 59 - 0
func.c

@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include "table.h"
+#include "mem.h"
+#include "func.h"
+
+static TFunc *function_root = NULL;
+
+
+/*
+** Insert function in list for GC
+*/
+void luaI_insertfunction (TFunc *f)
+{
+  lua_pack();
+  f->next = function_root;
+  function_root = f;
+  f->marked = 0;
+}
+
+
+/*
+** Free function
+*/
+static void freefunc (TFunc *f)
+{
+  luaI_free (f->code);
+  luaI_free (f);
+}
+
+/*
+** Garbage collection function.
+** This function traverse the function list freeing unindexed functions
+*/
+Long luaI_funccollector (void)
+{
+  TFunc *curr = function_root;
+  TFunc *prev = NULL;
+  Long counter = 0;
+  while (curr)
+  {
+    TFunc *next = curr->next;
+    if (!curr->marked)
+    {
+      if (prev == NULL)
+        function_root = next;
+      else
+        prev->next = next;
+      freefunc (curr);
+      ++counter;
+    }
+    else
+    {
+      curr->marked = 0;
+      prev = curr;
+    } 
+    curr = next;
+  }
+  return counter;
+}

+ 20 - 0
func.h

@@ -0,0 +1,20 @@
+#ifndef func_h
+#define func_h
+
+#include "types.h"
+
+/*
+** Header para funcoes.
+*/
+typedef struct TFunc
+{
+  struct TFunc	*next;
+  char		marked;
+  int		size;
+  Byte		*code;
+} TFunc;
+
+Long luaI_funccollector (void);
+void luaI_insertfunction (TFunc *f);
+
+#endif