| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index a2bc186d61a622b1f2f32aff6072c638360131b1..3e8d57d039900ac11fc0311b9a45ba35045f9f43 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -7263,7 +7263,7 @@ static void JoinSparseArrayWithSeparator(FixedArray* elements,
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| CONVERT_ARG_CHECKED(JSArray, elements_array, 0);
|
| RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements());
|
| @@ -7323,8 +7323,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) {
|
| }
|
| }
|
| if (overflow) {
|
| - // Throw OutOfMemory exception for creating too large a string.
|
| - V8::FatalProcessOutOfMemory("Array join result too large.");
|
| + // Throw an exception if the resulting string is too large. See
|
| + // https://code.google.com/p/chromium/issues/detail?id=336820
|
| + // for details.
|
| + return isolate->Throw(*isolate->factory()->
|
| + NewRangeError("invalid_string_length",
|
| + HandleVector<Object>(NULL, 0)));
|
| }
|
|
|
| if (is_ascii) {
|
| @@ -8049,23 +8053,22 @@ static SmartArrayPointer<Handle<Object> > GetCallerArguments(
|
| if (functions.length() > 1) {
|
| int inlined_jsframe_index = functions.length() - 1;
|
| JSFunction* inlined_function = functions[inlined_jsframe_index];
|
| - Vector<SlotRef> args_slots =
|
| - SlotRef::ComputeSlotMappingForArguments(
|
| - frame,
|
| - inlined_jsframe_index,
|
| - inlined_function->shared()->formal_parameter_count());
|
| + SlotRefValueBuilder slot_refs(
|
| + frame,
|
| + inlined_jsframe_index,
|
| + inlined_function->shared()->formal_parameter_count());
|
|
|
| - int args_count = args_slots.length();
|
| + int args_count = slot_refs.args_length();
|
|
|
| *total_argc = prefix_argc + args_count;
|
| SmartArrayPointer<Handle<Object> > param_data(
|
| NewArray<Handle<Object> >(*total_argc));
|
| + slot_refs.Prepare(isolate);
|
| for (int i = 0; i < args_count; i++) {
|
| - Handle<Object> val = args_slots[i].GetValue(isolate);
|
| + Handle<Object> val = slot_refs.GetNext(isolate, 0);
|
| param_data[prefix_argc + i] = val;
|
| }
|
| -
|
| - args_slots.Dispose();
|
| + slot_refs.Finish(isolate);
|
|
|
| return param_data;
|
| } else {
|
| @@ -13977,6 +13980,35 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalCompare) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_StringNormalize) {
|
| + HandleScope scope(isolate);
|
| + static const UNormalizationMode normalizationForms[] =
|
| + { UNORM_NFC, UNORM_NFD, UNORM_NFKC, UNORM_NFKD };
|
| +
|
| + ASSERT(args.length() == 2);
|
| +
|
| + CONVERT_ARG_HANDLE_CHECKED(String, stringValue, 0);
|
| + CONVERT_NUMBER_CHECKED(int, form_id, Int32, args[1]);
|
| +
|
| + v8::String::Value string_value(v8::Utils::ToLocal(stringValue));
|
| + const UChar* u_value = reinterpret_cast<const UChar*>(*string_value);
|
| +
|
| + // TODO(mnita): check Normalizer2 (not available in ICU 46)
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + icu::UnicodeString result;
|
| + icu::Normalizer::normalize(u_value, normalizationForms[form_id], 0,
|
| + result, status);
|
| + if (U_FAILURE(status)) {
|
| + return isolate->heap()->undefined_value();
|
| + }
|
| +
|
| + return *isolate->factory()->NewStringFromTwoByte(
|
| + Vector<const uint16_t>(
|
| + reinterpret_cast<const uint16_t*>(result.getBuffer()),
|
| + result.length()));
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateBreakIterator) {
|
| HandleScope scope(isolate);
|
|
|
|
|