2023-05-28 14:00:20 +03:00
|
|
|
#ifndef INTERNAL_RUBY_PARSE_H
|
|
|
|
#define INTERNAL_RUBY_PARSE_H
|
|
|
|
|
|
|
|
#include "internal.h"
|
2024-01-05 06:03:11 +03:00
|
|
|
#include "internal/bignum.h"
|
|
|
|
#include "internal/compilers.h"
|
|
|
|
#include "internal/complex.h"
|
|
|
|
#include "internal/rational.h"
|
2023-08-25 07:47:10 +03:00
|
|
|
#include "rubyparser.h"
|
2023-05-28 14:00:20 +03:00
|
|
|
#include "vm.h"
|
|
|
|
|
|
|
|
RUBY_SYMBOL_EXPORT_BEGIN
|
|
|
|
#ifdef UNIVERSAL_PARSER
|
Fix Ripper memory allocation size when enabled Universal Parser
The size of `struct parser_params` is 8 bytes difference in `ripper_s_allocate` and `rb_ruby_parser_allocate` when the universal parser is
enabled.
This causes a situation where `*r->p` is not fully initialized in `ripper_s_allocate` as shown below.
```console
(gdb) p *r->p
$2 = {heap = 0x0, lval = 0x0, yylloc = 0x0, lex = {strterm = 0x0, gets = 0x0, input = 0, string_buffer = {head = 0x0, last = 0x0}, lastlin
e = 0x0,
nextline = 0x0, pbeg = 0x0, pcur = 0x0, pend = 0x0, ptok = 0x0, gets_ = {ptr = 0, call = 0x0}, state = EXPR_NONE, paren_nest = 0, lpar
_seen = 0,
debug = 0, has_shebang = 0, token_seen = 0, token_info_enabled = 0, error_p = 0, cr_seen = 0, value = 0, result = 0, parsing_thread = 0, s_value = 0,
s_lvalue = 0, s_value_stack = 2097}
````
This seems to cause `double free or corruption (!prev)` and SEGV.
So, fixing this by introduce `rb_ripper_parser_params_allocate` and `rb_ruby_parser_config` functions for Ripper, and `struct parser_params` same size is returned.
2024-03-19 18:26:54 +03:00
|
|
|
const rb_parser_config_t *rb_ruby_parser_config(void);
|
2024-01-11 15:27:19 +03:00
|
|
|
rb_parser_t *rb_parser_params_allocate(void);
|
|
|
|
rb_parser_t *rb_parser_params_new(void);
|
2023-05-28 14:00:20 +03:00
|
|
|
#endif
|
|
|
|
VALUE rb_parser_set_context(VALUE, const struct rb_iseq_struct *, int);
|
2023-11-08 07:02:55 +03:00
|
|
|
VALUE rb_parser_new(void);
|
|
|
|
rb_ast_t *rb_parser_compile_string_path(VALUE vparser, VALUE fname, VALUE src, int line);
|
[Feature #20257] Rearchitect Ripper
Introduce another semantic value stack for Ripper so that
Ripper can manage both Node and Ruby Object separately.
This rearchitectutre of Ripper solves these issues.
Therefore adding test cases for them.
* [Bug 10436] https://bugs.ruby-lang.org/issues/10436
* [Bug 18988] https://bugs.ruby-lang.org/issues/18988
* [Bug 20055] https://bugs.ruby-lang.org/issues/20055
Checked the differences of `Ripper.sexp` for files under `/test/ruby`
are only on test_pattern_matching.rb.
The differences comes from the differences between
`new_hash_pattern_tail` functions between parser and Ripper.
Ripper `new_hash_pattern_tail` didn’t call `assignable` then
`kw_rest_arg` wasn’t marked as local variable.
This is also fixed by this commit.
```
--- a/./tmp/before/test_pattern_matching.rb
+++ b/./tmp/after/test_pattern_matching.rb
@@ -3607,7 +3607,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [984, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [985, 10]]],
+ [:var_ref, [:@ident, “a”, [985, 10]]],
:==,
[:hash, nil]]],
nil]]],
@@ -3662,7 +3662,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [993, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [994, 10]]],
+ [:var_ref, [:@ident, “a”, [994, 10]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -3813,7 +3813,7 @@
[:command,
[:@ident, “raise”, [1022, 10]],
[:args_add_block,
- [[:vcall, [:@ident, “b”, [1022, 16]]]],
+ [[:var_ref, [:@ident, “b”, [1022, 16]]]],
false]]],
[:else, [[:var_ref, [:@kw, “true”, [1024, 10]]]]]]]],
nil,
@@ -3876,7 +3876,7 @@
[:@int, “0”, [1033, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1033, 20]]],
+ [:var_ref, [:@ident, “b”, [1033, 20]]],
:==,
[:hash, nil]]]],
nil]]],
@@ -3946,7 +3946,7 @@
[:@int, “0”, [1042, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1042, 20]]],
+ [:var_ref, [:@ident, “b”, [1042, 20]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -5206,7 +5206,7 @@
[[:assoc_new,
[:@label, “c:“, [1352, 22]],
[:@int, “0”, [1352, 25]]]]]],
- [:vcall, [:@ident, “r”, [1352, 29]]]],
+ [:var_ref, [:@ident, “r”, [1352, 29]]]],
false]]],
[:binary,
[:call,
@@ -5299,7 +5299,7 @@
[:assoc_new,
[:@label, “c:“, [1367, 34]],
[:@int, “0”, [1367, 37]]]]]],
- [:vcall, [:@ident, “r”, [1367, 41]]]],
+ [:var_ref, [:@ident, “r”, [1367, 41]]]],
false]]],
[:binary,
[:call,
@@ -5931,7 +5931,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “r”, [1533, 11]]]],
[[:binary,
- [:vcall, [:@ident, “r”, [1534, 8]]],
+ [:var_ref, [:@ident, “r”, [1534, 8]]],
:==,
[:hash,
[:assoclist_from_args,
```
2024-01-12 04:46:17 +03:00
|
|
|
VALUE rb_str_new_parser_string(rb_parser_string_t *str);
|
2024-04-10 11:50:18 +03:00
|
|
|
VALUE rb_str_new_mutable_parser_string(rb_parser_string_t *str);
|
[Feature #20257] Rearchitect Ripper
Introduce another semantic value stack for Ripper so that
Ripper can manage both Node and Ruby Object separately.
This rearchitectutre of Ripper solves these issues.
Therefore adding test cases for them.
* [Bug 10436] https://bugs.ruby-lang.org/issues/10436
* [Bug 18988] https://bugs.ruby-lang.org/issues/18988
* [Bug 20055] https://bugs.ruby-lang.org/issues/20055
Checked the differences of `Ripper.sexp` for files under `/test/ruby`
are only on test_pattern_matching.rb.
The differences comes from the differences between
`new_hash_pattern_tail` functions between parser and Ripper.
Ripper `new_hash_pattern_tail` didn’t call `assignable` then
`kw_rest_arg` wasn’t marked as local variable.
This is also fixed by this commit.
```
--- a/./tmp/before/test_pattern_matching.rb
+++ b/./tmp/after/test_pattern_matching.rb
@@ -3607,7 +3607,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [984, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [985, 10]]],
+ [:var_ref, [:@ident, “a”, [985, 10]]],
:==,
[:hash, nil]]],
nil]]],
@@ -3662,7 +3662,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [993, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [994, 10]]],
+ [:var_ref, [:@ident, “a”, [994, 10]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -3813,7 +3813,7 @@
[:command,
[:@ident, “raise”, [1022, 10]],
[:args_add_block,
- [[:vcall, [:@ident, “b”, [1022, 16]]]],
+ [[:var_ref, [:@ident, “b”, [1022, 16]]]],
false]]],
[:else, [[:var_ref, [:@kw, “true”, [1024, 10]]]]]]]],
nil,
@@ -3876,7 +3876,7 @@
[:@int, “0”, [1033, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1033, 20]]],
+ [:var_ref, [:@ident, “b”, [1033, 20]]],
:==,
[:hash, nil]]]],
nil]]],
@@ -3946,7 +3946,7 @@
[:@int, “0”, [1042, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1042, 20]]],
+ [:var_ref, [:@ident, “b”, [1042, 20]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -5206,7 +5206,7 @@
[[:assoc_new,
[:@label, “c:“, [1352, 22]],
[:@int, “0”, [1352, 25]]]]]],
- [:vcall, [:@ident, “r”, [1352, 29]]]],
+ [:var_ref, [:@ident, “r”, [1352, 29]]]],
false]]],
[:binary,
[:call,
@@ -5299,7 +5299,7 @@
[:assoc_new,
[:@label, “c:“, [1367, 34]],
[:@int, “0”, [1367, 37]]]]]],
- [:vcall, [:@ident, “r”, [1367, 41]]]],
+ [:var_ref, [:@ident, “r”, [1367, 41]]]],
false]]],
[:binary,
[:call,
@@ -5931,7 +5931,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “r”, [1533, 11]]]],
[[:binary,
- [:vcall, [:@ident, “r”, [1534, 8]]],
+ [:var_ref, [:@ident, “r”, [1534, 8]]],
:==,
[:hash,
[:assoclist_from_args,
```
2024-01-12 04:46:17 +03:00
|
|
|
|
|
|
|
VALUE rb_node_str_string_val(const NODE *);
|
|
|
|
VALUE rb_node_sym_string_val(const NODE *);
|
|
|
|
VALUE rb_node_dstr_string_val(const NODE *);
|
2024-02-10 04:05:18 +03:00
|
|
|
VALUE rb_node_regx_string_val(const NODE *);
|
[Feature #20257] Rearchitect Ripper
Introduce another semantic value stack for Ripper so that
Ripper can manage both Node and Ruby Object separately.
This rearchitectutre of Ripper solves these issues.
Therefore adding test cases for them.
* [Bug 10436] https://bugs.ruby-lang.org/issues/10436
* [Bug 18988] https://bugs.ruby-lang.org/issues/18988
* [Bug 20055] https://bugs.ruby-lang.org/issues/20055
Checked the differences of `Ripper.sexp` for files under `/test/ruby`
are only on test_pattern_matching.rb.
The differences comes from the differences between
`new_hash_pattern_tail` functions between parser and Ripper.
Ripper `new_hash_pattern_tail` didn’t call `assignable` then
`kw_rest_arg` wasn’t marked as local variable.
This is also fixed by this commit.
```
--- a/./tmp/before/test_pattern_matching.rb
+++ b/./tmp/after/test_pattern_matching.rb
@@ -3607,7 +3607,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [984, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [985, 10]]],
+ [:var_ref, [:@ident, “a”, [985, 10]]],
:==,
[:hash, nil]]],
nil]]],
@@ -3662,7 +3662,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “a”, [993, 13]]]],
[[:binary,
- [:vcall, [:@ident, “a”, [994, 10]]],
+ [:var_ref, [:@ident, “a”, [994, 10]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -3813,7 +3813,7 @@
[:command,
[:@ident, “raise”, [1022, 10]],
[:args_add_block,
- [[:vcall, [:@ident, “b”, [1022, 16]]]],
+ [[:var_ref, [:@ident, “b”, [1022, 16]]]],
false]]],
[:else, [[:var_ref, [:@kw, “true”, [1024, 10]]]]]]]],
nil,
@@ -3876,7 +3876,7 @@
[:@int, “0”, [1033, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1033, 20]]],
+ [:var_ref, [:@ident, “b”, [1033, 20]]],
:==,
[:hash, nil]]]],
nil]]],
@@ -3946,7 +3946,7 @@
[:@int, “0”, [1042, 15]]],
:“&&“,
[:binary,
- [:vcall, [:@ident, “b”, [1042, 20]]],
+ [:var_ref, [:@ident, “b”, [1042, 20]]],
:==,
[:hash,
[:assoclist_from_args,
@@ -5206,7 +5206,7 @@
[[:assoc_new,
[:@label, “c:“, [1352, 22]],
[:@int, “0”, [1352, 25]]]]]],
- [:vcall, [:@ident, “r”, [1352, 29]]]],
+ [:var_ref, [:@ident, “r”, [1352, 29]]]],
false]]],
[:binary,
[:call,
@@ -5299,7 +5299,7 @@
[:assoc_new,
[:@label, “c:“, [1367, 34]],
[:@int, “0”, [1367, 37]]]]]],
- [:vcall, [:@ident, “r”, [1367, 41]]]],
+ [:var_ref, [:@ident, “r”, [1367, 41]]]],
false]]],
[:binary,
[:call,
@@ -5931,7 +5931,7 @@
[:in,
[:hshptn, nil, [], [:var_field, [:@ident, “r”, [1533, 11]]]],
[[:binary,
- [:vcall, [:@ident, “r”, [1534, 8]]],
+ [:var_ref, [:@ident, “r”, [1534, 8]]],
:==,
[:hash,
[:assoclist_from_args,
```
2024-01-12 04:46:17 +03:00
|
|
|
VALUE rb_node_dregx_string_val(const NODE *);
|
|
|
|
VALUE rb_node_line_lineno_val(const NODE *);
|
|
|
|
VALUE rb_node_file_path_val(const NODE *);
|
|
|
|
VALUE rb_node_encoding_val(const NODE *);
|
|
|
|
|
|
|
|
VALUE rb_node_integer_literal_val(const NODE *);
|
|
|
|
VALUE rb_node_float_literal_val(const NODE *);
|
|
|
|
VALUE rb_node_rational_literal_val(const NODE *);
|
|
|
|
VALUE rb_node_imaginary_literal_val(const NODE *);
|
2023-05-28 14:00:20 +03:00
|
|
|
RUBY_SYMBOL_EXPORT_END
|
|
|
|
|
|
|
|
VALUE rb_parser_end_seen_p(VALUE);
|
|
|
|
VALUE rb_parser_encoding(VALUE);
|
|
|
|
VALUE rb_parser_set_yydebug(VALUE, VALUE);
|
|
|
|
void rb_parser_set_options(VALUE, int, int, int, int);
|
|
|
|
void *rb_parser_load_file(VALUE parser, VALUE name);
|
2023-08-25 10:53:29 +03:00
|
|
|
void rb_parser_set_script_lines(VALUE vparser, VALUE lines_array);
|
2023-05-28 14:00:20 +03:00
|
|
|
void rb_parser_error_tolerant(VALUE vparser);
|
|
|
|
void rb_parser_keep_tokens(VALUE vparser);
|
|
|
|
|
|
|
|
rb_ast_t *rb_parser_compile_string(VALUE, const char*, VALUE, int);
|
|
|
|
rb_ast_t *rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE input, int line);
|
|
|
|
rb_ast_t *rb_parser_compile_generic(VALUE vparser, VALUE (*lex_gets)(VALUE, int), VALUE fname, VALUE input, int line);
|
|
|
|
|
|
|
|
enum lex_state_bits {
|
|
|
|
EXPR_BEG_bit, /* ignore newline, +/- is a sign. */
|
|
|
|
EXPR_END_bit, /* newline significant, +/- is an operator. */
|
|
|
|
EXPR_ENDARG_bit, /* ditto, and unbound braces. */
|
|
|
|
EXPR_ENDFN_bit, /* ditto, and unbound braces. */
|
|
|
|
EXPR_ARG_bit, /* newline significant, +/- is an operator. */
|
|
|
|
EXPR_CMDARG_bit, /* newline significant, +/- is an operator. */
|
|
|
|
EXPR_MID_bit, /* newline significant, +/- is an operator. */
|
|
|
|
EXPR_FNAME_bit, /* ignore newline, no reserved words. */
|
|
|
|
EXPR_DOT_bit, /* right after `.', `&.' or `::', no reserved words. */
|
|
|
|
EXPR_CLASS_bit, /* immediate after `class', no here document. */
|
|
|
|
EXPR_LABEL_bit, /* flag bit, label is allowed. */
|
|
|
|
EXPR_LABELED_bit, /* flag bit, just after a label. */
|
|
|
|
EXPR_FITEM_bit, /* symbol literal as FNAME. */
|
|
|
|
EXPR_MAX_STATE
|
|
|
|
};
|
|
|
|
/* examine combinations */
|
|
|
|
enum lex_state_e {
|
|
|
|
#define DEF_EXPR(n) EXPR_##n = (1 << EXPR_##n##_bit)
|
|
|
|
DEF_EXPR(BEG),
|
|
|
|
DEF_EXPR(END),
|
|
|
|
DEF_EXPR(ENDARG),
|
|
|
|
DEF_EXPR(ENDFN),
|
|
|
|
DEF_EXPR(ARG),
|
|
|
|
DEF_EXPR(CMDARG),
|
|
|
|
DEF_EXPR(MID),
|
|
|
|
DEF_EXPR(FNAME),
|
|
|
|
DEF_EXPR(DOT),
|
|
|
|
DEF_EXPR(CLASS),
|
|
|
|
DEF_EXPR(LABEL),
|
|
|
|
DEF_EXPR(LABELED),
|
|
|
|
DEF_EXPR(FITEM),
|
|
|
|
EXPR_VALUE = EXPR_BEG,
|
|
|
|
EXPR_BEG_ANY = (EXPR_BEG | EXPR_MID | EXPR_CLASS),
|
|
|
|
EXPR_ARG_ANY = (EXPR_ARG | EXPR_CMDARG),
|
|
|
|
EXPR_END_ANY = (EXPR_END | EXPR_ENDARG | EXPR_ENDFN),
|
|
|
|
EXPR_NONE = 0
|
|
|
|
};
|
2023-12-28 06:38:24 +03:00
|
|
|
|
2023-05-28 14:00:20 +03:00
|
|
|
#endif /* INTERNAL_RUBY_PARSE_H */
|