rua 0.3.5-mswin32 → 0.3.7-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 +6 -1
  2. data/ext/rua.c +79 -12
  3. data/lib/i386-mswin32/rua.so +0 -0
  4. metadata +41 -34
data/README.txt CHANGED
@@ -24,7 +24,10 @@ http://storehouse.sakura.ne.jp/rua/
24
24
 
25
25
  require 'rua'
26
26
 
27
- class MyClass; end
27
+ class MyClass
28
+ def val=(v); @val = v; end
29
+ def val; @val; end
30
+ end
28
31
 
29
32
  rua = Rua.new(:all)
30
33
  #rua.external_charset = Rua::SJIS
@@ -60,6 +63,8 @@ http://storehouse.sakura.ne.jp/rua/
60
63
  err()
61
64
  print(Time.new().to_s())
62
65
  my_obj = MyClass.new()
66
+ my_obj.val = 'my_obj.val'
67
+ print(my_obj.val())
63
68
 
64
69
  f = function()
65
70
  print('f() called.')
data/ext/rua.c CHANGED
@@ -9,6 +9,7 @@ __declspec(dllexport) void Init_rua(void);
9
9
  #include <string.h>
10
10
  #include <malloc.h>
11
11
  #include <errno.h>
12
+ #include <stdarg.h>
12
13
 
13
14
  #include "ruby.h"
14
15
 
@@ -20,7 +21,7 @@ __declspec(dllexport) void Init_rua(void);
20
21
 
21
22
  #include "rua.h"
22
23
 
23
- #define VERSION "0.3.5"
24
+ #define VERSION "0.3.7"
24
25
  #define REF_RBOBJ "self"
25
26
 
26
27
  #define ICONV_JIS "ISO-2022-JP"
@@ -978,7 +979,7 @@ static void rua_pushrbval(lua_State *L, VALUE rbval, struct rua_state *R) {
978
979
  lua_pushlightuserdata(L, (void *) rbval);
979
980
  lua_pushlightuserdata(L, R);
980
981
  lua_pushcclosure(L, rua_proc_call, 2);
981
- rua_set_finalizer(L, -1, rbval, R);
982
+ rua_setmeta2(L, -1, "__gc", rua_finalize_rbobj, 2, rbval, R);
982
983
  } else {
983
984
  rua_newtable_from_obj(L, rbval, R);
984
985
  }
@@ -1021,15 +1022,17 @@ static void rua_newtable_from_hash(lua_State *L, VALUE hash, struct rua_state *R
1021
1022
 
1022
1023
  static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R) {
1023
1024
  VALUE methods, name, method;
1024
- int i, tblidx;
1025
+ int i, tblidx, prxidx;
1025
1026
 
1027
+ lua_newtable(L);
1028
+ prxidx = lua_gettop(L);
1026
1029
  lua_newtable(L);
1027
1030
  tblidx = lua_gettop(L);
1028
1031
  methods = rb_check_convert_type(obj, T_ARRAY, "Array", "methods");
1029
1032
 
1030
1033
  lua_pushstring(L, REF_RBOBJ);
1031
1034
  lua_pushlightuserdata(L, (void *) obj);
1032
- rua_set_finalizer(L, -1, obj, R);
1035
+ rua_setmeta2(L, -1, "__gc", rua_finalize_rbobj, 2, obj, R);
1033
1036
  lua_rawset(L, tblidx);
1034
1037
  rb_hash_aset(R->refs, obj, Qtrue);
1035
1038
 
@@ -1046,6 +1049,47 @@ static void rua_newtable_from_obj(lua_State *L, VALUE obj, struct rua_state *R)
1046
1049
  rua_pushrbval(L, method, R);
1047
1050
  lua_rawset(L, tblidx);
1048
1051
  }
1052
+
1053
+ lua_pushvalue(L, -1);
1054
+ rua_setmeta(L, prxidx, "__index", rua_getobject_event, 1);
1055
+ rua_setmeta(L, prxidx, "__newindex", rua_setobject_event, 1);
1056
+ }
1057
+
1058
+ static int rua_getobject_event(lua_State *L) {
1059
+ int tblidx;
1060
+
1061
+ tblidx = lua_upvalueindex(1);
1062
+ lua_rawget(L, tblidx);
1063
+ return 1;
1064
+ }
1065
+
1066
+ static int rua_setobject_event(lua_State *L) {
1067
+ const char *key;
1068
+ size_t keylen;
1069
+ char *setter;
1070
+ int tblidx;
1071
+
1072
+ tblidx = lua_upvalueindex(1);
1073
+
1074
+ key = lua_tostring(L, -2);
1075
+ keylen = strlen(key);
1076
+ setter = alloca(keylen + 2);
1077
+ memcpy(setter, key, keylen);
1078
+ setter[keylen] = '=';
1079
+ setter[keylen + 1] = '\0';
1080
+
1081
+ lua_pushstring(L, setter);
1082
+ lua_rawget(L, tblidx);
1083
+
1084
+ if (lua_isfunction(L, -1)) {
1085
+ lua_pushvalue(L, -2);
1086
+ lua_call(L, 1, 0);
1087
+ } else {
1088
+ lua_pop(L, 1);
1089
+ lua_rawset(L, tblidx);
1090
+ }
1091
+
1092
+ return 0;
1049
1093
  }
