/* ** $Id: luacomp.c,v 1.2 2003-12-11 16:53:30 pixel Exp $ ** Lua compiler (saves bytecodes to files; also list bytecodes) ** 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 static 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; ip[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; ip[i]); } void luacmain(lua_State * L, int stripping, lua_Chunkwriter w, void * uD) { Proto * f; int i; f = combine(L, 1); if (stripping) strip(L, f); luaU_dump(L, f, w, uD); }