rua 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +21 -0
- data/ext/rua.c +89 -7
- data/ext/rua.h +12 -0
- metadata +2 -2
data/README.txt
CHANGED
@@ -45,3 +45,24 @@ Rua is a library for using Lua under Ruby.
|
|
45
45
|
|
46
46
|
rua.f.call
|
47
47
|
p rua.eval('return 1, 2, 3')
|
48
|
+
|
49
|
+
co = rua.eval(<<-EOS)
|
50
|
+
function foo (a)
|
51
|
+
print('foo', a)
|
52
|
+
return coroutine.yield(2 * a)
|
53
|
+
end
|
54
|
+
|
55
|
+
return coroutine.create(function (a, b)
|
56
|
+
print('co-body', a, b)
|
57
|
+
local r = foo(a + 1)
|
58
|
+
print('co-body', r)
|
59
|
+
local r, s = coroutine.yield(a + b, a - b)
|
60
|
+
print('co-body', r, s)
|
61
|
+
return b, 'end'
|
62
|
+
end)
|
63
|
+
EOS
|
64
|
+
|
65
|
+
p co.resume(1, 10)
|
66
|
+
p co.resume('r')
|
67
|
+
p co.resume('x', 'y')
|
68
|
+
p co.resume('x', 'y')
|
data/ext/rua.c
CHANGED
@@ -71,16 +71,17 @@ static const char *insecure_methods[] = {
|
|
71
71
|
};
|
72
72
|
|
73
73
|
static const int insecure_method_num = sizeof(insecure_methods) / sizeof(char*);
|
74
|
-
static VALUE Rua, RuaFunc, RuaError;
|
74
|
+
static VALUE Rua, RuaFunc, RuaThread, RuaError;
|
75
75
|
static VALUE s_all, s_base, s_package, s_string, s_table, s_math, s_io, s_debug;
|
76
76
|
|
77
77
|
void Init_rua() {
|
78
78
|
Rua = rb_define_class("Rua", rb_cObject);
|
79
79
|
RuaFunc = rb_define_class("RuaFunc", rb_cObject);
|
80
|
+
RuaThread = rb_define_class("RuaThread", rb_cObject);
|
80
81
|
RuaError = rb_define_class("RuaError", rb_eStandardError);
|
81
82
|
|
82
83
|
rb_define_alloc_func(Rua, rua_alloc);
|
83
|
-
rb_define_const(Rua, "VERSION", rb_str_new2("0.1.
|
84
|
+
rb_define_const(Rua, "VERSION", rb_str_new2("0.1.4"));
|
84
85
|
rb_define_private_method(Rua, "initialize", rua_initialize, -1);
|
85
86
|
rb_define_method(Rua, "openlibs", rua_openlibs, -1);
|
86
87
|
rb_define_method(Rua, "eval", rua_eval, 1);
|
@@ -94,6 +95,10 @@ void Init_rua() {
|
|
94
95
|
rb_define_private_method(RuaFunc, "initialize", rua_func_initialize, 0);
|
95
96
|
rb_define_method(RuaFunc, "call", rua_func_call, -1);
|
96
97
|
|
98
|
+
rb_define_alloc_func(RuaThread, rua_thread_alloc);
|
99
|
+
rb_define_private_method(RuaThread, "initialize", rua_thread_initialize, 0);
|
100
|
+
rb_define_method(RuaThread, "resume", rua_thread_resume, -1);
|
101
|
+
|
97
102
|
s_all = ID2SYM(rb_intern("all"));
|
98
103
|
s_base = ID2SYM(rb_intern("base"));
|
99
104
|
s_package = ID2SYM(rb_intern("package"));
|
@@ -194,8 +199,8 @@ static VALUE rua_eval(VALUE self, VALUE str) {
|
|
194
199
|
const char *errmsg;
|
195
200
|
int pretop, nresults, i;
|
196
201
|
|
197
|
-
Data_Get_Struct(self, struct rua, p);
|
198
202
|
Check_Type(str, T_STRING);
|
203
|
+
Data_Get_Struct(self, struct rua, p);
|
199
204
|
pretop = lua_gettop(p->L);
|
200
205
|
luaL_loadstring(p->L, StringValuePtr(str));
|
201
206
|
|
@@ -350,6 +355,62 @@ static VALUE rua_func_call(int argc, VALUE *argv, VALUE self) {
|
|
350
355
|
|
351
356
|
// ------------------------------------------------------------------
|
352
357
|
|
358
|
+
static VALUE rua_thread_alloc(VALUE klass) {
|
359
|
+
struct rua_thread *p = ALLOC(struct rua_thread);
|
360
|
+
|
361
|
+
return Data_Wrap_Struct(klass, 0, -1, p);
|
362
|
+
}
|
363
|
+
|
364
|
+
static VALUE rua_thread_initialize(VALUE self) {
|
365
|
+
return Qnil;
|
366
|
+
}
|
367
|
+
|
368
|
+
static VALUE rua_thread_resume(int argc, VALUE *argv, VALUE self) {
|
369
|
+
struct rua_thread *p;
|
370
|
+
VALUE retval;
|
371
|
+
int pretop, nresults, i;
|
372
|
+
const char *errmsg;
|
373
|
+
|
374
|
+
Data_Get_Struct(self, struct rua_thread , p);
|
375
|
+
lua_getglobal(p->L, "coroutine");
|
376
|
+
pretop = lua_gettop(p->L);
|
377
|
+
lua_pushstring(p->L, "resume");
|
378
|
+
lua_gettable(p->L, pretop);
|
379
|
+
lua_rawgeti(p->L, LUA_REGISTRYINDEX, p->ref);
|
380
|
+
|
381
|
+
for (i = 0; i < argc; i ++) {
|
382
|
+
rua_pushrbval(p->L, argv[i], p->error_handler, p->secure);
|
383
|
+
}
|
384
|
+
|
385
|
+
if (lua_pcall(p->L, argc + 1, LUA_MULTRET, 0) != 0) {
|
386
|
+
errmsg = lua_tostring(p->L, -1);
|
387
|
+
lua_pop(p->L, 2);
|
388
|
+
rb_raise(RuaError, "%s", errmsg);
|
389
|
+
}
|
390
|
+
|
391
|
+
nresults = lua_gettop(p->L) - pretop;
|
392
|
+
|
393
|
+
if (nresults == 0) {
|
394
|
+
lua_pop(p->L, 1);
|
395
|
+
return Qnil;
|
396
|
+
} else if (nresults == 1) {
|
397
|
+
retval = rua_torbval(p->L, -1, p->error_handler, p->secure);
|
398
|
+
lua_pop(p->L, 2);
|
399
|
+
return retval;
|
400
|
+
} else {
|
401
|
+
retval = rb_ary_new();
|
402
|
+
|
403
|
+
for (i = nresults; i > 0; i--) {
|
404
|
+
rb_ary_push(retval, rua_torbval(p->L, -i, p->error_handler, p->secure));
|
405
|
+
}
|
406
|
+
|
407
|
+
lua_pop(p->L, nresults + 1);
|
408
|
+
return retval;
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
// ------------------------------------------------------------------
|
413
|
+
|
353
414
|
static VALUE rua_torbval(lua_State *L, int idx, VALUE error_handler, int secure) {
|
354
415
|
VALUE rbval = Qnil;
|
355
416
|
|
@@ -374,6 +435,10 @@ static VALUE rua_torbval(lua_State *L, int idx, VALUE error_handler, int secure)
|
|
374
435
|
rbval = rua_toruafunc(L, idx, error_handler, secure);
|
375
436
|
break;
|
376
437
|
|
438
|
+
case LUA_TTHREAD:
|
439
|
+
rbval = rua_toruathread(L, idx, error_handler, secure);
|
440
|
+
break;
|
441
|
+
|
377
442
|
case LUA_TLIGHTUSERDATA:
|
378
443
|
rbval = (VALUE) lua_touserdata(L, idx);
|
379
444
|
break;
|
@@ -403,7 +468,8 @@ static VALUE rua_tohash(lua_State *L, int idx, VALUE error_handler, int secure)
|
|
403
468
|
}
|
404
469
|
|
405
470
|
static void rua_pushrbval(lua_State *L, VALUE rbval, VALUE error_handler, int secure) {
|
406
|
-
struct rua_func *
|
471
|
+
struct rua_func *pf;
|
472
|
+
struct rua_thread *pt;
|
407
473
|
|
408
474
|
switch (TYPE(rbval)) {
|
409
475
|
case T_NIL:
|
@@ -441,8 +507,11 @@ static void rua_pushrbval(lua_State *L, VALUE rbval, VALUE error_handler, int se
|
|
441
507
|
fprintf(stderr, "warning: convert insecure value %s", rua_to_sptr(rbval));
|
442
508
|
lua_pushnil(L);
|
443
509
|
} else if (rb_obj_is_kind_of(rbval, RuaFunc)) {
|
444
|
-
Data_Get_Struct(rbval, struct rua_func,
|
445
|
-
lua_rawgeti(L, LUA_REGISTRYINDEX,
|
510
|
+
Data_Get_Struct(rbval, struct rua_func, pf);
|
511
|
+
lua_rawgeti(L, LUA_REGISTRYINDEX, pf->ref);
|
512
|
+
} else if (rb_obj_is_kind_of(rbval, RuaThread)) {
|
513
|
+
Data_Get_Struct(rbval, struct rua_thread, pt);
|
514
|
+
lua_rawgeti(L, LUA_REGISTRYINDEX, pt->ref);
|
446
515
|
} else if (rua_obj_is_executable(rbval)) {
|
447
516
|
lua_pushlightuserdata(L, (void *) rbval);
|
448
517
|
lua_pushlightuserdata(L, (void *) error_handler);
|
@@ -563,10 +632,23 @@ static VALUE rua_toruafunc(lua_State *L, int idx, VALUE error_handler, int secur
|
|
563
632
|
p->secure = secure;
|
564
633
|
lua_pushvalue(L, idx);
|
565
634
|
p->ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
566
|
-
lua_pop(L, 1);
|
567
635
|
return f;
|
568
636
|
}
|
569
637
|
|
638
|
+
static VALUE rua_toruathread(lua_State *L, int idx, VALUE error_handler, int secure) {
|
639
|
+
struct rua_thread *p;
|
640
|
+
VALUE t;
|
641
|
+
|
642
|
+
t = rb_funcall(RuaThread, rb_intern("new"), 0);
|
643
|
+
Data_Get_Struct(t, struct rua_thread, p);
|
644
|
+
p->L = L;
|
645
|
+
p->error_handler = error_handler;
|
646
|
+
p->secure = secure;
|
647
|
+
lua_pushvalue(L, idx);
|
648
|
+
p->ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
649
|
+
return t;
|
650
|
+
}
|
651
|
+
|
570
652
|
static VALUE rua_obj_is_executable(VALUE obj) {
|
571
653
|
return (rb_obj_is_kind_of(obj, rb_cProc) || rb_obj_is_kind_of(obj, rb_cMethod));
|
572
654
|
}
|
data/ext/rua.h
CHANGED
@@ -14,6 +14,13 @@ struct rua_func {
|
|
14
14
|
int secure;
|
15
15
|
};
|
16
16
|
|
17
|
+
struct rua_thread {
|
18
|
+
lua_State *L;
|
19
|
+
int ref;
|
20
|
+
VALUE error_handler;
|
21
|
+
int secure;
|
22
|
+
};
|
23
|
+
|
17
24
|
void Init_rua();
|
18
25
|
static VALUE rua_alloc(VALUE klass);
|
19
26
|
static void rua_free(struct rua *p);
|
@@ -30,6 +37,10 @@ static VALUE rua_func_alloc(VALUE klass);
|
|
30
37
|
static VALUE rua_func_initialize(VALUE self);
|
31
38
|
static VALUE rua_func_call(int argc, VALUE *argv, VALUE self);
|
32
39
|
|
40
|
+
static VALUE rua_thread_alloc(VALUE klass);
|
41
|
+
static VALUE rua_thread_initialize(VALUE self);
|
42
|
+
static VALUE rua_thread_resume(int argc, VALUE *argv, VALUE self);
|
43
|
+
|
33
44
|
static VALUE rua_torbval(lua_State *L, int idx, VALUE error_handler, int secure);
|
34
45
|
static VALUE rua_tohash(lua_State *L, int idx, VALUE error_handler, int secure);
|
35
46
|
static void rua_pushrbval(lua_State *L, VALUE rbval, VALUE error_handler, int secure);
|
@@ -39,6 +50,7 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, VALUE error_handler,
|
|
39
50
|
static int rua_proc_call(lua_State *L);
|
40
51
|
static VALUE _rua_proc_call(VALUE args);
|
41
52
|
static VALUE rua_toruafunc(lua_State *L, int idx, VALUE error_handler, int secure);
|
53
|
+
static VALUE rua_toruathread(lua_State *L, int idx, VALUE error_handler, int secure);
|
42
54
|
static VALUE rua_obj_is_executable(VALUE obj);
|
43
55
|
static int rua_name_is_insecure_method(const char *name);
|
44
56
|
static VALUE rua_to_s(VALUE v);
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rua
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.1.4
|
7
|
+
date: 2007-11-15 00:00:00 +09:00
|
8
8
|
summary: rua is a library for using Lua under Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib
|