# HG changeset patch # User Jaroslav Tulach # Date 1382361364 -7200 # Node ID 7f4d603c46ddc5f395d1eca8edf56ba7616a5f83 # Parent 033c5641c63f9466d2f16d5892b1981bbf2b325c In case the JavaScript Regexp does not parse the expression, use the regular Java one (if available) diff -r 033c5641c63f -r 7f4d603c46dd rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java --- a/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java Mon Oct 21 15:06:14 2013 +0200 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java Mon Oct 21 15:16:04 2013 +0200 @@ -185,6 +185,10 @@ return "org.apidesign.bck2brwsr.core.JavaScriptBody".replace(".", "\\."); } + @Compare public boolean matchWithComplicatedRegExp() { + return "Activates this model instance.".matches("(?sm).*^\\s*@deprecated( |$).*"); + } + @Factory public static Object[] create() { return VMTest.create(CompareStringsTest.class); diff -r 033c5641c63f -r 7f4d603c46dd rt/emul/mini/src/main/java/java/lang/String.java --- a/rt/emul/mini/src/main/java/java/lang/String.java Mon Oct 21 15:06:14 2013 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/String.java Mon Oct 21 15:16:04 2013 +0200 @@ -26,6 +26,8 @@ package java.lang; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Comparator; import java.util.Locale; import org.apidesign.bck2brwsr.core.ExtraJavaScript; @@ -2098,13 +2100,31 @@ * @since 1.4 * @spec JSR-51 */ + public boolean matches(String regex) { + try { + return matchesViaJS(regex); + } catch (Throwable t) { + // fallback to classical behavior + try { + Method m = Class.forName("java.util.regex.Pattern").getMethod("matches", String.class, CharSequence.class); + return (Boolean)m.invoke(null, regex, this); + } catch (InvocationTargetException ex) { + if (ex.getTargetException() instanceof RuntimeException) { + throw (RuntimeException)ex.getTargetException(); + } + } catch (Throwable another) { + // will report the old one + } + throw new RuntimeException(t); + } + } @JavaScriptBody(args = { "regex" }, body = "var self = this.toString();\n" + "var re = new RegExp(regex.toString());\n" + "var r = re.exec(self);\n" + "return r != null && r.length > 0 && self.length == r[0].length;" ) - public boolean matches(String regex) { + private boolean matchesViaJS(String regex) { throw new UnsupportedOperationException(); }