12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #include <stdio.h>
- #include "luadebug.h"
- #include "table.h"
- #include "mem.h"
- #include "func.h"
- #include "opcode.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;
- }
- void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
- {
- Object *f = luaI_Address(func);
- if (f->tag == LUA_T_MARK || f->tag == LUA_T_FUNCTION)
- {
- *filename = f->value.tf->fileName;
- *linedefined = f->value.tf->lineDefined;
- }
- else if (f->tag == LUA_T_CMARK || f->tag == LUA_T_CFUNCTION)
- {
- *filename = "(C)";
- *linedefined = -1;
- }
- }
|