[#37959] [Bug:trunk] I can modify literals — Yusuke ENDOH <mame@...>

遠藤です。

13 messages 2009/02/10

[#38005] Is URI.decode() broken? — MOROHASHI Kyosuke <moronatural@...>

もろはしです。いつもお世話になっております。

39 messages 2009/02/14
[#38006] Re: Is URI.decode() broken? — Nobuyoshi Nakada <nobu@...> 2009/02/14

なかだです。

[#38009] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/14

成瀬です、

[#38016] Re: Is URI.decode() broken? — Fujioka <fuj@...> 2009/02/15

xibbarこと藤岡です。

[#38017] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/15

成瀬です。

[#38040] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/02/17

NARUSE, Yui さんは書きました:

[#38124] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/03/03

成瀬です。

[#39214] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/09/02

(2009年03月03日 22:45), NARUSE, Yui さんは書きました:

[#39218] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/09/02

成瀬です。

[#39236] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/05

In article <4A9E44DD.6050706@airemix.jp>,

[#39242] Re: Is URI.decode() broken? — KOSAKI Motohiro <kosaki.motohiro@...> 2009/09/07

小崎@思いつきを適当に書いてみるテスト

[#39246] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/07

In article <20090907091830.2C7A.A69D9226@jp.fujitsu.com>,

[#38096] 多重代入やメソッド引数の展開でto_aが呼ばれます — nagachika <nagachika00@...>

nagachika と申します。

10 messages 2009/02/26

[#38098] ブロック引数と括弧・引数なしsuper — Shugo Maeda <shugo@...>

前田です。

12 messages 2009/02/27

[ruby-dev:38093] Re: [Bug:trunk] duplicate when clauses raise strange exception

From: Nobuyoshi Nakada <nobu@...>
Date: 2009-02-26 05:15:15 UTC
List: ruby-dev #38093
なかだです。

At Thu, 26 Feb 2009 00:17:40 +0900,
Yusuke ENDOH wrote in [ruby-dev:38079]:
> 文字列の when 節を重複させると、怪しい例外があがります。
> 
> $ ruby19 -e 'case "x"; when "x"; when "x"; end'
> ruby19: method `eql?' called on terminated object (0x826e0f0)
> (NotImplementedError)
> 
> [ruby-dev:37959] の関係で、文字列リテラルが不可視になった影響のようです。
> 不可視をやめてしまえばとりあえず解決しますが、そうすると ObjectSpace で
> when 節の文字列を書き換えられてしまうようになります。
> どうしたものでしょう。

これを調べていてもう一つ気づいたのが

./ruby -v -e '
  class S < String
    def eql?(s)
      @literal = s
      super
    end
    attr_reader :literal
  end

  case a = S.new("x")
  when "x"
  end
  p a.literal
'
ruby 1.9.2dev (2009-02-26 trunk 22637) [i386-darwin9.6.0]
-e:13:in `p': method `inspect' called on terminated object (0x11cdf8) (NotImplementedError)
	from -:12:in `<main>'

最適化されないときには "x" === a が呼ばれますが、されていると
a.eql?("x") が呼ばれます。リテラルを隠そうと思うなら、Hashをその
まま使うのはまずいと思います。


Index: compile.c
===================================================================
--- compile.c	(revision 22639)
+++ compile.c	(working copy)
@@ -1217,4 +1217,36 @@ iseq_set_local_table(rb_iseq_t *iseq, ID
 }
 
+static int
+cdhash_cmp(VALUE val, VALUE lit)
+{
+    if (val == lit) return 0;
+    if (SPECIAL_CONST_P(lit)) {
+	return val != lit;
+    }
+    if (SPECIAL_CONST_P(val) || BUILTIN_TYPE(val) != BUILTIN_TYPE(lit)) {
+	return -1;
+    }
+    if (BUILTIN_TYPE(lit) == T_STRING) {
+	return rb_str_hash_cmp(lit, val);
+    }
+    return !rb_eql(lit, val);
+}
+
+static int
+cdhash_hash(VALUE a)
+{
+    if (SPECIAL_CONST_P(a)) return (int)a;
+    if (TYPE(a) == T_STRING) return rb_str_hash(a);
+    {
+        VALUE hval = rb_hash(a);
+	return (int)FIX2LONG(hval);
+    }
+}
+
+static const struct st_hash_type cdhash_type = {
+    cdhash_cmp,
+    cdhash_hash,
+};
+
 /**
   ruby insn object array -> raw instruction sequence
@@ -1344,4 +1376,5 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_
 			    VALUE lits = operands[j];
 			    VALUE map = rb_hash_new();
+			    RHASH_TBL(map)->type = &cdhash_type;
 
 			    for (i=0; i < RARRAY_LEN(lits); i+=2) {


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread