/* ** $Id: luacomp.c,v 1.10 2008-08-05 11:27:16 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" #include "ldo.h" #ifndef PROGNAME #define PROGNAME "luacomp" /* program name */ #endif const char * progname = PROGNAME; /* actual program name */ #define toproto(L, i) (clvalue(L->top + (i))->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); setptvalue2s(L, L->top, f); incr_top(L); f->source = luaS_newliteral(L, "=(" PROGNAME ")"); f->maxstacksize = 1; pc = 2 * n + 1; f->code = luaM_newvector(L, pc, Instruction); f->sizecode = pc; f->p = luaM_newvector(L, n, Proto *); f->sizep = n; pc = 0; for (i = 0; i < n; i++) { f->p[i] = toproto(L, i - n - 1); 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; } } #ifdef __cplusplus extern "C" void luacmain(lua_State * L, int stripping, lua_Chunkwriter w, void *uD, int listing); #endif void luacmain(lua_State * L, int stripping, lua_Chunkwriter w, void *uD, int listing) { Proto * f; f = combine(L, lua_gettop(L)); if (listing) luaU_print(f, listing > 1); lua_lock(L); luaU_dump(L, f, w, uD, stripping); lua_unlock(L); }