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,40 @@
1
+ /*
2
+ ** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Lua tables (hash)
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef ltable_h
8
+ #define ltable_h
9
+
10
+ #include "lobject.h"
11
+
12
+
13
+ #define gnode(t,i) (&(t)->node[i])
14
+ #define gkey(n) (&(n)->i_key.nk)
15
+ #define gval(n) (&(n)->i_val)
16
+ #define gnext(n) ((n)->i_key.nk.next)
17
+
18
+ #define key2tval(n) (&(n)->i_key.tvk)
19
+
20
+
21
+ LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);
22
+ LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);
23
+ LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
24
+ LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);
25
+ LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
26
+ LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
27
+ LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);
28
+ LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);
29
+ LUAI_FUNC void luaH_free (lua_State *L, Table *t);
30
+ LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
31
+ LUAI_FUNC int luaH_getn (Table *t);
32
+
33
+
34
+ #if defined(LUA_DEBUG)
35
+ LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
36
+ LUAI_FUNC int luaH_isdummy (Node *n);
37
+ #endif
38
+
39
+
40
+ #endif
@@ -0,0 +1,287 @@
1
+ /*
2
+ ** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $
3
+ ** Library for Table Manipulation
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #include <stddef.h>
9
+
10
+ #define ltablib_c
11
+ #define LUA_LIB
12
+
13
+ #include "lua.h"
14
+
15
+ #include "lauxlib.h"
16
+ #include "lualib.h"
17
+
18
+
19
+ #define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
20
+
21
+
22
+ static int foreachi (lua_State *L) {
23
+ int i;
24
+ int n = aux_getn(L, 1);
25
+ luaL_checktype(L, 2, LUA_TFUNCTION);
26
+ for (i=1; i <= n; i++) {
27
+ lua_pushvalue(L, 2); /* function */
28
+ lua_pushinteger(L, i); /* 1st argument */
29
+ lua_rawgeti(L, 1, i); /* 2nd argument */
30
+ lua_call(L, 2, 1);
31
+ if (!lua_isnil(L, -1))
32
+ return 1;
33
+ lua_pop(L, 1); /* remove nil result */
34
+ }
35
+ return 0;
36
+ }
37
+
38
+
39
+ static int foreach (lua_State *L) {
40
+ luaL_checktype(L, 1, LUA_TTABLE);
41
+ luaL_checktype(L, 2, LUA_TFUNCTION);
42
+ lua_pushnil(L); /* first key */
43
+ while (lua_next(L, 1)) {
44
+ lua_pushvalue(L, 2); /* function */
45
+ lua_pushvalue(L, -3); /* key */
46
+ lua_pushvalue(L, -3); /* value */
47
+ lua_call(L, 2, 1);
48
+ if (!lua_isnil(L, -1))
49
+ return 1;
50
+ lua_pop(L, 2); /* remove value and result */
51
+ }
52
+ return 0;
53
+ }
54
+
55
+
56
+ static int maxn (lua_State *L) {
57
+ lua_Number max = 0;
58
+ luaL_checktype(L, 1, LUA_TTABLE);
59
+ lua_pushnil(L); /* first key */
60
+ while (lua_next(L, 1)) {
61
+ lua_pop(L, 1); /* remove value */
62
+ if (lua_type(L, -1) == LUA_TNUMBER) {
63
+ lua_Number v = lua_tonumber(L, -1);
64
+ if (v > max) max = v;
65
+ }
66
+ }
67
+ lua_pushnumber(L, max);
68
+ return 1;
69
+ }
70
+
71
+
72
+ static int getn (lua_State *L) {
73
+ lua_pushinteger(L, aux_getn(L, 1));
74
+ return 1;
75
+ }
76
+
77
+
78
+ static int setn (lua_State *L) {
79
+ luaL_checktype(L, 1, LUA_TTABLE);
80
+ #ifndef luaL_setn
81
+ luaL_setn(L, 1, luaL_checkint(L, 2));
82
+ #else
83
+ luaL_error(L, LUA_QL("setn") " is obsolete");
84
+ #endif
85
+ lua_pushvalue(L, 1);
86
+ return 1;
87
+ }
88
+
89
+
90
+ static int tinsert (lua_State *L) {
91
+ int e = aux_getn(L, 1) + 1; /* first empty element */
92
+ int pos; /* where to insert new element */
93
+ switch (lua_gettop(L)) {
94
+ case 2: { /* called with only 2 arguments */
95
+ pos = e; /* insert new element at the end */
96
+ break;
97
+ }
98
+ case 3: {
99
+ int i;
100
+ pos = luaL_checkint(L, 2); /* 2nd argument is the position */
101
+ if (pos > e) e = pos; /* `grow' array if necessary */
102
+ for (i = e; i > pos; i--) { /* move up elements */
103
+ lua_rawgeti(L, 1, i-1);
104
+ lua_rawseti(L, 1, i); /* t[i] = t[i-1] */
105
+ }
106
+ break;
107
+ }
108
+ default: {
109
+ return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));
110
+ }
111
+ }
112
+ luaL_setn(L, 1, e); /* new size */
113
+ lua_rawseti(L, 1, pos); /* t[pos] = v */
114
+ return 0;
115
+ }
116
+
117
+
118
+ static int tremove (lua_State *L) {
119
+ int e = aux_getn(L, 1);
120
+ int pos = luaL_optint(L, 2, e);
121
+ if (!(1 <= pos && pos <= e)) /* position is outside bounds? */
122
+ return 0; /* nothing to remove */
123
+ luaL_setn(L, 1, e - 1); /* t.n = n-1 */
124
+ lua_rawgeti(L, 1, pos); /* result = t[pos] */
125
+ for ( ;pos<e; pos++) {
126
+ lua_rawgeti(L, 1, pos+1);
127
+ lua_rawseti(L, 1, pos); /* t[pos] = t[pos+1] */
128
+ }
129
+ lua_pushnil(L);
130
+ lua_rawseti(L, 1, e); /* t[e] = nil */
131
+ return 1;
132
+ }
133
+
134
+
135
+ static void addfield (lua_State *L, luaL_Buffer *b, int i) {
136
+ lua_rawgeti(L, 1, i);
137
+ if (!lua_isstring(L, -1))
138
+ luaL_error(L, "invalid value (%s) at index %d in table for "
139
+ LUA_QL("concat"), luaL_typename(L, -1), i);
140
+ luaL_addvalue(b);
141
+ }
142
+
143
+
144
+ static int tconcat (lua_State *L) {
145
+ luaL_Buffer b;
146
+ size_t lsep;
147
+ int i, last;
148
+ const char *sep = luaL_optlstring(L, 2, "", &lsep);
149
+ luaL_checktype(L, 1, LUA_TTABLE);
150
+ i = luaL_optint(L, 3, 1);
151
+ last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
152
+ luaL_buffinit(L, &b);
153
+ for (; i < last; i++) {
154
+ addfield(L, &b, i);
155
+ luaL_addlstring(&b, sep, lsep);
156
+ }
157
+ if (i == last) /* add last value (if interval was not empty) */
158
+ addfield(L, &b, i);
159
+ luaL_pushresult(&b);
160
+ return 1;
161
+ }
162
+
163
+
164
+
165
+ /*
166
+ ** {======================================================
167
+ ** Quicksort
168
+ ** (based on `Algorithms in MODULA-3', Robert Sedgewick;
169
+ ** Addison-Wesley, 1993.)
170
+ */
171
+
172
+
173
+ static void set2 (lua_State *L, int i, int j) {
174
+ lua_rawseti(L, 1, i);
175
+ lua_rawseti(L, 1, j);
176
+ }
177
+
178
+ static int sort_comp (lua_State *L, int a, int b) {
179
+ if (!lua_isnil(L, 2)) { /* function? */
180
+ int res;
181
+ lua_pushvalue(L, 2);
182
+ lua_pushvalue(L, a-1); /* -1 to compensate function */
183
+ lua_pushvalue(L, b-2); /* -2 to compensate function and `a' */
184
+ lua_call(L, 2, 1);
185
+ res = lua_toboolean(L, -1);
186
+ lua_pop(L, 1);
187
+ return res;
188
+ }
189
+ else /* a < b? */
190
+ return lua_lessthan(L, a, b);
191
+ }
192
+
193
+ static void auxsort (lua_State *L, int l, int u) {
194
+ while (l < u) { /* for tail recursion */
195
+ int i, j;
196
+ /* sort elements a[l], a[(l+u)/2] and a[u] */
197
+ lua_rawgeti(L, 1, l);
198
+ lua_rawgeti(L, 1, u);
199
+ if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */
200
+ set2(L, l, u); /* swap a[l] - a[u] */
201
+ else
202
+ lua_pop(L, 2);
203
+ if (u-l == 1) break; /* only 2 elements */
204
+ i = (l+u)/2;
205
+ lua_rawgeti(L, 1, i);
206
+ lua_rawgeti(L, 1, l);
207
+ if (sort_comp(L, -2, -1)) /* a[i]<a[l]? */
208
+ set2(L, i, l);
209
+ else {
210
+ lua_pop(L, 1); /* remove a[l] */
211
+ lua_rawgeti(L, 1, u);
212
+ if (sort_comp(L, -1, -2)) /* a[u]<a[i]? */
213
+ set2(L, i, u);
214
+ else
215
+ lua_pop(L, 2);
216
+ }
217
+ if (u-l == 2) break; /* only 3 elements */
218
+ lua_rawgeti(L, 1, i); /* Pivot */
219
+ lua_pushvalue(L, -1);
220
+ lua_rawgeti(L, 1, u-1);
221
+ set2(L, i, u-1);
222
+ /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */
223
+ i = l; j = u-1;
224
+ for (;;) { /* invariant: a[l..i] <= P <= a[j..u] */
225
+ /* repeat ++i until a[i] >= P */
226
+ while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {
227
+ if (i>u) luaL_error(L, "invalid order function for sorting");
228
+ lua_pop(L, 1); /* remove a[i] */
229
+ }
230
+ /* repeat --j until a[j] <= P */
231
+ while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {
232
+ if (j<l) luaL_error(L, "invalid order function for sorting");
233
+ lua_pop(L, 1); /* remove a[j] */
234
+ }
235
+ if (j<i) {
236
+ lua_pop(L, 3); /* pop pivot, a[i], a[j] */
237
+ break;
238
+ }
239
+ set2(L, i, j);
240
+ }
241
+ lua_rawgeti(L, 1, u-1);
242
+ lua_rawgeti(L, 1, i);
243
+ set2(L, u-1, i); /* swap pivot (a[u-1]) with a[i] */
244
+ /* a[l..i-1] <= a[i] == P <= a[i+1..u] */
245
+ /* adjust so that smaller half is in [j..i] and larger one in [l..u] */
246
+ if (i-l < u-i) {
247
+ j=l; i=i-1; l=i+2;
248
+ }
249
+ else {
250
+ j=i+1; i=u; u=j-2;
251
+ }
252
+ auxsort(L, j, i); /* call recursively the smaller one */
253
+ } /* repeat the routine for the larger one */
254
+ }
255
+
256
+ static int sort (lua_State *L) {
257
+ int n = aux_getn(L, 1);
258
+ luaL_checkstack(L, 40, ""); /* assume array is smaller than 2^40 */
259
+ if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */
260
+ luaL_checktype(L, 2, LUA_TFUNCTION);
261
+ lua_settop(L, 2); /* make sure there is two arguments */
262
+ auxsort(L, 1, n);
263
+ return 0;
264
+ }
265
+
266
+ /* }====================================================== */
267
+
268
+
269
+ static const luaL_Reg tab_funcs[] = {
270
+ {"concat", tconcat},
271
+ {"foreach", foreach},
272
+ {"foreachi", foreachi},
273
+ {"getn", getn},
274
+ {"maxn", maxn},
275
+ {"insert", tinsert},
276
+ {"remove", tremove},
277
+ {"setn", setn},
278
+ {"sort", sort},
279
+ {NULL, NULL}
280
+ };
281
+
282
+
283
+ LUALIB_API int luaopen_table (lua_State *L) {
284
+ luaL_register(L, LUA_TABLIBNAME, tab_funcs);
285
+ return 1;
286
+ }
287
+
@@ -0,0 +1,75 @@
1
+ /*
2
+ ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Tag methods
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #include <string.h>
9
+
10
+ #define ltm_c
11
+ #define LUA_CORE
12
+
13
+ #include "lua.h"
14
+
15
+ #include "lobject.h"
16
+ #include "lstate.h"
17
+ #include "lstring.h"
18
+ #include "ltable.h"
19
+ #include "ltm.h"
20
+
21
+
22
+
23
+ const char *const luaT_typenames[] = {
24
+ "nil", "boolean", "userdata", "number",
25
+ "string", "table", "function", "userdata", "thread",
26
+ "proto", "upval"
27
+ };
28
+
29
+
30
+ void luaT_init (lua_State *L) {
31
+ static const char *const luaT_eventname[] = { /* ORDER TM */
32
+ "__index", "__newindex",
33
+ "__gc", "__mode", "__eq",
34
+ "__add", "__sub", "__mul", "__div", "__mod",
35
+ "__pow", "__unm", "__len", "__lt", "__le",
36
+ "__concat", "__call"
37
+ };
38
+ int i;
39
+ for (i=0; i<TM_N; i++) {
40
+ G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
41
+ luaS_fix(G(L)->tmname[i]); /* never collect these names */
42
+ }
43
+ }
44
+
45
+
46
+ /*
47
+ ** function to be used with macro "fasttm": optimized for absence of
48
+ ** tag methods
49
+ */
50
+ const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
51
+ const TValue *tm = luaH_getstr(events, ename);
52
+ lua_assert(event <= TM_EQ);
53
+ if (ttisnil(tm)) { /* no tag method? */
54
+ events->flags |= cast_byte(1u<<event); /* cache this fact */
55
+ return NULL;
56
+ }
57
+ else return tm;
58
+ }
59
+
60
+
61
+ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
62
+ Table *mt;
63
+ switch (ttype(o)) {
64
+ case LUA_TTABLE:
65
+ mt = hvalue(o)->metatable;
66
+ break;
67
+ case LUA_TUSERDATA:
68
+ mt = uvalue(o)->metatable;
69
+ break;
70
+ default:
71
+ mt = G(L)->mt[ttype(o)];
72
+ }
73
+ return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);
74
+ }
75
+
@@ -0,0 +1,54 @@
1
+ /*
2
+ ** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Tag methods
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef ltm_h
8
+ #define ltm_h
9
+
10
+
11
+ #include "lobject.h"
12
+
13
+
14
+ /*
15
+ * WARNING: if you change the order of this enumeration,
16
+ * grep "ORDER TM"
17
+ */
18
+ typedef enum {
19
+ TM_INDEX,
20
+ TM_NEWINDEX,
21
+ TM_GC,
22
+ TM_MODE,
23
+ TM_EQ, /* last tag method with `fast' access */
24
+ TM_ADD,
25
+ TM_SUB,
26
+ TM_MUL,
27
+ TM_DIV,
28
+ TM_MOD,
29
+ TM_POW,
30
+ TM_UNM,
31
+ TM_LEN,
32
+ TM_LT,
33
+ TM_LE,
34
+ TM_CONCAT,
35
+ TM_CALL,
36
+ TM_N /* number of elements in the enum */
37
+ } TMS;
38
+
39
+
40
+
41
+ #define gfasttm(g,et,e) ((et) == NULL ? NULL : \
42
+ ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
43
+
44
+ #define fasttm(l,et,e) gfasttm(G(l), et, e)
45
+
46
+ LUAI_DATA const char *const luaT_typenames[];
47
+
48
+
49
+ LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
50
+ LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
51
+ TMS event);
52
+ LUAI_FUNC void luaT_init (lua_State *L);
53
+
54
+ #endif