gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / ldump.c
1
2 /*
3 ** $Id: ldump.c,v 1.4 2003/02/11 23:52:12 lhf Exp $
4 ** save bytecodes
5 ** See Copyright Notice in lua.h
6 */
7
8 #include <stddef.h>
9
10 #define ldump_c
11
12 #include "lua.h"
13
14 #include "lobject.h"
15 #include "lopcodes.h"
16 #include "lstate.h"
17 #include "lundump.h"
18
19 #define DumpVector(b,n,size,D)  DumpBlock(b,(n)*(size),D)
20 #define DumpLiteral(s,D)        DumpBlock("" s,(sizeof(s))-1,D)
21
22 typedef struct {
23   lua_State *L;
24   lua_Chunkwriter write;
25   void *data;
26 } DumpState;
27
28 static void
29 DumpBlock(const void *b, size_t size, DumpState * D)
30 {
31   lua_unlock(D->L);
32   (*D->write) (D->L, b, size, D->data);
33   lua_lock(D->L);
34 }
35
36 static void
37 DumpByte(int y, DumpState * D)
38 {
39   char x = (char)y;
40   DumpBlock(&x, sizeof(x), D);
41 }
42
43 static void
44 DumpInt(int x, DumpState * D)
45 {
46   DumpBlock(&x, sizeof(x), D);
47 }
48
49 static void
50 DumpSize(size_t x, DumpState * D)
51 {
52   DumpBlock(&x, sizeof(x), D);
53 }
54
55 static void
56 DumpNumber(lua_Number x, DumpState * D)
57 {
58   DumpBlock(&x, sizeof(x), D);
59 }
60
61 static void
62 DumpString(TString * s, DumpState * D)
63 {
64   if (s == NULL || getstr(s) == NULL)
65     DumpSize(0, D);
66   else {
67     size_t size = s->tsv.len + 1;      /* include trailing '\0' */
68     DumpSize(size, D);
69     DumpBlock(getstr(s), size, D);
70   }
71 }
72
73 static void
74 DumpCode(const Proto * f, DumpState * D)
75 {
76   DumpInt(f->sizecode, D);
77   DumpVector(f->code, f->sizecode, sizeof(*f->code), D);
78 }
79
80 static void
81 DumpLocals(const Proto * f, DumpState * D)
82 {
83   int i, n = f->sizelocvars;
84   DumpInt(n, D);
85   for (i = 0; i < n; i++) {
86     DumpString(f->locvars[i].varname, D);
87     DumpInt(f->locvars[i].startpc, D);
88     DumpInt(f->locvars[i].endpc, D);
89   }
90 }
91
92 static void
93 DumpLines(const Proto * f, DumpState * D)
94 {
95   DumpInt(f->sizelineinfo, D);
96   DumpVector(f->lineinfo, f->sizelineinfo, sizeof(*f->lineinfo), D);
97 }
98
99 static void
100 DumpUpvalues(const Proto * f, DumpState * D)
101 {
102   int i, n = f->sizeupvalues;
103   DumpInt(n, D);
104   for (i = 0; i < n; i++)
105     DumpString(f->upvalues[i], D);
106 }
107
108 static void DumpFunction(const Proto * f, const TString * p, DumpState * D);
109
110 static void
111 DumpConstants(const Proto * f, DumpState * D)
112 {
113   int i, n;
114   DumpInt(n = f->sizek, D);
115   for (i = 0; i < n; i++) {
116     const TObject *o = &f->k[i];
117     DumpByte(ttype(o), D);
118     switch (ttype(o)) {
119     case LUA_TNUMBER:
120       DumpNumber(nvalue(o), D);
121       break;
122     case LUA_TSTRING:
123       DumpString(tsvalue(o), D);
124       break;
125     case LUA_TNIL:
126       break;
127     default:
128       lua_assert(0);            /* cannot happen */
129       break;
130     }
131   }
132   DumpInt(n = f->sizep, D);
133   for (i = 0; i < n; i++)
134     DumpFunction(f->p[i], f->source, D);
135 }
136
137 static void
138 DumpFunction(const Proto * f, const TString * p, DumpState * D)
139 {
140   DumpString((f->source == p) ? NULL : f->source, D);
141   DumpInt(f->lineDefined, D);
142   DumpByte(f->nups, D);
143   DumpByte(f->numparams, D);
144   DumpByte(f->is_vararg, D);
145   DumpByte(f->maxstacksize, D);
146   DumpLines(f, D);
147   DumpLocals(f, D);
148   DumpUpvalues(f, D);
149   DumpConstants(f, D);
150   DumpCode(f, D);
151 }
152
153 static void
154 DumpHeader(DumpState * D)
155 {
156   DumpLiteral(LUA_SIGNATURE, D);
157   DumpByte(VERSION, D);
158   DumpByte(luaU_endianness(), D);
159   DumpByte(sizeof(int), D);
160   DumpByte(sizeof(size_t), D);
161   DumpByte(sizeof(Instruction), D);
162   DumpByte(SIZE_OP, D);
163   DumpByte(SIZE_A, D);
164   DumpByte(SIZE_B, D);
165   DumpByte(SIZE_C, D);
166   DumpByte(sizeof(lua_Number), D);
167   DumpNumber(TEST_NUMBER, D);
168 }
169
170 /*
171 ** dump function as precompiled chunk
172 */
173 void
174 luaU_dump(lua_State * L, const Proto * Main, lua_Chunkwriter w, void *data)
175 {
176   DumpState D;
177   D.L = L;
178   D.write = w;
179   D.data = data;
180   DumpHeader(&D);
181   DumpFunction(Main, NULL, &D);
182 }