hirlite 0.0.2 → 0.0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/ext/hirlite_ext/extconf.rb +2 -2
  3. data/lib/hirlite/version.rb +1 -1
  4. data/vendor/rlite/deps/lua/Makefile +128 -0
  5. data/vendor/rlite/deps/lua/src/fpconv.c +205 -0
  6. data/vendor/rlite/deps/lua/src/fpconv.h +22 -0
  7. data/vendor/rlite/deps/lua/src/lapi.c +1087 -0
  8. data/vendor/rlite/deps/lua/src/lapi.h +16 -0
  9. data/vendor/rlite/deps/lua/src/lauxlib.c +652 -0
  10. data/vendor/rlite/deps/lua/src/lauxlib.h +174 -0
  11. data/vendor/rlite/deps/lua/src/lbaselib.c +653 -0
  12. data/vendor/rlite/deps/lua/src/lcode.c +831 -0
  13. data/vendor/rlite/deps/lua/src/lcode.h +76 -0
  14. data/vendor/rlite/deps/lua/src/ldblib.c +398 -0
  15. data/vendor/rlite/deps/lua/src/ldebug.c +638 -0
  16. data/vendor/rlite/deps/lua/src/ldebug.h +33 -0
  17. data/vendor/rlite/deps/lua/src/ldo.c +519 -0
  18. data/vendor/rlite/deps/lua/src/ldo.h +57 -0
  19. data/vendor/rlite/deps/lua/src/ldump.c +164 -0
  20. data/vendor/rlite/deps/lua/src/lfunc.c +174 -0
  21. data/vendor/rlite/deps/lua/src/lfunc.h +34 -0
  22. data/vendor/rlite/deps/lua/src/lgc.c +710 -0
  23. data/vendor/rlite/deps/lua/src/lgc.h +110 -0
  24. data/vendor/rlite/deps/lua/src/linit.c +38 -0
  25. data/vendor/rlite/deps/lua/src/liolib.c +556 -0
  26. data/vendor/rlite/deps/lua/src/llex.c +463 -0
  27. data/vendor/rlite/deps/lua/src/llex.h +81 -0
  28. data/vendor/rlite/deps/lua/src/llimits.h +128 -0
  29. data/vendor/rlite/deps/lua/src/lmathlib.c +263 -0
  30. data/vendor/rlite/deps/lua/src/lmem.c +86 -0
  31. data/vendor/rlite/deps/lua/src/lmem.h +49 -0
  32. data/vendor/rlite/deps/lua/src/loadlib.c +666 -0
  33. data/vendor/rlite/deps/lua/src/lobject.c +214 -0
  34. data/vendor/rlite/deps/lua/src/lobject.h +381 -0
  35. data/vendor/rlite/deps/lua/src/lopcodes.c +102 -0
  36. data/vendor/rlite/deps/lua/src/lopcodes.h +268 -0
  37. data/vendor/rlite/deps/lua/src/loslib.c +243 -0
  38. data/vendor/rlite/deps/lua/src/lparser.c +1339 -0
  39. data/vendor/rlite/deps/lua/src/lparser.h +82 -0
  40. data/vendor/rlite/deps/lua/src/lstate.c +214 -0
  41. data/vendor/rlite/deps/lua/src/lstate.h +169 -0
  42. data/vendor/rlite/deps/lua/src/lstring.c +111 -0
  43. data/vendor/rlite/deps/lua/src/lstring.h +31 -0
  44. data/vendor/rlite/deps/lua/src/lstrlib.c +871 -0
  45. data/vendor/rlite/deps/lua/src/ltable.c +588 -0
  46. data/vendor/rlite/deps/lua/src/ltable.h +40 -0
  47. data/vendor/rlite/deps/lua/src/ltablib.c +287 -0
  48. data/vendor/rlite/deps/lua/src/ltm.c +75 -0
  49. data/vendor/rlite/deps/lua/src/ltm.h +54 -0
  50. data/vendor/rlite/deps/lua/src/lua.c +392 -0
  51. data/vendor/rlite/deps/lua/src/lua.h +388 -0
  52. data/vendor/rlite/deps/lua/src/lua_bit.c +189 -0
  53. data/vendor/rlite/deps/lua/src/lua_cjson.c +1427 -0
  54. data/vendor/rlite/deps/lua/src/lua_cmsgpack.c +957 -0
  55. data/vendor/rlite/deps/lua/src/lua_struct.c +421 -0
  56. data/vendor/rlite/deps/lua/src/luac.c +200 -0
  57. data/vendor/rlite/deps/lua/src/luaconf.h +763 -0
  58. data/vendor/rlite/deps/lua/src/lualib.h +53 -0
  59. data/vendor/rlite/deps/lua/src/lundump.c +227 -0
  60. data/vendor/rlite/deps/lua/src/lundump.h +36 -0
  61. data/vendor/rlite/deps/lua/src/lvm.c +767 -0
  62. data/vendor/rlite/deps/lua/src/lvm.h +36 -0
  63. data/vendor/rlite/deps/lua/src/lzio.c +82 -0
  64. data/vendor/rlite/deps/lua/src/lzio.h +67 -0
  65. data/vendor/rlite/deps/lua/src/print.c +227 -0
  66. data/vendor/rlite/deps/lua/src/strbuf.c +251 -0
  67. data/vendor/rlite/deps/lua/src/strbuf.h +154 -0
  68. data/vendor/rlite/src/Makefile +97 -25
  69. data/vendor/rlite/{deps → src}/crc64.c +0 -0
  70. data/vendor/rlite/{deps → src}/crc64.h +0 -0
  71. data/vendor/rlite/src/dump.c +2 -2
  72. data/vendor/rlite/{deps → src}/endianconv.h +0 -0
  73. data/vendor/rlite/src/hirlite.c +134 -90
  74. data/vendor/rlite/src/hirlite.h +34 -1
  75. data/vendor/rlite/{deps → src}/hyperloglog.c +0 -0
  76. data/vendor/rlite/{deps → src}/hyperloglog.h +0 -0
  77. data/vendor/rlite/{deps → src}/lzf.h +0 -0
  78. data/vendor/rlite/{deps → src}/lzfP.h +0 -0
  79. data/vendor/rlite/{deps → src}/lzf_c.c +0 -0
  80. data/vendor/rlite/{deps → src}/lzf_d.c +0 -0
  81. data/vendor/rlite/src/page_btree.c +10 -10
  82. data/vendor/rlite/src/page_btree.h +2 -2
  83. data/vendor/rlite/src/page_list.c +3 -3
  84. data/vendor/rlite/src/page_list.h +1 -1
  85. data/vendor/rlite/src/page_multi_string.c +1 -1
  86. data/vendor/rlite/src/page_skiplist.c +1 -1
  87. data/vendor/rlite/src/page_skiplist.h +1 -1
  88. data/vendor/rlite/src/rand.c +93 -0
  89. data/vendor/rlite/src/rand.h +38 -0
  90. data/vendor/rlite/src/restore.c +286 -155
  91. data/vendor/rlite/src/restore.h +6 -0
  92. data/vendor/rlite/src/rlite.c +30 -30
  93. data/vendor/rlite/src/rlite.h +1 -1
  94. data/vendor/rlite/src/scripting.c +1138 -0
  95. data/vendor/rlite/src/scripting.h +10 -0
  96. data/vendor/rlite/{deps → src}/sha1.c +0 -0
  97. data/vendor/rlite/{deps → src}/sha1.h +0 -0
  98. data/vendor/rlite/src/solarisfixes.h +54 -0
  99. data/vendor/rlite/src/sort.c +4 -2
  100. data/vendor/rlite/src/sort.h +1 -1
  101. data/vendor/rlite/src/type_string.c +1 -1
  102. data/vendor/rlite/src/util.c +4 -4
  103. data/vendor/rlite/src/util.h +3 -3
  104. data/vendor/rlite/{deps → src}/utilfromredis.c +0 -0
  105. data/vendor/rlite/{deps → src}/utilfromredis.h +0 -0
  106. metadata +84 -15
