1*dfc11533SChris Williamson /*
2*dfc11533SChris Williamson ** $Id: ldump.c,v 2.17.1.1 2013/04/12 18:48:47 roberto Exp $
3*dfc11533SChris Williamson ** save precompiled Lua chunks
4*dfc11533SChris Williamson ** See Copyright Notice in lua.h
5*dfc11533SChris Williamson */
6*dfc11533SChris Williamson
7*dfc11533SChris Williamson #include <sys/zfs_context.h>
8*dfc11533SChris Williamson
9*dfc11533SChris Williamson #define ldump_c
10*dfc11533SChris Williamson #define LUA_CORE
11*dfc11533SChris Williamson
12*dfc11533SChris Williamson #include "lua.h"
13*dfc11533SChris Williamson
14*dfc11533SChris Williamson #include "lobject.h"
15*dfc11533SChris Williamson #include "lstate.h"
16*dfc11533SChris Williamson #include "lundump.h"
17*dfc11533SChris Williamson
18*dfc11533SChris Williamson typedef struct {
19*dfc11533SChris Williamson lua_State* L;
20*dfc11533SChris Williamson lua_Writer writer;
21*dfc11533SChris Williamson void* data;
22*dfc11533SChris Williamson int strip;
23*dfc11533SChris Williamson int status;
24*dfc11533SChris Williamson } DumpState;
25*dfc11533SChris Williamson
26*dfc11533SChris Williamson #define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D)
27*dfc11533SChris Williamson #define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D)
28*dfc11533SChris Williamson
DumpBlock(const void * b,size_t size,DumpState * D)29*dfc11533SChris Williamson static void DumpBlock(const void* b, size_t size, DumpState* D)
30*dfc11533SChris Williamson {
31*dfc11533SChris Williamson if (D->status==0)
32*dfc11533SChris Williamson {
33*dfc11533SChris Williamson lua_unlock(D->L);
34*dfc11533SChris Williamson D->status=(*D->writer)(D->L,b,size,D->data);
35*dfc11533SChris Williamson lua_lock(D->L);
36*dfc11533SChris Williamson }
37*dfc11533SChris Williamson }
38*dfc11533SChris Williamson
DumpChar(int y,DumpState * D)39*dfc11533SChris Williamson static void DumpChar(int y, DumpState* D)
40*dfc11533SChris Williamson {
41*dfc11533SChris Williamson char x=(char)y;
42*dfc11533SChris Williamson DumpVar(x,D);
43*dfc11533SChris Williamson }
44*dfc11533SChris Williamson
DumpInt(int x,DumpState * D)45*dfc11533SChris Williamson static void DumpInt(int x, DumpState* D)
46*dfc11533SChris Williamson {
47*dfc11533SChris Williamson DumpVar(x,D);
48*dfc11533SChris Williamson }
49*dfc11533SChris Williamson
DumpNumber(lua_Number x,DumpState * D)50*dfc11533SChris Williamson static void DumpNumber(lua_Number x, DumpState* D)
51*dfc11533SChris Williamson {
52*dfc11533SChris Williamson DumpVar(x,D);
53*dfc11533SChris Williamson }
54*dfc11533SChris Williamson
DumpVector(const void * b,int n,size_t size,DumpState * D)55*dfc11533SChris Williamson static void DumpVector(const void* b, int n, size_t size, DumpState* D)
56*dfc11533SChris Williamson {
57*dfc11533SChris Williamson DumpInt(n,D);
58*dfc11533SChris Williamson DumpMem(b,n,size,D);
59*dfc11533SChris Williamson }
60*dfc11533SChris Williamson
DumpString(const TString * s,DumpState * D)61*dfc11533SChris Williamson static void DumpString(const TString* s, DumpState* D)
62*dfc11533SChris Williamson {
63*dfc11533SChris Williamson if (s==NULL)
64*dfc11533SChris Williamson {
65*dfc11533SChris Williamson size_t size=0;
66*dfc11533SChris Williamson DumpVar(size,D);
67*dfc11533SChris Williamson }
68*dfc11533SChris Williamson else
69*dfc11533SChris Williamson {
70*dfc11533SChris Williamson size_t size=s->tsv.len+1; /* include trailing '\0' */
71*dfc11533SChris Williamson DumpVar(size,D);
72*dfc11533SChris Williamson DumpBlock(getstr(s),size*sizeof(char),D);
73*dfc11533SChris Williamson }
74*dfc11533SChris Williamson }
75*dfc11533SChris Williamson
76*dfc11533SChris Williamson #define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D)
77*dfc11533SChris Williamson
78*dfc11533SChris Williamson static void DumpFunction(const Proto* f, DumpState* D);
79*dfc11533SChris Williamson
DumpConstants(const Proto * f,DumpState * D)80*dfc11533SChris Williamson static void DumpConstants(const Proto* f, DumpState* D)
81*dfc11533SChris Williamson {
82*dfc11533SChris Williamson int i,n=f->sizek;
83*dfc11533SChris Williamson DumpInt(n,D);
84*dfc11533SChris Williamson for (i=0; i<n; i++)
85*dfc11533SChris Williamson {
86*dfc11533SChris Williamson const TValue* o=&f->k[i];
87*dfc11533SChris Williamson DumpChar(ttypenv(o),D);
88*dfc11533SChris Williamson switch (ttypenv(o))
89*dfc11533SChris Williamson {
90*dfc11533SChris Williamson case LUA_TNIL:
91*dfc11533SChris Williamson break;
92*dfc11533SChris Williamson case LUA_TBOOLEAN:
93*dfc11533SChris Williamson DumpChar(bvalue(o),D);
94*dfc11533SChris Williamson break;
95*dfc11533SChris Williamson case LUA_TNUMBER:
96*dfc11533SChris Williamson DumpNumber(nvalue(o),D);
97*dfc11533SChris Williamson break;
98*dfc11533SChris Williamson case LUA_TSTRING:
99*dfc11533SChris Williamson DumpString(rawtsvalue(o),D);
100*dfc11533SChris Williamson break;
101*dfc11533SChris Williamson default: lua_assert(0);
102*dfc11533SChris Williamson }
103*dfc11533SChris Williamson }
104*dfc11533SChris Williamson n=f->sizep;
105*dfc11533SChris Williamson DumpInt(n,D);
106*dfc11533SChris Williamson for (i=0; i<n; i++) DumpFunction(f->p[i],D);
107*dfc11533SChris Williamson }
108*dfc11533SChris Williamson
DumpUpvalues(const Proto * f,DumpState * D)109*dfc11533SChris Williamson static void DumpUpvalues(const Proto* f, DumpState* D)
110*dfc11533SChris Williamson {
111*dfc11533SChris Williamson int i,n=f->sizeupvalues;
112*dfc11533SChris Williamson DumpInt(n,D);
113*dfc11533SChris Williamson for (i=0; i<n; i++)
114*dfc11533SChris Williamson {
115*dfc11533SChris Williamson DumpChar(f->upvalues[i].instack,D);
116*dfc11533SChris Williamson DumpChar(f->upvalues[i].idx,D);
117*dfc11533SChris Williamson }
118*dfc11533SChris Williamson }
119*dfc11533SChris Williamson
DumpDebug(const Proto * f,DumpState * D)120*dfc11533SChris Williamson static void DumpDebug(const Proto* f, DumpState* D)
121*dfc11533SChris Williamson {
122*dfc11533SChris Williamson int i,n;
123*dfc11533SChris Williamson DumpString((D->strip) ? NULL : f->source,D);
124*dfc11533SChris Williamson n= (D->strip) ? 0 : f->sizelineinfo;
125*dfc11533SChris Williamson DumpVector(f->lineinfo,n,sizeof(int),D);
126*dfc11533SChris Williamson n= (D->strip) ? 0 : f->sizelocvars;
127*dfc11533SChris Williamson DumpInt(n,D);
128*dfc11533SChris Williamson for (i=0; i<n; i++)
129*dfc11533SChris Williamson {
130*dfc11533SChris Williamson DumpString(f->locvars[i].varname,D);
131*dfc11533SChris Williamson DumpInt(f->locvars[i].startpc,D);
132*dfc11533SChris Williamson DumpInt(f->locvars[i].endpc,D);
133*dfc11533SChris Williamson }
134*dfc11533SChris Williamson n= (D->strip) ? 0 : f->sizeupvalues;
135*dfc11533SChris Williamson DumpInt(n,D);
136*dfc11533SChris Williamson for (i=0; i<n; i++) DumpString(f->upvalues[i].name,D);
137*dfc11533SChris Williamson }
138*dfc11533SChris Williamson
DumpFunction(const Proto * f,DumpState * D)139*dfc11533SChris Williamson static void DumpFunction(const Proto* f, DumpState* D)
140*dfc11533SChris Williamson {
141*dfc11533SChris Williamson DumpInt(f->linedefined,D);
142*dfc11533SChris Williamson DumpInt(f->lastlinedefined,D);
143*dfc11533SChris Williamson DumpChar(f->numparams,D);
144*dfc11533SChris Williamson DumpChar(f->is_vararg,D);
145*dfc11533SChris Williamson DumpChar(f->maxstacksize,D);
146*dfc11533SChris Williamson DumpCode(f,D);
147*dfc11533SChris Williamson DumpConstants(f,D);
148*dfc11533SChris Williamson DumpUpvalues(f,D);
149*dfc11533SChris Williamson DumpDebug(f,D);
150*dfc11533SChris Williamson }
151*dfc11533SChris Williamson
DumpHeader(DumpState * D)152*dfc11533SChris Williamson static void DumpHeader(DumpState* D)
153*dfc11533SChris Williamson {
154*dfc11533SChris Williamson lu_byte h[LUAC_HEADERSIZE];
155*dfc11533SChris Williamson luaU_header(h);
156*dfc11533SChris Williamson DumpBlock(h,LUAC_HEADERSIZE,D);
157*dfc11533SChris Williamson }
158*dfc11533SChris Williamson
159*dfc11533SChris Williamson /*
160*dfc11533SChris Williamson ** dump Lua function as precompiled chunk
161*dfc11533SChris Williamson */
luaU_dump(lua_State * L,const Proto * f,lua_Writer w,void * data,int strip)162*dfc11533SChris Williamson int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
163*dfc11533SChris Williamson {
164*dfc11533SChris Williamson DumpState D;
165*dfc11533SChris Williamson D.L=L;
166*dfc11533SChris Williamson D.writer=w;
167*dfc11533SChris Williamson D.data=data;
168*dfc11533SChris Williamson D.strip=strip;
169*dfc11533SChris Williamson D.status=0;
170*dfc11533SChris Williamson DumpHeader(&D);
171*dfc11533SChris Williamson DumpFunction(f,&D);
172*dfc11533SChris Williamson return D.status;
173*dfc11533SChris Williamson }
174