diff options
author | Pavel Labath <pavelo@centrum.sk> | 2011-05-16 10:58:21 (GMT) |
---|---|---|
committer | Pavel Labath <pavelo@centrum.sk> | 2011-06-15 15:33:48 (GMT) |
commit | d4c5d99bcbf614e31e4f724319437e82d7f2a208 (patch) | |
tree | 84028219313ee62cc4bcccec2e3e2604e56c9dac /libs/lua/src/print.c | |
parent | db243c1d343781a1466e1b863e174427cd37e37f (diff) | |
download | fluxbox_pavel-d4c5d99bcbf614e31e4f724319437e82d7f2a208.zip fluxbox_pavel-d4c5d99bcbf614e31e4f724319437e82d7f2a208.tar.bz2 |
Add lua as an internal library in libs/lua
Diffstat (limited to 'libs/lua/src/print.c')
-rw-r--r-- | libs/lua/src/print.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/libs/lua/src/print.c b/libs/lua/src/print.c new file mode 100644 index 0000000..e240cfc --- /dev/null +++ b/libs/lua/src/print.c | |||
@@ -0,0 +1,227 @@ | |||
1 | /* | ||
2 | ** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $ | ||
3 | ** print bytecodes | ||
4 | ** See Copyright Notice in lua.h | ||
5 | */ | ||
6 | |||
7 | #include <ctype.h> | ||
8 | #include <stdio.h> | ||
9 | |||
10 | #define luac_c | ||
11 | #define LUA_CORE | ||
12 | |||
13 | #include "ldebug.h" | ||
14 | #include "lobject.h" | ||
15 | #include "lopcodes.h" | ||
16 | #include "lundump.h" | ||
17 | |||
18 | #define PrintFunction luaU_print | ||
19 | |||
20 | #define Sizeof(x) ((int)sizeof(x)) | ||
21 | #define VOID(p) ((const void*)(p)) | ||
22 | |||
23 | static void PrintString(const TString* ts) | ||
24 | { | ||
25 | const char* s=getstr(ts); | ||
26 | size_t i,n=ts->tsv.len; | ||
27 | putchar('"'); | ||
28 | for (i=0; i<n; i++) | ||
29 | { | ||
30 | int c=s[i]; | ||
31 | switch (c) | ||
32 | { | ||
33 | case '"': printf("\\\""); break; | ||
34 | case '\\': printf("\\\\"); break; | ||
35 | case '\a': printf("\\a"); break; | ||
36 | case '\b': printf("\\b"); break; | ||
37 | case '\f': printf("\\f"); break; | ||
38 | case '\n': printf("\\n"); break; | ||
39 | case '\r': printf("\\r"); break; | ||
40 | case '\t': printf("\\t"); break; | ||
41 | case '\v': printf("\\v"); break; | ||
42 | default: if (isprint((unsigned char)c)) | ||
43 | putchar(c); | ||
44 | else | ||
45 | printf("\\%03u",(unsigned char)c); | ||
46 | } | ||
47 | } | ||
48 | putchar('"'); | ||
49 | } | ||
50 | |||
51 | static void PrintConstant(const Proto* f, int i) | ||
52 | { | ||
53 | const TValue* o=&f->k[i]; | ||
54 | switch (ttype(o)) | ||
55 | { | ||
56 | case LUA_TNIL: | ||
57 | printf("nil"); | ||
58 | break; | ||
59 | case LUA_TBOOLEAN: | ||
60 | printf(bvalue(o) ? "true" : "false"); | ||
61 | break; | ||
62 | case LUA_TNUMBER: | ||
63 | printf(LUA_NUMBER_FMT,nvalue(o)); | ||
64 | break; | ||
65 | case LUA_TSTRING: | ||
66 | PrintString(rawtsvalue(o)); | ||
67 | break; | ||
68 | default: /* cannot happen */ | ||
69 | printf("? type=%d",ttype(o)); | ||
70 | break; | ||
71 | } | ||
72 | } | ||
73 | |||
74 | static void PrintCode(const Proto* f) | ||
75 | { | ||
76 | const Instruction* code=f->code; | ||
77 | int pc,n=f->sizecode; | ||
78 | for (pc=0; pc<n; pc++) | ||
79 | { | ||
80 | Instruction i=code[pc]; | ||
81 | OpCode o=GET_OPCODE(i); | ||
82 | int a=GETARG_A(i); | ||
83 | int b=GETARG_B(i); | ||
84 | int c=GETARG_C(i); | ||
85 | int bx=GETARG_Bx(i); | ||
86 | int sbx=GETARG_sBx(i); | ||
87 | int line=getline(f,pc); | ||
88 | printf("\t%d\t",pc+1); | ||
89 | if (line>0) printf("[%d]\t",line); else printf("[-]\t"); | ||
90 | printf("%-9s\t",luaP_opnames[o]); | ||
91 | switch (getOpMode(o)) | ||
92 | { | ||
93 | case iABC: | ||
94 | printf("%d",a); | ||
95 | if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); | ||
96 | if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); | ||
97 | break; | ||
98 | case iABx: | ||
99 | if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); | ||
100 | break; | ||
101 | case iAsBx: | ||
102 | if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); | ||
103 | break; | ||
104 | } | ||
105 | switch (o) | ||
106 | { | ||
107 | case OP_LOADK: | ||
108 | printf("\t; "); PrintConstant(f,bx); | ||
109 | break; | ||
110 | case OP_GETUPVAL: | ||
111 | case OP_SETUPVAL: | ||
112 | printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); | ||
113 | break; | ||
114 | case OP_GETGLOBAL: | ||
115 | case OP_SETGLOBAL: | ||
116 | printf("\t; %s",svalue(&f->k[bx])); | ||
117 | break; | ||
118 | case OP_GETTABLE: | ||
119 | case OP_SELF: | ||
120 | if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } | ||
121 | break; | ||
122 | case OP_SETTABLE: | ||
123 | case OP_ADD: | ||
124 | case OP_SUB: | ||
125 | case OP_MUL: | ||
126 | case OP_DIV: | ||
127 | case OP_POW: | ||
128 | case OP_EQ: | ||
129 | case OP_LT: | ||
130 | case OP_LE: | ||
131 | if (ISK(b) || ISK(c)) | ||
132 | { | ||
133 | printf("\t; "); | ||
134 | if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); | ||
135 | printf(" "); | ||
136 | if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); | ||
137 | } | ||
138 | break; | ||
139 | case OP_JMP: | ||
140 | case OP_FORLOOP: | ||
141 | case OP_FORPREP: | ||
142 | printf("\t; to %d",sbx+pc+2); | ||
143 | break; | ||
144 | case OP_CLOSURE: | ||
145 | printf("\t; %p",VOID(f->p[bx])); | ||
146 | break; | ||
147 | case OP_SETLIST: | ||
148 | if (c==0) printf("\t; %d",(int)code[++pc]); | ||
149 | else printf("\t; %d",c); | ||
150 | break; | ||
151 | default: | ||
152 | break; | ||
153 | } | ||
154 | printf("\n"); | ||
155 | } | ||
156 | } | ||
157 | |||
158 | #define SS(x) (x==1)?"":"s" | ||
159 | #define S(x) x,SS(x) | ||
160 | |||
161 | static void PrintHeader(const Proto* f) | ||
162 | { | ||
163 | const char* s=getstr(f->source); | ||
164 | if (*s=='@' || *s=='=') | ||
165 | s++; | ||
166 | else if (*s==LUA_SIGNATURE[0]) | ||
167 | s="(bstring)"; | ||
168 | else | ||
169 | s="(string)"; | ||
170 | printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", | ||
171 | (f->linedefined==0)?"main":"function",s, | ||
172 | f->linedefined,f->lastlinedefined, | ||
173 | S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); | ||
174 | printf("%d%s param%s, %d slot%s, %d upvalue%s, ", | ||
175 | f->numparams,f->is_vararg?"+":"",SS(f->numparams), | ||
176 | S(f->maxstacksize),S(f->nups)); | ||
177 | printf("%d local%s, %d constant%s, %d function%s\n", | ||
178 | S(f->sizelocvars),S(f->sizek),S(f->sizep)); | ||
179 | } | ||
180 | |||
181 | static void PrintConstants(const Proto* f) | ||
182 | { | ||
183 | int i,n=f->sizek; | ||
184 | printf("constants (%d) for %p:\n",n,VOID(f)); | ||
185 | for (i=0; i<n; i++) | ||
186 | { | ||
187 | printf("\t%d\t",i+1); | ||
188 | PrintConstant(f,i); | ||
189 | printf("\n"); | ||
190 | } | ||
191 | } | ||
192 | |||
193 | static void PrintLocals(const Proto* f) | ||
194 | { | ||
195 | int i,n=f->sizelocvars; | ||
196 | printf("locals (%d) for %p:\n",n,VOID(f)); | ||
197 | for (i=0; i<n; i++) | ||
198 | { | ||
199 | printf("\t%d\t%s\t%d\t%d\n", | ||
200 | i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | static void PrintUpvalues(const Proto* f) | ||
205 | { | ||
206 | int i,n=f->sizeupvalues; | ||
207 | printf("upvalues (%d) for %p:\n",n,VOID(f)); | ||
208 | if (f->upvalues==NULL) return; | ||
209 | for (i=0; i<n; i++) | ||
210 | { | ||
211 | printf("\t%d\t%s\n",i,getstr(f->upvalues[i])); | ||
212 | } | ||
213 | } | ||
214 | |||
215 | void PrintFunction(const Proto* f, int full) | ||
216 | { | ||
217 | int i,n=f->sizep; | ||
218 | PrintHeader(f); | ||
219 | PrintCode(f); | ||
220 | if (full) | ||
221 | { | ||
222 | PrintConstants(f); | ||
223 | PrintLocals(f); | ||
224 | PrintUpvalues(f); | ||
225 | } | ||
226 | for (i=0; i<n; i++) PrintFunction(f->p[i],full); | ||
227 | } | ||