@@ -0,0 +1,519 @@
1
+ /*
2
+ ** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $
3
+ ** Stack and Call structure of Lua
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #include <setjmp.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+
12
+ #define ldo_c
13
+ #define LUA_CORE
14
+
15
+ #include "lua.h"
16
+
17
+ #include "ldebug.h"
18
+ #include "ldo.h"
19
+ #include "lfunc.h"
20
+ #include "lgc.h"
21
+ #include "lmem.h"
22
+ #include "lobject.h"
23
+ #include "lopcodes.h"
24
+ #include "lparser.h"
25
+ #include "lstate.h"
26
+ #include "lstring.h"
27
+ #include "ltable.h"
28
+ #include "ltm.h"
29
+ #include "lundump.h"
30
+ #include "lvm.h"
31
+ #include "lzio.h"
32
+
33
+
34
+
35
+
36
+ /*
37
+ ** {======================================================
38
+ ** Error-recovery functions
39
+ ** =======================================================
40
+ */
41
+
42
+
43
+ /* chain list of long jump buffers */
44
+ struct lua_longjmp {
45
+ struct lua_longjmp *previous;
46
+ luai_jmpbuf b;
47
+ volatile int status; /* error code */
48
+ };
49
+
50
+
51
+ void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
52
+ switch (errcode) {
53
+ case LUA_ERRMEM: {
54
+ setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
55
+ break;
56
+ }
57
+ case LUA_ERRERR: {
58
+ setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
59
+ break;
60
+ }
61
+ case LUA_ERRSYNTAX:
62
+ case LUA_ERRRUN: {
63
+ setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
64
+ break;
65
+ }
66
+ }
67
+ L->top = oldtop + 1;
68
+ }
69
+
70
+
71
+ static void restore_stack_limit (lua_State *L) {
72
+ lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
73
+ if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */
74
+ int inuse = cast_int(L->ci - L->base_ci);
75
+ if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */
76
+ luaD_reallocCI(L, LUAI_MAXCALLS);
77
+ }
78
+ }
79
+
80
+
81
+ static void resetstack (lua_State *L, int status) {
82
+ L->ci = L->base_ci;
83
+ L->base = L->ci->base;
84
+ luaF_close(L, L->base); /* close eventual pending closures */
85
+ luaD_seterrorobj(L, status, L->base);
86
+ L->nCcalls = L->baseCcalls;
87
+ L->allowhook = 1;
88
+ restore_stack_limit(L);
89
+ L->errfunc = 0;
90
+ L->errorJmp = NULL;
91
+ }
92
+
93
+
94
+ void luaD_throw (lua_State *L, int errcode) {
95
+ if (L->errorJmp) {
96
+ L->errorJmp->status = errcode;
97
+ LUAI_THROW(L, L->errorJmp);
98
+ }
99
+ else {
100
+ L->status = cast_byte(errcode);
101
+ if (G(L)->panic) {
102
+ resetstack(L, errcode);
103
+ lua_unlock(L);
104
+ G(L)->panic(L);
105
+ }
106
+ exit(EXIT_FAILURE);
107
+ }
108
+ }
109
+
110
+
111
+ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
112
+ struct lua_longjmp lj;
113
+ lj.status = 0;
114
+ lj.previous = L->errorJmp; /* chain new error handler */
115
+ L->errorJmp = &lj;
116
+ LUAI_TRY(L, &lj,
117
+ (*f)(L, ud);
118
+ );
119
+ L->errorJmp = lj.previous; /* restore old error handler */
120
+ return lj.status;
121
+ }
122
+
123
+ /* }====================================================== */
124
+
125
+
126
+ static void correctstack (lua_State *L, TValue *oldstack) {
127
+ CallInfo *ci;
128
+ GCObject *up;
129
+ L->top = (L->top - oldstack) + L->stack;
130
+ for (up = L->openupval; up != NULL; up = up->gch.next)
131
+ gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;
132
+ for (ci = L->base_ci; ci <= L->ci; ci++) {
133
+ ci->top = (ci->top - oldstack) + L->stack;
134
+ ci->base = (ci->base - oldstack) + L->stack;
135
+ ci->func = (ci->func - oldstack) + L->stack;
136
+ }
137
+ L->base = (L->base - oldstack) + L->stack;
138
+ }
139
+
140
+
141
+ void luaD_reallocstack (lua_State *L, int newsize) {
142
+ TValue *oldstack = L->stack;
143
+ int realsize = newsize + 1 + EXTRA_STACK;
144
+ lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
145
+ luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);
146
+ L->stacksize = realsize;
147
+ L->stack_last = L->stack+newsize;
148
+ correctstack(L, oldstack);
149
+ }
150
+
151
+
152
+ void luaD_reallocCI (lua_State *L, int newsize) {
153
+ CallInfo *oldci = L->base_ci;
154
+ luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
155
+ L->size_ci = newsize;
156
+ L->ci = (L->ci - oldci) + L->base_ci;
157
+ L->end_ci = L->base_ci + L->size_ci - 1;
158
+ }
159
+
160
+
161
+ void luaD_growstack (lua_State *L, int n) {
162
+ if (n <= L->stacksize) /* double size is enough? */
163
+ luaD_reallocstack(L, 2*L->stacksize);
164
+ else
165
+ luaD_reallocstack(L, L->stacksize + n);
166
+ }
167
+
168
+
169
+ static CallInfo *growCI (lua_State *L) {
170
+ if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */
171
+ luaD_throw(L, LUA_ERRERR);
172
+ else {
173
+ luaD_reallocCI(L, 2*L->size_ci);
174
+ if (L->size_ci > LUAI_MAXCALLS)
175
+ luaG_runerror(L, "stack overflow");
176
+ }
177
+ return ++L->ci;
178
+ }
179
+
180
+
181
+ void luaD_callhook (lua_State *L, int event, int line) {
182
+ lua_Hook hook = L->hook;
183
+ if (hook && L->allowhook) {
184
+ ptrdiff_t top = savestack(L, L->top);
185
+ ptrdiff_t ci_top = savestack(L, L->ci->top);
186
+ lua_Debug ar;
187
+ ar.event = event;
188
+ ar.currentline = line;
189
+ if (event == LUA_HOOKTAILRET)
190
+ ar.i_ci = 0; /* tail call; no debug information about it */
191
+ else
192
+ ar.i_ci = cast_int(L->ci - L->base_ci);
193
+ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
194
+ L->ci->top = L->top + LUA_MINSTACK;
195
+ lua_assert(L->ci->top <= L->stack_last);
196
+ L->allowhook = 0; /* cannot call hooks inside a hook */
197
+ lua_unlock(L);
198
+ (*hook)(L, &ar);
199
+ lua_lock(L);
200
+ lua_assert(!L->allowhook);
201
+ L->allowhook = 1;
202
+ L->ci->top = restorestack(L, ci_top);
203
+ L->top = restorestack(L, top);
204
+ }
205
+ }
206
+
207
+
208
+ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
209
+ int i;
210
+ int nfixargs = p->numparams;
211
+ Table *htab = NULL;
212
+ StkId base, fixed;
213
+ for (; actual < nfixargs; ++actual)
214
+ setnilvalue(L->top++);
215
+ #if defined(LUA_COMPAT_VARARG)
216
+ if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */
217
+ int nvar = actual - nfixargs; /* number of extra arguments */
218
+ lua_assert(p->is_vararg & VARARG_HASARG);
219
+ luaC_checkGC(L);
220
+ luaD_checkstack(L, p->maxstacksize);
221
+ htab = luaH_new(L, nvar, 1); /* create `arg' table */
222
+ for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
223
+ setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);
224
+ /* store counter in field `n' */
225
+ setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
226
+ }
227
+ #endif
228
+ /* move fixed parameters to final position */
229
+ fixed = L->top - actual; /* first fixed argument */
230
+ base = L->top; /* final position of first argument */
231
+ for (i=0; i<nfixargs; i++) {
232
+ setobjs2s(L, L->top++, fixed+i);
233
+ setnilvalue(fixed+i);
234
+ }
235
+ /* add `arg' parameter */
236
+ if (htab) {
237
+ sethvalue(L, L->top++, htab);
238
+ lua_assert(iswhite(obj2gco(htab)));
239
+ }
240
+ return base;
241
+ }
242
+
243
+
244
+ static StkId tryfuncTM (lua_State *L, StkId func) {
245
+ const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
246
+ StkId p;
247
+ ptrdiff_t funcr = savestack(L, func);
248
+ if (!ttisfunction(tm))
249
+ luaG_typeerror(L, func, "call");
250
+ /* Open a hole inside the stack at `func' */
251
+ for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);
252
+ incr_top(L);
253
+ func = restorestack(L, funcr); /* previous call may change stack */
254
+ setobj2s(L, func, tm); /* tag method is the new function to be called */
255
+ return func;
256
+ }
257
+
258
+
259
+
260
+ #define inc_ci(L) \
261
+ ((L->ci == L->end_ci) ? growCI(L) : \
262
+ (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))
263
+
264
+
265
+ int luaD_precall (lua_State *L, StkId func, int nresults) {
266
+ LClosure *cl;
267
+ ptrdiff_t funcr;
268
+ if (!ttisfunction(func)) /* `func' is not a function? */
269
+ func = tryfuncTM(L, func); /* check the `function' tag method */
270
+ funcr = savestack(L, func);
271
+ cl = &clvalue(func)->l;
272
+ L->ci->savedpc = L->savedpc;
273
+ if (!cl->isC) { /* Lua function? prepare its call */
274
+ CallInfo *ci;
275
+ StkId st, base;
276
+ Proto *p = cl->p;
277
+ luaD_checkstack(L, p->maxstacksize);
278
+ func = restorestack(L, funcr);
279
+ if (!p->is_vararg) { /* no varargs? */
280
+ base = func + 1;
281
+ if (L->top > base + p->numparams)
282
+ L->top = base + p->numparams;
283
+ }
284
+ else { /* vararg function */
285
+ int nargs = cast_int(L->top - func) - 1;
286
+ base = adjust_varargs(L, p, nargs);
287
+ func = restorestack(L, funcr); /* previous call may change the stack */
288
+ }
289
+ ci = inc_ci(L); /* now `enter' new function */
290
+ ci->func = func;
291
+ L->base = ci->base = base;
292
+ ci->top = L->base + p->maxstacksize;
293
+ lua_assert(ci->top <= L->stack_last);
294
+ L->savedpc = p->code; /* starting point */
295
+ ci->tailcalls = 0;
296
+ ci->nresults = nresults;
297
+ for (st = L->top; st < ci->top; st++)
298
+ setnilvalue(st);
299
+ L->top = ci->top;
300
+ if (L->hookmask & LUA_MASKCALL) {
301
+ L->savedpc++; /* hooks assume 'pc' is already incremented */
302
+ luaD_callhook(L, LUA_HOOKCALL, -1);
303
+ L->savedpc--; /* correct 'pc' */
304
+ }
305
+ return PCRLUA;
306
+ }
307
+ else { /* if is a C function, call it */
308
+ CallInfo *ci;
309
+ int n;
310
+ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
311
+ ci = inc_ci(L); /* now `enter' new function */
312
+ ci->func = restorestack(L, funcr);
313
+ L->base = ci->base = ci->func + 1;
314
+ ci->top = L->top + LUA_MINSTACK;
315
+ lua_assert(ci->top <= L->stack_last);
316
+ ci->nresults = nresults;
317
+ if (L->hookmask & LUA_MASKCALL)
318
+ luaD_callhook(L, LUA_HOOKCALL, -1);
319
+ lua_unlock(L);
320
+ n = (*curr_func(L)->c.f)(L); /* do the actual call */
321
+ lua_lock(L);
322
+ if (n < 0) /* yielding? */
323
+ return PCRYIELD;
324
+ else {
325
+ luaD_poscall(L, L->top - n);
326
+ return PCRC;
327
+ }
328
+ }
329
+ }
330
+
331
+
332
+ static StkId callrethooks (lua_State *L, StkId firstResult) {
333
+ ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
334
+ luaD_callhook(L, LUA_HOOKRET, -1);
335
+ if (f_isLua(L->ci)) { /* Lua function? */
336
+ while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
337
+ luaD_callhook(L, LUA_HOOKTAILRET, -1);
338
+ }
339
+ return restorestack(L, fr);
340
+ }
341
+
342
+
343
+ int luaD_poscall (lua_State *L, StkId firstResult) {
344
+ StkId res;
345
+ int wanted, i;
346
+ CallInfo *ci;
347
+ if (L->hookmask & LUA_MASKRET)
348
+ firstResult = callrethooks(L, firstResult);
349
+ ci = L->ci--;
350
+ res = ci->func; /* res == final position of 1st result */
351
+ wanted = ci->nresults;
352
+ L->base = (ci - 1)->base; /* restore base */
353
+ L->savedpc = (ci - 1)->savedpc; /* restore savedpc */
354
+ /* move results to correct place */
355
+ for (i = wanted; i != 0 && firstResult < L->top; i--)
356
+ setobjs2s(L, res++, firstResult++);
357
+ while (i-- > 0)
358
+ setnilvalue(res++);
359
+ L->top = res;
360
+ return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */
361
+ }
362
+
363
+
364
+ /*
365
+ ** Call a function (C or Lua). The function to be called is at *func.
366
+ ** The arguments are on the stack, right after the function.
367
+ ** When returns, all the results are on the stack, starting at the original
368
+ ** function position.
369
+ */
370
+ void luaD_call (lua_State *L, StkId func, int nResults) {
371
+ if (++L->nCcalls >= LUAI_MAXCCALLS) {
372
+ if (L->nCcalls == LUAI_MAXCCALLS)
373
+ luaG_runerror(L, "C stack overflow");
374
+ else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
375
+ luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
376
+ }
377
+ if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */
378
+ luaV_execute(L, 1); /* call it */
379
+ L->nCcalls--;
380
+ luaC_checkGC(L);
381
+ }
382
+
383
+
384
+ static void resume (lua_State *L, void *ud) {
385
+ StkId firstArg = cast(StkId, ud);
386
+ CallInfo *ci = L->ci;
387
+ if (L->status == 0) { /* start coroutine? */
388
+ lua_assert(ci == L->base_ci && firstArg > L->base);
389
+ if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)
390
+ return;
391
+ }
392
+ else { /* resuming from previous yield */
393
+ lua_assert(L->status == LUA_YIELD);
394
+ L->status = 0;
395
+ if (!f_isLua(ci)) { /* `common' yield? */
396
+ /* finish interrupted execution of `OP_CALL' */
397
+ lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||
398
+ GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);
399
+ if (luaD_poscall(L, firstArg)) /* complete it... */
400
+ L->top = L->ci->top; /* and correct top if not multiple results */
401
+ }
402
+ else /* yielded inside a hook: just continue its execution */
403
+ L->base = L->ci->base;
404
+ }
405
+ luaV_execute(L, cast_int(L->ci - L->base_ci));
406
+ }
407
+
408
+
409
+ static int resume_error (lua_State *L, const char *msg) {
410
+ L->top = L->ci->base;
411
+ setsvalue2s(L, L->top, luaS_new(L, msg));
412
+ incr_top(L);
413
+ lua_unlock(L);
414
+ return LUA_ERRRUN;
415
+ }
416
+
417
+
418
+ LUA_API int lua_resume (lua_State *L, int nargs) {
419
+ int status;
420
+ lua_lock(L);
421
+ if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
422
+ return resume_error(L, "cannot resume non-suspended coroutine");
423
+ if (L->nCcalls >= LUAI_MAXCCALLS)
424
+ return resume_error(L, "C stack overflow");
425
+ luai_userstateresume(L, nargs);
426
+ lua_assert(L->errfunc == 0);
427
+ L->baseCcalls = ++L->nCcalls;
428
+ status = luaD_rawrunprotected(L, resume, L->top - nargs);
429
+ if (status != 0) { /* error? */
430
+ L->status = cast_byte(status); /* mark thread as `dead' */
431
+ luaD_seterrorobj(L, status, L->top);
432
+ L->ci->top = L->top;
433
+ }
434
+ else {
435
+ lua_assert(L->nCcalls == L->baseCcalls);
436
+ status = L->status;
437
+ }
438
+ --L->nCcalls;
439
+ lua_unlock(L);
440
+ return status;
441
+ }
442
+
443
+
444
+ LUA_API int lua_yield (lua_State *L, int nresults) {
445
+ luai_userstateyield(L, nresults);
446
+ lua_lock(L);
447
+ if (L->nCcalls > L->baseCcalls)
448
+ luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
449
+ L->base = L->top - nresults; /* protect stack slots below */
450
+ L->status = LUA_YIELD;
451
+ lua_unlock(L);
452
+ return -1;
453
+ }
454
+
455
+
456
+ int luaD_pcall (lua_State *L, Pfunc func, void *u,
457
+ ptrdiff_t old_top, ptrdiff_t ef) {
458
+ int status;
459
+ unsigned short oldnCcalls = L->nCcalls;
460
+ ptrdiff_t old_ci = saveci(L, L->ci);
461
+ lu_byte old_allowhooks = L->allowhook;
462
+ ptrdiff_t old_errfunc = L->errfunc;
463
+ L->errfunc = ef;
464
+ status = luaD_rawrunprotected(L, func, u);
465
+ if (status != 0) { /* an error occurred? */
466
+ StkId oldtop = restorestack(L, old_top);
467
+ luaF_close(L, oldtop); /* close eventual pending closures */
468
+ luaD_seterrorobj(L, status, oldtop);
469
+ L->nCcalls = oldnCcalls;
470
+ L->ci = restoreci(L, old_ci);
471
+ L->base = L->ci->base;
472
+ L->savedpc = L->ci->savedpc;
473
+ L->allowhook = old_allowhooks;
474
+ restore_stack_limit(L);
475
+ }
476
+ L->errfunc = old_errfunc;
477
+ return status;
478
+ }
479
+
480
+
481
+
482
+ /*
483
+ ** Execute a protected parser.
484
+ */
485
+ struct SParser { /* data to `f_parser' */
486
+ ZIO *z;
487
+ Mbuffer buff; /* buffer to be used by the scanner */
488
+ const char *name;
489
+ };
490
+
491
+ static void f_parser (lua_State *L, void *ud) {
492
+ int i;
493
+ Proto *tf;
494
+ Closure *cl;
495
+ struct SParser *p = cast(struct SParser *, ud);
496
+ int c = luaZ_lookahead(p->z);
497
+ luaC_checkGC(L);
498
+ tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
499
+ &p->buff, p->name);
500
+ cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
501
+ cl->l.p = tf;
502
+ for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */
503
+ cl->l.upvals[i] = luaF_newupval(L);
504
+ setclvalue(L, L->top, cl);
505
+ incr_top(L);
506
+ }
507
+
508
+
509
+ int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
510
+ struct SParser p;
511
+ int status;
512
+ p.z = z; p.name = name;
513
+ luaZ_initbuffer(L, &p.buff);
514
+ status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
515
+ luaZ_freebuffer(L, &p.buff);
516
+ return status;
517
+ }
518
+
519
+
@@ -0,0 +1,57 @@
1
+ /*
2
+ ** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Stack and Call structure of Lua
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef ldo_h
8
+ #define ldo_h
9
+
10
+
11
+ #include "lobject.h"
12
+ #include "lstate.h"
13
+ #include "lzio.h"
14
+
15
+
16
+ #define luaD_checkstack(L,n) \
17
+ if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \
18
+ luaD_growstack(L, n); \
19
+ else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1));
20
+
21
+
22
+ #define incr_top(L) {luaD_checkstack(L,1); L->top++;}
23
+
24
+ #define savestack(L,p) ((char *)(p) - (char *)L->stack)
25
+ #define restorestack(L,n) ((TValue *)((char *)L->stack + (n)))
26
+
27
+ #define saveci(L,p) ((char *)(p) - (char *)L->base_ci)
28
+ #define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n)))
29
+
30
+
31
+ /* results from luaD_precall */
32
+ #define PCRLUA 0 /* initiated a call to a Lua function */
33
+ #define PCRC 1 /* did a call to a C function */
34
+ #define PCRYIELD 2 /* C funtion yielded */
35
+
36
+
37
+ /* type of protected functions, to be ran by `runprotected' */
38
+ typedef void (*Pfunc) (lua_State *L, void *ud);
39
+
40
+ LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name);
41
+ LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line);
42
+ LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);
43
+ LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
44
+ LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
45
+ ptrdiff_t oldtop, ptrdiff_t ef);
46
+ LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);
47
+ LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);
48
+ LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
49
+ LUAI_FUNC void luaD_growstack (lua_State *L, int n);
50
+
51
+ LUAI_FUNC void luaD_throw (lua_State *L, int errcode);
52
+ LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
53
+
54
+ LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);
55
+
56
+ #endif
57
+