rua 0.3.7-mswin32 → 0.3.9-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.
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.