rufus-lua 1.0.0 → 1.1.0
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/CHANGELOG.txt +20 -1
- data/CREDITS.txt +4 -3
- data/{README.txt → README.rdoc} +15 -19
- data/TODO.txt +6 -1
- data/lib/rufus/lua/lib.rb +13 -7
- data/lib/rufus/lua/objects.rb +48 -20
- data/lib/rufus/lua/state.rb +88 -42
- data/lib/rufus/lua/utils.rb +1 -3
- metadata +9 -7
- data/t.txt +0 -24
data/CHANGELOG.txt
CHANGED
@@ -2,7 +2,26 @@
|
|
2
2
|
= rufus-lua CHANGELOG.txt
|
3
3
|
|
4
4
|
|
5
|
-
== rufus-lua - 1.
|
5
|
+
== rufus-lua - 1.1.0 released 2009/09/30
|
6
|
+
|
7
|
+
- todo : Ruby symbols are passed to Lua as strings (Scott)
|
8
|
+
- todo : implemented State#function :to_ruby option
|
9
|
+
- todo : implemented Table#to_ruby
|
10
|
+
- todo : added 'pure' option to Table#to_a
|
11
|
+
- issue : added State@callbacks array to preserve callback from GC (Scott)
|
12
|
+
- issue : passing tables to ruby functions wrecked arg list. Fixed.
|
13
|
+
- todo : added way to load only a given set of libs when State.new (Scott)
|
14
|
+
- todo : honouring #to_lua when calling Lua functions from Ruby (Scott)
|
15
|
+
- todo : search for dylib in /usr/lib as well (Scott)
|
16
|
+
- issue #5 : Ruby function more tolerant with block arity.
|
17
|
+
- issue #4 : Ruby function inverses order of its parameters. Fixed. (Scott)
|
18
|
+
- todo : state['a'] = [ 1, 2, 3 ] now possible
|
19
|
+
- issue #2 : tables returned from Ruby functions were indexed at 0. (Scott)
|
20
|
+
- issue #3 : passing false from Ruby to Lua twists it to true. (Scott)
|
21
|
+
- issue #1 : Ruby function return array not OK. Fixed. (Thanks Scott Persinger)
|
22
|
+
|
23
|
+
|
24
|
+
== rufus-lua - 1.0.0 released 2009/03/27
|
6
25
|
|
7
26
|
- automatically creates lib table when defined Ruby function (callback)
|
8
27
|
- implemented #[]=, #objlen and #size for table
|
data/CREDITS.txt
CHANGED
@@ -5,7 +5,8 @@
|
|
5
5
|
== authors
|
6
6
|
|
7
7
|
John Mettraux http://jmettraux.wordpress.com
|
8
|
-
Alain Hoang
|
8
|
+
Alain Hoang http://blogs.law.harvard.edu/hoanga/
|
9
|
+
Scott Persinger http://github.com/scottpersinger
|
9
10
|
|
10
11
|
|
11
12
|
== inspiration
|
@@ -15,7 +16,7 @@ Alain Hoang http://blogs.law.harvard.edu/hoanga/
|
|
15
16
|
|
16
17
|
== finally
|
17
18
|
|
18
|
-
many thanks to the authors of ruby-ffi
|
19
|
+
many thanks to the authors of ruby-ffi, especially Wayne Meissner,
|
19
20
|
|
20
|
-
http://
|
21
|
+
http://wiki.github.com/ffi/ffi
|
21
22
|
|
data/{README.txt → README.rdoc}
RENAMED
@@ -3,10 +3,6 @@
|
|
3
3
|
|
4
4
|
Lua embedded in Ruby, via Ruby FFI
|
5
5
|
|
6
|
-
Tested with
|
7
|
-
ruby 1.8.6, ruby 1.9.1p0, jruby 1.2.0
|
8
|
-
jruby 1.1.6 has an issue with errors raised inside of Ruby functions (callbacks)
|
9
|
-
|
10
6
|
|
11
7
|
== Lua
|
12
8
|
|
@@ -24,8 +20,8 @@ http://www.lua.org/
|
|
24
20
|
== other Ruby and Lua bridges / connectors
|
25
21
|
|
26
22
|
|
27
|
-
|
28
|
-
|
23
|
+
http://rubyluabridge.rubyforge.org/
|
24
|
+
http://raa.ruby-lang.org/project/ruby-lua
|
29
25
|
|
30
26
|
|
31
27
|
== using rufus-lua
|
@@ -133,27 +129,27 @@ then
|
|
133
129
|
modify the file src/Makefile as per http://lua-users.org/lists/lua-l/2006-09/msg00894.html
|
134
130
|
|
135
131
|
make
|
136
|
-
make
|
137
|
-
make -C src
|
138
|
-
|
132
|
+
make macosx # or make linux ...
|
133
|
+
make -C src liblua.dylib
|
139
134
|
sudo cp src/liblua.dylib /usr/local/lib/
|
140
135
|
|
136
|
+
sudo make macosx install
|
141
137
|
|
142
|
-
== build dependencies
|
143
138
|
|
144
|
-
|
145
|
-
gem sources -a http://gems.github.com
|
139
|
+
== build dependencies
|
146
140
|
|
147
141
|
The following gems are needed to run the specs
|
148
|
-
|
149
|
-
install bacon
|
142
|
+
|
143
|
+
sudo gem install bacon
|
150
144
|
|
151
145
|
|
152
146
|
== tested with
|
153
147
|
|
154
|
-
ruby 1.8.
|
148
|
+
ruby 1.8.7p72, ruby 1.9.1p0, jruby 1.2.0
|
155
149
|
jruby 1.1.6 has an issue with errors raised inside of Ruby functions (callbacks)
|
156
150
|
|
151
|
+
ruby-ffi 0.4.0 and 0.5.0
|
152
|
+
|
157
153
|
|
158
154
|
== dependencies
|
159
155
|
|
@@ -164,12 +160,12 @@ the ruby gem 'ffi'
|
|
164
160
|
|
165
161
|
On the rufus-ruby list :
|
166
162
|
|
167
|
-
|
163
|
+
http://groups.google.com/group/rufus-ruby
|
168
164
|
|
169
165
|
|
170
166
|
== issue tracker
|
171
167
|
|
172
|
-
|
168
|
+
http://github.com/jmettraux/rufus-lua/issues
|
173
169
|
|
174
170
|
|
175
171
|
== irc
|
@@ -188,8 +184,7 @@ http://github.com/jmettraux/rufus-lua
|
|
188
184
|
|
189
185
|
many thanks to the authors of Ruby FFI, and of Lua
|
190
186
|
|
191
|
-
http://
|
192
|
-
|
187
|
+
http://wiki.github.com/ffi/ffi
|
193
188
|
http://lua.org/
|
194
189
|
|
195
190
|
|
@@ -197,6 +192,7 @@ http://lua.org/
|
|
197
192
|
|
198
193
|
John Mettraux, jmettraux@gmail.com, http://jmettraux.wordpress.com
|
199
194
|
Alain Hoang, http://blogs.law.harvard.edu/hoanga/
|
195
|
+
Scott Persinger, http://github.com/scottpersinger/
|
200
196
|
|
201
197
|
|
202
198
|
== the rest of Rufus
|
data/TODO.txt
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
[o] fix coroutine & co / memoization (make it better later)
|
12
12
|
[o] fib.lua, use local, bench ! (2 times faster almost)
|
13
13
|
|
14
|
-
[
|
14
|
+
[o] add GC control methods (Alain)
|
15
15
|
[X] Add method to disable GC
|
16
16
|
[X] Add method to enable GC
|
17
17
|
[ ] Look at parameters in Lua GC that can be tweaked
|
@@ -21,3 +21,8 @@
|
|
21
21
|
[x] ruby callbacks (functions)
|
22
22
|
[ ] ability to bind ruby functions (callbacks) inside of tables (modules)
|
23
23
|
|
24
|
+
[ ] state['var'] = value
|
25
|
+
[ ] state['var'] = hash
|
26
|
+
|
27
|
+
[ ] state.load_and_eval(filepath)
|
28
|
+
|
data/lib/rufus/lua/lib.rb
CHANGED
@@ -34,14 +34,16 @@ module Lua
|
|
34
34
|
extend FFI::Library
|
35
35
|
|
36
36
|
#
|
37
|
-
# locate
|
37
|
+
# locate the dynamic library
|
38
38
|
|
39
|
-
paths = Array(
|
40
|
-
|
41
|
-
/usr/
|
42
|
-
/
|
43
|
-
/
|
44
|
-
|
39
|
+
paths = Array(
|
40
|
+
ENV['LUA_LIB'] ||
|
41
|
+
Dir.glob('/usr/lib/liblua*.so') +
|
42
|
+
Dir.glob('/usr/local/lib/liblua*.so') +
|
43
|
+
Dir.glob('/opt/local/lib/liblua*.so') +
|
44
|
+
Dir.glob('/usr/lib/liblua*.dylib') +
|
45
|
+
Dir.glob('/usr/local/lib/liblua*.dylib') +
|
46
|
+
Dir.glob('/opt/local/lib/liblua*.dylib'))
|
45
47
|
|
46
48
|
begin
|
47
49
|
|
@@ -63,6 +65,10 @@ module Lua
|
|
63
65
|
|
64
66
|
attach_function :luaL_openlibs, [ :pointer ], :void
|
65
67
|
|
68
|
+
%w[ base package string table math io os debug ].each do |libname|
|
69
|
+
attach_function "luaopen_#{libname}", [ :pointer ], :void
|
70
|
+
end
|
71
|
+
|
66
72
|
attach_function :lua_pcall, [ :pointer, :int, :int, :int ], :int
|
67
73
|
#attach_function :lua_resume, [ :pointer, :int ], :int
|
68
74
|
|
data/lib/rufus/lua/objects.rb
CHANGED
@@ -32,7 +32,6 @@ module Rufus::Lua
|
|
32
32
|
class Ref
|
33
33
|
include StateMixin
|
34
34
|
|
35
|
-
#
|
36
35
|
# The reference in the Lua registry.
|
37
36
|
# (You shouldn't care about this value)
|
38
37
|
#
|
@@ -45,18 +44,17 @@ module Rufus::Lua
|
|
45
44
|
# this pops the object out of the stack !
|
46
45
|
end
|
47
46
|
|
48
|
-
#
|
49
47
|
# Frees the reference to this object
|
50
48
|
# (Problably a good idea if you want Lua's GC to get rid of it later).
|
51
49
|
#
|
52
50
|
def free
|
51
|
+
|
53
52
|
Lib.luaL_unref(@pointer, LUA_REGISTRYINDEX, @ref)
|
54
53
|
@ref = nil
|
55
54
|
end
|
56
55
|
|
57
56
|
protected
|
58
57
|
|
59
|
-
#
|
60
58
|
# Brings the referenced object on top of the stack (will probably
|
61
59
|
# then take part in a method call).
|
62
60
|
#
|
@@ -88,7 +86,6 @@ module Rufus::Lua
|
|
88
86
|
#
|
89
87
|
class Function < Ref
|
90
88
|
|
91
|
-
#
|
92
89
|
# Calls the Lua function.
|
93
90
|
#
|
94
91
|
def call (*args)
|
@@ -110,7 +107,6 @@ module Rufus::Lua
|
|
110
107
|
#
|
111
108
|
class Coroutine < Ref
|
112
109
|
|
113
|
-
#
|
114
110
|
# Resumes the coroutine
|
115
111
|
#
|
116
112
|
def resume (*args)
|
@@ -125,7 +121,6 @@ module Rufus::Lua
|
|
125
121
|
pcall(bottom, args.length + 1)
|
126
122
|
end
|
127
123
|
|
128
|
-
#
|
129
124
|
# Returns the string status of the coroutine :
|
130
125
|
# suspended/running/dead/normal
|
131
126
|
#
|
@@ -152,7 +147,6 @@ module Rufus::Lua
|
|
152
147
|
class Table < Ref
|
153
148
|
include Enumerable
|
154
149
|
|
155
|
-
#
|
156
150
|
# The classical 'each'.
|
157
151
|
#
|
158
152
|
# Note it cheats by first turning the table into a Ruby Hash and calling
|
@@ -165,7 +159,6 @@ module Rufus::Lua
|
|
165
159
|
self.to_h.each { |k, v| yield(k, v) }
|
166
160
|
end
|
167
161
|
|
168
|
-
#
|
169
162
|
# Returns the array of keys of this Table.
|
170
163
|
#
|
171
164
|
def keys
|
@@ -173,7 +166,6 @@ module Rufus::Lua
|
|
173
166
|
self.to_h.keys
|
174
167
|
end
|
175
168
|
|
176
|
-
#
|
177
169
|
# Returns the array of values in this Table.
|
178
170
|
#
|
179
171
|
def values
|
@@ -181,7 +173,6 @@ module Rufus::Lua
|
|
181
173
|
self.to_h.values
|
182
174
|
end
|
183
175
|
|
184
|
-
#
|
185
176
|
# Returns the value behind the key, or else nil.
|
186
177
|
#
|
187
178
|
def [] (k)
|
@@ -192,7 +183,6 @@ module Rufus::Lua
|
|
192
183
|
stack_pop
|
193
184
|
end
|
194
185
|
|
195
|
-
#
|
196
186
|
# Sets a value in the table
|
197
187
|
#
|
198
188
|
# TODO : have something for adding in the array part...
|
@@ -208,7 +198,6 @@ module Rufus::Lua
|
|
208
198
|
v
|
209
199
|
end
|
210
200
|
|
211
|
-
#
|
212
201
|
# Returns the size of the table, corresponds to the Lua '#' operator.
|
213
202
|
#
|
214
203
|
# Will thus return 0 if the table doesn't hold any value in its
|
@@ -220,7 +209,6 @@ module Rufus::Lua
|
|
220
209
|
Lib.lua_objlen(@pointer, -1)
|
221
210
|
end
|
222
211
|
|
223
|
-
#
|
224
212
|
# Returns the real size of the table (number of entries + number of elements
|
225
213
|
# in array side)
|
226
214
|
#
|
@@ -230,7 +218,6 @@ module Rufus::Lua
|
|
230
218
|
end
|
231
219
|
alias :length :size
|
232
220
|
|
233
|
-
#
|
234
221
|
# Returns a Ruby Hash instance representing this Lua table.
|
235
222
|
#
|
236
223
|
def to_h
|
@@ -259,23 +246,64 @@ module Rufus::Lua
|
|
259
246
|
h
|
260
247
|
end
|
261
248
|
|
262
|
-
#
|
263
249
|
# Returns a Ruby Array instance representing this Lua table.
|
264
250
|
#
|
265
251
|
# Will raise an error if the 'rendering' is not possible.
|
266
252
|
#
|
267
|
-
|
253
|
+
# s = Rufus::Lua::State.new
|
254
|
+
#
|
255
|
+
# @s.eval("return { a = 'A', b = 'B', c = 3 }").to_a
|
256
|
+
# # => error !
|
257
|
+
#
|
258
|
+
# @s.eval("return { 1, 2 }").to_a
|
259
|
+
# # => [ 1.0, 2.0 ]
|
260
|
+
#
|
261
|
+
# @s.eval("return {}").to_a
|
262
|
+
# # => []
|
263
|
+
#
|
264
|
+
# @s.eval("return { 1, 2, car = 'benz' }").to_a
|
265
|
+
# # => error !
|
266
|
+
#
|
267
|
+
# == to_a(false)
|
268
|
+
#
|
269
|
+
# Setting the optional argument 'pure' to false will manage any table :
|
270
|
+
#
|
271
|
+
# s = Rufus::Lua::State.new
|
272
|
+
#
|
273
|
+
# @s.eval("return { a = 'A', b = 'B', c = 3 }").to_a(false)
|
274
|
+
# # => [["a", "A"], ["b", "B"], ["c", 3.0]]
|
275
|
+
#
|
276
|
+
# @s.eval("return { 1, 2 }").to_a(false)
|
277
|
+
# # => [1.0, 2.0]
|
278
|
+
#
|
279
|
+
# @s.eval("return {}").to_a(false)
|
280
|
+
# # => []
|
281
|
+
#
|
282
|
+
# @s.eval("return { 1, 2, car = 'benz' }").to_a(false)
|
283
|
+
# # => [1.0, 2.0, ["car", "benz"]]
|
284
|
+
#
|
285
|
+
def to_a (pure=true)
|
268
286
|
|
269
287
|
h = self.to_h
|
270
288
|
|
271
|
-
|
272
|
-
|
273
|
-
keys.find { |k| not [ Float ].include?(k.class) } &&
|
289
|
+
pure && h.keys.find { |k| not [ Float ].include?(k.class) } &&
|
274
290
|
raise("cannot turn hash into array, some keys are not numbers")
|
275
291
|
|
276
|
-
|
292
|
+
a_keys = (1..objlen).to_a.collect { |k| k.to_f }
|
293
|
+
keys = a_keys + (h.keys - a_keys)
|
294
|
+
|
295
|
+
keys.inject([]) { |a, k|
|
296
|
+
a << (a_keys.include?(k) ? h[k] : [ k, h[k] ])
|
297
|
+
a
|
298
|
+
}
|
277
299
|
end
|
278
300
|
|
301
|
+
# Turns the Lua table into a Ruby array, or else into a Ruby Hash instance.
|
302
|
+
#
|
303
|
+
def to_ruby
|
304
|
+
|
305
|
+
to_a rescue to_h
|
306
|
+
end
|
279
307
|
end
|
280
308
|
end
|
281
309
|
|
data/lib/rufus/lua/state.rb
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
module Rufus::Lua
|
27
27
|
|
28
|
-
VERSION = '1.
|
28
|
+
VERSION = '1.1.0'
|
29
29
|
|
30
30
|
#
|
31
31
|
# An error class for this gem/library.
|
@@ -75,7 +75,6 @@ module Rufus::Lua
|
|
75
75
|
|
76
76
|
protected
|
77
77
|
|
78
|
-
#
|
79
78
|
# This method is used to fetch/cache references to library methods like
|
80
79
|
# 'math.sin' or 'coroutine.resume'.
|
81
80
|
# The caching is done at the Lua state level (ie, all Lua objects available
|
@@ -92,7 +91,6 @@ module Rufus::Lua
|
|
92
91
|
end
|
93
92
|
end
|
94
93
|
|
95
|
-
#
|
96
94
|
# This method holds the 'eval' mechanism.
|
97
95
|
#
|
98
96
|
def loadstring_and_call (s)
|
@@ -105,7 +103,6 @@ module Rufus::Lua
|
|
105
103
|
pcall(bottom, 0) # arg_count is set to 0
|
106
104
|
end
|
107
105
|
|
108
|
-
#
|
109
106
|
# Returns a string representation of the state's stack.
|
110
107
|
#
|
111
108
|
def stack_to_s
|
@@ -135,7 +132,6 @@ module Rufus::Lua
|
|
135
132
|
s
|
136
133
|
end
|
137
134
|
|
138
|
-
#
|
139
135
|
# Outputs the stack to the stdout
|
140
136
|
#
|
141
137
|
def print_stack (msg=nil)
|
@@ -146,7 +142,6 @@ module Rufus::Lua
|
|
146
142
|
puts "= ="
|
147
143
|
end
|
148
144
|
|
149
|
-
#
|
150
145
|
# Returns the offset (int) of the top element of the stack.
|
151
146
|
#
|
152
147
|
def stack_top
|
@@ -154,7 +149,6 @@ module Rufus::Lua
|
|
154
149
|
Lib.lua_gettop(@pointer)
|
155
150
|
end
|
156
151
|
|
157
|
-
#
|
158
152
|
# Returns a pair type (int) and type name (string) of the element on top
|
159
153
|
# of the Lua state's stack. There is an optional pos paramter to peek
|
160
154
|
# at other elements of the stack.
|
@@ -167,7 +161,6 @@ module Rufus::Lua
|
|
167
161
|
[ type, tname ]
|
168
162
|
end
|
169
163
|
|
170
|
-
#
|
171
164
|
# Fetches the top value on the stack (or the one specified by the optional
|
172
165
|
# pos parameter), but does not 'pop' it.
|
173
166
|
#
|
@@ -184,6 +177,8 @@ module Rufus::Lua
|
|
184
177
|
when TNUMBER then Lib.lua_tonumber(@pointer, pos)
|
185
178
|
|
186
179
|
when TTABLE then Table.new(@pointer)
|
180
|
+
# warning : this pops up the item from the stack !
|
181
|
+
|
187
182
|
when TFUNCTION then Function.new(@pointer)
|
188
183
|
when TTHREAD then Coroutine.new(@pointer)
|
189
184
|
|
@@ -191,7 +186,6 @@ module Rufus::Lua
|
|
191
186
|
end
|
192
187
|
end
|
193
188
|
|
194
|
-
#
|
195
189
|
# Pops the top value of lua state's stack and returns it.
|
196
190
|
#
|
197
191
|
def stack_pop
|
@@ -201,7 +195,6 @@ module Rufus::Lua
|
|
201
195
|
r
|
202
196
|
end
|
203
197
|
|
204
|
-
#
|
205
198
|
# Makes sure the stack loses its top element (but doesn't return it).
|
206
199
|
#
|
207
200
|
def stack_unstack
|
@@ -216,22 +209,24 @@ module Rufus::Lua
|
|
216
209
|
Lib.lua_settop(@pointer, new_top)
|
217
210
|
end
|
218
211
|
|
219
|
-
#
|
220
212
|
# Given a Ruby instance, will attempt to push it on the Lua stack.
|
221
213
|
#
|
222
214
|
def stack_push (o)
|
223
215
|
|
216
|
+
return stack_push(o.to_lua) if o.respond_to?(:to_lua)
|
217
|
+
|
224
218
|
case o
|
225
219
|
|
226
220
|
when NilClass then Lib.lua_pushnil(@pointer)
|
227
221
|
|
228
222
|
when TrueClass then Lib.lua_pushboolean(@pointer, 1)
|
229
|
-
when FalseClass then Lib.lua_pushboolean(@pointer,
|
223
|
+
when FalseClass then Lib.lua_pushboolean(@pointer, 0)
|
230
224
|
|
231
225
|
when Fixnum then Lib.lua_pushinteger(@pointer, o)
|
232
226
|
when Float then Lib.lua_pushnumber(@pointer, o)
|
233
227
|
|
234
228
|
when String then Lib.lua_pushstring(@pointer, o)
|
229
|
+
when Symbol then Lib.lua_pushstring(@pointer, o.to_s)
|
235
230
|
|
236
231
|
when Hash then stack_push_hash(o)
|
237
232
|
when Array then stack_push_array(o)
|
@@ -242,7 +237,6 @@ module Rufus::Lua
|
|
242
237
|
end
|
243
238
|
end
|
244
239
|
|
245
|
-
#
|
246
240
|
# Pushes a hash on top of the Lua stack.
|
247
241
|
#
|
248
242
|
def stack_push_hash (h)
|
@@ -257,7 +251,6 @@ module Rufus::Lua
|
|
257
251
|
end
|
258
252
|
end
|
259
253
|
|
260
|
-
#
|
261
254
|
# Pushes an array on top of the Lua stack.
|
262
255
|
#
|
263
256
|
def stack_push_array (a)
|
@@ -266,13 +259,12 @@ module Rufus::Lua
|
|
266
259
|
# since we already know the size of the table...
|
267
260
|
|
268
261
|
a.each_with_index do |e, i|
|
269
|
-
stack_push(i)
|
262
|
+
stack_push(i + 1)
|
270
263
|
stack_push(e)
|
271
264
|
Lib.lua_settable(@pointer, -3)
|
272
265
|
end
|
273
266
|
end
|
274
267
|
|
275
|
-
#
|
276
268
|
# Loads a Lua global value on top of the stack
|
277
269
|
#
|
278
270
|
def stack_load_global (name)
|
@@ -280,7 +272,6 @@ module Rufus::Lua
|
|
280
272
|
Lib.lua_getfield(@pointer, LUA_GLOBALSINDEX, name)
|
281
273
|
end
|
282
274
|
|
283
|
-
#
|
284
275
|
# Loads the Lua object registered with the given ref on top of the stack
|
285
276
|
#
|
286
277
|
def stack_load_ref (ref)
|
@@ -288,7 +279,6 @@ module Rufus::Lua
|
|
288
279
|
Lib.lua_rawgeti(@pointer, LUA_REGISTRYINDEX, @ref)
|
289
280
|
end
|
290
281
|
|
291
|
-
#
|
292
282
|
# Returns the result of a function call or a coroutine.resume().
|
293
283
|
#
|
294
284
|
def return_result (stack_bottom)
|
@@ -301,7 +291,6 @@ module Rufus::Lua
|
|
301
291
|
(1..count).collect { |pos| stack_pop }.reverse
|
302
292
|
end
|
303
293
|
|
304
|
-
#
|
305
294
|
# Assumes the Lua stack is loaded with a ref to a method and arg_count
|
306
295
|
# arguments (on top of the method), will then call that Lua method and
|
307
296
|
# return a result.
|
@@ -331,7 +320,6 @@ module Rufus::Lua
|
|
331
320
|
#end
|
332
321
|
#++
|
333
322
|
|
334
|
-
#
|
335
323
|
# This method will raise an error with err > 0, else it will immediately
|
336
324
|
# return.
|
337
325
|
#
|
@@ -352,7 +340,6 @@ module Rufus::Lua
|
|
352
340
|
raise LuaError.new("#{where} : '#{s}' (#{err})")
|
353
341
|
end
|
354
342
|
|
355
|
-
#
|
356
343
|
# Given the name of a Lua global variable, will return its value (or nil
|
357
344
|
# if there is nothing bound under that name).
|
358
345
|
#
|
@@ -375,17 +362,32 @@ module Rufus::Lua
|
|
375
362
|
class State
|
376
363
|
include StateMixin
|
377
364
|
|
378
|
-
#
|
379
365
|
# Instantiates a Lua state (runtime).
|
380
366
|
#
|
381
367
|
# Accepts an 'include_libs' optional arg. When set to true (the default,
|
382
368
|
# all the base Lua libs are loaded in the runtime.
|
383
369
|
#
|
370
|
+
# This optional arg can be set to false, when no libs should be present, or
|
371
|
+
# to an array of libs to load in order to prepare the state.
|
372
|
+
#
|
373
|
+
# The list may include 'base', 'package', 'table', 'string', 'math', 'io',
|
374
|
+
# 'os' and 'debug'.
|
375
|
+
#
|
384
376
|
def initialize (include_libs=true)
|
385
377
|
|
386
378
|
@pointer = Lib.luaL_newstate
|
387
379
|
|
388
|
-
|
380
|
+
Array(include_libs).each do |libname|
|
381
|
+
|
382
|
+
if libname == false
|
383
|
+
break
|
384
|
+
elsif libname == true
|
385
|
+
Lib.luaL_openlibs(@pointer)
|
386
|
+
break
|
387
|
+
else
|
388
|
+
Lib.send("luaopen_#{libname}", @pointer)
|
389
|
+
end
|
390
|
+
end
|
389
391
|
|
390
392
|
#
|
391
393
|
# preparing library methods cache
|
@@ -394,9 +396,14 @@ module Rufus::Lua
|
|
394
396
|
attr_reader :__lib_method_cache
|
395
397
|
end
|
396
398
|
@pointer.instance_variable_set(:@__lib_method_cache, {})
|
399
|
+
|
400
|
+
#
|
401
|
+
# an array for preserving callback (Ruby functions) from Ruby
|
402
|
+
# garbage collection (Scott).
|
403
|
+
|
404
|
+
@callbacks = []
|
397
405
|
end
|
398
406
|
|
399
|
-
#
|
400
407
|
# Evaluates a piece (string) of Lua code within the state.
|
401
408
|
#
|
402
409
|
def eval (s)
|
@@ -404,7 +411,6 @@ module Rufus::Lua
|
|
404
411
|
loadstring_and_call(s)
|
405
412
|
end
|
406
413
|
|
407
|
-
#
|
408
414
|
# Returns a value set at the 'global' level in the state.
|
409
415
|
#
|
410
416
|
# state.eval('a = 1 + 2')
|
@@ -415,7 +421,17 @@ module Rufus::Lua
|
|
415
421
|
k.index('.') ? self.eval("return #{k}") : get_global(k)
|
416
422
|
end
|
417
423
|
|
424
|
+
# Allows for setting a Lua varible immediately.
|
425
|
+
#
|
426
|
+
# state['var'] = [ 1, 2, 3 ]
|
427
|
+
# puts state['var'].to_a[0] # => 1
|
418
428
|
#
|
429
|
+
def []= (k, v)
|
430
|
+
|
431
|
+
#puts; puts("#{k} = #{Rufus::Lua.to_lua_s(v)}")
|
432
|
+
self.eval("#{k} = #{Rufus::Lua.to_lua_s(v)}")
|
433
|
+
end
|
434
|
+
|
419
435
|
# Binds a Ruby function (callback) in the top environment of Lua
|
420
436
|
#
|
421
437
|
# require 'rubygems'
|
@@ -440,28 +456,63 @@ module Rufus::Lua
|
|
440
456
|
#
|
441
457
|
# s.close
|
442
458
|
#
|
443
|
-
|
459
|
+
# == :to_ruby => true
|
460
|
+
#
|
461
|
+
# Without this option set to true, Lua tables passed to the wrapped
|
462
|
+
# Ruby code are instances of Rufus::Lua::Table. With this option set,
|
463
|
+
# rufus-lua will call #to_ruby on any parameter that responds to it
|
464
|
+
# (And Rufus::Lua::Table does).
|
465
|
+
#
|
466
|
+
# s = Rufus::Lua::State.new
|
467
|
+
#
|
468
|
+
# s.function 'is_array', :to_ruby => true do |table|
|
469
|
+
# table.is_a?(Array)
|
470
|
+
# end
|
471
|
+
#
|
472
|
+
# s.eval(return is_array({ 1, 2 }))
|
473
|
+
# # => true
|
474
|
+
# s.eval(return is_array({ 'a' = 'b' }))
|
475
|
+
# # => false
|
476
|
+
#
|
477
|
+
def function (name, opts={}, &block)
|
444
478
|
|
445
479
|
raise 'please pass a block for the body of the function' unless block
|
446
480
|
|
481
|
+
to_ruby = opts[:to_ruby]
|
482
|
+
|
447
483
|
callback = Proc.new do |state|
|
448
484
|
|
449
|
-
args =
|
450
|
-
(1..block.arity).collect { |i| stack_pop } :
|
451
|
-
[]
|
485
|
+
args = []
|
452
486
|
|
453
|
-
|
487
|
+
loop do
|
454
488
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
489
|
+
break if stack_top == 0 # never touch stack[0] !!
|
490
|
+
|
491
|
+
arg = stack_fetch
|
492
|
+
break if arg.class == Rufus::Lua::Function
|
493
|
+
|
494
|
+
args.unshift(arg)
|
495
|
+
|
496
|
+
stack_unstack unless args.first.is_a?(Rufus::Lua::Table)
|
497
|
+
end
|
498
|
+
|
499
|
+
while args.size < block.arity
|
500
|
+
args << nil
|
462
501
|
end
|
502
|
+
|
503
|
+
args = args.collect { |a| a.respond_to?(:to_ruby) ? a.to_ruby : a } \
|
504
|
+
if to_ruby
|
505
|
+
|
506
|
+
result = block.call(*args)
|
507
|
+
|
508
|
+
stack_push(result)
|
509
|
+
|
510
|
+
1
|
463
511
|
end
|
464
512
|
|
513
|
+
@callbacks << callback
|
514
|
+
# preserving the callback from garbage collection
|
515
|
+
|
465
516
|
name = name.to_s
|
466
517
|
|
467
518
|
name, index = if ri = name.rindex('.')
|
@@ -494,7 +545,6 @@ module Rufus::Lua
|
|
494
545
|
Lib.lua_setfield(@pointer, index, name)
|
495
546
|
end
|
496
547
|
|
497
|
-
#
|
498
548
|
# Closes the state.
|
499
549
|
#
|
500
550
|
# It's probably a good idea (mem leaks) to close a Lua state once you're
|
@@ -507,7 +557,6 @@ module Rufus::Lua
|
|
507
557
|
@pointer = nil
|
508
558
|
end
|
509
559
|
|
510
|
-
#
|
511
560
|
# Returns current amount of memory in KB in use by Lua
|
512
561
|
#
|
513
562
|
def gc_count
|
@@ -516,7 +565,6 @@ module Rufus::Lua
|
|
516
565
|
Lib.lua_gc(@pointer, LUA_GCCOUNT, 0)
|
517
566
|
end
|
518
567
|
|
519
|
-
#
|
520
568
|
# Runs garbage collection
|
521
569
|
#
|
522
570
|
def gc_collect!
|
@@ -525,7 +573,6 @@ module Rufus::Lua
|
|
525
573
|
Lib.lua_gc(@pointer, LUA_GCCOLLECT, 0)
|
526
574
|
end
|
527
575
|
|
528
|
-
#
|
529
576
|
# Stop garbage collection for this state
|
530
577
|
#
|
531
578
|
def gc_stop
|
@@ -534,7 +581,6 @@ module Rufus::Lua
|
|
534
581
|
Lib.lua_gc(@pointer, LUA_GCSTOP, 0)
|
535
582
|
end
|
536
583
|
|
537
|
-
#
|
538
584
|
# Restart garbage collection for this state
|
539
585
|
#
|
540
586
|
def gc_resume
|
data/lib/rufus/lua/utils.rb
CHANGED
@@ -30,7 +30,6 @@ module Rufus::Lua
|
|
30
30
|
# to load liblua.dylib
|
31
31
|
#++
|
32
32
|
|
33
|
-
#
|
34
33
|
# Turns a Ruby instance into a Lua parseable string representation.
|
35
34
|
#
|
36
35
|
# Will raise an ArgumentError as soon as something else than a simple
|
@@ -60,7 +59,6 @@ module Rufus::Lua
|
|
60
59
|
end
|
61
60
|
end
|
62
61
|
|
63
|
-
#
|
64
62
|
# Turns a Ruby Array or Hash instance into a Lua parseable string
|
65
63
|
# representation.
|
66
64
|
#
|
@@ -69,7 +67,7 @@ module Rufus::Lua
|
|
69
67
|
s = if o.is_a?(Array)
|
70
68
|
o.collect { |e| to_lua_s(e) }
|
71
69
|
else
|
72
|
-
o.collect { |k, v| "#{to_lua_s(k)}
|
70
|
+
o.collect { |k, v| "[#{to_lua_s(k)}] = #{to_lua_s(v)}" }
|
73
71
|
end
|
74
72
|
|
75
73
|
"{ #{s.join(', ')} }"
|
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufus-lua
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Mettraux
|
8
8
|
- Alain Hoang
|
9
|
+
- Scott Persinger
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
13
|
|
13
|
-
date: 2009-
|
14
|
+
date: 2009-09-30 00:00:00 +09:00
|
14
15
|
default_executable:
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +31,7 @@ executables: []
|
|
30
31
|
extensions: []
|
31
32
|
|
32
33
|
extra_rdoc_files:
|
33
|
-
- README.
|
34
|
+
- README.rdoc
|
34
35
|
- CHANGELOG.txt
|
35
36
|
- CREDITS.txt
|
36
37
|
- LICENSE.txt
|
@@ -44,11 +45,12 @@ files:
|
|
44
45
|
- CHANGELOG.txt
|
45
46
|
- CREDITS.txt
|
46
47
|
- LICENSE.txt
|
47
|
-
- README.txt
|
48
|
-
- t.txt
|
49
48
|
- TODO.txt
|
49
|
+
- README.rdoc
|
50
50
|
has_rdoc: true
|
51
51
|
homepage: http://rufus.rubyforge.org/
|
52
|
+
licenses: []
|
53
|
+
|
52
54
|
post_install_message:
|
53
55
|
rdoc_options: []
|
54
56
|
|
@@ -69,9 +71,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
71
|
requirements:
|
70
72
|
- ffi
|
71
73
|
rubyforge_project: rufus
|
72
|
-
rubygems_version: 1.3.
|
74
|
+
rubygems_version: 1.3.5
|
73
75
|
signing_key:
|
74
|
-
specification_version:
|
76
|
+
specification_version: 3
|
75
77
|
summary: ruby-ffi based bridge from Ruby to Lua
|
76
78
|
test_files:
|
77
79
|
- spec/spec.rb
|
data/t.txt
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
$ ruby19 test/bm_fiber.rb
|
2
|
-
user system total real
|
3
|
-
ruby 0.050000 0.010000 0.060000 ( 0.054605)
|
4
|
-
lua via ruby 0.180000 0.000000 0.180000 ( 0.189010)
|
5
|
-
lua 0.010000 0.000000 0.010000 ( 0.005543)
|
6
|
-
|
7
|
-
$ ruby19 test/bm_fiber.rb
|
8
|
-
user system total real
|
9
|
-
ruby 0.050000 0.000000 0.050000 ( 0.051531)
|
10
|
-
lua via ruby 0.180000 0.010000 0.190000 ( 0.194944)
|
11
|
-
lua 0.010000 0.000000 0.010000 ( 0.006325)
|
12
|
-
|
13
|
-
$ ruby19 test/bm_fiber.rb
|
14
|
-
user system total real
|
15
|
-
ruby 0.050000 0.010000 0.060000 ( 0.052032)
|
16
|
-
lua via ruby 0.180000 0.000000 0.180000 ( 0.195411)
|
17
|
-
lua 0.010000 0.000000 0.010000 ( 0.006394)
|
18
|
-
|
19
|
-
$ ruby19 test/bm_fiber.rb
|
20
|
-
user system total real
|
21
|
-
ruby 0.050000 0.010000 0.060000 ( 0.054892)
|
22
|
-
lua via ruby 0.180000 0.000000 0.180000 ( 0.267880)
|
23
|
-
lua 0.000000 0.000000 0.000000 ( 0.005865)
|
24
|
-
|