3 ** save precompiled Lua chunks
4 ** See Copyright Notice in lua.h
32 ** All high-level dumps go through dumpVector; you can change it to
33 ** change the endianness of the result
35 #define dumpVector(D,v,n) dumpBlock(D,v,(n)*sizeof((v)[0]))
37 #define dumpLiteral(D, s) dumpBlock(D,s,sizeof(s) - sizeof(char))
40 static void dumpBlock (DumpState *D, const void *b, size_t size) {
41 if (D->status == 0 && size > 0) {
43 D->status = (*D->writer)(D->L, b, size, D->data);
49 #define dumpVar(D,x) dumpVector(D,&x,1)
52 static void dumpByte (DumpState *D, int y) {
53 lu_byte x = (lu_byte)y;
58 /* dumpInt Buff Size */
59 #define DIBS ((sizeof(size_t) * 8 / 7) + 1)
61 static void dumpSize (DumpState *D, size_t x) {
65 buff[DIBS - (++n)] = x & 0x7f; /* fill buffer in reverse order */
68 buff[DIBS - 1] |= 0x80; /* mark last byte */
69 dumpVector(D, buff + DIBS - n, n);
73 static void dumpInt (DumpState *D, int x) {
78 static void dumpNumber (DumpState *D, lua_Number x) {
83 static void dumpInteger (DumpState *D, lua_Integer x) {
88 static void dumpString (DumpState *D, const TString *s) {
92 size_t size = tsslen(s);
93 const char *str = getstr(s);
94 dumpSize(D, size + 1);
95 dumpVector(D, str, size);
100 static void dumpCode (DumpState *D, const Proto *f) {
101 dumpInt(D, f->sizecode);
102 dumpVector(D, f->code, f->sizecode);
106 static void dumpFunction(DumpState *D, const Proto *f, TString *psource);
108 static void dumpConstants (DumpState *D, const Proto *f) {
112 for (i = 0; i < n; i++) {
113 const TValue *o = &f->k[i];
114 int tt = ttypetag(o);
118 dumpNumber(D, fltvalue(o));
121 dumpInteger(D, ivalue(o));
125 dumpString(D, tsvalue(o));
128 lua_assert(tt == LUA_VNIL || tt == LUA_VFALSE || tt == LUA_VTRUE);
134 static void dumpProtos (DumpState *D, const Proto *f) {
138 for (i = 0; i < n; i++)
139 dumpFunction(D, f->p[i], f->source);
143 static void dumpUpvalues (DumpState *D, const Proto *f) {
144 int i, n = f->sizeupvalues;
146 for (i = 0; i < n; i++) {
147 dumpByte(D, f->upvalues[i].instack);
148 dumpByte(D, f->upvalues[i].idx);
149 dumpByte(D, f->upvalues[i].kind);
154 static void dumpDebug (DumpState *D, const Proto *f) {
156 n = (D->strip) ? 0 : f->sizelineinfo;
158 dumpVector(D, f->lineinfo, n);
159 n = (D->strip) ? 0 : f->sizeabslineinfo;
161 for (i = 0; i < n; i++) {
162 dumpInt(D, f->abslineinfo[i].pc);
163 dumpInt(D, f->abslineinfo[i].line);
165 n = (D->strip) ? 0 : f->sizelocvars;
167 for (i = 0; i < n; i++) {
168 dumpString(D, f->locvars[i].varname);
169 dumpInt(D, f->locvars[i].startpc);
170 dumpInt(D, f->locvars[i].endpc);
172 n = (D->strip) ? 0 : f->sizeupvalues;
174 for (i = 0; i < n; i++)
175 dumpString(D, f->upvalues[i].name);
179 static void dumpFunction (DumpState *D, const Proto *f, TString *psource) {
180 if (D->strip || f->source == psource)
181 dumpString(D, NULL); /* no debug info or same source as its parent */
183 dumpString(D, f->source);
184 dumpInt(D, f->linedefined);
185 dumpInt(D, f->lastlinedefined);
186 dumpByte(D, f->numparams);
187 dumpByte(D, f->is_vararg);
188 dumpByte(D, f->maxstacksize);
197 static void dumpHeader (DumpState *D) {
198 dumpLiteral(D, LUA_SIGNATURE);
199 dumpByte(D, LUAC_VERSION);
200 dumpByte(D, LUAC_FORMAT);
201 dumpLiteral(D, LUAC_DATA);
202 dumpByte(D, sizeof(Instruction));
203 dumpByte(D, sizeof(lua_Integer));
204 dumpByte(D, sizeof(lua_Number));
205 dumpInteger(D, LUAC_INT);
206 dumpNumber(D, LUAC_NUM);
211 ** dump Lua function as precompiled chunk
213 int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,
222 dumpByte(&D, f->sizeupvalues);
223 dumpFunction(&D, f, NULL);