1050
1094
 
1051
1095
  static int rua_proc_call(lua_State *L) {
@@ -1213,10 +1257,10 @@ static const char *rua_classname_ptr(VALUE v) {
1213
1257
  return StringValuePtr(klassname);
1214
1258
  }
1215
1259
 
1216
- static void rua_set_finalizer(lua_State *L, int idx, VALUE rbobj, struct rua_state *R) {
1217
- int pretop, objidx, tblidx;
1260
+ static void rua_setmeta(lua_State *L, int idx, const char *key, lua_CFunction f, int n) {
1261
+ int basetop, objidx, tblidx, i;
1218
1262
 
1219
- pretop = lua_gettop(L);
1263
+ basetop = lua_gettop(L) - n;
1220
1264
  lua_pushvalue(L, idx);
1221
1265
  objidx = lua_gettop(L);
1222
1266
 
@@ -1227,14 +1271,37 @@ static void rua_set_finalizer(lua_State *L, int idx, VALUE rbobj, struct rua_sta
1227
1271
  }
1228
1272
 
1229
1273
  tblidx = lua_gettop(L);
1230
- lua_pushstring(L, "__gc");
1274
+ lua_pushstring(L, key);
1231
1275
 
1232
- lua_pushlightuserdata(L, (void *) rbobj);
1233
- lua_pushlightuserdata(L, R);
1234
- lua_pushcclosure(L, rua_finalize_rbobj, 2);
1276
+ for (i = 1; i <= n; i++) {
1277
+ lua_pushvalue(L, basetop + i);
1278
+ }
1279
+
1280
+ if (n > 0) {
1281
+ lua_pushcclosure(L, f, n);
1282
+ } else {
1283
+ lua_pushcfunction(L, f);
1284
+ }
1235
1285
 
1236
1286
  lua_rawset(L, tblidx);
1237
- lua_pop(L, lua_gettop(L) - pretop);
1287
+ lua_pop(L, lua_gettop(L) - basetop);
1288
+ }
1289
+
1290
+ static void rua_setmeta2(lua_State *L, int idx, const char *key, lua_CFunction f, int n, ...) {
1291
+ va_list argp;
1292
+ int i;
1293
+
1294
+ va_start(argp, n);
1295
+
1296
+ for (i = 0; i < n; i++) {
1297
+ lua_pushlightuserdata(L, va_arg(argp, void*));
1298
+ }
1299
+
1300
+ if (idx < 0) {
1301
+ idx -= n;
1302
+ }
1303
+
1304
+ rua_setmeta(L, idx, key, f, n);
1238
1305
  }
1239
1306
 
1240
1307
  static int rua_finalize_rbobj(lua_State *L) {
Binary file
metadata CHANGED
@@ -1,50 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
4
2
  name: rua
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.3.5
7
- date: 2007-12-10 00:00:00 +09:00
8
- summary: Rua is a library for using Lua under Ruby.
9
- require_paths:
10
- - lib/i386-mswin32
11
- email: sgwr_dts@yahoo.co.jp
12
- homepage: http://rua.rubyforge.org
13
- rubyforge_project:
14
- description:
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.3.7
25
5
  platform: mswin32
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - winebarrel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2007-12-26 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: sgwr_dts@yahoo.co.jp
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.txt
24
+ - ext/rua.c
31
25
  files:
32
26
  - README.txt
33
27
  - lib/i386-mswin32/rua.so
34
28
  - ext/rua.c
35
- test_files: []
36
-
29
+ has_rdoc: true
30
+ homepage: http://rua.rubyforge.org
31
+ post_install_message:
37
32
  rdoc_options:
38
33
  - --title
39
34
  - Rua - library for using Lua under Ruby.
40
- extra_rdoc_files:
41
- - README.txt
42
- - ext/rua.c
43
- executables: []
44
-
45
- extensions: []
46
-
35
+ require_paths:
36
+ - lib/i386-mswin32
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
47
49
  requirements: []
48
50
 
49
- dependencies: []
51
+ rubyforge_project:
52
+ rubygems_version: 0.9.5
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: Rua is a library for using Lua under Ruby.
56
+ test_files: []
50
57