immunio 0.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +234 -0
  3. data/README.md +147 -0
  4. data/bin/immunio +5 -0
  5. data/lib/immunio.rb +29 -0
  6. data/lib/immunio/agent.rb +260 -0
  7. data/lib/immunio/authentication.rb +96 -0
  8. data/lib/immunio/blocked_app.rb +38 -0
  9. data/lib/immunio/channel.rb +432 -0
  10. data/lib/immunio/cli.rb +39 -0
  11. data/lib/immunio/context.rb +114 -0
  12. data/lib/immunio/errors.rb +43 -0
  13. data/lib/immunio/immunio_ca.crt +45 -0
  14. data/lib/immunio/logger.rb +87 -0
  15. data/lib/immunio/plugins/action_dispatch.rb +45 -0
  16. data/lib/immunio/plugins/action_view.rb +431 -0
  17. data/lib/immunio/plugins/active_record.rb +707 -0
  18. data/lib/immunio/plugins/active_record_relation.rb +370 -0
  19. data/lib/immunio/plugins/authlogic.rb +80 -0
  20. data/lib/immunio/plugins/csrf.rb +24 -0
  21. data/lib/immunio/plugins/devise.rb +40 -0
  22. data/lib/immunio/plugins/environment_reporter.rb +69 -0
  23. data/lib/immunio/plugins/eval.rb +51 -0
  24. data/lib/immunio/plugins/exception_handler.rb +55 -0
  25. data/lib/immunio/plugins/gems_tracker.rb +5 -0
  26. data/lib/immunio/plugins/haml.rb +36 -0
  27. data/lib/immunio/plugins/http_finisher.rb +50 -0
  28. data/lib/immunio/plugins/http_tracker.rb +203 -0
  29. data/lib/immunio/plugins/io.rb +96 -0
  30. data/lib/immunio/plugins/redirect.rb +42 -0
  31. data/lib/immunio/plugins/warden.rb +66 -0
  32. data/lib/immunio/processor.rb +234 -0
  33. data/lib/immunio/rails.rb +26 -0
  34. data/lib/immunio/request.rb +139 -0
  35. data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
  36. data/lib/immunio/rufus_lua_ext/state.rb +157 -0
  37. data/lib/immunio/rufus_lua_ext/table.rb +137 -0
  38. data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
  39. data/lib/immunio/version.rb +5 -0
  40. data/lib/immunio/vm.rb +291 -0
  41. data/lua-hooks/ext/all.c +78 -0
  42. data/lua-hooks/ext/bitop/README +22 -0
  43. data/lua-hooks/ext/bitop/bit.c +189 -0
  44. data/lua-hooks/ext/extconf.rb +38 -0
  45. data/lua-hooks/ext/libinjection/COPYING +37 -0
  46. data/lua-hooks/ext/libinjection/libinjection.h +65 -0
  47. data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
  48. data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
  49. data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
  50. data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
  51. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
  52. data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
  53. data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
  54. data/lua-hooks/ext/libinjection/lualib.c +109 -0
  55. data/lua-hooks/ext/lpeg/HISTORY +90 -0
  56. data/lua-hooks/ext/lpeg/lpcap.c +537 -0
  57. data/lua-hooks/ext/lpeg/lpcap.h +43 -0
  58. data/lua-hooks/ext/lpeg/lpcode.c +986 -0
  59. data/lua-hooks/ext/lpeg/lpcode.h +34 -0
  60. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  61. data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
  62. data/lua-hooks/ext/lpeg/lpprint.c +244 -0
  63. data/lua-hooks/ext/lpeg/lpprint.h +35 -0
  64. data/lua-hooks/ext/lpeg/lptree.c +1238 -0
  65. data/lua-hooks/ext/lpeg/lptree.h +77 -0
  66. data/lua-hooks/ext/lpeg/lptypes.h +149 -0
  67. data/lua-hooks/ext/lpeg/lpvm.c +355 -0
  68. data/lua-hooks/ext/lpeg/lpvm.h +58 -0
  69. data/lua-hooks/ext/lpeg/makefile +55 -0
  70. data/lua-hooks/ext/lpeg/re.html +498 -0
  71. data/lua-hooks/ext/lpeg/test.lua +1409 -0
  72. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
  73. data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
  74. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
  75. data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
  76. data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
  77. data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
  78. data/lua-hooks/ext/lua-snapshot/README.md +18 -0
  79. data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
  80. data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
  81. data/lua-hooks/ext/lua/COPYRIGHT +34 -0
  82. data/lua-hooks/ext/lua/lapi.c +1087 -0
  83. data/lua-hooks/ext/lua/lapi.h +16 -0
  84. data/lua-hooks/ext/lua/lauxlib.c +652 -0
  85. data/lua-hooks/ext/lua/lauxlib.h +174 -0
  86. data/lua-hooks/ext/lua/lbaselib.c +659 -0
  87. data/lua-hooks/ext/lua/lcode.c +831 -0
  88. data/lua-hooks/ext/lua/lcode.h +76 -0
  89. data/lua-hooks/ext/lua/ldblib.c +398 -0
  90. data/lua-hooks/ext/lua/ldebug.c +638 -0
  91. data/lua-hooks/ext/lua/ldebug.h +33 -0
  92. data/lua-hooks/ext/lua/ldo.c +519 -0
  93. data/lua-hooks/ext/lua/ldo.h +57 -0
  94. data/lua-hooks/ext/lua/ldump.c +164 -0
  95. data/lua-hooks/ext/lua/lfunc.c +174 -0
  96. data/lua-hooks/ext/lua/lfunc.h +34 -0
  97. data/lua-hooks/ext/lua/lgc.c +710 -0
  98. data/lua-hooks/ext/lua/lgc.h +110 -0
  99. data/lua-hooks/ext/lua/linit.c +38 -0
  100. data/lua-hooks/ext/lua/liolib.c +556 -0
  101. data/lua-hooks/ext/lua/llex.c +463 -0
  102. data/lua-hooks/ext/lua/llex.h +81 -0
  103. data/lua-hooks/ext/lua/llimits.h +128 -0
  104. data/lua-hooks/ext/lua/lmathlib.c +263 -0
  105. data/lua-hooks/ext/lua/lmem.c +86 -0
  106. data/lua-hooks/ext/lua/lmem.h +49 -0
  107. data/lua-hooks/ext/lua/loadlib.c +705 -0
  108. data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
  109. data/lua-hooks/ext/lua/lobject.c +214 -0
  110. data/lua-hooks/ext/lua/lobject.h +381 -0
  111. data/lua-hooks/ext/lua/lopcodes.c +102 -0
  112. data/lua-hooks/ext/lua/lopcodes.h +268 -0
  113. data/lua-hooks/ext/lua/loslib.c +243 -0
  114. data/lua-hooks/ext/lua/lparser.c +1339 -0
  115. data/lua-hooks/ext/lua/lparser.h +82 -0
  116. data/lua-hooks/ext/lua/lstate.c +214 -0
  117. data/lua-hooks/ext/lua/lstate.h +169 -0
  118. data/lua-hooks/ext/lua/lstring.c +111 -0
  119. data/lua-hooks/ext/lua/lstring.h +31 -0
  120. data/lua-hooks/ext/lua/lstrlib.c +871 -0
  121. data/lua-hooks/ext/lua/ltable.c +588 -0
  122. data/lua-hooks/ext/lua/ltable.h +40 -0
  123. data/lua-hooks/ext/lua/ltablib.c +287 -0
  124. data/lua-hooks/ext/lua/ltm.c +75 -0
  125. data/lua-hooks/ext/lua/ltm.h +54 -0
  126. data/lua-hooks/ext/lua/lua.c +392 -0
  127. data/lua-hooks/ext/lua/lua.def +131 -0
  128. data/lua-hooks/ext/lua/lua.h +388 -0
  129. data/lua-hooks/ext/lua/lua.rc +28 -0
  130. data/lua-hooks/ext/lua/lua_dll.rc +26 -0
  131. data/lua-hooks/ext/lua/luac.c +200 -0
  132. data/lua-hooks/ext/lua/luac.rc +1 -0
  133. data/lua-hooks/ext/lua/luaconf.h +763 -0
  134. data/lua-hooks/ext/lua/luaconf.h.in +724 -0
  135. data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
  136. data/lua-hooks/ext/lua/lualib.h +53 -0
  137. data/lua-hooks/ext/lua/lundump.c +227 -0
  138. data/lua-hooks/ext/lua/lundump.h +36 -0
  139. data/lua-hooks/ext/lua/lvm.c +767 -0
  140. data/lua-hooks/ext/lua/lvm.h +36 -0
  141. data/lua-hooks/ext/lua/lzio.c +82 -0
  142. data/lua-hooks/ext/lua/lzio.h +67 -0
  143. data/lua-hooks/ext/lua/print.c +227 -0
  144. data/lua-hooks/ext/luautf8/README.md +152 -0
  145. data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
  146. data/lua-hooks/ext/luautf8/unidata.h +3064 -0
  147. data/lua-hooks/lib/boot.lua +254 -0
  148. data/lua-hooks/lib/encode.lua +4 -0
  149. data/lua-hooks/lib/lexers/LICENSE +21 -0
  150. data/lua-hooks/lib/lexers/bash.lua +134 -0
  151. data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
  152. data/lua-hooks/lib/lexers/css.lua +216 -0
  153. data/lua-hooks/lib/lexers/html.lua +106 -0
  154. data/lua-hooks/lib/lexers/javascript.lua +68 -0
  155. data/lua-hooks/lib/lexers/lexer.lua +1575 -0
  156. data/lua-hooks/lib/lexers/markers.lua +33 -0
  157. metadata +308 -0
