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); |