summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--iseq.c8
-rw-r--r--vm_eval.c31
2 files changed, 39 insertions, 0 deletions
diff --git a/iseq.c b/iseq.c
index e2e9b4d6e7..4a80bca33e 100644
--- a/iseq.c
+++ b/iseq.c
@@ -925,6 +925,14 @@ rb_iseq_new_eval(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpat
parent, isolated_depth, ISEQ_TYPE_EVAL, &COMPILE_OPTION_DEFAULT);
}
+rb_iseq_t *
+pm_iseq_new_eval(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath,
+ int first_lineno, const rb_iseq_t *parent, int isolated_depth)
+{
+ return pm_iseq_new_with_opt(node, name, path, realpath, first_lineno,
+ parent, isolated_depth, ISEQ_TYPE_EVAL, &COMPILE_OPTION_DEFAULT);
+}
+
static inline rb_iseq_t *
iseq_translate(rb_iseq_t *iseq)
{
diff --git a/vm_eval.c b/vm_eval.c
index 1053731260..4c607f76ca 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1643,9 +1643,40 @@ get_eval_default_path(void)
}
static const rb_iseq_t *
+pm_eval_make_iseq(VALUE src, VALUE fname, int line,
+ const struct rb_block *base_block)
+{
+ rb_iseq_t *iseq = NULL;
+ const rb_iseq_t *const parent = vm_block_iseq(base_block);
+ const rb_iseq_t *iseq = parent;
+ VALUE name = rb_fstring_lit("<compiled>");
+ fname = rb_fstring_lit("<compiled>");
+
+ pm_parse_result_t result = { 0 };
+ VALUE error;
+
+
+ error = pm_parse_string(&result, src, fname);
+
+ if (error == Qnil) {
+ iseq = pm_iseq_new_eval(&result.node, name, fname, fname, ln, parent, 0);
+ pm_parse_result_free(&result);
+ }
+ else {
+ pm_parse_result_free(&result);
+ rb_exc_raise(error);
+ }
+
+ return iseq;
+}
+
+static const rb_iseq_t *
eval_make_iseq(VALUE src, VALUE fname, int line,
const struct rb_block *base_block)
{
+ if (*rb_ruby_prism_ptr()) {
+ return pm_eval_make_iseq(src, fname, line, base_block);
+ }
const VALUE parser = rb_parser_new();
const rb_iseq_t *const parent = vm_block_iseq(base_block);
rb_iseq_t *iseq = NULL;