[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: [OT] Re: segfault when lua_newtable called 100 times in a row
- From: "Soni L." <fakedme@...>
- Date: Sun, 10 Apr 2016 17:54:14 -0300
On 10/04/16 05:44 PM, Soni L. wrote:
On 10/04/16 05:06 PM, Nagaev Boris wrote:
On Sun, Apr 10, 2016 at 6:40 PM, Jura Pk <marsgpl@gmail.com> wrote:
Problem solved, thanks to Shmuel Zeigerman and Soni L.
After wrapping in lua_checkstack, the code works perfectly even with
1000
tables.
Seems, like lua_checkstack grows the stack =)
2016-04-10 21:27 GMT+03:00 Shmuel Zeigerman <shmuz@013net.net>:
On 10/04/2016 20:16, Jura Pk wrote:
I am stuck with a problem: when I'm trying to add 100 tables in Lua c
stack, I receive segfault on function end.
Code example:
lua_example.c: http://pastebin.com/GFvLwMY2
Makefile: http://pastebin.com/3EWJiVz7
test.lua: http://pastebin.com/1y22XvzK
See https://www.lua.org/manual/5.3/manual.html#lua_checkstack
--
Shmuel
By the way, why not to grow the stack automatically in pushing API
functions?
Because of overhead. Imagine checking the stack every operation vs
checking the stack once for 1000 operations, or however many you need.
A note about overhead: You can significantly speed up a Lua VM by using
a "microcoded" VM and optimizing the "microcode", that is, splitting
large operations into smaller operations and optimizing access.
E.g. for this code:
local t = {}
t[1] = true
t[2] = false
print(t[1], t[2])
Each table access needs to check if the table is nil and if the table
has a metatable. But with a "microcoded" VM, access to `t` could skip
those checks. It would however make the debug library significantly more
dangerous, and the VM would be significantly larger.
LuaJIT actually does this. The bytecode includes type hints and is
dynamically translated into IR and optimized, which then gets translated
into assembly. Altho I'm not sure if it includes the whole "making the
debug library dangerous" part.
If you need performance, you do it in C.
--
Disclaimer: these emails may be made public at any given time, with or without reason. If you don't agree with this, DO NOT REPLY.