From fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe Mon Sep 17 00:00:00 2001 From: yui-knk Date: Sun, 25 Sep 2022 17:53:44 +0900 Subject: Add error_tolerant option to RubyVM::AST If this option is enabled, SyntaxError is not raised and Node is returned even if passed script is broken. [Feature #19013] --- parse.y | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index b16dc35b88..c05ce48068 100644 --- a/parse.y +++ b/parse.y @@ -348,6 +348,7 @@ struct parser_params { unsigned int do_chomp: 1; unsigned int do_split: 1; unsigned int keep_script_lines: 1; + unsigned int error_tolerant: 1; NODE *eval_tree_begin; NODE *eval_tree; @@ -6384,7 +6385,9 @@ yycompile0(VALUE arg) mesg = rb_class_new_instance(0, 0, rb_eSyntaxError); } rb_set_errinfo(mesg); - return FALSE; + if (!p->error_tolerant) { + return FALSE; + } } tree = p->eval_tree; if (!tree) { @@ -13313,6 +13316,16 @@ rb_parser_keep_script_lines(VALUE vparser) TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); p->keep_script_lines = 1; } + +void +rb_parser_error_tolerant(VALUE vparser) +{ + struct parser_params *p; + + TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); + p->error_tolerant = 1; +} + #endif #ifdef RIPPER -- cgit v1.2.3