rua 0.3.1-mswin32 → 0.3.3-mswin32
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 +3 -2
- data/ext/rua.c +149 -25
- data/lib/i386-mswin32/rua.so +0 -0
- metadata +2 -2
data/README.txt
CHANGED
@@ -30,9 +30,10 @@ http://storehouse.sakura.ne.jp/rua/
|
|
30
30
|
#rua.openlibs(:base, :package, :string)
|
31
31
|
#rua.secure = false
|
32
32
|
rua.abort_by_error = false
|
33
|
-
rua.error_handler = lambda do |e
|
33
|
+
rua.error_handler = lambda do |e|
|
34
34
|
p e
|
35
|
-
p
|
35
|
+
p e.cause
|
36
|
+
p e.info.to_hash
|
36
37
|
end
|
37
38
|
|
38
39
|
rua.str = 'xxx'
|
data/ext/rua.c
CHANGED
@@ -16,7 +16,7 @@ __declspec(dllexport) void Init_rua(void);
|
|
16
16
|
|
17
17
|
#include "rua.h"
|
18
18
|
|
19
|
-
#define VERSION "0.3.
|
19
|
+
#define VERSION "0.3.3"
|
20
20
|
#define REF_RBOBJ "self"
|
21
21
|
|
22
22
|
static const char *insecure_methods[] = {
|
@@ -96,6 +96,8 @@ void Init_rua() {
|
|
96
96
|
rb_define_method(Rua, "secure=", rua_set_secure, 1);
|
97
97
|
rb_define_method(Rua, "abort_by_error", rua_get_abort_by_error, 0);
|
98
98
|
rb_define_method(Rua, "abort_by_error=", rua_set_abort_by_error, 1);
|
99
|
+
rb_define_method(Rua, "wrap_error", rua_get_wrap_error, 0);
|
100
|
+
rb_define_method(Rua, "wrap_error=", rua_set_wrap_error, 1);
|
99
101
|
rb_define_method(Rua, "error_handler", rua_get_error_handler, 0);
|
100
102
|
rb_define_method(Rua, "error_handler=", rua_set_error_handler, 1);
|
101
103
|
rb_define_method(Rua, "method_missing", rua_method_missing, -1);
|
@@ -109,6 +111,10 @@ void Init_rua() {
|
|
109
111
|
rb_define_private_method(RuaThread, "initialize", rua_thread_initialize, 0);
|
110
112
|
rb_define_method(RuaThread, "resume", rua_thread_resume, -1);
|
111
113
|
|
114
|
+
rb_define_alloc_func(RuaError, rua_error_alloc);
|
115
|
+
rb_define_method(RuaError, "cause", rua_error_cause, 0);
|
116
|
+
rb_define_method(RuaError, "info", rua_error_info, 0);
|
117
|
+
|
112
118
|
rb_define_alloc_func(RuaDebug, rua_debug_alloc);
|
113
119
|
rb_define_private_method(RuaDebug, "initialize", rua_debug_initialize, 0);
|
114
120
|
rb_define_method(RuaDebug, "name", rua_debug_name, 0);
|
@@ -139,14 +145,17 @@ static VALUE rua_alloc(VALUE klass) {
|
|
139
145
|
|
140
146
|
p->R = ALLOC(struct rua_state);
|
141
147
|
p->R->rua = Qnil;
|
148
|
+
p->R->refs = Qnil;
|
142
149
|
p->R->error_handler = Qnil;
|
143
150
|
p->R->secure = 1;
|
144
151
|
p->R->abort_by_error = 1;
|
152
|
+
p->R->wrap_error = 1;
|
145
153
|
return Data_Wrap_Struct(klass, rua_mark, rua_free, p);
|
146
154
|
}
|
147
155
|
|
148
156
|
static void rua_mark(struct rua *p) {
|
149
157
|
rb_gc_mark(p->R->rua);
|
158
|
+
rb_gc_mark(p->R->refs);
|
150
159
|
rb_gc_mark(p->R->error_handler);
|
151
160
|
}
|
152
161
|
|
@@ -171,9 +180,11 @@ static VALUE rua_initialize(int argc, VALUE *argv, VALUE self) {
|
|
171
180
|
Data_Get_Struct(self, struct rua, p);
|
172
181
|
p->L = lua_open();
|
173
182
|
p->R->rua = self;
|
183
|
+
p->R->refs = rb_hash_new();
|
174
184
|
p->R->error_handler = Qnil;
|
175
185
|
p->R->secure = 1;
|
176
186
|
p->R->abort_by_error = 1;
|
187
|
+
p->R->wrap_error = 1;
|
177
188
|
|
178
189
|
if (argc > 0) {
|
179
190
|
rua_openlibs(argc, argv, self);
|
@@ -240,6 +251,7 @@ static VALUE rua_openlibs(int argc, VALUE *argv, VALUE self) {
|
|
240
251
|
*/
|
241
252
|
static VALUE rua_eval(VALUE self, VALUE str) {
|
242
253
|
struct rua *p;
|
254
|
+
VALUE errinfo;
|
243
255
|
const char *errmsg;
|
244
256
|
int pretop;
|
245
257
|
|
@@ -249,9 +261,18 @@ static VALUE rua_eval(VALUE self, VALUE str) {
|
|
249
261
|
luaL_loadstring(p->L, StringValuePtr(str));
|
250
262
|
|
251
263
|
if (lua_pcall(p->L, 0, LUA_MULTRET, 0) != 0) {
|
252
|
-
|
253
|
-
|
254
|
-
|
264
|
+
if (lua_islightuserdata(p->L, -1)) {
|
265
|
+
errinfo = (VALUE) lua_touserdata(p->L, -1);
|
266
|
+
lua_pop(p->L, 1);
|
267
|
+
rb_exc_raise(errinfo);
|
268
|
+
} else if (lua_isstring(p->L, -1)){
|
269
|
+
errmsg = lua_tostring(p->L, -1);
|
270
|
+
lua_pop(p->L, 1);
|
271
|
+
rb_raise(RuaError, "%s", errmsg);
|
272
|
+
} else {
|
273
|
+
lua_pop(p->L, 1);
|
274
|
+
rb_raise(RuaError, "must not happen");
|
275
|
+
}
|
255
276
|
}
|
256
277
|
|
257
278
|
return rua_tomultiretval(p->L, pretop, p->R);
|
@@ -346,6 +367,35 @@ static VALUE rua_set_abort_by_error(VALUE self, VALUE abort_by_error) {
|
|
346
367
|
return Qnil;
|
347
368
|
}
|
348
369
|
|
370
|
+
/**
|
371
|
+
* get wrap error flag.
|
372
|
+
*/
|
373
|
+
static VALUE rua_get_wrap_error(VALUE self) {
|
374
|
+
struct rua *p;
|
375
|
+
|
376
|
+
Data_Get_Struct(self, struct rua, p);
|
377
|
+
return p->R->wrap_error ? Qtrue : Qfalse;
|
378
|
+
}
|
379
|
+
|
380
|
+
/**
|
381
|
+
* set wrap error flag.
|
382
|
+
*/
|
383
|
+
static VALUE rua_set_wrap_error(VALUE self, VALUE wrap_error) {
|
384
|
+
struct rua *p;
|
385
|
+
|
386
|
+
Data_Get_Struct(self, struct rua, p);
|
387
|
+
|
388
|
+
switch (TYPE(wrap_error)) {
|
389
|
+
case T_TRUE: p->R->wrap_error = 1; break;
|
390
|
+
case T_FALSE: p->R->wrap_error = 0; break;
|
391
|
+
default:
|
392
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected TrueClass or FalseClass)", rua_classname_ptr(wrap_error));
|
393
|
+
break;
|
394
|
+
}
|
395
|
+
|
396
|
+
return Qnil;
|
397
|
+
}
|
398
|
+
|
349
399
|
/**
|
350
400
|
* get error handler.
|
351
401
|
*/
|
@@ -406,11 +456,12 @@ static VALUE rua_ref_alloc(VALUE klass) {
|
|
406
456
|
|
407
457
|
static void rua_ref_mark(struct rua_ref *p) {
|
408
458
|
rb_gc_mark(p->R->rua);
|
459
|
+
rb_gc_mark(p->R->refs);
|
409
460
|
rb_gc_mark(p->R->error_handler);
|
410
461
|
}
|
411
462
|
|
412
463
|
static void rua_ref_free(struct rua_ref *p) {
|
413
|
-
luaL_unref(p->L, LUA_REGISTRYINDEX, p->ref);
|
464
|
+
//luaL_unref(p->L, LUA_REGISTRYINDEX, p->ref);
|
414
465
|
|
415
466
|
if (p->R) {
|
416
467
|
free(p->R);
|
@@ -434,6 +485,7 @@ static VALUE rua_func_initialize(VALUE self) {
|
|
434
485
|
static VALUE rua_func_call(int argc, VALUE *argv, VALUE self) {
|
435
486
|
struct rua_ref *p;
|
436
487
|
int pretop, i;
|
488
|
+
VALUE errinfo;
|
437
489
|
const char *errmsg;
|
438
490
|
|
439
491
|
Data_Get_Struct(self, struct rua_ref, p);
|
@@ -445,9 +497,18 @@ static VALUE rua_func_call(int argc, VALUE *argv, VALUE self) {
|
|
445
497
|
}
|
446
498
|
|
447
499
|
if (lua_pcall(p->L, argc, LUA_MULTRET, 0) != 0) {
|
448
|
-
|
449
|
-
|
450
|
-
|
500
|
+
if (lua_islightuserdata(p->L, -1)) {
|
501
|
+
errinfo = (VALUE) lua_touserdata(p->L, -1);
|
502
|
+
lua_pop(p->L, 1);
|
503
|
+
rb_exc_raise(errinfo);
|
504
|
+
} else if (lua_isstring(p->L, -1)){
|
505
|
+
errmsg = lua_tostring(p->L, -1);
|
506
|
+
lua_pop(p->L, 1);
|
507
|
+
rb_raise(RuaError, "%s", errmsg);
|
508
|
+
} else {
|
509
|
+
lua_pop(p->L, 1);
|
510
|
+
rb_raise(RuaError, "must not happen");
|
511
|
+
}
|
451
512
|
}
|
452
513
|
|
453
514
|
return rua_tomultiretval(p->L, pretop, p->R);
|
@@ -487,7 +548,7 @@ static VALUE rua_thread_initialize(VALUE self) {
|
|
487
548
|
*/
|
488
549
|
static VALUE rua_thread_resume(int argc, VALUE *argv, VALUE self) {
|
489
550
|
struct rua_ref *p;
|
490
|
-
VALUE retval;
|
551
|
+
VALUE retval, errinfo;
|
491
552
|
int pretop, i;
|
492
553
|
const char *errmsg;
|
493
554
|
|
@@ -503,9 +564,18 @@ static VALUE rua_thread_resume(int argc, VALUE *argv, VALUE self) {
|
|
503
564
|
}
|
504
565
|
|
505
566
|
if (lua_pcall(p->L, argc + 1, LUA_MULTRET, 0) != 0) {
|
506
|
-
|
507
|
-
|
508
|
-
|
567
|
+
if (lua_islightuserdata(p->L, -1)) {
|
568
|
+
errinfo = (VALUE) lua_touserdata(p->L, -1);
|
569
|
+
lua_pop(p->L, 2);
|
570
|
+
rb_exc_raise(errinfo);
|
571
|
+
} else if (lua_isstring(p->L, -1)){
|
572
|
+
errmsg = lua_tostring(p->L, -1);
|
573
|
+
lua_pop(p->L, 2);
|
574
|
+
rb_raise(RuaError, "%s", errmsg);
|
575
|
+
} else {
|
576
|
+
lua_pop(p->L, 2);
|
577
|
+
rb_raise(RuaError, "must not happen");
|
578
|
+
}
|
509
579
|
}
|
510
580
|
|
511
581
|
retval = rua_tomultiretval(p->L, pretop, p->R);
|
@@ -654,6 +724,41 @@ static VALUE rua_debug_to_hash(VALUE self) {
|
|
654
724
|
|
655
725
|
// ------------------------------------------------------------------
|
656
726
|
|
727
|
+
static VALUE rua_error_alloc(VALUE klass) {
|
728
|
+
struct rua_error *p = ALLOC(struct rua_error);
|
729
|
+
|
730
|
+
p->cause = Qnil;
|
731
|
+
p->info = Qnil;
|
732
|
+
return Data_Wrap_Struct(klass, rua_error_mark, -1, p);
|
733
|
+
}
|
734
|
+
|
735
|
+
static void rua_error_mark(struct rua_error *p) {
|
736
|
+
rb_gc_mark(p->cause);
|
737
|
+
rb_gc_mark(p->info);
|
738
|
+
}
|
739
|
+
|
740
|
+
/**
|
741
|
+
* get cause error.
|
742
|
+
*/
|
743
|
+
static VALUE rua_error_cause(VALUE self) {
|
744
|
+
struct rua_error *p;
|
745
|
+
|
746
|
+
Data_Get_Struct(self, struct rua_error, p);
|
747
|
+
return p->cause;
|
748
|
+
}
|
749
|
+
|
750
|
+
/**
|
751
|
+
* get debug info.
|
752
|
+
*/
|
753
|
+
static VALUE rua_error_info(VALUE self) {
|
754
|
+
struct rua_error *p;
|
755
|
+
|
756
|
+
Data_Get_Struct(self, struct rua_error, p);
|
757
|
+
return p->info;
|
758
|
+
}
|
759
|
+
|
760
|
+
// ------------------------------------------------------------------
|
761
|
+
|
657
762
|
static VALUE rua_tomultiretval(lua_State *L, int pretop, struct rua_state *R) {
|
658
763
|
VALUE retval;
|
659
764
|
int nresults, i;
|
@@ -831,7 +936,7 @@ static void rua_newtable_from_ary(lua_State *L, VALUE ary, struct rua_state *R)
|
|
831
936
|
entry = rb_ary_entry(ary, i);
|
832
937
|
lua_pushnumber(L, i + 1);
|
833
938
|
rua_pushrbval(L, entry, R);
|
834
|
-
|
939
|
+
lua_rawset(L, tblidx);
|
835
940
|
}
|
836
941
|
}
|
837
942
|
|
@@ -848,7 +953,7 @@ static void rua_newtable_from_hash(lua_State *L, VALUE hash, struct rua_state *R
|
|
848
953
|
val = rb_hash_aref(hash, key);
|
849
954
|
rua_pushrbval(L, key, R);
|
850
955
|
rua_pushrbval(L, val, R);
|
851
|
-
|
956
|
+
lua_rawset(L, tblidx);
|
852
957
|
}
|
853
958
|
}
|
854
959
|
|
@@ -862,11 +967,13 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R)
|
|
862
967
|
|
863
968
|
lua_pushstring(L, REF_RBOBJ);
|
864
969
|
lua_pushlightuserdata(L, (void *) obj);
|
865
|
-
|
970
|
+
lua_rawset(L, tblidx);
|
971
|
+
rb_hash_aset(R->refs, obj, Qtrue);
|
866
972
|
|
867
973
|
for (i = 0; i < RARRAY(methods)->len; i++) {
|
868
974
|
name = rb_ary_entry(methods, i);
|
869
975
|
method = rb_funcall(obj, rb_intern("method"), 1, name);
|
976
|
+
rb_hash_aset(R->refs, method, Qtrue);
|
870
977
|
|
871
978
|
if (R->secure && rua_name_is_insecure_method(StringValuePtr(name))) {
|
872
979
|
continue;
|
@@ -874,13 +981,13 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R)
|
|
874
981
|
|
875
982
|
rua_pushrbval(L, name, R);
|
876
983
|
rua_pushrbval(L, method, R);
|
877
|
-
|
984
|
+
lua_rawset(L, tblidx);
|
878
985
|
}
|
879
986
|
}
|
880
987
|
|
881
988
|
static int rua_proc_call(lua_State *L) {
|
882
989
|
struct rua_state *R;
|
883
|
-
VALUE proc, args, last, retval, errargs,
|
990
|
+
VALUE proc, args, last, retval, errargs, error;
|
884
991
|
int i, n, status;
|
885
992
|
lua_Debug ar;
|
886
993
|
|
@@ -903,16 +1010,19 @@ static int rua_proc_call(lua_State *L) {
|
|
903
1010
|
}
|
904
1011
|
|
905
1012
|
if (status != 0) {
|
906
|
-
|
907
|
-
|
908
|
-
if (rua_obj_is_executable(R->error_handler)) {
|
909
|
-
errargs = rb_ary_new();
|
910
|
-
rb_ary_push(errargs, ruby_errinfo);
|
911
|
-
|
1013
|
+
if (R->wrap_error) {
|
912
1014
|
if (lua_getstack(L, 1, &ar) && lua_getinfo(L, "nSlu", &ar)) {
|
913
|
-
|
1015
|
+
error = rua_toruaerror(ruby_errinfo, rua_toruadebug(&ar));
|
1016
|
+
} else {
|
1017
|
+
error = rua_toruaerror(ruby_errinfo, Qnil);
|
914
1018
|
}
|
1019
|
+
} else {
|
1020
|
+
error = ruby_errinfo;
|
1021
|
+
}
|
915
1022
|
|
1023
|
+
if (rua_obj_is_executable(R->error_handler)) {
|
1024
|
+
errargs = rb_ary_new();
|
1025
|
+
rb_ary_push(errargs, error);
|
916
1026
|
rb_ary_push(errargs, R->error_handler);
|
917
1027
|
retval = rb_protect(_rua_proc_call, errargs, &status);
|
918
1028
|
|
@@ -924,7 +1034,8 @@ static int rua_proc_call(lua_State *L) {
|
|
924
1034
|
}
|
925
1035
|
|
926
1036
|
if (R->abort_by_error) {
|
927
|
-
|
1037
|
+
lua_pushlightuserdata(L, (void *) error);
|
1038
|
+
return lua_error(L);
|
928
1039
|
}
|
929
1040
|
}
|
930
1041
|
|
@@ -967,9 +1078,22 @@ static VALUE rua_toruaobj(VALUE klass, lua_State *L, int idx, struct rua_state *
|
|
967
1078
|
p->R = R;
|
968
1079
|
lua_pushvalue(L, idx);
|
969
1080
|
p->ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
1081
|
+
rb_hash_aset(p->R->refs, ruaobj, Qtrue);
|
970
1082
|
return ruaobj;
|
971
1083
|
}
|
972
1084
|
|
1085
|
+
static VALUE rua_toruaerror(VALUE cause, VALUE ruadebug) {
|
1086
|
+
struct rua_error *p;
|
1087
|
+
VALUE errmsg, ruaerr;
|
1088
|
+
|
1089
|
+
errmsg = rb_check_convert_type(cause, T_STRING, "String", "to_s");
|
1090
|
+
ruaerr = rb_funcall(RuaError, rb_intern("new"), 1, errmsg);
|
1091
|
+
Data_Get_Struct(ruaerr, struct rua_error, p);
|
1092
|
+
p->cause = cause;
|
1093
|
+
p->info = ruadebug;
|
1094
|
+
return ruaerr;
|
1095
|
+
}
|
1096
|
+
|
973
1097
|
static VALUE rua_toruadebug(lua_Debug *ar) {
|
974
1098
|
struct rua_debug *p;
|
975
1099
|
VALUE ruadebug;
|
data/lib/i386-mswin32/rua.so
CHANGED
Binary file
|
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.3.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.3.3
|
7
|
+
date: 2007-11-29 00:00:00 +09:00
|
8
8
|
summary: Rua is a library for using Lua under Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib/i386-mswin32
|