lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


I can confirm that your fixes did the trick!  I very much appreciate
the speed of response.  I doubled the effect of the stress test and I
had not problems whatsoever.

wes

On Thu, Jun 17, 2010 at 3:57 PM, Wesley Smith <wesley.hoke@gmail.com> wrote:
> Awesome!  I'll have a look later tonight.
> Wes
>
> On Jun 17, 2010, at 12:00 PM, Fabio Mascarenhas <mascarenhas@acm.org> wrote:
>
>> I found a few stack leaks in some opcodes, and plugged them. Can you
>> pull from the git repository and try your example again? I also
>> changed the runtime capture code to move the capture values to a
>> worklist instead of leaving them on the stack.
>>
>> --
>> Fabio Mascarenhas
>>
>>
>> On Thu, Jun 17, 2010 at 3:45 PM, Wesley Smith <wesley.hoke@gmail.com>
>> wrote:
>>>
>>> On Thu, Jun 17, 2010 at 11:33 AM, Fabio Mascarenhas <mascarenhas@acm.org>
>>> wrote:
>>>>
>>>> Failures do an implicit close, so opens and closes may not be 1:1. And
>>>> it would no cause a stack leak, anyway, as the current list is kept in
>>>> the registry instead of the stack.
>>>
>>> Good to know!
>>>
>>>> I think the culprits are the runtime captures. The values returned by
>>>> a runtime capture are kept indefinitely in the stack. If there are
>>>> nested runtime captures then these values end up being replicated.
>>>> This behavior is inherited from regular LPEG... I am trying to think
>>>> of a way to fix it, but it is far from trivial.
>>>
>>> I see.  This is actually a huge problem for me since everything has
>>> nested Cmt captures.  I need these to check specific key-value pairs
>>> in the tree of tables and there's no other way to do it.  What the
>>> reasoning behind keeping around nested Cmt captures?
>>>
>>> Also, I'm not 100% sure that this is actually the problem.  If I print
>>> out the stack, I see the printout below after the match function runs.
>>>  The first 6 values are obviously the setup before match is run.
>>> Slots 7-15 are generated by match, however, the only captures
>>> generated return a capture value of nil, so something else has to be
>>> going on for each node in the table to be placed on the stack like
>>> this.
>>>
>>>
>>> 1 userdata
>>> 2 table
>>>       K:: number (1.000000)
>>>       V: table
>>> 3 (-13): nil
>>> 4 (-12): lightuserdata (0xbfffa7d0)
>>> 5 table
>>>       K:: number (1.000000)
>>>       V:: string (_depth_first)
>>>       K:: number (2.000000)
>>>       V:: function (0xc48340)
>>>       K:: number (3.000000)
>>>       V:: string (B)
>>>       K:: number (4.000000)
>>>       V:: string (C)
>>>       K:: number (5.000000)
>>>       V:: string (B)
>>>       K:: number (6.000000)
>>>       V:: function (0xc48470)
>>>       K:: number (7.000000)
>>>       V:: string (_patt)
>>>       K:: number (8.000000)
>>>       V:: string (_depth_first)
>>>       K:: number (9.000000)
>>>       V:: function (0xc48550)
>>> 6 table
>>>       K:: number (1.000000)
>>>       V: table
>>>       K:: number (2.000000)
>>>       V: table
>>>       K:: number (3.000000)
>>>       V: table
>>>       K:: number (4.000000)
>>>       V: table
>>>       K:: number (5.000000)
>>>       V: table
>>>       K:: number (6.000000)
>>>       V: table
>>> 7 table
>>>       K:: number (1.000000)
>>>       V: table
>>>       K:: number (2.000000)
>>>       V: table
>>>       K:: string (rule)
>>>       V:: string (A)
>>> 8 table
>>>       K:: number (1.000000)
>>>       V:: string (C)
>>>       K:: string (token)
>>>       V:: string (C)
>>> 9 (-7): nil
>>> 10 table
>>>       K:: number (1.000000)
>>>       V:: string (C)
>>>       K:: string (token)
>>>       V:: string (C)
>>> 11 table
>>>       K:: number (1.000000)
>>>       V:: string (C)
>>>       K:: string (token)
>>>       V:: string (C)
>>> 12 table
>>>       K:: number (1.000000)
>>>       V: table
>>>       K:: number (2.000000)
>>>       V: table
>>>       K:: string (rule)
>>>       V:: string (A)
>>> 13 table
>>>       K:: number (1.000000)
>>>       V: table
>>>       K:: number (2.000000)
>>>       V: table
>>>       K:: string (rule)
>>>       V:: string (A)
>>> 14 table
>>>       K:: number (1.000000)
>>>       V: table
>>> 15 table
>>>       K:: number (1.000000)
>>>       V: table
>>> nil
>>>
>