Project

General

Profile

« Previous | Next » 

Revision 2244c58b

Added by hasumikin (hitoshi hasumi) about 1 year ago

[Universal parser] Decouple IMEMO from rb_ast_t

This patch removes the VALUE flags member from the rb_ast_t structure making rb_ast_t no longer an IMEMO object.

Background

We are trying to make the Ruby parser generated from parse.y a universal parser that can be used by other implementations such as mruby.
To achieve this, it is necessary to exclude VALUE and IMEMO from parse.y, AST, and NODE.

Summary (file by file)

  • rubyparser.h
    • Remove the VALUE flags member from rb_ast_t
  • ruby_parser.c and internal/ruby_parser.h
    • Use TypedData_Make_Struct VALUE which wraps rb_ast_t in ast_alloc() so that GC can manage it
      • You can retrieve rb_ast_t from the VALUE by rb_ruby_ast_data_get()
    • Change the return type of rb_parser_compile_XXXX() functions from rb_ast_t * to VALUE
    • rb_ruby_ast_new() which internally calls ast_alloc() is to create VALUE vast outside ruby_parser.c
  • iseq.c and vm_core.h
    • Amend the first parameter of rb_iseq_new_XXXX() functions from rb_ast_body_t * to VALUE
    • This keeps the VALUE of AST on the machine stack to prevent being removed by GC
  • ast.c
    • Almost all change is replacement rb_ast_t *ast with VALUE vast (sorry for the big diff)
    • Fix node_memsize()
      • Now it includes rb_ast_local_table_link, tokens and script_lines
  • compile.c, load.c, node.c, parse.y, proc.c, ruby.c, template/prelude.c.tmpl, vm.c and vm_eval.c
    • Follow-up due to the above changes
  • imemo.{c|h}
    • If an object with imemo_ast appears, considers it a bug

Co-authored-by: Nobuyoshi Nakada