| Index: src/objects-inl.h
|
| ===================================================================
|
| --- src/objects-inl.h (revision 5696)
|
| +++ src/objects-inl.h (working copy)
|
| @@ -396,28 +396,39 @@
|
| }
|
|
|
|
|
| -bool Object::IsFailure() {
|
| +bool MaybeObject::IsFailure() {
|
| return HAS_FAILURE_TAG(this);
|
| }
|
|
|
|
|
| -bool Object::IsRetryAfterGC() {
|
| +bool MaybeObject::IsRetryAfterGC() {
|
| return HAS_FAILURE_TAG(this)
|
| && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
|
| }
|
|
|
|
|
| -bool Object::IsOutOfMemoryFailure() {
|
| +bool MaybeObject::IsOutOfMemory() {
|
| return HAS_FAILURE_TAG(this)
|
| && Failure::cast(this)->IsOutOfMemoryException();
|
| }
|
|
|
|
|
| -bool Object::IsException() {
|
| +bool MaybeObject::IsException() {
|
| return this == Failure::Exception();
|
| }
|
|
|
|
|
| +bool MaybeObject::IsTheHole() {
|
| + return this == Heap::the_hole_value();
|
| +}
|
| +
|
| +
|
| +Failure* Failure::cast(MaybeObject* obj) {
|
| + ASSERT(HAS_FAILURE_TAG(obj));
|
| + return reinterpret_cast<Failure*>(obj);
|
| +}
|
| +
|
| +
|
| bool Object::IsJSObject() {
|
| return IsHeapObject()
|
| && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
|
| @@ -677,11 +688,6 @@
|
| }
|
|
|
|
|
| -bool Object::IsTheHole() {
|
| - return this == Heap::the_hole_value();
|
| -}
|
| -
|
| -
|
| bool Object::IsNull() {
|
| return this == Heap::null_value();
|
| }
|
| @@ -706,7 +712,7 @@
|
|
|
|
|
|
|
| -Object* Object::ToSmi() {
|
| +MaybeObject* Object::ToSmi() {
|
| if (IsSmi()) return this;
|
| if (IsHeapNumber()) {
|
| double value = HeapNumber::cast(this)->value();
|
| @@ -724,18 +730,27 @@
|
| }
|
|
|
|
|
| -Object* Object::GetElement(uint32_t index) {
|
| +MaybeObject* Object::GetElement(uint32_t index) {
|
| return GetElementWithReceiver(this, index);
|
| }
|
|
|
|
|
| -Object* Object::GetProperty(String* key) {
|
| +Object* Object::GetElementNoExceptionThrown(uint32_t index) {
|
| + MaybeObject* maybe = GetElementWithReceiver(this, index);
|
| + ASSERT(!maybe->IsFailure());
|
| + Object* result = NULL; // Initialization to please compiler.
|
| + maybe->ToObject(&result);
|
| + return result;
|
| +}
|
| +
|
| +
|
| +MaybeObject* Object::GetProperty(String* key) {
|
| PropertyAttributes attributes;
|
| return GetPropertyWithReceiver(this, key, &attributes);
|
| }
|
|
|
|
|
| -Object* Object::GetProperty(String* key, PropertyAttributes* attributes) {
|
| +MaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) {
|
| return GetPropertyWithReceiver(this, key, attributes);
|
| }
|
|
|
| @@ -1189,9 +1204,11 @@
|
| }
|
|
|
|
|
| -Object* JSObject::ResetElements() {
|
| - Object* obj = map()->GetFastElementsMap();
|
| - if (obj->IsFailure()) return obj;
|
| +MaybeObject* JSObject::ResetElements() {
|
| + Object* obj;
|
| + { MaybeObject* maybe_obj = map()->GetFastElementsMap();
|
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| + }
|
| set_map(Map::cast(obj));
|
| initialize_elements();
|
| return this;
|
| @@ -1681,7 +1698,6 @@
|
| CAST_ACCESSOR(ExternalTwoByteString)
|
| CAST_ACCESSOR(JSObject)
|
| CAST_ACCESSOR(Smi)
|
| -CAST_ACCESSOR(Failure)
|
| CAST_ACCESSOR(HeapObject)
|
| CAST_ACCESSOR(HeapNumber)
|
| CAST_ACCESSOR(Oddball)
|
| @@ -1754,7 +1770,7 @@
|
| }
|
|
|
|
|
| -Object* String::TryFlatten(PretenureFlag pretenure) {
|
| +MaybeObject* String::TryFlatten(PretenureFlag pretenure) {
|
| if (!StringShape(this).IsCons()) return this;
|
| ConsString* cons = ConsString::cast(this);
|
| if (cons->second()->length() == 0) return cons->first();
|
| @@ -1763,8 +1779,12 @@
|
|
|
|
|
| String* String::TryFlattenGetString(PretenureFlag pretenure) {
|
| - Object* flat = TryFlatten(pretenure);
|
| - return flat->IsFailure() ? this : String::cast(flat);
|
| + MaybeObject* flat = TryFlatten(pretenure);
|
| + Object* successfully_flattened;
|
| + if (flat->ToObject(&successfully_flattened)) {
|
| + return String::cast(successfully_flattened);
|
| + }
|
| + return this;
|
| }
|
|
|
|
|
| @@ -2475,10 +2495,12 @@
|
| }
|
|
|
|
|
| -Object* Map::GetFastElementsMap() {
|
| +MaybeObject* Map::GetFastElementsMap() {
|
| if (has_fast_elements()) return this;
|
| - Object* obj = CopyDropTransitions();
|
| - if (obj->IsFailure()) return obj;
|
| + Object* obj;
|
| + { MaybeObject* maybe_obj = CopyDropTransitions();
|
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| + }
|
| Map* new_map = Map::cast(obj);
|
| new_map->set_has_fast_elements(true);
|
| Counters::map_slow_to_fast_elements.Increment();
|
| @@ -2486,10 +2508,12 @@
|
| }
|
|
|
|
|
| -Object* Map::GetSlowElementsMap() {
|
| +MaybeObject* Map::GetSlowElementsMap() {
|
| if (!has_fast_elements()) return this;
|
| - Object* obj = CopyDropTransitions();
|
| - if (obj->IsFailure()) return obj;
|
| + Object* obj;
|
| + { MaybeObject* maybe_obj = CopyDropTransitions();
|
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| + }
|
| Map* new_map = Map::cast(obj);
|
| new_map->set_has_fast_elements(false);
|
| Counters::map_fast_to_slow_elements.Increment();
|
| @@ -3189,13 +3213,17 @@
|
| }
|
|
|
|
|
| -Object* JSObject::EnsureWritableFastElements() {
|
| +MaybeObject* JSObject::EnsureWritableFastElements() {
|
| ASSERT(HasFastElements());
|
| FixedArray* elems = FixedArray::cast(elements());
|
| if (elems->map() != Heap::fixed_cow_array_map()) return elems;
|
| - Object* writable_elems = Heap::CopyFixedArrayWithMap(elems,
|
| - Heap::fixed_array_map());
|
| - if (writable_elems->IsFailure()) return writable_elems;
|
| + Object* writable_elems;
|
| + { MaybeObject* maybe_writable_elems =
|
| + Heap::CopyFixedArrayWithMap(elems, Heap::fixed_array_map());
|
| + if (!maybe_writable_elems->ToObject(&writable_elems)) {
|
| + return maybe_writable_elems;
|
| + }
|
| + }
|
| set_elements(FixedArray::cast(writable_elems));
|
| Counters::cow_arrays_converted.Increment();
|
| return writable_elems;
|
| @@ -3340,13 +3368,18 @@
|
| Object* JSObject::GetHiddenPropertiesObject() {
|
| ASSERT(!IsJSGlobalProxy());
|
| PropertyAttributes attributes;
|
| - return GetLocalPropertyPostInterceptor(this,
|
| - Heap::hidden_symbol(),
|
| - &attributes);
|
| + // You can't install a getter on a property indexed by the hidden symbol,
|
| + // so we can be sure that GetLocalPropertyPostInterceptor returns a real
|
| + // object.
|
| + Object* result =
|
| + GetLocalPropertyPostInterceptor(this,
|
| + Heap::hidden_symbol(),
|
| + &attributes)->ToObjectUnchecked();
|
| + return result;
|
| }
|
|
|
|
|
| -Object* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) {
|
| +MaybeObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) {
|
| ASSERT(!IsJSGlobalProxy());
|
| return SetPropertyPostInterceptor(Heap::hidden_symbol(),
|
| hidden_obj,
|
| @@ -3453,7 +3486,7 @@
|
| }
|
|
|
|
|
| -Object* FixedArray::Copy() {
|
| +MaybeObject* FixedArray::Copy() {
|
| if (length() == 0) return this;
|
| return Heap::CopyFixedArray(this);
|
| }
|
|
|