xref: /illumos-gate/usr/src/uts/common/fs/zfs/lua/ldump.c (revision dfc11533)
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