diff options
Diffstat (limited to 'src/luac')
| -rw-r--r-- | src/luac/Makefile | 31 | ||||
| -rw-r--r-- | src/luac/README | 18 | ||||
| -rw-r--r-- | src/luac/luac.c | 203 | ||||
| -rw-r--r-- | src/luac/print.c | 221 |
4 files changed, 0 insertions, 473 deletions
diff --git a/src/luac/Makefile b/src/luac/Makefile deleted file mode 100644 index 509577bb..00000000 --- a/src/luac/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# makefile for Lua compiler - -LUA= ../.. - -include $(LUA)/config - -INCS= -I$(INC) -I.. $(EXTRA_INCS) -OBJS= luac.o print.o -SRCS= luac.c print.c - -T= $(BIN)/luac - -all: $T - -$T: $(OBJS) $(LIB)/liblua.a ../lib/lauxlib.o - $(CC) -o $@ $(MYLDFLAGS) $(OBJS) ../lib/lauxlib.o -L$(LIB) -llua $(EXTRA_LIBS) - -$(LIB)/liblua.a: - cd ..; $(MAKE) - -../lib/lauxlib.o: - cd ../lib; $(MAKE) lauxlib.o - -clean: - rm -f $(OBJS) $T - -co: - co -q -f -M $(SRCS) - -klean: clean - rm -f $(SRCS) diff --git a/src/luac/README b/src/luac/README deleted file mode 100644 index 00dd1cd4..00000000 --- a/src/luac/README +++ /dev/null @@ -1,18 +0,0 @@ -This is luac, the Lua compiler. -There are man pages for it in both nroff and html in ../../doc. - -luac translates Lua programs into binary files that can be loaded later. -The main advantages of pre-compiling chunks are: faster loading, protecting -source code from user changes, and off-line syntax error detection. -luac can also be used to learn about the Lua virtual machine. - -Usage: luac [options] [filenames]. Available options are: - - process stdin - -l list - -o name output to file `name' (default is "luac.out") - -p parse only - -s strip debug information - -v show version information - -- stop handling options - -luac is also an example of how to use the internals of Lua (politely). diff --git a/src/luac/luac.c b/src/luac/luac.c deleted file mode 100644 index dfbcab05..00000000 --- a/src/luac/luac.c +++ /dev/null @@ -1,203 +0,0 @@ -/* -** $Id: luac.c,v 1.49 2004/09/01 21:22:34 lhf Exp $ -** Lua compiler (saves bytecodes to files; also list bytecodes) -** See Copyright Notice in lua.h -*/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#define luac_c -#define LUA_CORE - -#include "lua.h" -#include "lauxlib.h" - -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstring.h" -#include "lundump.h" - -#ifndef PROGNAME -#define PROGNAME "luac" /* default program name */ -#endif - -#ifndef OUTPUT -#define OUTPUT "luac.out" /* default output file */ -#endif - -static int listing=0; /* list bytecodes? */ -static int dumping=1; /* dump bytecodes? */ -static int stripping=0; /* strip debug information? */ -static char Output[]={ OUTPUT }; /* default output file name */ -static const char* output=Output; /* actual output file name */ -static const char* progname=PROGNAME; /* actual program name */ - -static void fatal(const char* message) -{ - fprintf(stderr,"%s: %s\n",progname,message); - exit(EXIT_FAILURE); -} - -static void cannot(const char* what) -{ - fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); - exit(EXIT_FAILURE); -} - -static void usage(const char* message) -{ - if (*message=='-') - fprintf(stderr,"%s: unrecognized option `%s'\n",progname,message); - else - fprintf(stderr,"%s: %s\n",progname,message); - fprintf(stderr, - "usage: %s [options] [filenames].\n" - "Available options are:\n" - " - process stdin\n" - " -l list\n" - " -o name output to file `name' (default is \"%s\")\n" - " -p parse only\n" - " -s strip debug information\n" - " -v show version information\n" - " -- stop handling options\n", - progname,Output); - exit(EXIT_FAILURE); -} - -#define IS(s) (strcmp(argv[i],s)==0) - -static int doargs(int argc, char* argv[]) -{ - int i; - if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; - for (i=1; i<argc; i++) - { - if (*argv[i]!='-') /* end of options; keep it */ - break; - else if (IS("--")) /* end of options; skip it */ - { - ++i; - break; - } - else if (IS("-")) /* end of options; use stdin */ - break; - else if (IS("-l")) /* list */ - ++listing; - else if (IS("-o")) /* output file */ - { - output=argv[++i]; - if (output==NULL || *output==0) usage("`-o' needs argument"); - if (IS("-")) output=NULL; - } - else if (IS("-p")) /* parse only */ - dumping=0; - else if (IS("-s")) /* strip debug information */ - stripping=1; - else if (IS("-v")) /* show version */ - { - printf("%s %s\n",LUA_VERSION,LUA_COPYRIGHT); - if (argc==2) exit(EXIT_SUCCESS); - } - else /* unknown option */ - usage(argv[i]); - } - if (i==argc && (listing || !dumping)) - { - dumping=0; - argv[--i]=Output; - } - return i; -} - -#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; - 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; - } -} - -static int writer(lua_State* L, const void* p, size_t size, void* u) -{ - UNUSED(L); - return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); -} - -void unprint(lua_State* L, const char* name); - -struct Smain { - int argc; - char **argv; -}; - -static int pmain(lua_State *L) -{ - struct Smain *s = (struct Smain *)lua_touserdata(L, 1); - int argc=s->argc; - char **argv=s->argv; - Proto* f; - int i; - if (!lua_checkstack(L,argc)) fatal("too many input files"); - for (i=0; i<argc; i++) - { - const char* filename=IS("-") ? NULL : argv[i]; - if (luaL_loadfile(L,filename)!=0) fatal(lua_tostring(L,-1)); - } - f=combine(L,argc); - if (listing) luaU_print(f,listing>1); - if (dumping) - { - FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); - if (D==NULL) cannot("open"); - lua_lock(L); - luaU_dump(L,f,writer,D,stripping); - lua_unlock(L); - if (ferror(D)) cannot("write"); - if (fclose(D)) cannot("close"); - } - return 0; -} - -int main(int argc, char* argv[]) -{ - lua_State* L; - struct Smain s; - int i=doargs(argc,argv); - argc-=i; argv+=i; - if (argc<=0) usage("no input files given"); - L=lua_open(); - if (L==NULL) fatal("not enough memory for state"); - s.argc=argc; - s.argv=argv; - if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1)); - lua_close(L); - return EXIT_SUCCESS; -} diff --git a/src/luac/print.c b/src/luac/print.c deleted file mode 100644 index f273ebfc..00000000 --- a/src/luac/print.c +++ /dev/null @@ -1,221 +0,0 @@ -/* -** $Id: print.c,v 1.49 2004/11/25 09:31:41 lhf Exp $ -** print bytecodes -** See Copyright Notice in lua.h -*/ - -#include <ctype.h> -#include <stdio.h> - -#define LUA_CORE - -#include "ldebug.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lundump.h" - -#define Sizeof(x) ((int)sizeof(x)) -#define VOID(p) ((const void*)(p)) - -static void PrintString(const Proto* f, int n) -{ - const char* s=svalue(&f->k[n]); - putchar('"'); - for (; *s; s++) - { - switch (*s) - { - case '"': printf("\\\""); break; - case '\a': printf("\\a"); break; - case '\b': printf("\\b"); break; - case '\f': printf("\\f"); break; - case '\n': printf("\\n"); break; - case '\r': printf("\\r"); break; - case '\t': printf("\\t"); break; - case '\v': printf("\\v"); break; - default: printf(isprint((unsigned char)*s) ? "%c" : "\\%03d",*s); - } - } - putchar('"'); -} - -static void PrintConstant(const Proto* f, int i) -{ - const TValue* o=&f->k[i]; - switch (ttype(o)) - { - case LUA_TNIL: - printf("nil"); - break; - case LUA_TBOOLEAN: - printf(bvalue(o) ? "true" : "false"); - break; - case LUA_TNUMBER: - printf(LUA_NUMBER_FMT,nvalue(o)); - break; - case LUA_TSTRING: - PrintString(f,i); - break; - default: /* cannot happen */ - printf("? type=%d",ttype(o)); - break; - } -} - -static void PrintCode(const Proto* f) -{ - const Instruction* code=f->code; - int pc,n=f->sizecode; - for (pc=0; pc<n; pc++) - { - Instruction i=code[pc]; - OpCode o=GET_OPCODE(i); - int a=GETARG_A(i); - int b=GETARG_B(i); - int c=GETARG_C(i); - int bx=GETARG_Bx(i); - int sbx=GETARG_sBx(i); - int line=getline(f,pc); -#if 0 - printf("%0*lX",Sizeof(i)*2,i); -#endif - printf("\t%d\t",pc+1); - if (line>0) printf("[%d]\t",line); else printf("[-]\t"); - printf("%-9s\t",luaP_opnames[o]); - switch (getOpMode(o)) - { - case iABC: - printf("%d",a); - if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); - if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); - break; - case iABx: - if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); - break; - case iAsBx: - if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); - break; - } - switch (o) - { - case OP_LOADK: - printf("\t; "); PrintConstant(f,bx); - break; - case OP_GETUPVAL: - case OP_SETUPVAL: - printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); - break; - case OP_GETGLOBAL: - case OP_SETGLOBAL: - printf("\t; %s",svalue(&f->k[bx])); - break; - case OP_GETTABLE: - case OP_SELF: - if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } - break; - case OP_SETTABLE: - case OP_ADD: - case OP_SUB: - case OP_MUL: - case OP_DIV: - case OP_POW: - case OP_EQ: - case OP_LT: - case OP_LE: - if (ISK(b) || ISK(c)) - { - printf("\t; "); - if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); - printf(" "); - if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); - } - break; - case OP_JMP: - case OP_FORLOOP: - case OP_FORPREP: - case OP_TFORPREP: - printf("\t; to %d",sbx+pc+2); - break; - case OP_CLOSURE: - printf("\t; %p",VOID(f->p[bx])); - break; - default: - break; - } - printf("\n"); - } -} - -static const char* Source(const Proto* f) -{ - const char* s=getstr(f->source); - if (*s=='@' || *s=='=') - return s+1; - else if (*s==LUA_SIGNATURE[0]) - return "(bstring)"; - else - return "(string)"; -} - -#define SS(x) (x==1)?"":"s" -#define S(x) x,SS(x) - -static void PrintHeader(const Proto* f) -{ - printf("\n%s <%s:%d> (%d instruction%s, %d bytes at %p)\n", - (f->lineDefined==0)?"main":"function",Source(f),f->lineDefined, - S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); - printf("%d%s param%s, %d stack%s, %d upvalue%s, ", - f->numparams,f->is_vararg?"+":"",SS(f->numparams),S(f->maxstacksize), - S(f->nups)); - printf("%d local%s, %d constant%s, %d function%s\n", - S(f->sizelocvars),S(f->sizek),S(f->sizep)); -} - -static void PrintConstants(const Proto* f) -{ - int i,n=f->sizek; - printf("constants (%d) for %p:\n",n,VOID(f)); - for (i=0; i<n; i++) - { - printf("\t%d\t",i+1); - PrintConstant(f,i); - printf("\n"); - } -} - -static void PrintLocals(const Proto* f) -{ - int i,n=f->sizelocvars; - printf("locals (%d) for %p:\n",n,VOID(f)); - for (i=0; i<n; i++) - { - printf("\t%d\t%s\t%d\t%d\n", - i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); - } -} - -static void PrintUpvalues(const Proto* f) -{ - int i,n=f->sizeupvalues; - printf("upvalues (%d) for %p:\n",n,VOID(f)); - if (f->upvalues==NULL) return; - for (i=0; i<n; i++) - { - printf("\t%d\t%s\n",i,getstr(f->upvalues[i])); - } -} - -void luaU_print(const Proto* f, int full) -{ - int i,n=f->sizep; - PrintHeader(f); - PrintCode(f); - if (full) - { - PrintConstants(f); - PrintLocals(f); - PrintUpvalues(f); - } - for (i=0; i<n; i++) luaU_print(f->p[i],full); -} |
