rua 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +9 -8
- data/ext/rua.c +66 -10
- data/ext/rua.h +1 -0
- metadata +1 -1
data/README.txt
CHANGED
|
@@ -19,22 +19,23 @@ Rua is a library for using Lua under Ruby.
|
|
|
19
19
|
#rua.openlibs(:base, :package, :string)
|
|
20
20
|
#rua.secure = false
|
|
21
21
|
|
|
22
|
-
rua
|
|
23
|
-
rua
|
|
24
|
-
rua
|
|
22
|
+
rua.str = 'xxx'
|
|
23
|
+
rua.num = 100
|
|
24
|
+
rua.proc = lambda do
|
|
25
25
|
puts 'proc called.'
|
|
26
26
|
end
|
|
27
|
-
rua
|
|
27
|
+
rua.err = lambda do
|
|
28
28
|
raise 'err called.'
|
|
29
29
|
end
|
|
30
|
-
|
|
30
|
+
rua.Time = Time
|
|
31
31
|
puts rua.eval(<<-EOS)
|
|
32
32
|
print('hello Rua!')
|
|
33
33
|
print(str)
|
|
34
34
|
print(num)
|
|
35
35
|
proc()
|
|
36
36
|
err()
|
|
37
|
-
|
|
37
|
+
print(Time.new().to_s())
|
|
38
|
+
|
|
38
39
|
f = function()
|
|
39
40
|
print('f() called.')
|
|
40
41
|
end
|
|
@@ -42,5 +43,5 @@ Rua is a library for using Lua under Ruby.
|
|
|
42
43
|
return true
|
|
43
44
|
EOS
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
rua.f.call
|
|
47
|
+
p rua.eval('return 1, 2, 3')
|
data/ext/rua.c
CHANGED
|
@@ -80,7 +80,7 @@ void Init_rua() {
|
|
|
80
80
|
RuaError = rb_define_class("RuaError", rb_eStandardError);
|
|
81
81
|
|
|
82
82
|
rb_define_alloc_func(Rua, rua_alloc);
|
|
83
|
-
rb_define_const(Rua, "VERSION", rb_str_new2("0.1.
|
|
83
|
+
rb_define_const(Rua, "VERSION", rb_str_new2("0.1.3"));
|
|
84
84
|
rb_define_private_method(Rua, "initialize", rua_initialize, -1);
|
|
85
85
|
rb_define_method(Rua, "openlibs", rua_openlibs, -1);
|
|
86
86
|
rb_define_method(Rua, "eval", rua_eval, 1);
|
|
@@ -88,6 +88,7 @@ void Init_rua() {
|
|
|
88
88
|
rb_define_method(Rua, "[]=", rua_set, 2);
|
|
89
89
|
rb_define_method(Rua, "secure", rua_get_secure, 0);
|
|
90
90
|
rb_define_method(Rua, "secure=", rua_set_secure, 1);
|
|
91
|
+
rb_define_method(Rua, "method_missing", rua_method_missing, -1);
|
|
91
92
|
|
|
92
93
|
rb_define_alloc_func(RuaFunc, rua_func_alloc);
|
|
93
94
|
rb_define_private_method(RuaFunc, "initialize", rua_func_initialize, 0);
|
|
@@ -191,21 +192,38 @@ static VALUE rua_eval(VALUE self, VALUE str) {
|
|
|
191
192
|
struct rua *p;
|
|
192
193
|
VALUE retval;
|
|
193
194
|
const char *errmsg;
|
|
195
|
+
int pretop, nresults, i;
|
|
194
196
|
|
|
195
197
|
Data_Get_Struct(self, struct rua, p);
|
|
196
198
|
Check_Type(str, T_STRING);
|
|
199
|
+
pretop = lua_gettop(p->L);
|
|
197
200
|
luaL_loadstring(p->L, StringValuePtr(str));
|
|
198
201
|
|
|
199
|
-
if (lua_pcall(p->L, 0,
|
|
202
|
+
if (lua_pcall(p->L, 0, LUA_MULTRET, 0) != 0) {
|
|
200
203
|
RuaError = rb_const_get(rb_cObject, rb_intern("RuaError"));
|
|
201
204
|
errmsg = lua_tostring(p->L, -1);
|
|
202
205
|
lua_pop(p->L, 1);
|
|
203
206
|
rb_raise(RuaError, "%s", errmsg);
|
|
204
207
|
}
|
|
205
208
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
+
nresults = lua_gettop(p->L) - pretop;
|
|
210
|
+
|
|
211
|
+
if (nresults == 0) {
|
|
212
|
+
return Qnil;
|
|
213
|
+
} else if (nresults == 1) {
|
|
214
|
+
retval = rua_torbval(p->L, -1, p->error_handler, p->secure);
|
|
215
|
+
lua_pop(p->L, 1);
|
|
216
|
+
return retval;
|
|
217
|
+
} else {
|
|
218
|
+
retval = rb_ary_new();
|
|
219
|
+
|
|
220
|
+
for (i = nresults; i > 0; i--) {
|
|
221
|
+
rb_ary_push(retval, rua_torbval(p->L, -i, p->error_handler, p->secure));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
lua_pop(p->L, nresults);
|
|
225
|
+
return retval;
|
|
226
|
+
}
|
|
209
227
|
}
|
|
210
228
|
|
|
211
229
|
static VALUE rua_get(VALUE self, VALUE key) {
|
|
@@ -256,6 +274,28 @@ static VALUE rua_set_secure(VALUE self, VALUE secure) {
|
|
|
256
274
|
return Qnil;
|
|
257
275
|
}
|
|
258
276
|
|
|
277
|
+
static VALUE rua_method_missing(int argc, VALUE *argv, VALUE self) {
|
|
278
|
+
const char *name;
|
|
279
|
+
size_t len;
|
|
280
|
+
|
|
281
|
+
name = rb_id2name(rb_to_id(argv[0]));
|
|
282
|
+
|
|
283
|
+
if (!name) {
|
|
284
|
+
rb_raise(rb_eRuntimeError, "fail: unknown method or property");
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
len = strlen(name);
|
|
288
|
+
|
|
289
|
+
if (argc = 2 && name[len - 1] == '=') {
|
|
290
|
+
argv[0] = rb_str_new(name, (long) len - 1);
|
|
291
|
+
return rua_set(self, argv[0], argv[1]);
|
|
292
|
+
} else if(argc = 1) {
|
|
293
|
+
return rua_get(self, argv[0]);
|
|
294
|
+
} else {
|
|
295
|
+
return rb_call_super(argc, argv);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
259
299
|
// ------------------------------------------------------------------
|
|
260
300
|
|
|
261
301
|
static VALUE rua_func_alloc(VALUE klass) {
|
|
@@ -271,25 +311,41 @@ static VALUE rua_func_initialize(VALUE self) {
|
|
|
271
311
|
static VALUE rua_func_call(int argc, VALUE *argv, VALUE self) {
|
|
272
312
|
struct rua_func *p;
|
|
273
313
|
VALUE retval;
|
|
274
|
-
int i;
|
|
314
|
+
int pretop, nresults, i;
|
|
275
315
|
const char *errmsg;
|
|
276
316
|
|
|
277
317
|
Data_Get_Struct(self, struct rua_func, p);
|
|
318
|
+
pretop = lua_gettop(p->L);
|
|
278
319
|
lua_rawgeti(p->L, LUA_REGISTRYINDEX, p->ref);
|
|
279
320
|
|
|
280
321
|
for (i = 0; i < argc; i ++) {
|
|
281
322
|
rua_pushrbval(p->L, argv[i], p->error_handler, p->secure);
|
|
282
323
|
}
|
|
283
324
|
|
|
284
|
-
if (lua_pcall(p->L, argc,
|
|
325
|
+
if (lua_pcall(p->L, argc, LUA_MULTRET, 0) != 0) {
|
|
285
326
|
errmsg = lua_tostring(p->L, -1);
|
|
286
327
|
lua_pop(p->L, 1);
|
|
287
328
|
rb_raise(RuaError, "%s", errmsg);
|
|
288
329
|
}
|
|
289
330
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
331
|
+
nresults = lua_gettop(p->L) - pretop;
|
|
332
|
+
|
|
333
|
+
if (nresults == 0) {
|
|
334
|
+
return Qnil;
|
|
335
|
+
} else if (nresults == 1) {
|
|
336
|
+
retval = rua_torbval(p->L, -1, p->error_handler, p->secure);
|
|
337
|
+
lua_pop(p->L, 1);
|
|
338
|
+
return retval;
|
|
339
|
+
} else {
|
|
340
|
+
retval = rb_ary_new();
|
|
341
|
+
|
|
342
|
+
for (i = nresults; i > 0; i--) {
|
|
343
|
+
rb_ary_push(retval, rua_torbval(p->L, -i, p->error_handler, p->secure));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
lua_pop(p->L, nresults);
|
|
347
|
+
return retval;
|
|
348
|
+
}
|
|
293
349
|
}
|
|
294
350
|
|
|
295
351
|
// ------------------------------------------------------------------
|
data/ext/rua.h
CHANGED
|
@@ -24,6 +24,7 @@ static VALUE rua_get(VALUE self, VALUE key);
|
|
|
24
24
|
static VALUE rua_set(VALUE self, VALUE key, VALUE val);
|
|
25
25
|
static VALUE rua_get_secure(VALUE self);
|
|
26
26
|
static VALUE rua_set_secure(VALUE self, VALUE secure);
|
|
27
|
+
static VALUE rua_method_missing(int argc, VALUE *argv, VALUE self);
|
|
27
28
|
|
|
28
29
|
static VALUE rua_func_alloc(VALUE klass);
|
|
29
30
|
static VALUE rua_func_initialize(VALUE self);
|