diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-string.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-string.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/deps/v8/src/builtins/builtins-string.cc b/deps/v8/src/builtins/builtins-string.cc index 4e3058c220..14a74afb6d 100644 --- a/deps/v8/src/builtins/builtins-string.cc +++ b/deps/v8/src/builtins/builtins-string.cc @@ -8,6 +8,7 @@ #include "src/counters.h" #include "src/objects-inl.h" #include "src/regexp/regexp-utils.h" +#include "src/string-builder.h" #include "src/string-case.h" #include "src/unicode-inl.h" #include "src/unicode.h" @@ -511,5 +512,65 @@ BUILTIN(StringPrototypeToUpperCase) { } #endif // !V8_INTL_SUPPORT +// ES6 #sec-string.prototype.raw +BUILTIN(StringRaw) { + HandleScope scope(isolate); + Handle<Object> templ = args.atOrUndefined(isolate, 1); + const uint32_t argc = args.length(); + Handle<String> raw_string = + isolate->factory()->NewStringFromAsciiChecked("raw"); + + Handle<Object> cooked; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, cooked, + Object::ToObject(isolate, templ)); + + Handle<Object> raw; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, raw, + Object::GetProperty(cooked, raw_string)); + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, raw, + Object::ToObject(isolate, raw)); + Handle<Object> raw_len; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( + isolate, raw_len, + Object::GetProperty(raw, isolate->factory()->length_string())); + + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, raw_len, + Object::ToLength(isolate, raw_len)); + + IncrementalStringBuilder result_builder(isolate); + const uint32_t length = static_cast<uint32_t>(raw_len->Number()); + if (length > 0) { + Handle<Object> first_element; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, first_element, + Object::GetElement(isolate, raw, 0)); + + Handle<String> first_string; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( + isolate, first_string, Object::ToString(isolate, first_element)); + result_builder.AppendString(first_string); + + for (uint32_t i = 1, arg_i = 2; i < length; i++, arg_i++) { + if (arg_i < argc) { + Handle<String> argument_string; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( + isolate, argument_string, + Object::ToString(isolate, args.at(arg_i))); + result_builder.AppendString(argument_string); + } + + Handle<Object> element; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, element, + Object::GetElement(isolate, raw, i)); + + Handle<String> element_string; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, element_string, + Object::ToString(isolate, element)); + result_builder.AppendString(element_string); + } + } + + RETURN_RESULT_OR_FAILURE(isolate, result_builder.Finish()); +} + } // namespace internal } // namespace v8 |