/* ** $Id: luacomp.c,v 1.7 2004-12-27 19:52:24 pixel Exp $ ** Lua compiler (saves bytecodes to files; also list bytecodes) ** Highly hacked by Nicolas "Pixel" Noble to be transformed into a ** small form-factor LUA compiler. ** See Copyright Notice in lua.h */ #include #include #include #include "lua.h" #include "lauxlib.h" #include "lfunc.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lstring.h" #include "lundump.h" #ifndef PROGNAME #define PROGNAME "luacomp" /* program name */ #endif const char * progname = PROGNAME; /* actual program name */ static Proto * toproto(lua_State * L, int i) { const Closure * c = (const Closure *) lua_topointer(L, i); return c->l.p; } static Proto * combine(lua_State * L, int n) { if (n == 1) return toproto(L, -1); else { int i, pc = 0; Proto * f = luaF_newproto(L); f->source = luaS_newliteral(L, "=(" PROGNAME ")"); f->maxstacksize = 1; f->p = luaM_newvector(L, n, Proto *); f->sizep = n; f->sizecode = 2 * n + 1; f->code = luaM_newvector(L, f->sizecode, Instruction); for (i = 0; i < n; i++) { f->p[i] = toproto(L, i - n); f->code[pc++] = CREATE_ABx(OP_CLOSURE, 0, i); f->code[pc++] = CREATE_ABC(OP_CALL, 0, 1, 1); } f->code[pc++] = CREATE_ABC(OP_RETURN, 0, 1, 0); return f; } } static void strip(lua_State * L, Proto * f) { int i, n = f->sizep; luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); f->lineinfo = NULL; f->sizelineinfo = 0; f->locvars = NULL; f->sizelocvars = 0; f->upvalues = NULL; f->sizeupvalues = 0; f->source = luaS_newliteral(L, "=(none)"); for (i = 0; i < n; i++) strip(L, f->p[i]); } void luacmain(lua_State * L, int stripping, lua_Chunkwriter w, void *uD) { Proto * f; f = combine(L, lua_gettop(L)); if (stripping) strip(L, f); lua_lock(L); luaU_dump(L, f, w, uD); lua_unlock(L); }