@@ -12773,8 +12773,8 @@ parse_expression(yp_parser_t *parser, yp_binding_power_t binding_power, const ch
12773
12773
}
12774
12774
12775
12775
static yp_node_t *
12776
- parse_program(yp_parser_t *parser) {
12777
- yp_parser_scope_push(parser, true );
12776
+ parse_program(yp_parser_t *parser, bool eval ) {
12777
+ yp_parser_scope_push(parser, !eval );
12778
12778
parser_lex(parser);
12779
12779
12780
12780
yp_statements_node_t *statements = parse_statements(parser, YP_CONTEXT_MAIN);
@@ -12794,6 +12794,34 @@ parse_program(yp_parser_t *parser) {
12794
12794
return (yp_node_t *) yp_program_node_create(parser, &locals, statements);
12795
12795
}
12796
12796
12797
+ // Assume always a valid string since it is from trusted source (Ruby impl internals).
12798
+ // Format: [num_scopes, (num_vars1, (var_char1*, 0)*)*]
12799
+ static void
12800
+ yp_populate_eval_scopes(yp_parser_t *parser, const char *data) {
12801
+ const char *p = data;
12802
+ size_t number_of_scopes = (size_t) *p;
12803
+
12804
+ p++;
12805
+ for (size_t scope_index = 0; scope_index < number_of_scopes; scope_index++) {
12806
+ size_t number_of_variables = (size_t) *p++;
12807
+
12808
+ yp_parser_scope_push(parser, scope_index == 0);
12809
+
12810
+ for (size_t variable_index = 0; variable_index < number_of_variables; variable_index++) {
12811
+ char *eos = strchr(p, 0);
12812
+
12813
+ yp_token_t lvar = (yp_token_t) {
12814
+ .type = YP_TOKEN_IDENTIFIER,
12815
+ .start = p,
12816
+ .end = eos
12817
+ };
12818
+ yp_parser_local_add_token(parser, &lvar);
12819
+
12820
+ p = ++eos;
12821
+ }
12822
+ }
12823
+ }
12824
+
12797
12825
/******************************************************************************/
12798
12826
/* External functions */
12799
12827
/******************************************************************************/
@@ -12930,8 +12958,8 @@ yp_parser_free(yp_parser_t *parser) {
12930
12958
12931
12959
// Parse the Ruby source associated with the given parser and return the tree.
12932
12960
YP_EXPORTED_FUNCTION yp_node_t *
12933
- yp_parse(yp_parser_t *parser) {
12934
- return parse_program(parser);
12961
+ yp_parse(yp_parser_t *parser, bool eval ) {
12962
+ return parse_program(parser, eval );
12935
12963
}
12936
12964
12937
12965
YP_EXPORTED_FUNCTION void
@@ -12948,11 +12976,13 @@ yp_serialize(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
12948
12976
// Parse and serialize the AST represented by the given source to the given
12949
12977
// buffer.
12950
12978
YP_EXPORTED_FUNCTION void
12951
- yp_parse_serialize(const char *source, size_t size, yp_buffer_t *buffer) {
12979
+ yp_parse_serialize(const char *source, size_t size, yp_buffer_t *buffer, const char *parent_scopes) {
12980
+ bool eval = parent_scopes != NULL;
12952
12981
yp_parser_t parser;
12953
12982
yp_parser_init(&parser, source, size, NULL);
12983
+ if (eval) yp_populate_eval_scopes(&parser, parent_scopes);
12954
12984
12955
- yp_node_t *node = yp_parse(&parser);
12985
+ yp_node_t *node = yp_parse(&parser, eval);
12956
12986
yp_serialize(&parser, node, buffer);
12957
12987
12958
12988
yp_node_destroy(&parser, node);
0 commit comments