| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 11886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11897 return true; | 11897 return true; |
| 11898 } | 11898 } |
| 11899 | 11899 |
| 11900 | 11900 |
| 11901 bool Map::EquivalentToForNormalization(Map* other, | 11901 bool Map::EquivalentToForNormalization(Map* other, |
| 11902 PropertyNormalizationMode mode) { | 11902 PropertyNormalizationMode mode) { |
| 11903 int properties = | 11903 int properties = |
| 11904 mode == CLEAR_INOBJECT_PROPERTIES ? 0 : other->GetInObjectProperties(); | 11904 mode == CLEAR_INOBJECT_PROPERTIES ? 0 : other->GetInObjectProperties(); |
| 11905 return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() && | 11905 return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() && |
| 11906 GetInObjectProperties() == properties && | 11906 GetInObjectProperties() == properties && |
| 11907 JSObject::GetInternalFieldCount(this) == | 11907 JSObject::GetEmbedderFieldCount(this) == |
| 11908 JSObject::GetInternalFieldCount(other); | 11908 JSObject::GetEmbedderFieldCount(other); |
| 11909 } | 11909 } |
| 11910 | 11910 |
| 11911 | 11911 |
| 11912 bool JSFunction::Inlines(SharedFunctionInfo* candidate) { | 11912 bool JSFunction::Inlines(SharedFunctionInfo* candidate) { |
| 11913 DisallowHeapAllocation no_gc; | 11913 DisallowHeapAllocation no_gc; |
| 11914 if (shared() == candidate) return true; | 11914 if (shared() == candidate) return true; |
| 11915 if (code()->kind() != Code::OPTIMIZED_FUNCTION) return false; | 11915 if (code()->kind() != Code::OPTIMIZED_FUNCTION) return false; |
| 11916 DeoptimizationInputData* const data = | 11916 DeoptimizationInputData* const data = |
| 11917 DeoptimizationInputData::cast(code()->deoptimization_data()); | 11917 DeoptimizationInputData::cast(code()->deoptimization_data()); |
| 11918 if (data->length() == 0) return false; | 11918 if (data->length() == 0) return false; |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12771 | 12771 |
| 12772 // Create a new map with the size and number of in-object properties | 12772 // Create a new map with the size and number of in-object properties |
| 12773 // suggested by |function|. | 12773 // suggested by |function|. |
| 12774 | 12774 |
| 12775 // Link initial map and constructor function if the new.target is actually a | 12775 // Link initial map and constructor function if the new.target is actually a |
| 12776 // subclass constructor. | 12776 // subclass constructor. |
| 12777 if (IsDerivedConstructor(function->shared()->kind())) { | 12777 if (IsDerivedConstructor(function->shared()->kind())) { |
| 12778 Handle<Object> prototype(function->instance_prototype(), isolate); | 12778 Handle<Object> prototype(function->instance_prototype(), isolate); |
| 12779 InstanceType instance_type = constructor_initial_map->instance_type(); | 12779 InstanceType instance_type = constructor_initial_map->instance_type(); |
| 12780 DCHECK(CanSubclassHaveInobjectProperties(instance_type)); | 12780 DCHECK(CanSubclassHaveInobjectProperties(instance_type)); |
| 12781 int internal_fields = | 12781 int embedder_fields = |
| 12782 JSObject::GetInternalFieldCount(*constructor_initial_map); | 12782 JSObject::GetEmbedderFieldCount(*constructor_initial_map); |
| 12783 int pre_allocated = constructor_initial_map->GetInObjectProperties() - | 12783 int pre_allocated = constructor_initial_map->GetInObjectProperties() - |
| 12784 constructor_initial_map->unused_property_fields(); | 12784 constructor_initial_map->unused_property_fields(); |
| 12785 int instance_size; | 12785 int instance_size; |
| 12786 int in_object_properties; | 12786 int in_object_properties; |
| 12787 function->CalculateInstanceSizeForDerivedClass( | 12787 function->CalculateInstanceSizeForDerivedClass( |
| 12788 instance_type, internal_fields, &instance_size, | 12788 instance_type, embedder_fields, &instance_size, |
| 12789 &in_object_properties); | 12789 &in_object_properties); |
| 12790 | 12790 |
| 12791 int unused_property_fields = in_object_properties - pre_allocated; | 12791 int unused_property_fields = in_object_properties - pre_allocated; |
| 12792 Handle<Map> map = | 12792 Handle<Map> map = |
| 12793 Map::CopyInitialMap(constructor_initial_map, instance_size, | 12793 Map::CopyInitialMap(constructor_initial_map, instance_size, |
| 12794 in_object_properties, unused_property_fields); | 12794 in_object_properties, unused_property_fields); |
| 12795 map->set_new_target_is_base(false); | 12795 map->set_new_target_is_base(false); |
| 12796 | 12796 |
| 12797 JSFunction::SetInitialMap(function, map, prototype); | 12797 JSFunction::SetInitialMap(function, map, prototype); |
| 12798 map->SetConstructor(*constructor); | 12798 map->SetConstructor(*constructor); |
| (...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13435 if (!script()->IsScript()) return false; | 13435 if (!script()->IsScript()) return false; |
| 13436 return !optimization_disabled(); | 13436 return !optimization_disabled(); |
| 13437 } | 13437 } |
| 13438 | 13438 |
| 13439 | 13439 |
| 13440 int SharedFunctionInfo::SourceSize() { | 13440 int SharedFunctionInfo::SourceSize() { |
| 13441 return end_position() - start_position(); | 13441 return end_position() - start_position(); |
| 13442 } | 13442 } |
| 13443 | 13443 |
| 13444 void JSFunction::CalculateInstanceSizeHelper(InstanceType instance_type, | 13444 void JSFunction::CalculateInstanceSizeHelper(InstanceType instance_type, |
| 13445 int requested_internal_fields, | 13445 int requested_embedder_fields, |
| 13446 int requested_in_object_properties, | 13446 int requested_in_object_properties, |
| 13447 int* instance_size, | 13447 int* instance_size, |
| 13448 int* in_object_properties) { | 13448 int* in_object_properties) { |
| 13449 int header_size = JSObject::GetHeaderSize(instance_type); | 13449 int header_size = JSObject::GetHeaderSize(instance_type); |
| 13450 DCHECK_LE(requested_internal_fields, | 13450 DCHECK_LE(requested_embedder_fields, |
| 13451 (JSObject::kMaxInstanceSize - header_size) >> kPointerSizeLog2); | 13451 (JSObject::kMaxInstanceSize - header_size) >> kPointerSizeLog2); |
| 13452 *instance_size = | 13452 *instance_size = |
| 13453 Min(header_size + | 13453 Min(header_size + |
| 13454 ((requested_internal_fields + requested_in_object_properties) | 13454 ((requested_embedder_fields + requested_in_object_properties) |
| 13455 << kPointerSizeLog2), | 13455 << kPointerSizeLog2), |
| 13456 JSObject::kMaxInstanceSize); | 13456 JSObject::kMaxInstanceSize); |
| 13457 *in_object_properties = ((*instance_size - header_size) >> kPointerSizeLog2) - | 13457 *in_object_properties = ((*instance_size - header_size) >> kPointerSizeLog2) - |
| 13458 requested_internal_fields; | 13458 requested_embedder_fields; |
| 13459 } | 13459 } |
| 13460 | 13460 |
| 13461 | |
| 13462 void JSFunction::CalculateInstanceSize(InstanceType instance_type, | 13461 void JSFunction::CalculateInstanceSize(InstanceType instance_type, |
| 13463 int requested_internal_fields, | 13462 int requested_embedder_fields, |
| 13464 int* instance_size, | 13463 int* instance_size, |
| 13465 int* in_object_properties) { | 13464 int* in_object_properties) { |
| 13466 CalculateInstanceSizeHelper(instance_type, requested_internal_fields, | 13465 CalculateInstanceSizeHelper(instance_type, requested_embedder_fields, |
| 13467 shared()->expected_nof_properties(), | 13466 shared()->expected_nof_properties(), |
| 13468 instance_size, in_object_properties); | 13467 instance_size, in_object_properties); |
| 13469 } | 13468 } |
| 13470 | 13469 |
| 13471 | |
| 13472 void JSFunction::CalculateInstanceSizeForDerivedClass( | 13470 void JSFunction::CalculateInstanceSizeForDerivedClass( |
| 13473 InstanceType instance_type, int requested_internal_fields, | 13471 InstanceType instance_type, int requested_embedder_fields, |
| 13474 int* instance_size, int* in_object_properties) { | 13472 int* instance_size, int* in_object_properties) { |
| 13475 Isolate* isolate = GetIsolate(); | 13473 Isolate* isolate = GetIsolate(); |
| 13476 int expected_nof_properties = 0; | 13474 int expected_nof_properties = 0; |
| 13477 for (PrototypeIterator iter(isolate, this, kStartAtReceiver); !iter.IsAtEnd(); | 13475 for (PrototypeIterator iter(isolate, this, kStartAtReceiver); !iter.IsAtEnd(); |
| 13478 iter.Advance()) { | 13476 iter.Advance()) { |
| 13479 JSReceiver* current = iter.GetCurrent<JSReceiver>(); | 13477 JSReceiver* current = iter.GetCurrent<JSReceiver>(); |
| 13480 if (!current->IsJSFunction()) break; | 13478 if (!current->IsJSFunction()) break; |
| 13481 JSFunction* func = JSFunction::cast(current); | 13479 JSFunction* func = JSFunction::cast(current); |
| 13482 SharedFunctionInfo* shared = func->shared(); | 13480 SharedFunctionInfo* shared = func->shared(); |
| 13483 expected_nof_properties += shared->expected_nof_properties(); | 13481 expected_nof_properties += shared->expected_nof_properties(); |
| 13484 if (!IsDerivedConstructor(shared->kind())) { | 13482 if (!IsDerivedConstructor(shared->kind())) { |
| 13485 break; | 13483 break; |
| 13486 } | 13484 } |
| 13487 } | 13485 } |
| 13488 CalculateInstanceSizeHelper(instance_type, requested_internal_fields, | 13486 CalculateInstanceSizeHelper(instance_type, requested_embedder_fields, |
| 13489 expected_nof_properties, instance_size, | 13487 expected_nof_properties, instance_size, |
| 13490 in_object_properties); | 13488 in_object_properties); |
| 13491 } | 13489 } |
| 13492 | 13490 |
| 13493 | 13491 |
| 13494 // Output the source code without any allocation in the heap. | 13492 // Output the source code without any allocation in the heap. |
| 13495 std::ostream& operator<<(std::ostream& os, const SourceCodeOf& v) { | 13493 std::ostream& operator<<(std::ostream& os, const SourceCodeOf& v) { |
| 13496 const SharedFunctionInfo* s = v.value; | 13494 const SharedFunctionInfo* s = v.value; |
| 13497 // For some native functions there is no source. | 13495 // For some native functions there is no source. |
| 13498 if (!s->HasSourceCode()) return os << "<No Source>"; | 13496 if (!s->HasSourceCode()) return os << "<No Source>"; |
| (...skipping 5780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19279 Isolate* const isolate = GetIsolate(); | 19277 Isolate* const isolate = GetIsolate(); |
| 19280 if (isolate->IsArrayBufferNeuteringIntact()) { | 19278 if (isolate->IsArrayBufferNeuteringIntact()) { |
| 19281 isolate->InvalidateArrayBufferNeuteringProtector(); | 19279 isolate->InvalidateArrayBufferNeuteringProtector(); |
| 19282 } | 19280 } |
| 19283 } | 19281 } |
| 19284 | 19282 |
| 19285 | 19283 |
| 19286 void JSArrayBuffer::Setup(Handle<JSArrayBuffer> array_buffer, Isolate* isolate, | 19284 void JSArrayBuffer::Setup(Handle<JSArrayBuffer> array_buffer, Isolate* isolate, |
| 19287 bool is_external, void* data, size_t allocated_length, | 19285 bool is_external, void* data, size_t allocated_length, |
| 19288 SharedFlag shared) { | 19286 SharedFlag shared) { |
| 19289 DCHECK(array_buffer->GetInternalFieldCount() == | 19287 DCHECK(array_buffer->GetEmbedderFieldCount() == |
| 19290 v8::ArrayBuffer::kInternalFieldCount); | 19288 v8::ArrayBuffer::kEmbedderFieldCount); |
| 19291 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { | 19289 for (int i = 0; i < v8::ArrayBuffer::kEmbedderFieldCount; i++) { |
| 19292 array_buffer->SetInternalField(i, Smi::kZero); | 19290 array_buffer->SetEmbedderField(i, Smi::kZero); |
| 19293 } | 19291 } |
| 19294 array_buffer->set_bit_field(0); | 19292 array_buffer->set_bit_field(0); |
| 19295 array_buffer->set_is_external(is_external); | 19293 array_buffer->set_is_external(is_external); |
| 19296 array_buffer->set_is_neuterable(shared == SharedFlag::kNotShared); | 19294 array_buffer->set_is_neuterable(shared == SharedFlag::kNotShared); |
| 19297 array_buffer->set_is_shared(shared == SharedFlag::kShared); | 19295 array_buffer->set_is_shared(shared == SharedFlag::kShared); |
| 19298 | 19296 |
| 19299 Handle<Object> byte_length = | 19297 Handle<Object> byte_length = |
| 19300 isolate->factory()->NewNumberFromSize(allocated_length); | 19298 isolate->factory()->NewNumberFromSize(allocated_length); |
| 19301 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); | 19299 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); |
| 19302 array_buffer->set_byte_length(*byte_length); | 19300 array_buffer->set_byte_length(*byte_length); |
| (...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20242 // depend on this. | 20240 // depend on this. |
| 20243 return DICTIONARY_ELEMENTS; | 20241 return DICTIONARY_ELEMENTS; |
| 20244 } | 20242 } |
| 20245 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20243 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
| 20246 return kind; | 20244 return kind; |
| 20247 } | 20245 } |
| 20248 } | 20246 } |
| 20249 | 20247 |
| 20250 } // namespace internal | 20248 } // namespace internal |
| 20251 } // namespace v8 | 20249 } // namespace v8 |
| OLD | NEW |