@@ -0,0 +1,214 @@
1
+ /*
2
+ ** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Some generic functions over Lua objects
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #include <ctype.h>
8
+ #include <stdarg.h>
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ #define lobject_c
14
+ #define LUA_CORE
15
+
16
+ #include "lua.h"
17
+
18
+ #include "ldo.h"
19
+ #include "lmem.h"
20
+ #include "lobject.h"
21
+ #include "lstate.h"
22
+ #include "lstring.h"
23
+ #include "lvm.h"
24
+
25
+
26
+
27
+ const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL};
28
+
29
+
30
+ /*
31
+ ** converts an integer to a "floating point byte", represented as
32
+ ** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
33
+ ** eeeee != 0 and (xxx) otherwise.
34
+ */
35
+ int luaO_int2fb (unsigned int x) {
36
+ int e = 0; /* expoent */
37
+ while (x >= 16) {
38
+ x = (x+1) >> 1;
39
+ e++;
40
+ }
41
+ if (x < 8) return x;
42
+ else return ((e+1) << 3) | (cast_int(x) - 8);
43
+ }
44
+
45
+
46
+ /* converts back */
47
+ int luaO_fb2int (int x) {
48
+ int e = (x >> 3) & 31;
49
+ if (e == 0) return x;
50
+ else return ((x & 7)+8) << (e - 1);
51
+ }
52
+
53
+
54
+ int luaO_log2 (unsigned int x) {
55
+ static const lu_byte log_2[256] = {
56
+ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
57
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
58
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
59
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
60
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
61
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
62
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
63
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
64
+ };
65
+ int l = -1;
66
+ while (x >= 256) { l += 8; x >>= 8; }
67
+ return l + log_2[x];
68
+
69
+ }
70
+
71
+
72
+ int luaO_rawequalObj (const TValue *t1, const TValue *t2) {
73
+ if (ttype(t1) != ttype(t2)) return 0;
74
+ else switch (ttype(t1)) {
75
+ case LUA_TNIL:
76
+ return 1;
77
+ case LUA_TNUMBER:
78
+ return luai_numeq(nvalue(t1), nvalue(t2));
79
+ case LUA_TBOOLEAN:
80
+ return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */
81
+ case LUA_TLIGHTUSERDATA:
82
+ return pvalue(t1) == pvalue(t2);
83
+ default:
84
+ lua_assert(iscollectable(t1));
85
+ return gcvalue(t1) == gcvalue(t2);
86
+ }
87
+ }
88
+
89
+
90
+ int luaO_str2d (const char *s, lua_Number *result) {
91
+ char *endptr;
92
+ *result = lua_str2number(s, &endptr);
93
+ if (endptr == s) return 0; /* conversion failed */
94
+ if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */
95
+ *result = cast_num(strtoul(s, &endptr, 16));
96
+ if (*endptr == '\0') return 1; /* most common case */
97
+ while (isspace(cast(unsigned char, *endptr))) endptr++;
98
+ if (*endptr != '\0') return 0; /* invalid trailing characters? */
99
+ return 1;
100
+ }
101
+
102
+
103
+
104
+ static void pushstr (lua_State *L, const char *str) {
105
+ setsvalue2s(L, L->top, luaS_new(L, str));
106
+ incr_top(L);
107
+ }
108
+
109
+
110
+ /* this function handles only `%d', `%c', %f, %p, and `%s' formats */
111
+ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
112
+ int n = 1;
113
+ pushstr(L, "");
114
+ for (;;) {
115
+ const char *e = strchr(fmt, '%');
116
+ if (e == NULL) break;
117
+ setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt));
118
+ incr_top(L);
119
+ switch (*(e+1)) {
120
+ case 's': {
121
+ const char *s = va_arg(argp, char *);
122
+ if (s == NULL) s = "(null)";
123
+ pushstr(L, s);
124
+ break;
125
+ }
126
+ case 'c': {
127
+ char buff[2];
128
+ buff[0] = cast(char, va_arg(argp, int));
129
+ buff[1] = '\0';
130
+ pushstr(L, buff);
131
+ break;
132
+ }
133
+ case 'd': {
134
+ setnvalue(L->top, cast_num(va_arg(argp, int)));
135
+ incr_top(L);
136
+ break;
137
+ }
138
+ case 'f': {
139
+ setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));
140
+ incr_top(L);
141
+ break;
142
+ }
143
+ case 'p': {
144
+ char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */
145
+ sprintf(buff, "%p", va_arg(argp, void *));
146
+ pushstr(L, buff);
147
+ break;
148
+ }
149
+ case '%': {
150
+ pushstr(L, "%");
151
+ break;
152
+ }
153
+ default: {
154
+ char buff[3];
155
+ buff[0] = '%';
156
+ buff[1] = *(e+1);
157
+ buff[2] = '\0';
158
+ pushstr(L, buff);
159
+ break;
160
+ }
161
+ }
162
+ n += 2;
163
+ fmt = e+2;
164
+ }
165
+ pushstr(L, fmt);
166
+ luaV_concat(L, n+1, cast_int(L->top - L->base) - 1);
167
+ L->top -= n;
168
+ return svalue(L->top - 1);
169
+ }
170
+
171
+
172
+ const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {
173
+ const char *msg;
174
+ va_list argp;
175
+ va_start(argp, fmt);
176
+ msg = luaO_pushvfstring(L, fmt, argp);
177
+ va_end(argp);
178
+ return msg;
179
+ }
180
+
181
+
182
+ void luaO_chunkid (char *out, const char *source, size_t bufflen) {
183
+ if (*source == '=') {
184
+ strncpy(out, source+1, bufflen); /* remove first char */
185
+ out[bufflen-1] = '\0'; /* ensures null termination */
186
+ }
187
+ else { /* out = "source", or "...source" */
188
+ if (*source == '@') {
189
+ size_t l;
190
+ source++; /* skip the `@' */
191
+ bufflen -= sizeof(" '...' ");
192
+ l = strlen(source);
193
+ strcpy(out, "");
194
+ if (l > bufflen) {
195
+ source += (l-bufflen); /* get last part of file name */
196
+ strcat(out, "...");
197
+ }
198
+ strcat(out, source);
199
+ }
200
+ else { /* out = [string "string"] */
201
+ size_t len = strcspn(source, "\n\r"); /* stop at first newline */
202
+ bufflen -= sizeof(" [string \"...\"] ");
203
+ if (len > bufflen) len = bufflen;
204
+ strcpy(out, "[string \"");
205
+ if (source[len] != '\0') { /* must truncate? */
206
+ strncat(out, source, len);
207
+ strcat(out, "...");
208
+ }
209
+ else
210
+ strcat(out, source);
211
+ strcat(out, "\"]");
212
+ }
213
+ }
214
+ }
@@ -0,0 +1,381 @@
1
+ /*
2
+ ** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $
3
+ ** Type definitions for Lua objects
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #ifndef lobject_h
9
+ #define lobject_h
10
+
11
+
12
+ #include <stdarg.h>
13
+
14
+
15
+ #include "llimits.h"
16
+ #include "lua.h"
17
+
18
+
19
+ /* tags for values visible from Lua */
20
+ #define LAST_TAG LUA_TTHREAD
21
+
22
+ #define NUM_TAGS (LAST_TAG+1)
23
+
24
+
25
+ /*
26
+ ** Extra tags for non-values
27
+ */
28
+ #define LUA_TPROTO (LAST_TAG+1)
29
+ #define LUA_TUPVAL (LAST_TAG+2)
30
+ #define LUA_TDEADKEY (LAST_TAG+3)
31
+
32
+
33
+ /*
34
+ ** Union of all collectable objects
35
+ */
36
+ typedef union GCObject GCObject;
37
+
38
+
39
+ /*
40
+ ** Common Header for all collectable objects (in macro form, to be
41
+ ** included in other objects)
42
+ */
43
+ #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
44
+
45
+
46
+ /*
47
+ ** Common header in struct form
48
+ */
49
+ typedef struct GCheader {
50
+ CommonHeader;
51
+ } GCheader;
52
+
53
+
54
+
55
+
56
+ /*
57
+ ** Union of all Lua values
58
+ */
59
+ typedef union {
60
+ GCObject *gc;
61
+ void *p;
62
+ lua_Number n;
63
+ int b;
64
+ } Value;
65
+
66
+
67
+ /*
68
+ ** Tagged Values
69
+ */
70
+
71
+ #define TValuefields Value value; int tt
72
+
73
+ typedef struct lua_TValue {
74
+ TValuefields;
75
+ } TValue;
76
+
77
+
78
+ /* Macros to test type */
79
+ #define ttisnil(o) (ttype(o) == LUA_TNIL)
80
+ #define ttisnumber(o) (ttype(o) == LUA_TNUMBER)
81
+ #define ttisstring(o) (ttype(o) == LUA_TSTRING)
82
+ #define ttistable(o) (ttype(o) == LUA_TTABLE)
83
+ #define ttisfunction(o) (ttype(o) == LUA_TFUNCTION)
84
+ #define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN)
85
+ #define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA)
86
+ #define ttisthread(o) (ttype(o) == LUA_TTHREAD)
87
+ #define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA)
88
+
89
+ /* Macros to access values */
90
+ #define ttype(o) ((o)->tt)
91
+ #define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc)
92
+ #define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p)
93
+ #define nvalue(o) check_exp(ttisnumber(o), (o)->value.n)
94
+ #define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts)
95
+ #define tsvalue(o) (&rawtsvalue(o)->tsv)
96
+ #define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u)
97
+ #define uvalue(o) (&rawuvalue(o)->uv)
98
+ #define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl)
99
+ #define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h)
100
+ #define bvalue(o) check_exp(ttisboolean(o), (o)->value.b)
101
+ #define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th)
102
+
103
+ #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
104
+
105
+ /*
106
+ ** for internal debug only
107
+ */
108
+ #define checkconsistency(obj) \
109
+ lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))
110
+
111
+ #define checkliveness(g,obj) \
112
+ lua_assert(!iscollectable(obj) || \
113
+ ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc)))
114
+
115
+
116
+ /* Macros to set values */
117
+ #define setnilvalue(obj) ((obj)->tt=LUA_TNIL)
118
+
119
+ #define setnvalue(obj,x) \
120
+ { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; }
121
+
122
+ #define setpvalue(obj,x) \
123
+ { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; }
124
+
125
+ #define setbvalue(obj,x) \
126
+ { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; }
127
+
128
+ #define setsvalue(L,obj,x) \
129
+ { TValue *i_o=(obj); \
130
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \
131
+ checkliveness(G(L),i_o); }
132
+
133
+ #define setuvalue(L,obj,x) \
134
+ { TValue *i_o=(obj); \
135
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \
136
+ checkliveness(G(L),i_o); }
137
+
138
+ #define setthvalue(L,obj,x) \
139
+ { TValue *i_o=(obj); \
140
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \
141
+ checkliveness(G(L),i_o); }
142
+
143
+ #define setclvalue(L,obj,x) \
144
+ { TValue *i_o=(obj); \
145
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \
146
+ checkliveness(G(L),i_o); }
147
+
148
+ #define sethvalue(L,obj,x) \
149
+ { TValue *i_o=(obj); \
150
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \
151
+ checkliveness(G(L),i_o); }
152
+
153
+ #define setptvalue(L,obj,x) \
154
+ { TValue *i_o=(obj); \
155
+ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \
156
+ checkliveness(G(L),i_o); }
157
+
158
+
159
+
160
+
161
+ #define setobj(L,obj1,obj2) \
162
+ { const TValue *o2=(obj2); TValue *o1=(obj1); \
163
+ o1->value = o2->value; o1->tt=o2->tt; \
164
+ checkliveness(G(L),o1); }
165
+
166
+
167
+ /*
168
+ ** different types of sets, according to destination
169
+ */
170
+
171
+ /* from stack to (same) stack */
172
+ #define setobjs2s setobj
173
+ /* to stack (not from same stack) */
174
+ #define setobj2s setobj
175
+ #define setsvalue2s setsvalue
176
+ #define sethvalue2s sethvalue
177
+ #define setptvalue2s setptvalue
178
+ /* from table to same table */
179
+ #define setobjt2t setobj
180
+ /* to table */
181
+ #define setobj2t setobj
182
+ /* to new object */
183
+ #define setobj2n setobj
184
+ #define setsvalue2n setsvalue
185
+
186
+ #define setttype(obj, tt) (ttype(obj) = (tt))
187
+
188
+
189
+ #define iscollectable(o) (ttype(o) >= LUA_TSTRING)
190
+
191
+
192
+
193
+ typedef TValue *StkId; /* index to stack elements */
194
+
195
+
196
+ /*
197
+ ** String headers for string table
198
+ */
199
+ typedef union TString {
200
+ L_Umaxalign dummy; /* ensures maximum alignment for strings */
201
+ struct {
202
+ CommonHeader;
203
+ lu_byte reserved;
204
+ unsigned int hash;
205
+ size_t len;
206
+ } tsv;
207
+ } TString;
208
+
209
+
210
+ #define getstr(ts) cast(const char *, (ts) + 1)
211
+ #define svalue(o) getstr(rawtsvalue(o))
212
+
213
+
214
+
215
+ typedef union Udata {
216
+ L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */
217
+ struct {
218
+ CommonHeader;
219
+ struct Table *metatable;
220
+ struct Table *env;
221
+ size_t len;
222
+ } uv;
223
+ } Udata;
224
+
225
+
226
+
227
+
228
+ /*
229
+ ** Function Prototypes
230
+ */
231
+ typedef struct Proto {
232
+ CommonHeader;
233
+ TValue *k; /* constants used by the function */
234
+ Instruction *code;
235
+ struct Proto **p; /* functions defined inside the function */
236
+ int *lineinfo; /* map from opcodes to source lines */
237
+ struct LocVar *locvars; /* information about local variables */
238
+ TString **upvalues; /* upvalue names */
239
+ TString *source;
240
+ int sizeupvalues;
241
+ int sizek; /* size of `k' */
242
+ int sizecode;
243
+ int sizelineinfo;
244
+ int sizep; /* size of `p' */
245
+ int sizelocvars;
246
+ int linedefined;
247
+ int lastlinedefined;
248
+ GCObject *gclist;
249
+ lu_byte nups; /* number of upvalues */
250
+ lu_byte numparams;
251
+ lu_byte is_vararg;
252
+ lu_byte maxstacksize;
253
+ } Proto;
254
+
255
+
256
+ /* masks for new-style vararg */
257
+ #define VARARG_HASARG 1
258
+ #define VARARG_ISVARARG 2
259
+ #define VARARG_NEEDSARG 4
260
+
261
+
262
+ typedef struct LocVar {
263
+ TString *varname;
264
+ int startpc; /* first point where variable is active */
265
+ int endpc; /* first point where variable is dead */
266
+ } LocVar;
267
+
268
+
269
+
270
+ /*
271
+ ** Upvalues
272
+ */
273
+
274
+ typedef struct UpVal {
275
+ CommonHeader;
276
+ TValue *v; /* points to stack or to its own value */
277
+ union {
278
+ TValue value; /* the value (when closed) */
279
+ struct { /* double linked list (when open) */
280
+ struct UpVal *prev;
281
+ struct UpVal *next;
282
+ } l;
283
+ } u;
284
+ } UpVal;
285
+
286
+
287
+ /*
288
+ ** Closures
289
+ */
290
+
291
+ #define ClosureHeader \
292
+ CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
293
+ struct Table *env
294
+
295
+ typedef struct CClosure {
296
+ ClosureHeader;
297
+ lua_CFunction f;
298
+ TValue upvalue[1];
299
+ } CClosure;
300
+
301
+
302
+ typedef struct LClosure {
303
+ ClosureHeader;
304
+ struct Proto *p;
305
+ UpVal *upvals[1];
306
+ } LClosure;
307
+
308
+
309
+ typedef union Closure {
310
+ CClosure c;
311
+ LClosure l;
312
+ } Closure;
313
+
314
+
315
+ #define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC)
316
+ #define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC)
317
+
318
+
319
+ /*
320
+ ** Tables
321
+ */
322
+
323
+ typedef union TKey {
324
+ struct {
325
+ TValuefields;
326
+ struct Node *next; /* for chaining */
327
+ } nk;
328
+ TValue tvk;
329
+ } TKey;
330
+
331
+
332
+ typedef struct Node {
333
+ TValue i_val;
334
+ TKey i_key;
335
+ } Node;
336
+
337
+
338
+ typedef struct Table {
339
+ CommonHeader;
340
+ lu_byte flags; /* 1<<p means tagmethod(p) is not present */
341
+ lu_byte lsizenode; /* log2 of size of `node' array */
342
+ struct Table *metatable;
343
+ TValue *array; /* array part */
344
+ Node *node;
345
+ Node *lastfree; /* any free position is before this position */
346
+ GCObject *gclist;
347
+ int sizearray; /* size of `array' array */
348
+ } Table;
349
+
350
+
351
+
352
+ /*
353
+ ** `module' operation for hashing (size is always a power of 2)
354
+ */
355
+ #define lmod(s,size) \
356
+ (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))
357
+
358
+
359
+ #define twoto(x) (1<<(x))
360
+ #define sizenode(t) (twoto((t)->lsizenode))
361
+
362
+
363
+ #define luaO_nilobject (&luaO_nilobject_)
364
+
365
+ LUAI_DATA const TValue luaO_nilobject_;
366
+
367
+ #define ceillog2(x) (luaO_log2((x)-1) + 1)
368
+
369
+ LUAI_FUNC int luaO_log2 (unsigned int x);
370
+ LUAI_FUNC int luaO_int2fb (unsigned int x);
371
+ LUAI_FUNC int luaO_fb2int (int x);
372
+ LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2);
373
+ LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result);
374
+ LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,
375
+ va_list argp);
376
+ LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);
377
+ LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);
378
+
379
+
380
+ #endif
381
+