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