Index: src/builtins/builtins-regexp.cc |
diff --git a/src/builtins/builtins-regexp.cc b/src/builtins/builtins-regexp.cc |
index a121a951c9da4abf6ca8d99fed8c4e6545592e99..a555d45073049034fb4d7ff1f9d7315ff2a07a5f 100644 |
--- a/src/builtins/builtins-regexp.cc |
+++ b/src/builtins/builtins-regexp.cc |
@@ -7,6 +7,7 @@ |
#include "src/code-factory.h" |
#include "src/regexp/jsregexp.h" |
+#include "src/string-builder.h" |
namespace v8 { |
namespace internal { |
@@ -158,6 +159,36 @@ BUILTIN(RegExpConstructor) { |
RegExpInitialize(isolate, regexp, pattern, flags)); |
} |
+BUILTIN(RegExpPrototypeCompile) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSRegExp, regexp, "RegExp.prototype.compile"); |
+ |
+ Handle<Object> pattern = args.atOrUndefined(isolate, 1); |
+ Handle<Object> flags = args.atOrUndefined(isolate, 2); |
+ |
+ if (pattern->IsJSRegExp()) { |
+ Handle<JSRegExp> pattern_regexp = Handle<JSRegExp>::cast(pattern); |
+ |
+ if (!flags->IsUndefined(isolate)) { |
+ THROW_NEW_ERROR_RETURN_FAILURE( |
+ isolate, NewTypeError(MessageTemplate::kRegExpFlags)); |
+ } |
+ |
+ flags = PatternFlags(isolate, pattern_regexp); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, pattern, |
+ Object::GetProperty(pattern, isolate->factory()->source_string())); |
+ } |
+ |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, regexp, RegExpInitialize(isolate, regexp, pattern, flags)); |
+ |
+ // Return undefined for compatibility with JSC. |
+ // See http://crbug.com/585775 for web compat details. |
+ |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
namespace { |
compiler::Node* LoadLastIndex(CodeStubAssembler* a, compiler::Node* context, |
@@ -656,6 +687,43 @@ BUILTIN(RegExpPrototypeSourceGetter) { |
return regexp->source(); |
} |
+BUILTIN(RegExpPrototypeToString) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSReceiver, recv, "RegExp.prototype.toString"); |
+ |
+ if (*recv == isolate->regexp_function()->prototype()) { |
+ isolate->CountUsage(v8::Isolate::kRegExpPrototypeToString); |
+ } |
+ |
+ IncrementalStringBuilder builder(isolate); |
+ |
+ builder.AppendCharacter('/'); |
+ { |
+ Handle<Object> source; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, source, |
+ JSReceiver::GetProperty(recv, isolate->factory()->source_string())); |
+ Handle<String> source_str; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, source_str, |
+ Object::ToString(isolate, source)); |
+ builder.AppendString(source_str); |
+ } |
+ |
+ builder.AppendCharacter('/'); |
+ { |
+ Handle<Object> flags; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, flags, |
+ JSReceiver::GetProperty(recv, isolate->factory()->flags_string())); |
+ Handle<String> flags_str; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, flags_str, |
+ Object::ToString(isolate, flags)); |
+ builder.AppendString(flags_str); |
+ } |
+ |
+ RETURN_RESULT_OR_FAILURE(isolate, builder.Finish()); |
+} |
+ |
// ES6 21.2.4.2. |
BUILTIN(RegExpPrototypeSpeciesGetter) { |
HandleScope scope(isolate); |