rufus-lua 1.1.0 → 1.1.1
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 +17 -0
- data/CREDITS.txt +7 -2
- data/LICENSE.txt +1 -1
- data/README.md +263 -0
- data/Rakefile +82 -0
- data/lib/rufus/lua.rb +4 -1
- data/lib/rufus/lua/error.rb +86 -0
- data/lib/rufus/lua/lib.rb +34 -14
- data/lib/rufus/lua/objects.rb +11 -12
- data/lib/rufus/lua/state.rb +74 -55
- data/lib/rufus/lua/utils.rb +3 -3
- data/lib/rufus/lua/version.rb +32 -0
- data/rufus-lua.gemspec +36 -0
- data/spec/coroutines_spec.rb +90 -0
- data/spec/eval_spec.rb +125 -0
- data/spec/functions_spec.rb +119 -0
- data/spec/gc_spec.rb +41 -0
- data/spec/lib_spec.rb +32 -0
- data/spec/rfunctions_spec.rb +282 -0
- data/spec/spec_base.rb +10 -0
- data/spec/state_spec.rb +106 -0
- data/spec/string_spec.rb +46 -0
- data/spec/tables_spec.rb +165 -0
- data/spec/utils_spec.rb +36 -0
- data/test/bm0.rb +41 -0
- data/test/bm_fiber.rb +78 -0
- data/test/bm_gc_stop.rb +43 -0
- data/test/gc0.rb +19 -0
- data/test/t.rb +19 -0
- metadata +105 -56
- data/README.rdoc +0 -210
data/lib/rufus/lua/lib.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009, John Mettraux, Alain Hoang.
|
2
|
+
# Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -23,7 +23,6 @@
|
|
23
23
|
#++
|
24
24
|
|
25
25
|
|
26
|
-
#require 'rubygems' # done by the 'client' code
|
27
26
|
require 'ffi'
|
28
27
|
|
29
28
|
|
@@ -36,26 +35,45 @@ module Lua
|
|
36
35
|
#
|
37
36
|
# locate the dynamic library
|
38
37
|
|
39
|
-
paths =
|
38
|
+
paths =
|
40
39
|
ENV['LUA_LIB'] ||
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
# developer points to the right lib
|
41
|
+
(
|
42
|
+
Dir.glob('/usr/lib/liblua*.so') +
|
43
|
+
Dir.glob('/usr/lib/*/liblua*.so') +
|
44
|
+
Dir.glob('/usr/local/lib/liblua*.so') +
|
45
|
+
Dir.glob('/opt/local/lib/liblua*.so') +
|
46
|
+
Dir.glob('/usr/lib/liblua*.dylib') +
|
47
|
+
Dir.glob('/usr/local/lib/liblua*.dylib') +
|
48
|
+
Dir.glob('/opt/local/lib/liblua*.dylib')
|
49
|
+
)
|
50
|
+
# or else we attempt to find it from potential locations
|
47
51
|
|
48
52
|
begin
|
49
53
|
|
50
|
-
|
54
|
+
ffi_lib_flags(:lazy, :global)
|
55
|
+
|
56
|
+
ffi_lib(paths)
|
51
57
|
|
52
58
|
rescue LoadError => le
|
53
|
-
|
54
|
-
|
55
|
-
"
|
59
|
+
|
60
|
+
fail RuntimeError.new(
|
61
|
+
"Didn't find the Lua dynamic library on your system. " +
|
62
|
+
"Set LUA_LIB in your environment if have that library or " +
|
63
|
+
"go to https://github.com/jmettraux/rufus-lua to learn how to " +
|
64
|
+
"get it. (paths: #{paths.inspect})"
|
56
65
|
)
|
57
66
|
end
|
58
67
|
|
68
|
+
# Rufus::Lua::Lib.path returns the path to the library used.
|
69
|
+
#
|
70
|
+
def self.path
|
71
|
+
|
72
|
+
f = ffi_libraries.first
|
73
|
+
|
74
|
+
f ? f.name : nil
|
75
|
+
end
|
76
|
+
|
59
77
|
#
|
60
78
|
# attach functions
|
61
79
|
|
@@ -65,6 +83,7 @@ module Lua
|
|
65
83
|
|
66
84
|
attach_function :luaL_openlibs, [ :pointer ], :void
|
67
85
|
|
86
|
+
attach_function :lua_call, [ :pointer, :int, :int ], :void
|
68
87
|
%w[ base package string table math io os debug ].each do |libname|
|
69
88
|
attach_function "luaopen_#{libname}", [ :pointer ], :void
|
70
89
|
end
|
@@ -74,7 +93,7 @@ module Lua
|
|
74
93
|
|
75
94
|
attach_function :lua_toboolean, [ :pointer, :int ], :int
|
76
95
|
attach_function :lua_tonumber, [ :pointer, :int ], :double
|
77
|
-
attach_function :lua_tolstring, [ :pointer, :int, :pointer ], :
|
96
|
+
attach_function :lua_tolstring, [ :pointer, :int, :pointer ], :pointer
|
78
97
|
|
79
98
|
attach_function :lua_type, [ :pointer, :int ], :int
|
80
99
|
attach_function :lua_typename, [ :pointer, :int ], :string
|
@@ -97,6 +116,7 @@ module Lua
|
|
97
116
|
attach_function :lua_pushinteger, [ :pointer, :int ], :pointer
|
98
117
|
attach_function :lua_pushnumber, [ :pointer, :double ], :pointer
|
99
118
|
attach_function :lua_pushstring, [ :pointer, :string ], :pointer
|
119
|
+
attach_function :lua_pushlstring, [ :pointer, :pointer, :int ], :pointer
|
100
120
|
|
101
121
|
attach_function :lua_rawgeti, [ :pointer, :int, :int ], :void
|
102
122
|
|
data/lib/rufus/lua/objects.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009, John Mettraux, Alain Hoang.
|
2
|
+
# Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -37,7 +37,7 @@ module Rufus::Lua
|
|
37
37
|
#
|
38
38
|
attr_reader :ref
|
39
39
|
|
40
|
-
def initialize
|
40
|
+
def initialize(pointer)
|
41
41
|
|
42
42
|
@pointer = pointer
|
43
43
|
@ref = Lib.luaL_ref(@pointer, LUA_REGISTRYINDEX)
|
@@ -60,7 +60,7 @@ module Rufus::Lua
|
|
60
60
|
#
|
61
61
|
def load_onto_stack
|
62
62
|
|
63
|
-
|
63
|
+
fail RuntimeError.new(
|
64
64
|
"#{self.class} got freed, cannot re-access it directly"
|
65
65
|
) unless @ref
|
66
66
|
|
@@ -71,7 +71,6 @@ module Rufus::Lua
|
|
71
71
|
#
|
72
72
|
# A Lua function.
|
73
73
|
#
|
74
|
-
# require 'rubygems'
|
75
74
|
# require 'rufus/lua'
|
76
75
|
#
|
77
76
|
# s = Rufus::Lua::State.new
|
@@ -88,7 +87,7 @@ module Rufus::Lua
|
|
88
87
|
|
89
88
|
# Calls the Lua function.
|
90
89
|
#
|
91
|
-
def call
|
90
|
+
def call(*args)
|
92
91
|
|
93
92
|
bottom = stack_top
|
94
93
|
|
@@ -98,7 +97,7 @@ module Rufus::Lua
|
|
98
97
|
args.each { |arg| stack_push(arg) }
|
99
98
|
# push arguments on stack
|
100
99
|
|
101
|
-
pcall(bottom, args.length)
|
100
|
+
pcall(bottom, args.length, nil, nil, nil)
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
@@ -109,7 +108,7 @@ module Rufus::Lua
|
|
109
108
|
|
110
109
|
# Resumes the coroutine
|
111
110
|
#
|
112
|
-
def resume
|
111
|
+
def resume(*args)
|
113
112
|
|
114
113
|
bottom = stack_top
|
115
114
|
|
@@ -118,7 +117,7 @@ module Rufus::Lua
|
|
118
117
|
load_onto_stack
|
119
118
|
args.each { |arg| stack_push(arg) }
|
120
119
|
|
121
|
-
pcall(bottom, args.length + 1)
|
120
|
+
pcall(bottom, args.length + 1, nil, nil, nil)
|
122
121
|
end
|
123
122
|
|
124
123
|
# Returns the string status of the coroutine :
|
@@ -131,7 +130,7 @@ module Rufus::Lua
|
|
131
130
|
fetch_library_method('coroutine.status').load_onto_stack
|
132
131
|
load_onto_stack
|
133
132
|
|
134
|
-
pcall(bottom, 1)
|
133
|
+
pcall(bottom, 1, nil, nil, nil)
|
135
134
|
end
|
136
135
|
end
|
137
136
|
|
@@ -175,7 +174,7 @@ module Rufus::Lua
|
|
175
174
|
|
176
175
|
# Returns the value behind the key, or else nil.
|
177
176
|
#
|
178
|
-
def []
|
177
|
+
def [](k)
|
179
178
|
|
180
179
|
load_onto_stack # table
|
181
180
|
stack_push(k) # key
|
@@ -187,7 +186,7 @@ module Rufus::Lua
|
|
187
186
|
#
|
188
187
|
# TODO : have something for adding in the array part...
|
189
188
|
#
|
190
|
-
def []=
|
189
|
+
def []=(k, v)
|
191
190
|
|
192
191
|
load_onto_stack
|
193
192
|
|
@@ -282,7 +281,7 @@ module Rufus::Lua
|
|
282
281
|
# @s.eval("return { 1, 2, car = 'benz' }").to_a(false)
|
283
282
|
# # => [1.0, 2.0, ["car", "benz"]]
|
284
283
|
#
|
285
|
-
def to_a
|
284
|
+
def to_a(pure=true)
|
286
285
|
|
287
286
|
h = self.to_h
|
288
287
|
|
data/lib/rufus/lua/state.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009, John Mettraux, Alain Hoang.
|
2
|
+
# Copyright (c) 2009-2014, John Mettraux, Alain Hoang.
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -25,13 +25,6 @@
|
|
25
25
|
|
26
26
|
module Rufus::Lua
|
27
27
|
|
28
|
-
VERSION = '1.1.0'
|
29
|
-
|
30
|
-
#
|
31
|
-
# An error class for this gem/library.
|
32
|
-
#
|
33
|
-
class LuaError < RuntimeError; end
|
34
|
-
|
35
28
|
#
|
36
29
|
# Rufus::Lua::Lib contains all the raw C API Lua methods. The methods
|
37
30
|
# here are shared by all the rufus-lua classes that have to deal with
|
@@ -82,25 +75,25 @@ module Rufus::Lua
|
|
82
75
|
#
|
83
76
|
# (Not sure yet about this yet)
|
84
77
|
#
|
85
|
-
def fetch_library_method
|
78
|
+
def fetch_library_method(s)
|
86
79
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
80
|
+
m = @pointer.__lib_method_cache[s]
|
81
|
+
return m if m
|
82
|
+
|
83
|
+
@pointer.__lib_method_cache[s] =
|
84
|
+
loadstring_and_call("return #{s}", nil, nil, nil)
|
92
85
|
end
|
93
86
|
|
94
87
|
# This method holds the 'eval' mechanism.
|
95
88
|
#
|
96
|
-
def loadstring_and_call
|
89
|
+
def loadstring_and_call(s, binding, filename, lineno)
|
97
90
|
|
98
91
|
bottom = stack_top
|
99
92
|
|
100
93
|
err = Lib.luaL_loadbuffer(@pointer, s, Lib.strlen(s), 'line')
|
101
|
-
|
94
|
+
fail_if_error('eval:compile', err, binding, filename, lineno)
|
102
95
|
|
103
|
-
pcall(bottom, 0) # arg_count is set to 0
|
96
|
+
pcall(bottom, 0, binding, filename, lineno) # arg_count is set to 0
|
104
97
|
end
|
105
98
|
|
106
99
|
# Returns a string representation of the state's stack.
|
@@ -134,7 +127,7 @@ module Rufus::Lua
|
|
134
127
|
|
135
128
|
# Outputs the stack to the stdout
|
136
129
|
#
|
137
|
-
def print_stack
|
130
|
+
def print_stack(msg=nil)
|
138
131
|
|
139
132
|
puts "\n=stack= #{msg ? "(#{msg})" : ""}"
|
140
133
|
puts "top : #{stack_top}"
|
@@ -153,7 +146,7 @@ module Rufus::Lua
|
|
153
146
|
# of the Lua state's stack. There is an optional pos paramter to peek
|
154
147
|
# at other elements of the stack.
|
155
148
|
#
|
156
|
-
def stack_type_at
|
149
|
+
def stack_type_at(pos=-1)
|
157
150
|
|
158
151
|
type = Lib.lua_type(@pointer, pos)
|
159
152
|
tname = Lib.lua_typename(@pointer, type)
|
@@ -164,7 +157,7 @@ module Rufus::Lua
|
|
164
157
|
# Fetches the top value on the stack (or the one specified by the optional
|
165
158
|
# pos parameter), but does not 'pop' it.
|
166
159
|
#
|
167
|
-
def stack_fetch
|
160
|
+
def stack_fetch(pos=-1)
|
168
161
|
|
169
162
|
type, tname = stack_type_at(pos)
|
170
163
|
|
@@ -172,7 +165,11 @@ module Rufus::Lua
|
|
172
165
|
|
173
166
|
when TNIL then nil
|
174
167
|
|
175
|
-
when TSTRING then
|
168
|
+
when TSTRING then
|
169
|
+
len = FFI::MemoryPointer.new(:size_t)
|
170
|
+
ptr = Lib.lua_tolstring(@pointer, pos, len)
|
171
|
+
ptr.read_string(len.read_long)
|
172
|
+
|
176
173
|
when TBOOLEAN then (Lib.lua_toboolean(@pointer, pos) == 1)
|
177
174
|
when TNUMBER then Lib.lua_tonumber(@pointer, pos)
|
178
175
|
|
@@ -211,7 +208,7 @@ module Rufus::Lua
|
|
211
208
|
|
212
209
|
# Given a Ruby instance, will attempt to push it on the Lua stack.
|
213
210
|
#
|
214
|
-
def stack_push
|
211
|
+
def stack_push(o)
|
215
212
|
|
216
213
|
return stack_push(o.to_lua) if o.respond_to?(:to_lua)
|
217
214
|
|
@@ -225,7 +222,7 @@ module Rufus::Lua
|
|
225
222
|
when Fixnum then Lib.lua_pushinteger(@pointer, o)
|
226
223
|
when Float then Lib.lua_pushnumber(@pointer, o)
|
227
224
|
|
228
|
-
when String then Lib.
|
225
|
+
when String then Lib.lua_pushlstring(@pointer, o, o.unpack('C*').size)
|
229
226
|
when Symbol then Lib.lua_pushstring(@pointer, o.to_s)
|
230
227
|
|
231
228
|
when Hash then stack_push_hash(o)
|
@@ -239,7 +236,7 @@ module Rufus::Lua
|
|
239
236
|
|
240
237
|
# Pushes a hash on top of the Lua stack.
|
241
238
|
#
|
242
|
-
def stack_push_hash
|
239
|
+
def stack_push_hash(h)
|
243
240
|
|
244
241
|
Lib.lua_createtable(@pointer, 0, h.size)
|
245
242
|
# since we already know the size of the table...
|
@@ -253,7 +250,7 @@ module Rufus::Lua
|
|
253
250
|
|
254
251
|
# Pushes an array on top of the Lua stack.
|
255
252
|
#
|
256
|
-
def stack_push_array
|
253
|
+
def stack_push_array(a)
|
257
254
|
|
258
255
|
Lib.lua_createtable(@pointer, a.size, 0)
|
259
256
|
# since we already know the size of the table...
|
@@ -267,21 +264,21 @@ module Rufus::Lua
|
|
267
264
|
|
268
265
|
# Loads a Lua global value on top of the stack
|
269
266
|
#
|
270
|
-
def stack_load_global
|
267
|
+
def stack_load_global(name)
|
271
268
|
|
272
269
|
Lib.lua_getfield(@pointer, LUA_GLOBALSINDEX, name)
|
273
270
|
end
|
274
271
|
|
275
272
|
# Loads the Lua object registered with the given ref on top of the stack
|
276
273
|
#
|
277
|
-
def stack_load_ref
|
274
|
+
def stack_load_ref(ref)
|
278
275
|
|
279
276
|
Lib.lua_rawgeti(@pointer, LUA_REGISTRYINDEX, @ref)
|
280
277
|
end
|
281
278
|
|
282
279
|
# Returns the result of a function call or a coroutine.resume().
|
283
280
|
#
|
284
|
-
def return_result
|
281
|
+
def return_result(stack_bottom)
|
285
282
|
|
286
283
|
count = stack_top - stack_bottom
|
287
284
|
|
@@ -297,14 +294,14 @@ module Rufus::Lua
|
|
297
294
|
#
|
298
295
|
# Will raise an error in case of failure.
|
299
296
|
#
|
300
|
-
def pcall
|
297
|
+
def pcall(stack_bottom, arg_count, binding, filename, lineno)
|
301
298
|
|
302
299
|
#err = Lib.lua_pcall(@pointer, 0, 1, 0)
|
303
300
|
# when there's only 1 return value, use LUA_MULTRET (-1) the
|
304
301
|
# rest of the time
|
305
302
|
|
306
303
|
err = Lib.lua_pcall(@pointer, arg_count, LUA_MULTRET, 0)
|
307
|
-
|
304
|
+
fail_if_error('eval:pcall', err, binding, filename, lineno)
|
308
305
|
|
309
306
|
return_result(stack_bottom)
|
310
307
|
end
|
@@ -313,9 +310,9 @@ module Rufus::Lua
|
|
313
310
|
# Resumes a coroutine (that has been placed, under its arguments,
|
314
311
|
# on top of the stack).
|
315
312
|
#
|
316
|
-
#def do_resume
|
313
|
+
#def do_resume(stack_bottom, arg_count)
|
317
314
|
# err = Lib.lua_resume(@pointer, arg_count)
|
318
|
-
#
|
315
|
+
# fail_if_error('eval:resume', err, nil, nil, nil)
|
319
316
|
# return_result(stack_bottom)
|
320
317
|
#end
|
321
318
|
#++
|
@@ -323,7 +320,7 @@ module Rufus::Lua
|
|
323
320
|
# This method will raise an error with err > 0, else it will immediately
|
324
321
|
# return.
|
325
322
|
#
|
326
|
-
def
|
323
|
+
def fail_if_error(kind, err, binding, filename, lineno)
|
327
324
|
|
328
325
|
return if err < 1
|
329
326
|
|
@@ -334,16 +331,16 @@ module Rufus::Lua
|
|
334
331
|
# the error handler function.
|
335
332
|
# LUA_ERRERR: error while running the error handler function.
|
336
333
|
|
337
|
-
s = Lib.lua_tolstring(@pointer, -1, nil)
|
334
|
+
s = Lib.lua_tolstring(@pointer, -1, nil).read_string
|
338
335
|
Lib.lua_settop(@pointer, -2)
|
339
336
|
|
340
|
-
|
337
|
+
fail LuaError.new(kind, err, s, binding, filename, lineno)
|
341
338
|
end
|
342
339
|
|
343
340
|
# Given the name of a Lua global variable, will return its value (or nil
|
344
341
|
# if there is nothing bound under that name).
|
345
342
|
#
|
346
|
-
def get_global
|
343
|
+
def get_global(name)
|
347
344
|
|
348
345
|
stack_load_global(name)
|
349
346
|
stack_pop
|
@@ -373,21 +370,11 @@ module Rufus::Lua
|
|
373
370
|
# The list may include 'base', 'package', 'table', 'string', 'math', 'io',
|
374
371
|
# 'os' and 'debug'.
|
375
372
|
#
|
376
|
-
def initialize
|
373
|
+
def initialize(include_libs=true)
|
377
374
|
|
378
375
|
@pointer = Lib.luaL_newstate
|
379
376
|
|
380
|
-
|
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
|
377
|
+
open_libraries(include_libs)
|
391
378
|
|
392
379
|
#
|
393
380
|
# preparing library methods cache
|
@@ -406,9 +393,9 @@ module Rufus::Lua
|
|
406
393
|
|
407
394
|
# Evaluates a piece (string) of Lua code within the state.
|
408
395
|
#
|
409
|
-
def eval
|
396
|
+
def eval(s, binding=nil, filename=nil, lineno=nil)
|
410
397
|
|
411
|
-
loadstring_and_call(s)
|
398
|
+
loadstring_and_call(s, binding, filename, lineno)
|
412
399
|
end
|
413
400
|
|
414
401
|
# Returns a value set at the 'global' level in the state.
|
@@ -416,9 +403,9 @@ module Rufus::Lua
|
|
416
403
|
# state.eval('a = 1 + 2')
|
417
404
|
# puts state['a'] # => "3.0"
|
418
405
|
#
|
419
|
-
def []
|
406
|
+
def [](k)
|
420
407
|
|
421
|
-
k.index('.') ?
|
408
|
+
k.index('.') ? self.eval("return #{k}") : get_global(k)
|
422
409
|
end
|
423
410
|
|
424
411
|
# Allows for setting a Lua varible immediately.
|
@@ -426,7 +413,7 @@ module Rufus::Lua
|
|
426
413
|
# state['var'] = [ 1, 2, 3 ]
|
427
414
|
# puts state['var'].to_a[0] # => 1
|
428
415
|
#
|
429
|
-
def []=
|
416
|
+
def []=(k, v)
|
430
417
|
|
431
418
|
#puts; puts("#{k} = #{Rufus::Lua.to_lua_s(v)}")
|
432
419
|
self.eval("#{k} = #{Rufus::Lua.to_lua_s(v)}")
|
@@ -434,7 +421,6 @@ module Rufus::Lua
|
|
434
421
|
|
435
422
|
# Binds a Ruby function (callback) in the top environment of Lua
|
436
423
|
#
|
437
|
-
# require 'rubygems'
|
438
424
|
# require 'rufus/lua'
|
439
425
|
#
|
440
426
|
# s = Rufus::Lua::State.new
|
@@ -474,7 +460,7 @@ module Rufus::Lua
|
|
474
460
|
# s.eval(return is_array({ 'a' = 'b' }))
|
475
461
|
# # => false
|
476
462
|
#
|
477
|
-
def function
|
463
|
+
def function(name, opts={}, &block)
|
478
464
|
|
479
465
|
raise 'please pass a block for the body of the function' unless block
|
480
466
|
|
@@ -588,6 +574,39 @@ module Rufus::Lua
|
|
588
574
|
raise "State got closed, cannot proceed" unless @pointer
|
589
575
|
Lib.lua_gc(@pointer, LUA_GCRESTART, 0)
|
590
576
|
end
|
577
|
+
|
578
|
+
# #open_library(libname) - load a lua library via lua_call().
|
579
|
+
#
|
580
|
+
# This is needed because is the Lua 5.1 Reference Manual Section 5
|
581
|
+
# (http://www.lua.org/manual/5.1/manual.html#5) it says:
|
582
|
+
#
|
583
|
+
# "The luaopen_* functions (to open libraries) cannot be called
|
584
|
+
# directly, like a regular C function. They must be called through
|
585
|
+
# Lua, like a Lua function."
|
586
|
+
#
|
587
|
+
# "..you must call them like any other Lua C function, e.g., by using
|
588
|
+
# lua_call."
|
589
|
+
#
|
590
|
+
# (by Matthew Nielsen - https://github.com/xunker)
|
591
|
+
#
|
592
|
+
def open_library(libname)
|
593
|
+
|
594
|
+
Lib.lua_pushcclosure(
|
595
|
+
@pointer, lambda { |ptr| Lib.send("luaopen_#{libname}", @pointer) }, 0)
|
596
|
+
Lib.lua_pushstring(
|
597
|
+
@pointer, (libname.to_s == "base" ? "" : libname.to_s))
|
598
|
+
Lib.lua_call(
|
599
|
+
@pointer, 1, 0)
|
600
|
+
end
|
601
|
+
|
602
|
+
def open_libraries(libs)
|
603
|
+
|
604
|
+
if libs == true
|
605
|
+
Lib.luaL_openlibs(@pointer)
|
606
|
+
elsif libs.is_a?(Array)
|
607
|
+
libs.each { |l| open_library(l) }
|
608
|
+
end
|
609
|
+
end
|
591
610
|
end
|
592
611
|
end
|
593
612
|
|