[前][次][番号順一覧][スレッド一覧]

ruby-changes:50222

From: nobu <ko1@a...>
Date: Sat, 10 Feb 2018 10:28:56 +0900 (JST)
Subject: [ruby-changes:50222] nobu:r62340 (trunk): mjit_compile.c: original_body_iseq

nobu	2018-02-10 10:28:51 +0900 (Sat, 10 Feb 2018)

  New Revision: 62340

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62340

  Log:
    mjit_compile.c: original_body_iseq
    
    * mjit_compile.c (mjit_compile): name the original iseq pointer to
      eliminate magic numbers.

  Modified files:
    trunk/mjit_compile.c
    trunk/tool/ruby_vm/views/_mjit_compile_insn.erb
    trunk/tool/ruby_vm/views/_mjit_compile_send.erb
Index: mjit_compile.c
===================================================================
--- mjit_compile.c	(revision 62339)
+++ mjit_compile.c	(revision 62340)
@@ -142,6 +142,8 @@ mjit_compile(FILE *f, const struct rb_is https://github.com/ruby/ruby/blob/trunk/mjit_compile.c#L142
 #endif
     fprintf(f, "VALUE\n%s(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)\n{\n", funcname);
     fprintf(f, "    VALUE *stack = reg_cfp->sp;\n");
+    fprintf(f, "    static const VALUE *const original_body_iseq = (VALUE *)%p;\n",
+            body->iseq_encoded);
 
     /* Simulate `opt_pc` in setup_parameters_complex */
     if (body->param.flags.has_opt) {
@@ -157,7 +159,7 @@ mjit_compile(FILE *f, const struct rb_is https://github.com/ruby/ruby/blob/trunk/mjit_compile.c#L159
     }
 
     /* ISeq might be used for catch table too. For that usage, this code cancels JIT execution. */
-    fprintf(f, "    if (reg_cfp->pc != 0x%"PRIxVALUE") {\n", (VALUE)body->iseq_encoded);
+    fprintf(f, "    if (reg_cfp->pc != original_body_iseq) {\n");
     fprintf(f, "        return Qundef;\n");
     fprintf(f, "    }\n");
 
Index: tool/ruby_vm/views/_mjit_compile_send.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_send.erb	(revision 62339)
+++ tool/ruby_vm/views/_mjit_compile_send.erb	(revision 62340)
@@ -23,12 +23,12 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_send.erb#L23
             int param_size = iseq->body->param.size; /* TODO: check calling->argc for argument_arity_error */
 
 % # JIT: move sp and pc if necessary
-            fprintf(f, "    reg_cfp->pc = (VALUE *)0x%"PRIxVALUE";\n", (VALUE)(body->iseq_encoded + next_pos)); /* ADD_PC(INSN_ATTR(width)); */
+            fprintf(f, "    reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
             fprintf(f, "    reg_cfp->sp = reg_cfp->bp + %d;\n", b->stack_size + 1 - <%= insn.pops.size %>); /* POPN(INSN_ATTR(popn)); */
 
 % # JIT: Invalidate call cache if it requires vm_search_method. This allows to inline some of following things.
             fprintf(f, "    if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %llu || RCLASS_SERIAL(CLASS_OF(stack[%d])) != %llu)) {\n", cc->method_state, b->stack_size - 1 - argc, cc->class_serial);
-            fprintf(f, "        reg_cfp->pc = (VALUE *)0x%"PRIxVALUE";\n", (VALUE)(body->iseq_encoded + pos));
+            fprintf(f, "        reg_cfp->pc = original_body_iseq + %d;\n", pos);
             fprintf(f, "        return Qundef; /* cancel JIT */\n");
             fprintf(f, "    }\n");
 
Index: tool/ruby_vm/views/_mjit_compile_insn.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 62339)
+++ tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 62340)
@@ -50,10 +50,10 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn.erb#L50
 %
 % # JIT: move sp and pc if necessary
 % if insn.handles_frame?
-        fprintf(f, "    reg_cfp->pc = (VALUE *)0x%"PRIxVALUE";\n", (VALUE)(body->iseq_encoded + next_pos)); /* ADD_PC(INSN_ATTR(width)); */
+        fprintf(f, "    reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
         fprintf(f, "    reg_cfp->sp = reg_cfp->bp + %d;\n", b->stack_size + 1 - <%= insn.pops.size %>); /* POPN(INSN_ATTR(popn)); */
 % else
-        fprintf(f, "    reg_cfp->pc = (VALUE *)0x%"PRIxVALUE";\n", (VALUE)(body->iseq_encoded + pos));
+        fprintf(f, "    reg_cfp->pc = original_body_iseq + %d;\n", pos);
         fprintf(f, "    reg_cfp->sp = reg_cfp->bp + %d;\n", b->stack_size + 1);
 % end
 %

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]