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