How about move Yue auto generated anonymous function to upvalue with name prefix '__'
Nobody has claimed this yet.
- Dominant language
- Lua
- Stars
- 613
- Forks
- 45
- PR merge metrics
- No merged PRs in 30d
Description
Yue have some nice features/syntax that make it a joy to work with like existence ?, nil coalescing ??, backcalls, destruct vargs... . But it also has big draw back that make it a bad choice for me to writing performance code with it because it auto create a new function every time a function called, this is a big performance issue. So I intent to avoid using it as much as possible.
It is a big shame that I can not use it when it very nice to have. So I intent to make a proposal to fix this issue.
We can move yue auto generated anonymous function to a upvalue named with prefix '__' in the same scope with parent function so that it with not generate a new function every time parent called, this generate a more better performance.
In many cases, we could send variables of closures as function parameters and get modified variable as function return results.
Well... let take the look at the example below to see what I mean.
buff_strength = (char, item) ->
item.buffer.strength? char.stats.strength?::ref()
To default Lua:
local buff_strength
buff_strength = function(char, item)
local _obj_0 = item.buffer.strength
if _obj_0 ~= nil then
return _obj_0((function()
local _obj_1 = char.stats.strength
if _obj_1 ~= nil then
return _obj_1:ref()
end
return nil
end)())
end
return nil
end
Maybe to Lua without inner function:
local __buff_strength__stub_0 = function(char)
local _obj_1 = char.stats.strength
if _obj_1 ~= nil then
return _obj_1:ref()
end
return nil
end
local buff_strength
buff_strength = function(char, item)
local _obj_0 = item.buffer.strength
if _obj_0 ~= nil then
return _obj_0(__buff_strength__stub_0(char))
end
return nil
end
Another more complex example:
exe_func = (func, env) ->
ok, ... = try
debug_env_before(env)
func(env)
debug_env_after(env)
catch ex
-- only access ex
error ex
return ex
if ok
return ...
else
os.exit(1)
To Lua with poor performance:
local exe_func
exe_func = function(func, env)
return (function(_arg_0, ...)
local ok = _arg_0
if ok then
return ...
else
return os.exit(1)
end
end)(xpcall(function()
debug_env_before(env)
func(env)
return debug_env_after(env)
end, function(ex)
error(ex)
return ex
end))
end
To Lua with better performance:
local __exe_func__stub_0 = function(_arg_0, ...)
local ok = _arg_0
if ok then
return ...
else
return os.exit(1)
end
end
local __exe_func__stub_1 = function(env)
debug_env_before(env)
func(env)
return debug_env_after(env)
end
local __exe_func__stub_2 = function(ex)
error(ex)
return ex
end
local exe_func
exe_func = function(func, env)
return __exe_func__stub_0(xpcall(__exe_func__stub_1, __exe_func__stub_2, env))
end
I may make some mistake in the rush, but I hope you can get the idea.
Well... this solution is not work with all cases but aleast it will save a lot of performance in some cases. And I think it is worth to try.
Thanks and regards.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
No files, tests, or entry points are named in the issue. Start by locating the compiler logic that emits anonymous functions and identify which generated closures can be moved to named upvalues without changing behavior. Done means implementing a well-defined subset, preserving closure semantics, and demonstrating that the selected cases avoid repeated function creation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- lua
- Domain
- compilers, performance
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100