mirror of https://github.com/rusefi/lua.git
60 lines
911 B
C
60 lines
911 B
C
|
#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;
|
||
|
}
|