| Index: sdk/lib/_internal/compiler/js_lib/js_string.dart | 
| diff --git a/sdk/lib/_internal/compiler/js_lib/js_string.dart b/sdk/lib/_internal/compiler/js_lib/js_string.dart | 
| index ec1ece176fc8da1ce7579e6a203f91aea73a8647..c7fd9aba51aa0702c034753a901475d7c965e070 100644 | 
| --- a/sdk/lib/_internal/compiler/js_lib/js_string.dart | 
| +++ b/sdk/lib/_internal/compiler/js_lib/js_string.dart | 
| @@ -83,14 +83,42 @@ class JSString extends Interceptor implements String, JSIndexable { | 
| checkNull(pattern); | 
| if (pattern is String) { | 
| return JS('JSExtendableArray', r'#.split(#)', this, pattern); | 
| -    } else if (pattern is JSSyntaxRegExp) { | 
| +    } else if (pattern is JSSyntaxRegExp && regExpCaptureCount(pattern) == 0) { | 
| var re = regExpGetNative(pattern); | 
| return JS('JSExtendableArray', r'#.split(#)', this, re); | 
| } else { | 
| -      throw "String.split(Pattern) UNIMPLEMENTED"; | 
| +      return _defaultSplit(pattern); | 
| } | 
| } | 
|  | 
| +  List<String> _defaultSplit(Pattern pattern) { | 
| +    List<String> result = <String>[]; | 
| +    // End of most recent match. That is, start of next part to add to result. | 
| +    int start = 0; | 
| +    // Length of most recent match. | 
| +    // Set >0, so no match on the empty string causes the result to be [""]. | 
| +    int length = 1; | 
| +    for (var match in pattern.allMatches(this)) { | 
| +      int matchStart = match.start; | 
| +      int matchEnd = match.end; | 
| +      length = matchEnd - matchStart; | 
| +      if (length == 0 && start == matchStart) { | 
| +        // An empty match right after another match is ignored. | 
| +        // This includes an empty match at the start of the string. | 
| +        continue; | 
| +      } | 
| +      int end = matchStart; | 
| +      result.add(this.substring(start, end)); | 
| +      start = matchEnd; | 
| +    } | 
| +    if (start < this.length || length > 0) { | 
| +      // An empty match at the end of the string does not cause a "" at the end. | 
| +      // A non-empty match ending at the end of the string does add a "". | 
| +      result.add(this.substring(start)); | 
| +    } | 
| +    return result; | 
| +  } | 
| + | 
| bool startsWith(Pattern pattern, [int index = 0]) { | 
| checkInt(index); | 
| if (index < 0 || index > this.length) { | 
|  |