Fix memory leak in syntax error in prism
If there is a syntax error, there could be an ast_node in the result. This could get leaked if there is a syntax error so parsing could not complete (parsed is not set to true). For example, the following script leaks memory: 10.times do 10_000.times do eval("def foo(...) super(...) {}; end") rescue SyntaxError end puts `ps -o rss= -p #{$$}` end Before: 31328 42768 53856 65120 76208 86768 97856 109120 120208 131296 After: 20944 20944 20944 20944 20944 20944 20944 20944 20944 20944
This commit is contained in:
parent
4621c9b815
commit
90aa6aefc4
Notes:
git
2024-10-16 18:53:06 +00:00
@ -10118,9 +10118,11 @@ pm_iseq_compile_node(rb_iseq_t *iseq, pm_scope_node_t *node)
|
|||||||
void
|
void
|
||||||
pm_parse_result_free(pm_parse_result_t *result)
|
pm_parse_result_free(pm_parse_result_t *result)
|
||||||
{
|
{
|
||||||
if (result->parsed) {
|
if (result->node.ast_node != NULL) {
|
||||||
pm_node_destroy(&result->parser, result->node.ast_node);
|
pm_node_destroy(&result->parser, result->node.ast_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result->parsed) {
|
||||||
xfree(result->node.constants);
|
xfree(result->node.constants);
|
||||||
pm_scope_node_destroy(&result->node);
|
pm_scope_node_destroy(&result->node);
|
||||||
}
|
}
|
||||||
|
@ -2204,6 +2204,20 @@ eom
|
|||||||
assert_syntax_error('def foo(...) super(1, ...) {}; end', /both block arg and actual block/)
|
assert_syntax_error('def foo(...) super(1, ...) {}; end', /both block arg and actual block/)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_argument_forwarding_with_super_memory_leak
|
||||||
|
assert_no_memory_leak([], "#{<<-'begin;'}", "#{<<-'end;'}", rss: true)
|
||||||
|
code = proc do
|
||||||
|
eval("def foo(...) super(...) {}; end")
|
||||||
|
raise "unreachable"
|
||||||
|
rescue SyntaxError
|
||||||
|
end
|
||||||
|
|
||||||
|
1_000.times(&code)
|
||||||
|
begin;
|
||||||
|
100_000.times(&code)
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
|
||||||
def test_class_module_Object_ancestors
|
def test_class_module_Object_ancestors
|
||||||
assert_separately([], <<-RUBY)
|
assert_separately([], <<-RUBY)
|
||||||
m = Module.new
|
m = Module.new
|
||||||
|
Loading…
x
Reference in New Issue
Block a user