| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 128 } |
| 129 return heap_object->GetHeap()->true_value(); | 129 return heap_object->GetHeap()->true_value(); |
| 130 } | 130 } |
| 131 | 131 |
| 132 | 132 |
| 133 void Object::Lookup(String* name, LookupResult* result) { | 133 void Object::Lookup(String* name, LookupResult* result) { |
| 134 Object* holder = NULL; | 134 Object* holder = NULL; |
| 135 if (IsJSReceiver()) { | 135 if (IsJSReceiver()) { |
| 136 holder = this; | 136 holder = this; |
| 137 } else { | 137 } else { |
| 138 Context* native_context = Isolate::Current()->context()->native_context(); | 138 Context* native_context = result->isolate()->context()->native_context(); |
| 139 if (IsNumber()) { | 139 if (IsNumber()) { |
| 140 holder = native_context->number_function()->instance_prototype(); | 140 holder = native_context->number_function()->instance_prototype(); |
| 141 } else if (IsString()) { | 141 } else if (IsString()) { |
| 142 holder = native_context->string_function()->instance_prototype(); | 142 holder = native_context->string_function()->instance_prototype(); |
| 143 } else if (IsBoolean()) { | 143 } else if (IsBoolean()) { |
| 144 holder = native_context->boolean_function()->instance_prototype(); | 144 holder = native_context->boolean_function()->instance_prototype(); |
| 145 } else { | 145 } else { |
| 146 Isolate::Current()->PushStackTraceAndDie( | 146 Isolate::Current()->PushStackTraceAndDie( |
| 147 0xDEAD0000, this, JSReceiver::cast(this)->map(), 0xDEAD0001); | 147 0xDEAD0000, this, JSReceiver::cast(this)->map(), 0xDEAD0001); |
| 148 } | 148 } |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 } | 606 } |
| 607 | 607 |
| 608 | 608 |
| 609 MaybeObject* Object::GetProperty(Object* receiver, | 609 MaybeObject* Object::GetProperty(Object* receiver, |
| 610 LookupResult* result, | 610 LookupResult* result, |
| 611 String* name, | 611 String* name, |
| 612 PropertyAttributes* attributes) { | 612 PropertyAttributes* attributes) { |
| 613 // Make sure that the top context does not change when doing | 613 // Make sure that the top context does not change when doing |
| 614 // callbacks or interceptor calls. | 614 // callbacks or interceptor calls. |
| 615 AssertNoContextChange ncc; | 615 AssertNoContextChange ncc; |
| 616 Heap* heap = name->GetHeap(); | 616 Isolate* isolate = name->GetIsolate(); |
| 617 Heap* heap = isolate->heap(); |
| 617 | 618 |
| 618 // Traverse the prototype chain from the current object (this) to | 619 // Traverse the prototype chain from the current object (this) to |
| 619 // the holder and check for access rights. This avoids traversing the | 620 // the holder and check for access rights. This avoids traversing the |
| 620 // objects more than once in case of interceptors, because the | 621 // objects more than once in case of interceptors, because the |
| 621 // holder will always be the interceptor holder and the search may | 622 // holder will always be the interceptor holder and the search may |
| 622 // only continue with a current object just after the interceptor | 623 // only continue with a current object just after the interceptor |
| 623 // holder in the prototype chain. | 624 // holder in the prototype chain. |
| 624 // Proxy handlers do not use the proxy's prototype, so we can skip this. | 625 // Proxy handlers do not use the proxy's prototype, so we can skip this. |
| 625 if (!result->IsHandler()) { | 626 if (!result->IsHandler()) { |
| 626 Object* last = result->IsProperty() | 627 Object* last = result->IsProperty() |
| 627 ? result->holder() | 628 ? result->holder() |
| 628 : Object::cast(heap->null_value()); | 629 : Object::cast(heap->null_value()); |
| 629 ASSERT(this != this->GetPrototype()); | 630 ASSERT(this != this->GetPrototype(isolate)); |
| 630 for (Object* current = this; true; current = current->GetPrototype()) { | 631 for (Object* current = this; |
| 632 true; |
| 633 current = current->GetPrototype(isolate)) { |
| 631 if (current->IsAccessCheckNeeded()) { | 634 if (current->IsAccessCheckNeeded()) { |
| 632 // Check if we're allowed to read from the current object. Note | 635 // Check if we're allowed to read from the current object. Note |
| 633 // that even though we may not actually end up loading the named | 636 // that even though we may not actually end up loading the named |
| 634 // property from the current object, we still check that we have | 637 // property from the current object, we still check that we have |
| 635 // access to it. | 638 // access to it. |
| 636 // TODO(dcarney): revert. | 639 // TODO(dcarney): revert. |
| 637 CHECK(current->IsJSObject()); | 640 CHECK(current->IsJSObject()); |
| 638 JSObject* checked = JSObject::cast(current); | 641 JSObject* checked = JSObject::cast(current); |
| 639 if (!heap->isolate()->MayNamedAccess(checked, name, v8::ACCESS_GET)) { | 642 if (!heap->isolate()->MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
| 640 return checked->GetPropertyWithFailedAccessCheck(receiver, | 643 return checked->GetPropertyWithFailedAccessCheck(receiver, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 case NONEXISTENT: | 683 case NONEXISTENT: |
| 681 UNREACHABLE(); | 684 UNREACHABLE(); |
| 682 break; | 685 break; |
| 683 } | 686 } |
| 684 UNREACHABLE(); | 687 UNREACHABLE(); |
| 685 return NULL; | 688 return NULL; |
| 686 } | 689 } |
| 687 | 690 |
| 688 | 691 |
| 689 MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { | 692 MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { |
| 690 Heap* heap = IsSmi() | 693 Isolate* isolate = IsSmi() |
| 691 ? Isolate::Current()->heap() | 694 ? Isolate::Current() |
| 692 : HeapObject::cast(this)->GetHeap(); | 695 : HeapObject::cast(this)->GetIsolate(); |
| 696 Heap* heap = isolate->heap(); |
| 693 Object* holder = this; | 697 Object* holder = this; |
| 694 | 698 |
| 695 // Iterate up the prototype chain until an element is found or the null | 699 // Iterate up the prototype chain until an element is found or the null |
| 696 // prototype is encountered. | 700 // prototype is encountered. |
| 697 for (holder = this; | 701 for (holder = this; |
| 698 holder != heap->null_value(); | 702 holder != heap->null_value(); |
| 699 holder = holder->GetPrototype()) { | 703 holder = holder->GetPrototype(isolate)) { |
| 700 if (!holder->IsJSObject()) { | 704 if (!holder->IsJSObject()) { |
| 701 Isolate* isolate = heap->isolate(); | |
| 702 Context* native_context = isolate->context()->native_context(); | 705 Context* native_context = isolate->context()->native_context(); |
| 703 if (holder->IsNumber()) { | 706 if (holder->IsNumber()) { |
| 704 holder = native_context->number_function()->instance_prototype(); | 707 holder = native_context->number_function()->instance_prototype(); |
| 705 } else if (holder->IsString()) { | 708 } else if (holder->IsString()) { |
| 706 holder = native_context->string_function()->instance_prototype(); | 709 holder = native_context->string_function()->instance_prototype(); |
| 707 } else if (holder->IsBoolean()) { | 710 } else if (holder->IsBoolean()) { |
| 708 holder = native_context->boolean_function()->instance_prototype(); | 711 holder = native_context->boolean_function()->instance_prototype(); |
| 709 } else if (holder->IsJSProxy()) { | 712 } else if (holder->IsJSProxy()) { |
| 710 return JSProxy::cast(holder)->GetElementWithHandler(receiver, index); | 713 return JSProxy::cast(holder)->GetElementWithHandler(receiver, index); |
| 711 } else { | 714 } else { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 737 MaybeObject* result = js_object->GetElementsAccessor()->Get( | 740 MaybeObject* result = js_object->GetElementsAccessor()->Get( |
| 738 receiver, js_object, index); | 741 receiver, js_object, index); |
| 739 if (result != heap->the_hole_value()) return result; | 742 if (result != heap->the_hole_value()) return result; |
| 740 } | 743 } |
| 741 } | 744 } |
| 742 | 745 |
| 743 return heap->undefined_value(); | 746 return heap->undefined_value(); |
| 744 } | 747 } |
| 745 | 748 |
| 746 | 749 |
| 747 Object* Object::GetPrototype() { | 750 Object* Object::GetPrototype(Isolate* isolate) { |
| 748 if (IsSmi()) { | 751 if (IsSmi()) { |
| 749 Heap* heap = Isolate::Current()->heap(); | 752 Context* context = isolate->context()->native_context(); |
| 750 Context* context = heap->isolate()->context()->native_context(); | |
| 751 return context->number_function()->instance_prototype(); | 753 return context->number_function()->instance_prototype(); |
| 752 } | 754 } |
| 753 | 755 |
| 754 HeapObject* heap_object = HeapObject::cast(this); | 756 HeapObject* heap_object = HeapObject::cast(this); |
| 755 | 757 |
| 756 // The object is either a number, a string, a boolean, | 758 // The object is either a number, a string, a boolean, |
| 757 // a real JS object, or a Harmony proxy. | 759 // a real JS object, or a Harmony proxy. |
| 758 if (heap_object->IsJSReceiver()) { | 760 if (heap_object->IsJSReceiver()) { |
| 759 return heap_object->map()->prototype(); | 761 return heap_object->map()->prototype(); |
| 760 } | 762 } |
| 761 Heap* heap = heap_object->GetHeap(); | 763 Context* context = isolate->context()->native_context(); |
| 762 Context* context = heap->isolate()->context()->native_context(); | |
| 763 | 764 |
| 764 if (heap_object->IsHeapNumber()) { | 765 if (heap_object->IsHeapNumber()) { |
| 765 return context->number_function()->instance_prototype(); | 766 return context->number_function()->instance_prototype(); |
| 766 } | 767 } |
| 767 if (heap_object->IsString()) { | 768 if (heap_object->IsString()) { |
| 768 return context->string_function()->instance_prototype(); | 769 return context->string_function()->instance_prototype(); |
| 769 } | 770 } |
| 770 if (heap_object->IsBoolean()) { | 771 if (heap_object->IsBoolean()) { |
| 771 return context->boolean_function()->instance_prototype(); | 772 return context->boolean_function()->instance_prototype(); |
| 772 } else { | 773 } else { |
| 773 return heap->null_value(); | 774 return isolate->heap()->null_value(); |
| 774 } | 775 } |
| 775 } | 776 } |
| 776 | 777 |
| 777 | 778 |
| 778 MaybeObject* Object::GetHash(CreationFlag flag) { | 779 MaybeObject* Object::GetHash(CreationFlag flag) { |
| 779 // The object is either a number, a string, an odd-ball, | 780 // The object is either a number, a string, an odd-ball, |
| 780 // a real JS object, or a Harmony proxy. | 781 // a real JS object, or a Harmony proxy. |
| 781 if (IsNumber()) { | 782 if (IsNumber()) { |
| 782 uint32_t hash = ComputeLongHash(double_to_uint64(Number())); | 783 uint32_t hash = ComputeLongHash(double_to_uint64(Number())); |
| 783 return Smi::FromInt(hash & Smi::kMaxValue); | 784 return Smi::FromInt(hash & Smi::kMaxValue); |
| (...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2093 | 2094 |
| 2094 | 2095 |
| 2095 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes( | 2096 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes( |
| 2096 uint32_t index, | 2097 uint32_t index, |
| 2097 Object* value, | 2098 Object* value, |
| 2098 bool* found, | 2099 bool* found, |
| 2099 StrictModeFlag strict_mode) { | 2100 StrictModeFlag strict_mode) { |
| 2100 Heap* heap = GetHeap(); | 2101 Heap* heap = GetHeap(); |
| 2101 for (Object* pt = GetPrototype(); | 2102 for (Object* pt = GetPrototype(); |
| 2102 pt != heap->null_value(); | 2103 pt != heap->null_value(); |
| 2103 pt = pt->GetPrototype()) { | 2104 pt = pt->GetPrototype(GetIsolate())) { |
| 2104 if (pt->IsJSProxy()) { | 2105 if (pt->IsJSProxy()) { |
| 2105 String* name; | 2106 String* name; |
| 2106 MaybeObject* maybe = GetHeap()->Uint32ToString(index); | 2107 MaybeObject* maybe = heap->Uint32ToString(index); |
| 2107 if (!maybe->To<String>(&name)) { | 2108 if (!maybe->To<String>(&name)) { |
| 2108 *found = true; // Force abort | 2109 *found = true; // Force abort |
| 2109 return maybe; | 2110 return maybe; |
| 2110 } | 2111 } |
| 2111 return JSProxy::cast(pt)->SetPropertyViaPrototypesWithHandler( | 2112 return JSProxy::cast(pt)->SetPropertyViaPrototypesWithHandler( |
| 2112 this, name, value, NONE, strict_mode, found); | 2113 this, name, value, NONE, strict_mode, found); |
| 2113 } | 2114 } |
| 2114 if (!JSObject::cast(pt)->HasDictionaryElements()) { | 2115 if (!JSObject::cast(pt)->HasDictionaryElements()) { |
| 2115 continue; | 2116 continue; |
| 2116 } | 2117 } |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2496 void JSObject::LookupRealNamedProperty(String* name, LookupResult* result) { | 2497 void JSObject::LookupRealNamedProperty(String* name, LookupResult* result) { |
| 2497 LocalLookupRealNamedProperty(name, result); | 2498 LocalLookupRealNamedProperty(name, result); |
| 2498 if (result->IsFound()) return; | 2499 if (result->IsFound()) return; |
| 2499 | 2500 |
| 2500 LookupRealNamedPropertyInPrototypes(name, result); | 2501 LookupRealNamedPropertyInPrototypes(name, result); |
| 2501 } | 2502 } |
| 2502 | 2503 |
| 2503 | 2504 |
| 2504 void JSObject::LookupRealNamedPropertyInPrototypes(String* name, | 2505 void JSObject::LookupRealNamedPropertyInPrototypes(String* name, |
| 2505 LookupResult* result) { | 2506 LookupResult* result) { |
| 2506 Heap* heap = GetHeap(); | 2507 Isolate* isolate = GetIsolate(); |
| 2508 Heap* heap = isolate->heap(); |
| 2507 for (Object* pt = GetPrototype(); | 2509 for (Object* pt = GetPrototype(); |
| 2508 pt != heap->null_value(); | 2510 pt != heap->null_value(); |
| 2509 pt = pt->GetPrototype()) { | 2511 pt = pt->GetPrototype(isolate)) { |
| 2510 if (pt->IsJSProxy()) { | 2512 if (pt->IsJSProxy()) { |
| 2511 return result->HandlerResult(JSProxy::cast(pt)); | 2513 return result->HandlerResult(JSProxy::cast(pt)); |
| 2512 } | 2514 } |
| 2513 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); | 2515 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); |
| 2514 ASSERT(!(result->IsFound() && result->type() == INTERCEPTOR)); | 2516 ASSERT(!(result->IsFound() && result->type() == INTERCEPTOR)); |
| 2515 if (result->IsFound()) return; | 2517 if (result->IsFound()) return; |
| 2516 } | 2518 } |
| 2517 result->NotFound(); | 2519 result->NotFound(); |
| 2518 } | 2520 } |
| 2519 | 2521 |
| (...skipping 5622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8142 | 8144 |
| 8143 | 8145 |
| 8144 bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { | 8146 bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { |
| 8145 // Check the basic conditions for generating inline constructor code. | 8147 // Check the basic conditions for generating inline constructor code. |
| 8146 if (!FLAG_inline_new | 8148 if (!FLAG_inline_new |
| 8147 || !has_only_simple_this_property_assignments() | 8149 || !has_only_simple_this_property_assignments() |
| 8148 || this_property_assignments_count() == 0) { | 8150 || this_property_assignments_count() == 0) { |
| 8149 return false; | 8151 return false; |
| 8150 } | 8152 } |
| 8151 | 8153 |
| 8152 Heap* heap = GetHeap(); | 8154 Isolate* isolate = GetIsolate(); |
| 8155 Heap* heap = isolate->heap(); |
| 8153 | 8156 |
| 8154 // Traverse the proposed prototype chain looking for properties of the | 8157 // Traverse the proposed prototype chain looking for properties of the |
| 8155 // same names as are set by the inline constructor. | 8158 // same names as are set by the inline constructor. |
| 8156 for (Object* obj = prototype; | 8159 for (Object* obj = prototype; |
| 8157 obj != heap->null_value(); | 8160 obj != heap->null_value(); |
| 8158 obj = obj->GetPrototype()) { | 8161 obj = obj->GetPrototype(isolate)) { |
| 8159 JSReceiver* receiver = JSReceiver::cast(obj); | 8162 JSReceiver* receiver = JSReceiver::cast(obj); |
| 8160 for (int i = 0; i < this_property_assignments_count(); i++) { | 8163 for (int i = 0; i < this_property_assignments_count(); i++) { |
| 8161 LookupResult result(heap->isolate()); | 8164 LookupResult result(heap->isolate()); |
| 8162 String* name = GetThisPropertyAssignmentName(i); | 8165 String* name = GetThisPropertyAssignmentName(i); |
| 8163 receiver->LocalLookup(name, &result); | 8166 receiver->LocalLookup(name, &result); |
| 8164 if (result.IsFound()) { | 8167 if (result.IsFound()) { |
| 8165 switch (result.type()) { | 8168 switch (result.type()) { |
| 8166 case NORMAL: | 8169 case NORMAL: |
| 8167 case FIELD: | 8170 case FIELD: |
| 8168 case CONSTANT_FUNCTION: | 8171 case CONSTANT_FUNCTION: |
| (...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9604 Deoptimizer::DeoptimizeAllFunctionsWith(&filter); | 9607 Deoptimizer::DeoptimizeAllFunctionsWith(&filter); |
| 9605 } | 9608 } |
| 9606 | 9609 |
| 9607 | 9610 |
| 9608 MaybeObject* JSReceiver::SetPrototype(Object* value, | 9611 MaybeObject* JSReceiver::SetPrototype(Object* value, |
| 9609 bool skip_hidden_prototypes) { | 9612 bool skip_hidden_prototypes) { |
| 9610 #ifdef DEBUG | 9613 #ifdef DEBUG |
| 9611 int size = Size(); | 9614 int size = Size(); |
| 9612 #endif | 9615 #endif |
| 9613 | 9616 |
| 9614 Heap* heap = GetHeap(); | 9617 Isolate* isolate = GetIsolate(); |
| 9618 Heap* heap = isolate->heap(); |
| 9615 // Silently ignore the change if value is not a JSObject or null. | 9619 // Silently ignore the change if value is not a JSObject or null. |
| 9616 // SpiderMonkey behaves this way. | 9620 // SpiderMonkey behaves this way. |
| 9617 if (!value->IsJSReceiver() && !value->IsNull()) return value; | 9621 if (!value->IsJSReceiver() && !value->IsNull()) return value; |
| 9618 | 9622 |
| 9619 // From 8.6.2 Object Internal Methods | 9623 // From 8.6.2 Object Internal Methods |
| 9620 // ... | 9624 // ... |
| 9621 // In addition, if [[Extensible]] is false the value of the [[Class]] and | 9625 // In addition, if [[Extensible]] is false the value of the [[Class]] and |
| 9622 // [[Prototype]] internal properties of the object may not be modified. | 9626 // [[Prototype]] internal properties of the object may not be modified. |
| 9623 // ... | 9627 // ... |
| 9624 // Implementation specific extensions that modify [[Class]], [[Prototype]] | 9628 // Implementation specific extensions that modify [[Class]], [[Prototype]] |
| 9625 // or [[Extensible]] must not violate the invariants defined in the preceding | 9629 // or [[Extensible]] must not violate the invariants defined in the preceding |
| 9626 // paragraph. | 9630 // paragraph. |
| 9627 if (!this->map()->is_extensible()) { | 9631 if (!this->map()->is_extensible()) { |
| 9628 HandleScope scope(heap->isolate()); | 9632 HandleScope scope(isolate); |
| 9629 Handle<Object> handle(this, heap->isolate()); | 9633 Handle<Object> handle(this, isolate); |
| 9630 return heap->isolate()->Throw( | 9634 return isolate->Throw( |
| 9631 *FACTORY->NewTypeError("non_extensible_proto", | 9635 *isolate->factory()->NewTypeError("non_extensible_proto", |
| 9632 HandleVector<Object>(&handle, 1))); | 9636 HandleVector<Object>(&handle, 1))); |
| 9633 } | 9637 } |
| 9634 | 9638 |
| 9635 // Before we can set the prototype we need to be sure | 9639 // Before we can set the prototype we need to be sure |
| 9636 // prototype cycles are prevented. | 9640 // prototype cycles are prevented. |
| 9637 // It is sufficient to validate that the receiver is not in the new prototype | 9641 // It is sufficient to validate that the receiver is not in the new prototype |
| 9638 // chain. | 9642 // chain. |
| 9639 for (Object* pt = value; pt != heap->null_value(); pt = pt->GetPrototype()) { | 9643 for (Object* pt = value; |
| 9644 pt != heap->null_value(); |
| 9645 pt = pt->GetPrototype(isolate)) { |
| 9640 if (JSReceiver::cast(pt) == this) { | 9646 if (JSReceiver::cast(pt) == this) { |
| 9641 // Cycle detected. | 9647 // Cycle detected. |
| 9642 HandleScope scope(heap->isolate()); | 9648 HandleScope scope(isolate); |
| 9643 return heap->isolate()->Throw( | 9649 return isolate->Throw( |
| 9644 *FACTORY->NewError("cyclic_proto", HandleVector<Object>(NULL, 0))); | 9650 *FACTORY->NewError("cyclic_proto", HandleVector<Object>(NULL, 0))); |
| 9645 } | 9651 } |
| 9646 } | 9652 } |
| 9647 | 9653 |
| 9648 JSReceiver* real_receiver = this; | 9654 JSReceiver* real_receiver = this; |
| 9649 | 9655 |
| 9650 if (skip_hidden_prototypes) { | 9656 if (skip_hidden_prototypes) { |
| 9651 // Find the first object in the chain whose prototype object is not | 9657 // Find the first object in the chain whose prototype object is not |
| 9652 // hidden and set the new prototype on that object. | 9658 // hidden and set the new prototype on that object. |
| 9653 Object* current_proto = real_receiver->GetPrototype(); | 9659 Object* current_proto = real_receiver->GetPrototype(); |
| 9654 while (current_proto->IsJSObject() && | 9660 while (current_proto->IsJSObject() && |
| 9655 JSReceiver::cast(current_proto)->map()->is_hidden_prototype()) { | 9661 JSReceiver::cast(current_proto)->map()->is_hidden_prototype()) { |
| 9656 real_receiver = JSReceiver::cast(current_proto); | 9662 real_receiver = JSReceiver::cast(current_proto); |
| 9657 current_proto = current_proto->GetPrototype(); | 9663 current_proto = current_proto->GetPrototype(isolate); |
| 9658 } | 9664 } |
| 9659 } | 9665 } |
| 9660 | 9666 |
| 9661 // Set the new prototype of the object. | 9667 // Set the new prototype of the object. |
| 9662 Map* map = real_receiver->map(); | 9668 Map* map = real_receiver->map(); |
| 9663 | 9669 |
| 9664 // Nothing to do if prototype is already set. | 9670 // Nothing to do if prototype is already set. |
| 9665 if (map->prototype() == value) return value; | 9671 if (map->prototype() == value) return value; |
| 9666 | 9672 |
| 9667 if (value->IsJSObject()) { | 9673 if (value->IsJSObject()) { |
| (...skipping 4313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13981 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13987 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13982 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13988 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13983 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13989 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13984 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13990 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13985 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13991 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13986 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13992 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13987 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13993 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13988 } | 13994 } |
| 13989 | 13995 |
| 13990 } } // namespace v8::internal | 13996 } } // namespace v8::internal |
| OLD | NEW |