rua 0.3.7-mswin32 → 0.3.9-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.txt +5 -0
  2. data/ext/rua.c +40 -4
  3. data/lib/i386-mswin32/rua.so +0 -0
  4. metadata +3 -3
data/README.txt CHANGED
@@ -27,6 +27,8 @@ http://storehouse.sakura.ne.jp/rua/
27
27
  class MyClass
28
28
  def val=(v); @val = v; end
29
29
  def val; @val; end
30
+ def [](k); "#{k}->#{@val}"; end
31
+ def []=(k, v); @val = "#{k}:#{v}"; end
30
32
  end
31
33
 
32
34
  rua = Rua.new(:all)
@@ -65,6 +67,9 @@ http://storehouse.sakura.ne.jp/rua/
65
67
  my_obj = MyClass.new()
66
68
  my_obj.val = 'my_obj.val'
67
69
  print(my_obj.val())
70
+ print(my_obj['foo'])
71
+ my_obj['bar'] = 'zoo'
72
+ print(my_obj.val())
68
73
 
69
74
  f = function()
70
75
  print('f() called.')
data/ext/rua.c CHANGED
@@ -21,7 +21,7 @@ __declspec(dllexport) void Init_rua(void);
21
21
 
22
22
  #include "rua.h"
23
23
 
24
- #define VERSION "0.3.7"
24
+ #define VERSION "0.3.9"
25
25
  #define REF_RBOBJ "self"
26
26
 
27
27
  #define ICONV_JIS "ISO-2022-JP"
@@ -87,6 +87,7 @@ static const char *insecure_methods[] = {
87
87
  static const int insecure_method_num = sizeof(insecure_methods) / sizeof(char*);
88
88
  static VALUE Rua, RuaFunc, RuaThread, RuaError, RuaDebug;
89
89
  static VALUE s_all, s_base, s_package, s_string, s_table, s_math, s_io, s_debug;
90
+ static VALUE m_method_unbound, m_methods_unbound;
90
91
 
91
92
  void Init_rua() {
92
93
  Rua = rb_define_class("Rua", rb_cObject);
@@ -118,6 +119,11 @@ void Init_rua() {
118
119
  rb_define_method(Rua, "error_handler=", rua_set_error_handler, 1);
119
120
  rb_define_method(Rua, "method_missing", rua_method_missing, -1);
120
121
 
122
+ m_method_unbound = rb_funcall(rb_cObject, rb_intern("instance_method"), 1, ID2SYM(rb_intern("method")));
123
+ m_methods_unbound = rb_funcall(rb_cObject, rb_intern("instance_method"), 1, ID2SYM(rb_intern("methods")));
124
+ rb_define_class_variable(Rua, "@@m_method_unbound", m_method_unbound);
125
+ rb_define_class_variable(Rua, "@@m_methods_unbound", m_methods_unbound);
126
+
121
127
  rb_define_alloc_func(RuaFunc, rua_ref_alloc);
122
128
  rb_define_private_method(RuaFunc, "initialize", rua_func_initialize, 0);
123
129
  rb_define_method(RuaFunc, "call", rua_func_call, -1);
@@ -1022,13 +1028,17 @@ static void rua_newtable_from_hash(lua_State *L, VALUE hash, struct rua_state *R
1022
1028
 
1023
1029
  static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R) {
1024
1030
  VALUE methods, name, method;
1031
+ VALUE m_method_bound, m_methods_bound;
1025
1032
  int i, tblidx, prxidx;
1026
1033
 
1027
1034
  lua_newtable(L);
1028
1035
  prxidx = lua_gettop(L);
1029
1036
  lua_newtable(L);
1030
1037
  tblidx = lua_gettop(L);
1031
- methods = rb_check_convert_type(obj, T_ARRAY, "Array", "methods");
1038
+
1039
+ m_method_bound = rb_funcall(m_method_unbound, rb_intern("bind"), 1, obj);
1040
+ m_methods_bound = rb_funcall(m_methods_unbound, rb_intern("bind"), 1, obj);
1041
+ methods = rb_check_convert_type(m_methods_bound, T_ARRAY, "Array", "call");
1032
1042
 
1033
1043
  lua_pushstring(L, REF_RBOBJ);
1034
1044
  lua_pushlightuserdata(L, (void *) obj);
@@ -1038,7 +1048,7 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R)
1038
1048
 
1039
1049
  for (i = 0; i < RARRAY(methods)->len; i++) {
1040
1050
  name = rb_ary_entry(methods, i);
1041
- method = rb_funcall(obj, rb_intern("method"), 1, name);
1051
+ method = rb_funcall(m_method_bound, rb_intern("call"), 1, name);
1042
1052
  rb_hash_aset(R->refs, method, Qtrue);
1043
1053
 
1044
1054
  if (R->secure && rua_name_is_insecure_method(StringValuePtr(name))) {
@@ -1059,7 +1069,23 @@ static int rua_getobject_event(lua_State *L) {
1059
1069
  int tblidx;
1060
1070
 
1061
1071
  tblidx = lua_upvalueindex(1);
1072
+ lua_pushvalue(L, -1);
1062
1073
  lua_rawget(L, tblidx);
1074
+
1075
+ if (lua_isnil(L, -1)) {
1076
+ lua_pop(L, 1);
1077
+ lua_pushstring(L, "[]");
1078
+ lua_rawget(L, tblidx);
1079
+
1080
+ if (lua_isfunction(L, -1)) {
1081
+ lua_pushvalue(L, -2);
1082
+ lua_call(L, 1, 1);
1083
+ } else {
1084
+ lua_pop(L, 1);
1085
+ lua_pushnil(L);
1086
+ }
1087
+ }
1088
+
1063
1089
  return 1;
1064
1090
  }
1065
1091
 
@@ -1086,7 +1112,17 @@ static int rua_setobject_event(lua_State *L) {
1086
1112
  lua_call(L, 1, 0);
1087
1113
  } else {
1088
1114
  lua_pop(L, 1);
1089
- lua_rawset(L, tblidx);
1115
+ lua_pushstring(L, "[]=");
1116
+ lua_rawget(L, tblidx);
1117
+
1118
+ if (lua_isfunction(L, -1)) {
1119
+ lua_pushvalue(L, -3);
1120
+ lua_pushvalue(L, -3);
1121
+ lua_call(L, 2, 0);
1122
+ } else {
1123
+ lua_pop(L, 1);
1124
+ lua_rawset(L, tblidx);
1125
+ }
1090
1126
  }
1091
1127
 
1092
1128
  return 0;
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rua
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.9
5
5
  platform: mswin32
6
6
  authors:
7
7
  - winebarrel
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2007-12-26 00:00:00 +09:00
12
+ date: 2007-12-28 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  requirements: []
50
50
 
51
51
  rubyforge_project:
52
- rubygems_version: 0.9.5
52
+ rubygems_version: 1.0.1
53
53
  signing_key:
54
54
  specification_version: 2
55
55
  summary: Rua is a library for using Lua under Ruby.