OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4125 if (proto->IsNull()) return isolate->heap()->false_value(); | 4125 if (proto->IsNull()) return isolate->heap()->false_value(); |
4126 ASSERT(proto->IsJSGlobalObject()); | 4126 ASSERT(proto->IsJSGlobalObject()); |
4127 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); | 4127 return JSGlobalObject::cast(proto)->DeleteElement(index, mode); |
4128 } | 4128 } |
4129 | 4129 |
4130 // From this point on everything needs to be handlified. | 4130 // From this point on everything needs to be handlified. |
4131 HandleScope scope(isolate); | 4131 HandleScope scope(isolate); |
4132 Handle<JSObject> self(this); | 4132 Handle<JSObject> self(this); |
4133 | 4133 |
4134 Handle<String> name; | 4134 Handle<String> name; |
4135 Handle<Object> old_value(isolate->heap()->the_hole_value()); | 4135 Handle<Object> old_value; |
4136 bool preexists = false; | 4136 bool preexists = false; |
4137 if (FLAG_harmony_observation && map()->is_observed()) { | 4137 if (FLAG_harmony_observation && map()->is_observed()) { |
4138 name = isolate->factory()->Uint32ToString(index); | 4138 name = isolate->factory()->Uint32ToString(index); |
4139 preexists = self->HasLocalElement(index); | 4139 preexists = self->HasLocalElement(index); |
4140 if (preexists) { | 4140 if (preexists) { |
4141 // TODO(observe): only read & set old_value if it's not an accessor | 4141 old_value = GetLocalElementAccessorPair(index) != NULL |
4142 old_value = Object::GetElement(self, index); | 4142 ? Handle<Object>::cast(isolate->factory()->the_hole_value()) |
| 4143 : Object::GetElement(self, index); |
4143 } | 4144 } |
4144 } | 4145 } |
4145 | 4146 |
4146 MaybeObject* result; | 4147 MaybeObject* result; |
4147 // Skip interceptor if forcing deletion. | 4148 // Skip interceptor if forcing deletion. |
4148 if (self->HasIndexedInterceptor() && mode != FORCE_DELETION) { | 4149 if (self->HasIndexedInterceptor() && mode != FORCE_DELETION) { |
4149 result = self->DeleteElementWithInterceptor(index); | 4150 result = self->DeleteElementWithInterceptor(index); |
4150 } else { | 4151 } else { |
4151 result = self->GetElementsAccessor()->Delete(*self, index, mode); | 4152 result = self->GetElementsAccessor()->Delete(*self, index, mode); |
4152 } | 4153 } |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4879 // From this point on everything needs to be handlified. | 4880 // From this point on everything needs to be handlified. |
4880 HandleScope scope(GetIsolate()); | 4881 HandleScope scope(GetIsolate()); |
4881 Handle<JSObject> self(this); | 4882 Handle<JSObject> self(this); |
4882 Handle<String> name(name_raw); | 4883 Handle<String> name(name_raw); |
4883 Handle<Object> getter(getter_raw); | 4884 Handle<Object> getter(getter_raw); |
4884 Handle<Object> setter(setter_raw); | 4885 Handle<Object> setter(setter_raw); |
4885 | 4886 |
4886 uint32_t index = 0; | 4887 uint32_t index = 0; |
4887 bool is_element = name->AsArrayIndex(&index); | 4888 bool is_element = name->AsArrayIndex(&index); |
4888 | 4889 |
4889 Handle<Object> old_value(isolate->heap()->the_hole_value()); | 4890 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
4890 bool preexists = false; | 4891 bool preexists = false; |
4891 if (FLAG_harmony_observation && map()->is_observed()) { | 4892 if (FLAG_harmony_observation && map()->is_observed()) { |
4892 if (is_element) { | 4893 if (is_element) { |
4893 preexists = HasLocalElement(index); | 4894 preexists = HasLocalElement(index); |
4894 if (preexists) { | 4895 if (preexists && GetLocalElementAccessorPair(index) == NULL) { |
4895 // TODO(observe): distinguish the case where it's an accessor | |
4896 old_value = Object::GetElement(self, index); | 4896 old_value = Object::GetElement(self, index); |
4897 } | 4897 } |
4898 } else { | 4898 } else { |
4899 LookupResult lookup(isolate); | 4899 LookupResult lookup(isolate); |
4900 LocalLookup(*name, &lookup); | 4900 LocalLookup(*name, &lookup); |
4901 preexists = lookup.IsProperty(); | 4901 preexists = lookup.IsProperty(); |
4902 if (preexists) old_value = handle(lookup.GetLazyValue()); | 4902 if (preexists) old_value = handle(lookup.GetLazyValue()); |
4903 } | 4903 } |
4904 } | 4904 } |
4905 | 4905 |
(...skipping 4642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9548 EnsureElementsMode mode) { | 9548 EnsureElementsMode mode) { |
9549 // Elements in |Arguments| are ordered backwards (because they're on the | 9549 // Elements in |Arguments| are ordered backwards (because they're on the |
9550 // stack), but the method that's called here iterates over them in forward | 9550 // stack), but the method that's called here iterates over them in forward |
9551 // direction. | 9551 // direction. |
9552 return EnsureCanContainElements( | 9552 return EnsureCanContainElements( |
9553 args->arguments() - first_arg - (arg_count - 1), | 9553 args->arguments() - first_arg - (arg_count - 1), |
9554 arg_count, mode); | 9554 arg_count, mode); |
9555 } | 9555 } |
9556 | 9556 |
9557 | 9557 |
9558 JSObject::LocalElementType JSObject::GetLocalElementType(uint32_t index) { | 9558 PropertyType JSObject::GetLocalPropertyType(String* name) { |
| 9559 uint32_t index = 0; |
| 9560 if (name->AsArrayIndex(&index)) { |
| 9561 return GetLocalElementType(index); |
| 9562 } |
| 9563 LookupResult lookup(GetIsolate()); |
| 9564 LocalLookup(name, &lookup); |
| 9565 return lookup.type(); |
| 9566 } |
| 9567 |
| 9568 |
| 9569 PropertyType JSObject::GetLocalElementType(uint32_t index) { |
| 9570 return GetElementsAccessor()->GetType(this, this, index); |
| 9571 } |
| 9572 |
| 9573 |
| 9574 AccessorPair* JSObject::GetLocalPropertyAccessorPair(String* name) { |
| 9575 uint32_t index = 0; |
| 9576 if (name->AsArrayIndex(&index)) { |
| 9577 return GetLocalElementAccessorPair(index); |
| 9578 } |
| 9579 LookupResult lookup(GetIsolate()); |
| 9580 LocalLookup(name, &lookup); |
| 9581 if (lookup.IsPropertyCallbacks() && |
| 9582 lookup.GetCallbackObject()->IsAccessorPair()) { |
| 9583 return AccessorPair::cast(lookup.GetCallbackObject()); |
| 9584 } |
| 9585 return NULL; |
| 9586 } |
| 9587 |
| 9588 |
| 9589 AccessorPair* JSObject::GetLocalElementAccessorPair(uint32_t index) { |
| 9590 return GetElementsAccessor()->GetAccessorPair(this, this, index); |
| 9591 } |
| 9592 |
| 9593 |
| 9594 JSObject::LocalElementKind JSObject::GetLocalElementKind(uint32_t index) { |
9559 // Check access rights if needed. | 9595 // Check access rights if needed. |
9560 if (IsAccessCheckNeeded()) { | 9596 if (IsAccessCheckNeeded()) { |
9561 Heap* heap = GetHeap(); | 9597 Heap* heap = GetHeap(); |
9562 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 9598 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { |
9563 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 9599 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); |
9564 return UNDEFINED_ELEMENT; | 9600 return UNDEFINED_ELEMENT; |
9565 } | 9601 } |
9566 } | 9602 } |
9567 | 9603 |
9568 if (IsJSGlobalProxy()) { | 9604 if (IsJSGlobalProxy()) { |
9569 Object* proto = GetPrototype(); | 9605 Object* proto = GetPrototype(); |
9570 if (proto->IsNull()) return UNDEFINED_ELEMENT; | 9606 if (proto->IsNull()) return UNDEFINED_ELEMENT; |
9571 ASSERT(proto->IsJSGlobalObject()); | 9607 ASSERT(proto->IsJSGlobalObject()); |
9572 return JSObject::cast(proto)->GetLocalElementType(index); | 9608 return JSObject::cast(proto)->GetLocalElementKind(index); |
9573 } | 9609 } |
9574 | 9610 |
9575 // Check for lookup interceptor | 9611 // Check for lookup interceptor |
9576 if (HasIndexedInterceptor()) { | 9612 if (HasIndexedInterceptor()) { |
9577 return GetElementAttributeWithInterceptor(this, index, false) != ABSENT | 9613 return GetElementAttributeWithInterceptor(this, index, false) != ABSENT |
9578 ? INTERCEPTED_ELEMENT : UNDEFINED_ELEMENT; | 9614 ? INTERCEPTED_ELEMENT : UNDEFINED_ELEMENT; |
9579 } | 9615 } |
9580 | 9616 |
9581 // Handle [] on String objects. | 9617 // Handle [] on String objects. |
9582 if (this->IsStringObjectWithCharacterAt(index)) { | 9618 if (this->IsStringObjectWithCharacterAt(index)) { |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10315 } | 10351 } |
10316 | 10352 |
10317 // From here on, everything has to be handlified. | 10353 // From here on, everything has to be handlified. |
10318 Handle<JSObject> self(this); | 10354 Handle<JSObject> self(this); |
10319 Handle<Object> value(value_raw); | 10355 Handle<Object> value(value_raw); |
10320 PropertyAttributes old_attributes = self->GetLocalElementAttribute(index); | 10356 PropertyAttributes old_attributes = self->GetLocalElementAttribute(index); |
10321 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 10357 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
10322 Handle<Object> old_length; | 10358 Handle<Object> old_length; |
10323 | 10359 |
10324 if (old_attributes != ABSENT) { | 10360 if (old_attributes != ABSENT) { |
10325 // TODO(observe): only read & set old_value if we have a data property | 10361 if (GetLocalElementAccessorPair(index) == NULL) |
10326 old_value = Object::GetElement(self, index); | 10362 old_value = Object::GetElement(self, index); |
10327 } else if (self->IsJSArray()) { | 10363 } else if (self->IsJSArray()) { |
10328 // Store old array length in case adding an element grows the array. | 10364 // Store old array length in case adding an element grows the array. |
10329 old_length = handle(Handle<JSArray>::cast(self)->length()); | 10365 old_length = handle(Handle<JSArray>::cast(self)->length()); |
10330 } | 10366 } |
10331 | 10367 |
10332 // Check for lookup interceptor | 10368 // Check for lookup interceptor |
10333 MaybeObject* result = self->HasIndexedInterceptor() | 10369 MaybeObject* result = self->HasIndexedInterceptor() |
10334 ? self->SetElementWithInterceptor( | 10370 ? self->SetElementWithInterceptor( |
10335 index, *value, attributes, strict_mode, check_prototype, set_mode) | 10371 index, *value, attributes, strict_mode, check_prototype, set_mode) |
10336 : self->SetElementWithoutInterceptor( | 10372 : self->SetElementWithoutInterceptor( |
(...skipping 3522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13859 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13895 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
13860 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13896 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
13861 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13897 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
13862 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13898 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
13863 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13899 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
13864 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13900 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
13865 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13901 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
13866 } | 13902 } |
13867 | 13903 |
13868 } } // namespace v8::internal | 13904 } } // namespace v8::internal |
OLD | NEW |