OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 1832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1843 // If the constructor is not present, return "Object". | 1843 // If the constructor is not present, return "Object". |
1844 return GetHeap()->Object_string(); | 1844 return GetHeap()->Object_string(); |
1845 } | 1845 } |
1846 | 1846 |
1847 | 1847 |
1848 String* JSReceiver::constructor_name() { | 1848 String* JSReceiver::constructor_name() { |
1849 return map()->constructor_name(); | 1849 return map()->constructor_name(); |
1850 } | 1850 } |
1851 | 1851 |
1852 | 1852 |
1853 Handle<Object> JSObject::AddFastPropertyUsingMap( | 1853 // TODO(mstarzinger): Temporary wrapper until handlified. |
1854 Handle<JSObject> object, | 1854 static Handle<Object> NewStorageFor(Isolate* isolate, |
1855 Handle<Map> new_map, | 1855 Handle<Object> object, |
1856 Handle<Name> name, | 1856 Representation representation) { |
1857 Handle<Object> value, | 1857 Heap* heap = isolate->heap(); |
1858 int field_index, | 1858 CALL_HEAP_FUNCTION(isolate, |
1859 Representation representation) { | 1859 object->AllocateNewStorageFor(heap, representation), |
1860 CALL_HEAP_FUNCTION(object->GetIsolate(), | |
1861 object->AddFastPropertyUsingMap( | |
1862 *new_map, *name, *value, field_index, representation), | |
1863 Object); | 1860 Object); |
1864 } | 1861 } |
1865 | 1862 |
1866 | 1863 |
1867 MaybeObject* JSObject::AddFastPropertyUsingMap(Map* new_map, | 1864 void JSObject::AddFastPropertyUsingMap(Handle<JSObject> object, |
1868 Name* name, | 1865 Handle<Map> new_map, |
1869 Object* value, | 1866 Handle<Name> name, |
1870 int field_index, | 1867 Handle<Object> value, |
1871 Representation representation) { | 1868 int field_index, |
| 1869 Representation representation) { |
| 1870 Isolate* isolate = object->GetIsolate(); |
| 1871 |
1872 // This method is used to transition to a field. If we are transitioning to a | 1872 // This method is used to transition to a field. If we are transitioning to a |
1873 // double field, allocate new storage. | 1873 // double field, allocate new storage. |
1874 Object* storage; | 1874 Handle<Object> storage = NewStorageFor(isolate, value, representation); |
1875 MaybeObject* maybe_storage = | |
1876 value->AllocateNewStorageFor(GetHeap(), representation); | |
1877 if (!maybe_storage->To(&storage)) return maybe_storage; | |
1878 | 1875 |
1879 if (map()->unused_property_fields() == 0) { | 1876 if (object->map()->unused_property_fields() == 0) { |
1880 int new_unused = new_map->unused_property_fields(); | 1877 int new_unused = new_map->unused_property_fields(); |
1881 FixedArray* values; | 1878 Handle<FixedArray> properties(object->properties()); |
1882 MaybeObject* maybe_values = | 1879 Handle<FixedArray> values = isolate->factory()->CopySizeFixedArray( |
1883 properties()->CopySize(properties()->length() + new_unused + 1); | 1880 properties, properties->length() + new_unused + 1); |
1884 if (!maybe_values->To(&values)) return maybe_values; | 1881 object->set_properties(*values); |
1885 | |
1886 set_properties(values); | |
1887 } | 1882 } |
1888 | 1883 |
1889 set_map(new_map); | 1884 object->set_map(*new_map); |
1890 | 1885 object->FastPropertyAtPut(field_index, *storage); |
1891 FastPropertyAtPut(field_index, storage); | |
1892 return value; | |
1893 } | 1886 } |
1894 | 1887 |
1895 | 1888 |
1896 static MaybeObject* CopyAddFieldDescriptor(Map* map, | 1889 static MaybeObject* CopyAddFieldDescriptor(Map* map, |
1897 Name* name, | 1890 Name* name, |
1898 int index, | 1891 int index, |
1899 PropertyAttributes attributes, | 1892 PropertyAttributes attributes, |
1900 Representation representation, | 1893 Representation representation, |
1901 TransitionFlag flag) { | 1894 TransitionFlag flag) { |
1902 Map* new_map; | 1895 Map* new_map; |
(...skipping 1881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3784 descriptor, value->OptimalRepresentation(), FORCE_FIELD); | 3777 descriptor, value->OptimalRepresentation(), FORCE_FIELD); |
3785 Object* back = transition_map->GetBackPointer(); | 3778 Object* back = transition_map->GetBackPointer(); |
3786 if (back->IsMap()) { | 3779 if (back->IsMap()) { |
3787 MigrateToMap(object, handle(Map::cast(back))); | 3780 MigrateToMap(object, handle(Map::cast(back))); |
3788 } | 3781 } |
3789 descriptors = transition_map->instance_descriptors(); | 3782 descriptors = transition_map->instance_descriptors(); |
3790 representation = descriptors->GetDetails(descriptor).representation(); | 3783 representation = descriptors->GetDetails(descriptor).representation(); |
3791 } | 3784 } |
3792 | 3785 |
3793 int field_index = descriptors->GetFieldIndex(descriptor); | 3786 int field_index = descriptors->GetFieldIndex(descriptor); |
3794 return AddFastPropertyUsingMap( | 3787 AddFastPropertyUsingMap( |
3795 object, transition_map, name, value, field_index, representation); | 3788 object, transition_map, name, value, field_index, representation); |
| 3789 return value; |
3796 } | 3790 } |
3797 | 3791 |
3798 | 3792 |
3799 static void SetPropertyToField(LookupResult* lookup, | 3793 static void SetPropertyToField(LookupResult* lookup, |
3800 Handle<Name> name, | 3794 Handle<Name> name, |
3801 Handle<Object> value) { | 3795 Handle<Object> value) { |
3802 Representation representation = lookup->representation(); | 3796 Representation representation = lookup->representation(); |
3803 if (!value->FitsRepresentation(representation) || | 3797 if (!value->FitsRepresentation(representation) || |
3804 lookup->type() == CONSTANT) { | 3798 lookup->type() == CONSTANT) { |
3805 JSObject::GeneralizeFieldRepresentation(handle(lookup->holder()), | 3799 JSObject::GeneralizeFieldRepresentation(handle(lookup->holder()), |
(...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5564 MaybeObject* maybe_copy = map()->Copy(); | 5558 MaybeObject* maybe_copy = map()->Copy(); |
5565 if (!maybe_copy->To(&new_map)) return maybe_copy; | 5559 if (!maybe_copy->To(&new_map)) return maybe_copy; |
5566 new_map->set_is_observed(true); | 5560 new_map->set_is_observed(true); |
5567 } | 5561 } |
5568 set_map(new_map); | 5562 set_map(new_map); |
5569 | 5563 |
5570 return heap->undefined_value(); | 5564 return heap->undefined_value(); |
5571 } | 5565 } |
5572 | 5566 |
5573 | 5567 |
5574 // TODO(mstarzinger): Temporary wrapper until handlified. | |
5575 static Handle<Object> NewStorageFor(Isolate* isolate, | |
5576 Handle<Object> object, | |
5577 Representation representation) { | |
5578 Heap* heap = isolate->heap(); | |
5579 CALL_HEAP_FUNCTION(isolate, | |
5580 object->AllocateNewStorageFor(heap, representation), | |
5581 Object); | |
5582 } | |
5583 | |
5584 | |
5585 Handle<JSObject> JSObject::Copy(Handle<JSObject> object) { | 5568 Handle<JSObject> JSObject::Copy(Handle<JSObject> object) { |
5586 Isolate* isolate = object->GetIsolate(); | 5569 Isolate* isolate = object->GetIsolate(); |
5587 CALL_HEAP_FUNCTION(isolate, | 5570 CALL_HEAP_FUNCTION(isolate, |
5588 isolate->heap()->CopyJSObject(*object), JSObject); | 5571 isolate->heap()->CopyJSObject(*object), JSObject); |
5589 } | 5572 } |
5590 | 5573 |
5591 | 5574 |
5592 Handle<JSObject> JSObject::DeepCopy(Handle<JSObject> object) { | 5575 Handle<JSObject> JSObject::DeepCopy(Handle<JSObject> object) { |
5593 Isolate* isolate = object->GetIsolate(); | 5576 Isolate* isolate = object->GetIsolate(); |
5594 StackLimitCheck check(isolate); | 5577 StackLimitCheck check(isolate); |
(...skipping 10518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16113 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16096 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16114 static const char* error_messages_[] = { | 16097 static const char* error_messages_[] = { |
16115 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16098 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16116 }; | 16099 }; |
16117 #undef ERROR_MESSAGES_TEXTS | 16100 #undef ERROR_MESSAGES_TEXTS |
16118 return error_messages_[reason]; | 16101 return error_messages_[reason]; |
16119 } | 16102 } |
16120 | 16103 |
16121 | 16104 |
16122 } } // namespace v8::internal | 16105 } } // namespace v8::internal |
OLD | NEW |