rufus-lua 1.1.2 → 1.1.3
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 +5 -0
- data/CREDITS.txt +1 -0
- data/LICENSE.txt +1 -1
- data/README.md +9 -5
- data/lib/rufus/lua.rb +1 -1
- data/lib/rufus/lua/error.rb +1 -1
- data/lib/rufus/lua/lib.rb +1 -1
- data/lib/rufus/lua/objects.rb +1 -1
- data/lib/rufus/lua/state.rb +2 -2
- data/lib/rufus/lua/utils.rb +1 -1
- data/lib/rufus/lua/version.rb +2 -2
- data/rufus-lua.gemspec +1 -2
- metadata +10 -45
- data/Rakefile +0 -82
- data/spec/coroutines_spec.rb +0 -136
- data/spec/error_handler_spec.rb +0 -222
- data/spec/eval_spec.rb +0 -165
- data/spec/functions_spec.rb +0 -119
- data/spec/gc_spec.rb +0 -41
- data/spec/lib_spec.rb +0 -32
- data/spec/rfunctions_spec.rb +0 -295
- data/spec/spec.rb +0 -9
- data/spec/spec_base.rb +0 -10
- data/spec/state_spec.rb +0 -106
- data/spec/string_spec.rb +0 -60
- data/spec/tables_spec.rb +0 -165
- data/spec/utils_spec.rb +0 -45
- data/test/bm0.rb +0 -41
- data/test/bm_fiber.rb +0 -78
- data/test/bm_gc_stop.rb +0 -43
- data/test/gc0.rb +0 -19
- data/test/t.rb +0 -19
data/spec/error_handler_spec.rb
DELETED
@@ -1,222 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Specifying rufus-lua
|
4
|
-
#
|
5
|
-
# Tue Jul 22 21:07:10 JST 2014
|
6
|
-
#
|
7
|
-
|
8
|
-
require 'spec_base'
|
9
|
-
|
10
|
-
|
11
|
-
describe 'State and error handler' do
|
12
|
-
|
13
|
-
before do
|
14
|
-
@s = Rufus::Lua::State.new
|
15
|
-
end
|
16
|
-
after do
|
17
|
-
@s.close
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#set_error_handler(lua_code)' do
|
21
|
-
|
22
|
-
it 'registers a function as error handler' do
|
23
|
-
|
24
|
-
le = nil
|
25
|
-
|
26
|
-
@s.set_error_handler(%{
|
27
|
-
function (e)
|
28
|
-
return e .. '\\n' .. debug.traceback()
|
29
|
-
end
|
30
|
-
})
|
31
|
-
|
32
|
-
@s.eval(%{
|
33
|
-
function f ()
|
34
|
-
error("in f")
|
35
|
-
end
|
36
|
-
}, nil, 'mystuff.lua', 77)
|
37
|
-
begin
|
38
|
-
@s.eval('f()', nil, 'mymain.lua', 88)
|
39
|
-
rescue Rufus::Lua::LuaError => le
|
40
|
-
end
|
41
|
-
|
42
|
-
expect(le.message).to eq(%{
|
43
|
-
eval:pcall : '[string "mystuff.lua:77"]:3: in f
|
44
|
-
stack traceback:
|
45
|
-
[string "line"]:2: in function <[string "line"]:1>
|
46
|
-
[C]: in function 'error'
|
47
|
-
[string "mystuff.lua:77"]:3: in function 'f'
|
48
|
-
[string "mymain.lua:88"]:1: in main chunk' (2 LUA_ERRRUN)
|
49
|
-
}.strip)
|
50
|
-
|
51
|
-
expect(@s.send(:stack_top)).to eq(1)
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'sets the error handler in a permanent way' do
|
55
|
-
|
56
|
-
le = nil
|
57
|
-
|
58
|
-
@s.set_error_handler(%{
|
59
|
-
function (e)
|
60
|
-
return 'something went wrong: ' .. string.gmatch(e, ": (.+)$")()
|
61
|
-
end
|
62
|
-
})
|
63
|
-
|
64
|
-
begin
|
65
|
-
@s.eval('error("a")')
|
66
|
-
rescue Rufus::Lua::LuaError => le
|
67
|
-
end
|
68
|
-
|
69
|
-
expect(le.msg).to eq('something went wrong: a')
|
70
|
-
|
71
|
-
begin
|
72
|
-
@s.eval('error("b")')
|
73
|
-
rescue Rufus::Lua::LuaError => le
|
74
|
-
end
|
75
|
-
|
76
|
-
expect(le.msg).to eq('something went wrong: b')
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'CallbackState' do
|
80
|
-
|
81
|
-
# Setting an error handler on the calling state or even directly
|
82
|
-
# on the CallbackState doesn't have any effect.
|
83
|
-
# Any error handler seems bypassed.
|
84
|
-
|
85
|
-
it 'has no effect' do
|
86
|
-
|
87
|
-
e = nil
|
88
|
-
|
89
|
-
@s.set_error_handler(%{
|
90
|
-
function (e) return 'bad: ' .. string.gmatch(e, ": (.+)$")() end
|
91
|
-
})
|
92
|
-
f = @s.function(:do_fail) { fail('in style') }
|
93
|
-
begin
|
94
|
-
@s.eval('do_fail()')
|
95
|
-
rescue Exception => e
|
96
|
-
end
|
97
|
-
|
98
|
-
expect(e.class).to eq(RuntimeError)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe '#set_error_handler(:traceback)' do
|
104
|
-
|
105
|
-
it 'sets a vanilla debug.traceback() error handler' do
|
106
|
-
|
107
|
-
le = nil
|
108
|
-
|
109
|
-
@s.set_error_handler(:traceback)
|
110
|
-
|
111
|
-
@s.eval(%{
|
112
|
-
function f ()
|
113
|
-
error("in f")
|
114
|
-
end
|
115
|
-
}, nil, 'mystuff.lua', 77)
|
116
|
-
begin
|
117
|
-
@s.eval('f()', nil, 'mymain.lua', 88)
|
118
|
-
rescue Rufus::Lua::LuaError => le
|
119
|
-
end
|
120
|
-
|
121
|
-
expect(le.message).to eq(%{
|
122
|
-
eval:pcall : '[string "mystuff.lua:77"]:3: in f
|
123
|
-
stack traceback:
|
124
|
-
[C]: in function 'error'
|
125
|
-
[string "mystuff.lua:77"]:3: in function 'f'
|
126
|
-
[string "mymain.lua:88"]:1: in main chunk' (2 LUA_ERRRUN)
|
127
|
-
}.strip)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe '#set_error_handler(:backtrace)' do
|
132
|
-
|
133
|
-
it 'sets a special handler that provides a merged Ruby then Lua backtrace'
|
134
|
-
# does it make any sense?
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#set_error_handler(&ruby_block)' do
|
138
|
-
|
139
|
-
it 'sets a Ruby callback as handler' do
|
140
|
-
|
141
|
-
le = nil
|
142
|
-
|
143
|
-
@s.set_error_handler do |msg|
|
144
|
-
([ msg.split.last ] * 3).join(' ')
|
145
|
-
end
|
146
|
-
|
147
|
-
begin
|
148
|
-
@s.eval('error("tora")')
|
149
|
-
rescue Rufus::Lua::LuaError => le
|
150
|
-
end
|
151
|
-
|
152
|
-
expect(le.msg).to eq('tora tora tora')
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
describe '#set_error_handler(nil)' do
|
157
|
-
|
158
|
-
it 'unsets the current error handler' do
|
159
|
-
|
160
|
-
le = nil
|
161
|
-
|
162
|
-
# set
|
163
|
-
|
164
|
-
@s.set_error_handler(%{
|
165
|
-
function (e)
|
166
|
-
return 'something went wrong: ' .. string.gmatch(e, ": (.+)$")()
|
167
|
-
end
|
168
|
-
})
|
169
|
-
|
170
|
-
begin
|
171
|
-
@s.eval('error("a")')
|
172
|
-
rescue Rufus::Lua::LuaError => le
|
173
|
-
end
|
174
|
-
|
175
|
-
expect(le.msg).to eq('something went wrong: a')
|
176
|
-
|
177
|
-
# unset
|
178
|
-
|
179
|
-
@s.set_error_handler(nil)
|
180
|
-
|
181
|
-
begin
|
182
|
-
@s.eval('error("b")')
|
183
|
-
rescue Rufus::Lua::LuaError => le
|
184
|
-
end
|
185
|
-
|
186
|
-
expect(le.msg).to eq('[string "line"]:1: b')
|
187
|
-
expect(@s.send(:stack_top)).to eq(0)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe '#set_error_handler(x)' do
|
192
|
-
|
193
|
-
it 'pops the previous handler from the stack' do
|
194
|
-
|
195
|
-
le = nil
|
196
|
-
|
197
|
-
expect(@s.send(:stack_top)).to eq(0)
|
198
|
-
|
199
|
-
@s.set_error_handler(%{ function (e) return "a" end })
|
200
|
-
#@s.set_error_handler(:traceback)
|
201
|
-
#@s.set_error_handler do |msg| return msg * 2; end
|
202
|
-
|
203
|
-
#@s.send(:print_stack)
|
204
|
-
|
205
|
-
expect(@s.send(:stack_top)).to eq(1)
|
206
|
-
|
207
|
-
@s.set_error_handler(%{ function (e) return "b" end })
|
208
|
-
|
209
|
-
#@s.send(:print_stack)
|
210
|
-
|
211
|
-
expect(@s.send(:stack_top)).to eq(1)
|
212
|
-
|
213
|
-
begin
|
214
|
-
@s.eval('error("Z")')
|
215
|
-
rescue Rufus::Lua::LuaError => le
|
216
|
-
end
|
217
|
-
|
218
|
-
expect(le.msg).to eq('b')
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
data/spec/eval_spec.rb
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Specifying rufus-lua
|
4
|
-
#
|
5
|
-
# Wed Mar 11 17:09:17 JST 2009
|
6
|
-
#
|
7
|
-
|
8
|
-
require 'spec_base'
|
9
|
-
|
10
|
-
|
11
|
-
describe Rufus::Lua::State do
|
12
|
-
|
13
|
-
before do
|
14
|
-
@s = Rufus::Lua::State.new
|
15
|
-
end
|
16
|
-
after do
|
17
|
-
@s.close
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#[]' do
|
21
|
-
|
22
|
-
it 'returns nil for an unknown value/binding' do
|
23
|
-
|
24
|
-
expect(@s['unknown']).to eq nil
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#eval' do
|
29
|
-
|
30
|
-
it 'evals true' do
|
31
|
-
|
32
|
-
@s.eval('a = true')
|
33
|
-
expect(@s['a']).to eq true
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'evals false' do
|
37
|
-
|
38
|
-
@s.eval('a = false')
|
39
|
-
expect(@s['a']).to eq false
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'evals strings' do
|
43
|
-
|
44
|
-
@s.eval('a = "black adder"')
|
45
|
-
expect(@s['a']).to eq 'black adder'
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'evals additions' do
|
49
|
-
|
50
|
-
@s.eval('a = 1 + 1')
|
51
|
-
expect(@s['a']).to eq 2.0
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'evals nested lookups' do
|
55
|
-
|
56
|
-
@s.eval('a = { b = { c = 0 } }')
|
57
|
-
@s.eval('_ = a.b.c')
|
58
|
-
expect(@s['_']).to eq 0
|
59
|
-
end
|
60
|
-
|
61
|
-
#it 'returns the global environment' do
|
62
|
-
# @s['_G']).to eq {}
|
63
|
-
#end
|
64
|
-
|
65
|
-
it 'returns numbers' do
|
66
|
-
|
67
|
-
expect(@s.eval('return 7')).to eq 7.0
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'returns multiple values' do
|
71
|
-
|
72
|
-
expect(@s.eval('return 1, 2')).to eq [ 1.0, 2.0 ]
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'returns multiple values (tables included)' do
|
76
|
-
|
77
|
-
r = @s.eval('return 1, 2, {}')
|
78
|
-
|
79
|
-
expect(r.class).to eq Array
|
80
|
-
expect(r[0, 2]).to eq [ 1.0, 2.0 ]
|
81
|
-
expect(r[2].class).to eq Rufus::Lua::Table
|
82
|
-
expect(r[2].size).to eq 0
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'returns multiple values (tables included) (take 2)' do
|
86
|
-
|
87
|
-
r = @s.eval('return { "hello", "world" }, 2, { 3 }')
|
88
|
-
|
89
|
-
expect(r[0].class).to eq Rufus::Lua::Table
|
90
|
-
expect(r[0][1]).to eq 'hello'
|
91
|
-
expect(r[0][2]).to eq 'world'
|
92
|
-
expect(r[1]).to eq 2.0
|
93
|
-
expect(r[2].class).to eq Rufus::Lua::Table
|
94
|
-
expect(r[2][1]).to eq 3.0
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'returns false' do
|
98
|
-
|
99
|
-
expect(@s.eval('return false')).to eq false
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'returns true' do
|
103
|
-
|
104
|
-
expect(@s.eval('return true')).to eq true
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'returns tables' do
|
108
|
-
|
109
|
-
r = @s.eval('return { "hello", "world", 2 }')
|
110
|
-
|
111
|
-
expect(r.class).to eq Rufus::Lua::Table
|
112
|
-
expect(r[0]).to eq nil
|
113
|
-
expect(r[1]).to eq 'hello'
|
114
|
-
expect(r[2]).to eq 'world'
|
115
|
-
expect(r[3]).to eq 2.0
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'accepts a binding optional argument'
|
119
|
-
|
120
|
-
it 'accepts a filename and a lineno optional arguments' do
|
121
|
-
|
122
|
-
le = nil
|
123
|
-
begin
|
124
|
-
@s.eval('error(77)', nil, '/nada/virtual.lua', 63)
|
125
|
-
rescue Rufus::Lua::LuaError => le
|
126
|
-
end
|
127
|
-
|
128
|
-
expect(le.kind).to eq('eval:pcall')
|
129
|
-
expect(le.msg).to eq('[string "/nada/virtual.lua:63"]:1: 77')
|
130
|
-
expect(le.errcode).to eq(2)
|
131
|
-
|
132
|
-
expect(le.filename).to eq('/nada/virtual.lua')
|
133
|
-
expect(le.lineno).to eq(63)
|
134
|
-
|
135
|
-
expect(le.original_backtrace.first).to match(/\/lua\/state\.rb:/)
|
136
|
-
expect(le.backtrace.first).to eq('/nada/virtual.lua:63:')
|
137
|
-
end
|
138
|
-
|
139
|
-
context 'and errors' do
|
140
|
-
|
141
|
-
it 'makes the file and line available' do
|
142
|
-
|
143
|
-
le = nil
|
144
|
-
begin
|
145
|
-
@s.eval('error(77)')
|
146
|
-
rescue Rufus::Lua::LuaError => le
|
147
|
-
end
|
148
|
-
|
149
|
-
expect(le.kind).to eq('eval:pcall')
|
150
|
-
expect(le.msg).to eq('[string "line"]:1: 77')
|
151
|
-
expect(le.errcode).to eq(2)
|
152
|
-
|
153
|
-
expect(le.message).to eq(
|
154
|
-
"eval:pcall : '[string \"line\"]:1: 77' (2 LUA_ERRRUN)")
|
155
|
-
|
156
|
-
expect(le.filename).to eq(__FILE__)
|
157
|
-
expect(le.lineno).to eq(__LINE__ - 12)
|
158
|
-
|
159
|
-
expect(le.original_backtrace.first).to match(/\/lua\/state\.rb:/)
|
160
|
-
expect(le.backtrace.first).to match(/\/eval_spec\.rb:/)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
data/spec/functions_spec.rb
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Specifying rufus-lua
|
4
|
-
#
|
5
|
-
# Wed Mar 11 17:09:17 JST 2009
|
6
|
-
#
|
7
|
-
|
8
|
-
require 'spec_base'
|
9
|
-
|
10
|
-
|
11
|
-
describe Rufus::Lua::State do
|
12
|
-
|
13
|
-
describe 'Lua functions' do
|
14
|
-
|
15
|
-
before do
|
16
|
-
@s = Rufus::Lua::State.new
|
17
|
-
end
|
18
|
-
after do
|
19
|
-
@s.close
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'are returned as Rufus::Lua::Function instances' do
|
23
|
-
|
24
|
-
expect(@s.eval('return function () end').class).to eq Rufus::Lua::Function
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'are callable from Ruby' do
|
28
|
-
|
29
|
-
f = @s.eval(%{
|
30
|
-
f = function ()
|
31
|
-
return 77
|
32
|
-
end
|
33
|
-
return f
|
34
|
-
})
|
35
|
-
|
36
|
-
expect(f.call()).to eq 77.0
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'are callable even when they return multiple values' do
|
40
|
-
|
41
|
-
f = @s.eval(%{
|
42
|
-
f = function ()
|
43
|
-
return 77, 44
|
44
|
-
end
|
45
|
-
return f
|
46
|
-
})
|
47
|
-
|
48
|
-
expect(f.call()).to eq [ 77.0, 44.0 ]
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'are callable with arguments' do
|
52
|
-
|
53
|
-
f = @s.eval(%{
|
54
|
-
f = function (x)
|
55
|
-
return x * x
|
56
|
-
end
|
57
|
-
return f
|
58
|
-
})
|
59
|
-
|
60
|
-
expect(f.call(2)).to eq 4.0
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'are callable with boolean arguments' do
|
64
|
-
|
65
|
-
f = @s.eval(%{
|
66
|
-
f = function (x)
|
67
|
-
return x
|
68
|
-
end
|
69
|
-
return f
|
70
|
-
})
|
71
|
-
|
72
|
-
expect(f.call(true)).to eq true
|
73
|
-
expect(f.call(false)).to eq false
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'are callable with array arguments' do
|
77
|
-
|
78
|
-
f = @s.eval(%{
|
79
|
-
f = function (x)
|
80
|
-
return x
|
81
|
-
end
|
82
|
-
return f
|
83
|
-
})
|
84
|
-
|
85
|
-
expect(f.call(%w[ one two three ]).to_a).to eq %w[ one two three ]
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'are callable with multiple arguments' do
|
89
|
-
|
90
|
-
f = @s.eval(%{
|
91
|
-
f = function (x, y)
|
92
|
-
return x + y
|
93
|
-
end
|
94
|
-
return f
|
95
|
-
})
|
96
|
-
|
97
|
-
expect(f.call(1, 2)).to eq 3.0
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'are called with #to_lua\'ed Ruby arguments' do
|
101
|
-
|
102
|
-
f = @s.eval(%{
|
103
|
-
f = function (x)
|
104
|
-
return x
|
105
|
-
end
|
106
|
-
return f
|
107
|
-
})
|
108
|
-
|
109
|
-
t = Time.now
|
110
|
-
|
111
|
-
def t.to_lua
|
112
|
-
"lua:#{to_s}"
|
113
|
-
end
|
114
|
-
|
115
|
-
expect(f.call(t)).to eq t.to_lua
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|