| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index b82d377f71fda4040cdcb5784c0f14744a64f42b..743b34b534639a31917e1097ee27558605696b25 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -978,6 +978,8 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) {
|
| &fixed_elements_kind,
|
| &element_size);
|
|
|
| + RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind);
|
| +
|
| size_t byte_offset = 0;
|
| size_t byte_length = 0;
|
| RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset));
|
| @@ -986,7 +988,7 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) {
|
| holder->set_byte_offset(*byte_offset_object);
|
| holder->set_byte_length(*byte_length_object);
|
|
|
| - CHECK_EQ(0, static_cast<int>(byte_length % element_size));
|
| + RUNTIME_ASSERT(byte_length % element_size == 0);
|
| size_t length = byte_length / element_size;
|
|
|
| if (length > static_cast<unsigned>(Smi::kMaxValue)) {
|
| @@ -1062,6 +1064,8 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitializeFromArrayLike) {
|
| &fixed_elements_kind,
|
| &element_size);
|
|
|
| + RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind);
|
| +
|
| Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
|
| if (source->IsJSTypedArray() &&
|
| JSTypedArray::cast(*source)->type() == array_type) {
|
| @@ -1739,6 +1743,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionGet) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
|
| Handle<ObjectHashTable> table(
|
| ObjectHashTable::cast(weak_collection->table()));
|
| + RUNTIME_ASSERT(table->IsKey(*key));
|
| Handle<Object> lookup(table->Lookup(key), isolate);
|
| return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup;
|
| }
|
| @@ -1751,6 +1756,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionHas) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
|
| Handle<ObjectHashTable> table(
|
| ObjectHashTable::cast(weak_collection->table()));
|
| + RUNTIME_ASSERT(table->IsKey(*key));
|
| Handle<Object> lookup(table->Lookup(key), isolate);
|
| return isolate->heap()->ToBoolean(!lookup->IsTheHole());
|
| }
|
| @@ -1763,6 +1769,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
|
| Handle<ObjectHashTable> table(ObjectHashTable::cast(
|
| weak_collection->table()));
|
| + RUNTIME_ASSERT(table->IsKey(*key));
|
| Handle<Object> lookup(table->Lookup(key), isolate);
|
| Handle<ObjectHashTable> new_table =
|
| ObjectHashTable::Put(table, key, isolate->factory()->the_hole_value());
|
| @@ -1779,6 +1786,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionSet) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
|
| Handle<ObjectHashTable> table(
|
| ObjectHashTable::cast(weak_collection->table()));
|
| + RUNTIME_ASSERT(table->IsKey(*key));
|
| Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value);
|
| weak_collection->set_table(*new_table);
|
| return isolate->heap()->undefined_value();
|
| @@ -4305,6 +4313,7 @@ RUNTIME_FUNCTION(Runtime_StringReplaceGlobalRegExpWithString) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
|
|
|
| RUNTIME_ASSERT(regexp->GetFlags().is_global());
|
| + RUNTIME_ASSERT(last_match_info->HasFastObjectElements());
|
|
|
| subject = String::Flatten(subject);
|
|
|
| @@ -4735,12 +4744,11 @@ static Object* SearchRegExpMultiple(
|
| RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate);
|
| if (global_cache.HasException()) return isolate->heap()->exception();
|
|
|
| - Handle<FixedArray> result_elements;
|
| - if (result_array->HasFastObjectElements()) {
|
| - result_elements =
|
| - Handle<FixedArray>(FixedArray::cast(result_array->elements()));
|
| - }
|
| - if (result_elements.is_null() || result_elements->length() < 16) {
|
| + // Ensured in Runtime_RegExpExecMultiple.
|
| + ASSERT(result_array->HasFastObjectElements());
|
| + Handle<FixedArray> result_elements(
|
| + FixedArray::cast(result_array->elements()));
|
| + if (result_elements->length() < 16) {
|
| result_elements = isolate->factory()->NewFixedArrayWithHoles(16);
|
| }
|
|
|
| @@ -4854,9 +4862,11 @@ RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2);
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3);
|
| + RUNTIME_ASSERT(last_match_info->HasFastObjectElements());
|
| + RUNTIME_ASSERT(result_array->HasFastObjectElements());
|
|
|
| subject = String::Flatten(subject);
|
| - ASSERT(regexp->GetFlags().is_global());
|
| + RUNTIME_ASSERT(regexp->GetFlags().is_global());
|
|
|
| if (regexp->CaptureCount() == 0) {
|
| return SearchRegExpMultiple<false>(
|
| @@ -5504,6 +5514,7 @@ RUNTIME_FUNCTION(Runtime_SetHiddenProperty) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(String, key, 1);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
|
| + RUNTIME_ASSERT(key->IsUniqueName());
|
| return *JSObject::SetHiddenProperty(object, key, value);
|
| }
|
|
|
| @@ -7338,6 +7349,7 @@ RUNTIME_FUNCTION(Runtime_StringBuilderJoin) {
|
| CONVERT_SMI_ARG_CHECKED(array_length, 1);
|
| CONVERT_ARG_HANDLE_CHECKED(String, separator, 2);
|
| RUNTIME_ASSERT(array->HasFastObjectElements());
|
| + RUNTIME_ASSERT(array_length >= 0);
|
|
|
| Handle<FixedArray> fixed_array(FixedArray::cast(array->elements()));
|
| if (fixed_array->length() < array_length) {
|
| @@ -7385,17 +7397,19 @@ RUNTIME_FUNCTION(Runtime_StringBuilderJoin) {
|
| uc16* end = sink + length;
|
| #endif
|
|
|
| + RUNTIME_ASSERT(fixed_array->get(0)->IsString());
|
| String* first = String::cast(fixed_array->get(0));
|
| - String* seperator_raw = *separator;
|
| + String* separator_raw = *separator;
|
| int first_length = first->length();
|
| String::WriteToFlat(first, sink, 0, first_length);
|
| sink += first_length;
|
|
|
| for (int i = 1; i < array_length; i++) {
|
| ASSERT(sink + separator_length <= end);
|
| - String::WriteToFlat(seperator_raw, sink, 0, separator_length);
|
| + String::WriteToFlat(separator_raw, sink, 0, separator_length);
|
| sink += separator_length;
|
|
|
| + RUNTIME_ASSERT(fixed_array->get(i)->IsString());
|
| String* element = String::cast(fixed_array->get(i));
|
| int element_length = element->length();
|
| ASSERT(sink + element_length <= end);
|
| @@ -7474,6 +7488,8 @@ RUNTIME_FUNCTION(Runtime_SparseJoinWithSeparator) {
|
| FixedArray* elements = FixedArray::cast(elements_array->elements());
|
| for (int i = 0; i < elements_length; i += 2) {
|
| RUNTIME_ASSERT(elements->get(i)->IsNumber());
|
| + CONVERT_NUMBER_CHECKED(uint32_t, position, Uint32, elements->get(i));
|
| + RUNTIME_ASSERT(position < array_length);
|
| RUNTIME_ASSERT(elements->get(i + 1)->IsString());
|
| }
|
|
|
| @@ -9752,6 +9768,8 @@ RUNTIME_FUNCTION(Runtime_DateLocalTimezone) {
|
| ASSERT(args.length() == 1);
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| + RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs &&
|
| + x <= DateCache::kMaxTimeBeforeUTCInMs);
|
| const char* zone =
|
| isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x));
|
| Handle<String> result = isolate->factory()->NewStringFromUtf8(
|
| @@ -9765,6 +9783,8 @@ RUNTIME_FUNCTION(Runtime_DateToUTC) {
|
| ASSERT(args.length() == 1);
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| + RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs &&
|
| + x <= DateCache::kMaxTimeBeforeUTCInMs);
|
| int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x));
|
|
|
| return *isolate->factory()->NewNumber(static_cast<double>(time));
|
| @@ -10356,6 +10376,10 @@ static bool IterateElements(Isolate* isolate,
|
| if (length == 0) break;
|
| // Run through the elements FixedArray and use HasElement and GetElement
|
| // to check the prototype for missing elements.
|
| + if (receiver->elements()->IsFixedArray()) {
|
| + ASSERT(receiver->elements()->length() == 0);
|
| + break;
|
| + }
|
| Handle<FixedDoubleArray> elements(
|
| FixedDoubleArray::cast(receiver->elements()));
|
| int fast_length = static_cast<int>(length);
|
| @@ -10706,15 +10730,13 @@ RUNTIME_FUNCTION(Runtime_MoveArrayContents) {
|
| RUNTIME_FUNCTION(Runtime_EstimateNumberOfElements) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 1);
|
| - CONVERT_ARG_CHECKED(JSObject, object, 0);
|
| + CONVERT_ARG_CHECKED(JSArray, object, 0);
|
| HeapObject* elements = object->elements();
|
| if (elements->IsDictionary()) {
|
| int result = SeededNumberDictionary::cast(elements)->NumberOfElements();
|
| return Smi::FromInt(result);
|
| - } else if (object->IsJSArray()) {
|
| - return JSArray::cast(object)->length();
|
| } else {
|
| - return Smi::FromInt(FixedArray::cast(elements)->length());
|
| + return object->length();
|
| }
|
| }
|
|
|
| @@ -10755,8 +10777,8 @@ RUNTIME_FUNCTION(Runtime_GetArrayKeys) {
|
| }
|
| return *isolate->factory()->NewJSArrayWithElements(keys);
|
| } else {
|
| - ASSERT(array->HasFastSmiOrObjectElements() ||
|
| - array->HasFastDoubleElements());
|
| + RUNTIME_ASSERT(array->HasFastSmiOrObjectElements() ||
|
| + array->HasFastDoubleElements());
|
| uint32_t actual_length = static_cast<uint32_t>(array->elements()->length());
|
| return *isolate->factory()->NewNumberFromUint(Min(actual_length, length));
|
| }
|
| @@ -10859,8 +10881,8 @@ static Handle<Object> DebugLookupResultValue(Isolate* isolate,
|
| break;
|
| }
|
| case INTERCEPTOR:
|
| - break;
|
| case HANDLER:
|
| + break;
|
| case NONEXISTENT:
|
| UNREACHABLE();
|
| break;
|
| @@ -12697,12 +12719,13 @@ RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) {
|
| ASSERT(args.length() == 3);
|
| CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
|
| CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
|
| - RUNTIME_ASSERT(source_position >= 0);
|
| + RUNTIME_ASSERT(source_position >= function->shared()->start_position() &&
|
| + source_position <= function->shared()->end_position());
|
| CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2);
|
|
|
| // Set break point.
|
| - isolate->debug()->SetBreakPoint(function, break_point_object_arg,
|
| - &source_position);
|
| + RUNTIME_ASSERT(isolate->debug()->SetBreakPoint(
|
| + function, break_point_object_arg, &source_position));
|
|
|
| return Smi::FromInt(source_position);
|
| }
|
| @@ -13504,7 +13527,7 @@ RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) {
|
| Script* script = Script::cast(JSValue::cast(*script_object)->value());
|
| script_object = Handle<Object>(script, isolate);
|
| }
|
| -
|
| + RUNTIME_ASSERT(function_wrapper->value()->IsSharedFunctionInfo());
|
| LiveEdit::SetFunctionScript(function_wrapper, script_object);
|
| } else {
|
| // Just ignore this. We may not have a SharedFunctionInfo for some functions
|
|
|