String.replace is now capable to relace a pattern with a longer super pattern
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 03 Oct 2013 14:39:56 +0200
changeset 13318d9d63f414b5
parent 1330 740712318ab3
child 1332 bad90a969596
String.replace is now capable to relace a pattern with a longer super pattern
rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java
rt/emul/mini/src/main/java/java/lang/String.java
     1.1 --- a/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java	Thu Oct 03 14:35:09 2013 +0200
     1.2 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java	Thu Oct 03 14:39:56 2013 +0200
     1.3 @@ -162,6 +162,10 @@
     1.4          return res;
     1.5      }
     1.6  
     1.7 +    @Compare public String replaceWithItself() {
     1.8 +        return "org.apidesign.bck2brwsr.core.JavaScriptBody".replace(".", "\\.");
     1.9 +    }
    1.10 +    
    1.11      @Factory
    1.12      public static Object[] create() {
    1.13          return VMTest.create(CompareStringsTest.class);
     2.1 --- a/rt/emul/mini/src/main/java/java/lang/String.java	Thu Oct 03 14:35:09 2013 +0200
     2.2 +++ b/rt/emul/mini/src/main/java/java/lang/String.java	Thu Oct 03 14:39:56 2013 +0200
     2.3 @@ -2239,12 +2239,14 @@
     2.4            "var s = this.toString();\n"
     2.5          + "target = target.toString();\n"
     2.6          + "replacement = replacement.toString();\n"
     2.7 +        + "var pos = 0;\n"
     2.8          + "for (;;) {\n"
     2.9 -        + "  var ret = s.replace(target, replacement);\n"
    2.10 -        + "  if (ret === s) {\n"
    2.11 -        + "    return ret;\n"
    2.12 +        + "  var indx = s.indexOf(target, pos);\n"
    2.13 +        + "  if (indx === -1) {\n"
    2.14 +        + "    return s;\n"
    2.15          + "  }\n"
    2.16 -        + "  s = ret;\n"
    2.17 +        + "  pos = indx + replacement.length;\n"
    2.18 +        + "  s = s.substring(0, indx) + replacement + s.substring(indx + target.length);\n"
    2.19          + "}"
    2.20      )
    2.21      public native String replace(CharSequence target, CharSequence replacement);