From 669a55dfed5cc6e32afee69694b95e8b4c187f54 Mon Sep 17 00:00:00 2001
From: normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 27 Mar 2017 06:12:37 +0000
Subject: fix redefinition optimization for -"literal string" (UMinus)

Unfortunately this enlarges insns.def by yet another
instruction.  However, it is much prettier than opt_str_freeze
in use, and maybe we can avoid having so many instructions in
the future.

[ruby-core:80368]

* insns.def (DEFINE_INSN): new instruction: opt_str_uminus (maybe temporary)
* compile.c (iseq_compile_each0): split instructions
* test/ruby/test_optimization.rb (test_string_uminus): new test
* vm.c (vm_init_redefined_flag): set redefinintion flag for uminus
* vm_core.h (enum ruby_basic_operators): add BOP_UMINUS

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58144 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 insns.def | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

(limited to 'insns.def')

diff --git a/insns.def b/insns.def
index 9bae14b5a9..a4f2526bef 100644
--- a/insns.def
+++ b/insns.def
@@ -981,6 +981,20 @@ opt_str_freeze
     }
 }
 
+DEFINE_INSN
+opt_str_uminus
+(VALUE str)
+()
+(VALUE val)
+{
+    if (BASIC_OP_UNREDEFINED_P(BOP_UMINUS, STRING_REDEFINED_OP_FLAG)) {
+	val = str;
+    }
+    else {
+	val = rb_funcall(rb_str_resurrect(str), idUMinus, 0);
+    }
+}
+
 DEFINE_INSN
 opt_newarray_max
 (rb_num_t num)
-- 
cgit v1.2.3

