Skip to content

Commit a8a5ec3

Browse files
committed
Merge pull request zeromq#30 from moteus/master
Fix. User `prelude` code overwrite library one.
2 parents 3233755 + d2acf9a commit a8a5ec3

File tree

4 files changed

+61
-15
lines changed

4 files changed

+61
-15
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ script:
6363
- lunit.sh test_proxy.lua
6464
- lua -lluacov test_threads.lua
6565
- lua -lluacov test_threads_arg.lua
66+
- lua -lluacov test_threads_opt.lua
6667
- lua -lluacov test_threads_fork_arg.lua
6768
- lua -lluacov test_threads_fork.lua
6869
- lua -lluacov test_threads_file.lua

lakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ target('test', install, function()
7979
run_test('test_proxy.lua')
8080
run_test('test_threads.lua')
8181
run_test('test_threads_arg.lua')
82+
run_test('test_threads_opt.lua')
8283
run_test('test_threads_fork.lua')
8384
run_test('test_threads_fork_arg.lua')
8485
run_test('test_threads_file.lua')

src/lua/lzmq/impl/threads.lua

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -117,22 +117,33 @@ local function make_pipe(ctx)
117117
return pipe, pipe_endpoint
118118
end
119119

120-
local function thread_opts(code, default_thread_opts)
121-
local source
122-
local prelude
123-
local lua_init
120+
local function thread_opts(code, opt)
124121
if type(code) == "table" then
125-
source = code[1] or code.source
126-
prelude = code.prelude
127-
lua_init = code.lua_init
128-
else
129-
source = code
122+
local source = assert(code[1] or code.source)
123+
local lua_init = code.lua_init or opt.lua_init
124+
local prelude = opt.prelude
125+
if code.prelude then
126+
--! @todo support user prelude as `@filename`
127+
local user_prelude = code.prelude
128+
if type(user_prelude) == 'function' then
129+
user_prelude = T(user_prelude)
130+
end
131+
if type(prelude) == 'function' then
132+
prelude = T(prelude)
133+
end
134+
135+
prelude = string.format([[
136+
local loadstring = loadstring or load
137+
local prelude1 = loadstring(%q)
138+
local prelude2 = loadstring(%q)
139+
return prelude1(prelude2(...))
140+
]], user_prelude, prelude)
141+
end
142+
return {source, prelude = prelude, lua_init = lua_init}
130143
end
131-
return {
132-
[1] = assert(source) or default_thread_opts.source,
133-
prelude = prelude or default_thread_opts.prelude,
134-
lua_init = lua_init or default_thread_opts.lua_init
135-
}
144+
145+
opt.source = assert(code)
146+
return opt
136147
end
137148

138149
local zthreads = {}
@@ -162,7 +173,6 @@ function zthreads.actor(...)
162173
return actor_new(thread, pipe)
163174
end
164175

165-
166176
function zthreads.xrun(...)
167177
return zthreads.run(zthreads.context(), ...)
168178
end

test/test_threads_opt.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
local TEST_FFI = ("ffi" == os.getenv("LZMQ"))
2+
local LZMQ = "lzmq" .. (TEST_FFI and ".ffi" or "")
3+
4+
local zthreads = require (LZMQ .. ".threads" )
5+
6+
local thread_code = function(...)
7+
local function assert_equal(name, a, b, ...)
8+
if a == b then return b, ... end
9+
print(name .. " Fail! Expected `" .. tostring(a) .. "` got `" .. tostring(b) .. "`")
10+
os.exit(1)
11+
end
12+
13+
local a,b,c,d,e,f = ...
14+
assert_equal("1:", 1 , a )
15+
assert_equal("2:", nil , b )
16+
assert_equal("3:", 'hello' , c )
17+
assert_equal("4:", nil , d )
18+
assert_equal("5:", 2 , e )
19+
assert_equal("6:", nil , f )
20+
assert_equal("#:", 6 , select("#", ...))
21+
end
22+
23+
-- pass `prelude` function that change thread arguments
24+
local thread = zthreads.xrun({thread_code, prelude = function(...)
25+
return 1, nil, 'hello', ...
26+
end}, nil, 2, nil)
27+
28+
local a = assert(thread:start())
29+
30+
assert(thread:join())
31+
32+
assert(a == thread)
33+
34+
print("done!")

0 commit comments

Comments
 (0)