Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Unified Diff: src/objects.cc

Issue 1276533003: [runtime] Store constructor function index on primitive maps. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix arm failures Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 36b43ccbceb3b3503aaded872741a38707ad7b6a..4bcca545c855321043366619b3fb62bcaed98d0e 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -73,34 +73,17 @@ MaybeHandle<JSReceiver> Object::ToObject(Isolate* isolate,
Handle<Context> native_context) {
if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object);
Handle<JSFunction> constructor;
- if (object->IsNumber()) {
+ if (object->IsSmi()) {
constructor = handle(native_context->number_function(), isolate);
- } else if (object->IsBoolean()) {
- constructor = handle(native_context->boolean_function(), isolate);
- } else if (object->IsString()) {
- constructor = handle(native_context->string_function(), isolate);
- } else if (object->IsSymbol()) {
- constructor = handle(native_context->symbol_function(), isolate);
- } else if (object->IsSimd128Value()) {
- if (object->IsFloat32x4()) {
- constructor = handle(native_context->float32x4_function(), isolate);
- } else if (object->IsInt32x4()) {
- constructor = handle(native_context->int32x4_function(), isolate);
- } else if (object->IsBool32x4()) {
- constructor = handle(native_context->bool32x4_function(), isolate);
- } else if (object->IsInt16x8()) {
- constructor = handle(native_context->int16x8_function(), isolate);
- } else if (object->IsBool16x8()) {
- constructor = handle(native_context->bool16x8_function(), isolate);
- } else if (object->IsInt8x16()) {
- constructor = handle(native_context->int8x16_function(), isolate);
- } else if (object->IsBool8x16()) {
- constructor = handle(native_context->bool8x16_function(), isolate);
- } else {
- UNREACHABLE();
- }
} else {
- return MaybeHandle<JSReceiver>();
+ int constructor_function_index =
+ Handle<HeapObject>::cast(object)->map()->GetConstructorFunctionIndex();
+ if (constructor_function_index == Map::kNoConstructorFunctionIndex) {
+ return MaybeHandle<JSReceiver>();
+ }
+ constructor = handle(
+ JSFunction::cast(native_context->get(constructor_function_index)),
+ isolate);
}
Handle<JSObject> result = isolate->factory()->NewJSObject(constructor);
Handle<JSValue>::cast(result)->set_value(*object);
@@ -619,49 +602,23 @@ void JSObject::SetNormalizedProperty(Handle<JSObject> object,
Map* Object::GetRootMap(Isolate* isolate) {
DisallowHeapAllocation no_alloc;
if (IsSmi()) {
- Context* context = isolate->context()->native_context();
- return context->number_function()->initial_map();
+ Context* native_context = isolate->context()->native_context();
+ return native_context->number_function()->initial_map();
}
- HeapObject* heap_object = HeapObject::cast(this);
-
// The object is either a number, a string, a symbol, a boolean, a SIMD value,
// a real JS object, or a Harmony proxy.
+ HeapObject* heap_object = HeapObject::cast(this);
if (heap_object->IsJSReceiver()) {
return heap_object->map();
}
- Context* context = isolate->context()->native_context();
-
- if (heap_object->IsHeapNumber()) {
- return context->number_function()->initial_map();
- }
- if (heap_object->IsString()) {
- return context->string_function()->initial_map();
- }
- if (heap_object->IsSymbol()) {
- return context->symbol_function()->initial_map();
- }
- if (heap_object->IsBoolean()) {
- return context->boolean_function()->initial_map();
- }
- if (heap_object->IsSimd128Value()) {
- if (heap_object->IsFloat32x4()) {
- return context->float32x4_function()->initial_map();
- } else if (heap_object->IsInt32x4()) {
- return context->int32x4_function()->initial_map();
- } else if (heap_object->IsBool32x4()) {
- return context->bool32x4_function()->initial_map();
- } else if (heap_object->IsInt16x8()) {
- return context->int16x8_function()->initial_map();
- } else if (heap_object->IsBool16x8()) {
- return context->bool16x8_function()->initial_map();
- } else if (heap_object->IsInt8x16()) {
- return context->int8x16_function()->initial_map();
- } else if (heap_object->IsBool8x16()) {
- return context->bool8x16_function()->initial_map();
- } else {
- UNREACHABLE();
- }
+ int constructor_function_index =
+ heap_object->map()->GetConstructorFunctionIndex();
+ if (constructor_function_index != Map::kNoConstructorFunctionIndex) {
+ Context* native_context = isolate->context()->native_context();
+ JSFunction* constructor_function =
+ JSFunction::cast(native_context->get(constructor_function_index));
+ return constructor_function->initial_map();
}
return isolate->heap()->null_value()->map();
}
@@ -1864,11 +1821,11 @@ bool Map::InstancesNeedRewriting(Map* target, int target_number_of_fields,
// If no fields were added, and no inobject properties were removed, setting
// the map is sufficient.
- if (target_inobject == inobject_properties()) return false;
+ if (target_inobject == GetInObjectProperties()) return false;
// In-object slack tracking may have reduced the object size of the new map.
// In that case, succeed if all existing fields were inobject, and they still
// fit within the new inobject size.
- DCHECK(target_inobject < inobject_properties());
+ DCHECK(target_inobject < GetInObjectProperties());
if (target_number_of_fields <= target_inobject) {
DCHECK(target_number_of_fields + target_unused == target_inobject);
return false;
@@ -1975,7 +1932,7 @@ void JSObject::MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map) {
Handle<Map> old_map(object->map());
int old_number_of_fields;
int number_of_fields = new_map->NumberOfFields();
- int inobject = new_map->inobject_properties();
+ int inobject = new_map->GetInObjectProperties();
int unused = new_map->unused_property_fields();
// Nothing to do if no functions were converted to fields and no smis were
@@ -4182,7 +4139,8 @@ MaybeHandle<Object> JSProxy::CallTrap(Handle<JSProxy> proxy,
void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map) {
- DCHECK(object->map()->inobject_properties() == map->inobject_properties());
+ DCHECK(object->map()->GetInObjectProperties() ==
+ map->GetInObjectProperties());
ElementsKind obj_kind = object->map()->elements_kind();
ElementsKind map_kind = map->elements_kind();
if (map_kind != obj_kind) {
@@ -4694,7 +4652,7 @@ void JSObject::MigrateFastToSlow(Handle<JSObject> object,
// Ensure that in-object space of slow-mode object does not contain random
// garbage.
- int inobject_properties = new_map->inobject_properties();
+ int inobject_properties = new_map->GetInObjectProperties();
for (int i = 0; i < inobject_properties; i++) {
FieldIndex index = FieldIndex::ForPropertyIndex(*new_map, i);
object->RawFastPropertyAtPut(index, Smi::FromInt(0));
@@ -4751,7 +4709,7 @@ void JSObject::MigrateSlowToFast(Handle<JSObject> object,
Handle<Map> old_map(object->map(), isolate);
- int inobject_props = old_map->inobject_properties();
+ int inobject_props = old_map->GetInObjectProperties();
// Allocate new map.
Handle<Map> new_map = Map::CopyDropDescriptors(old_map);
@@ -6639,13 +6597,13 @@ Handle<Map> Map::CopyNormalized(Handle<Map> map,
PropertyNormalizationMode mode) {
int new_instance_size = map->instance_size();
if (mode == CLEAR_INOBJECT_PROPERTIES) {
- new_instance_size -= map->inobject_properties() * kPointerSize;
+ new_instance_size -= map->GetInObjectProperties() * kPointerSize;
}
Handle<Map> result = RawCopy(map, new_instance_size);
if (mode != CLEAR_INOBJECT_PROPERTIES) {
- result->set_inobject_properties(map->inobject_properties());
+ result->SetInObjectProperties(map->GetInObjectProperties());
}
result->set_dictionary_map(true);
@@ -6663,7 +6621,7 @@ Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) {
Handle<Map> result = RawCopy(map, map->instance_size());
// Please note instance_type and instance_size are set when allocated.
- result->set_inobject_properties(map->inobject_properties());
+ result->SetInObjectProperties(map->GetInObjectProperties());
result->set_unused_property_fields(map->unused_property_fields());
result->ClearCodeCache(map->GetHeap());
@@ -6975,7 +6933,7 @@ Handle<Map> Map::Create(Isolate* isolate, int inobject_properties) {
JSObject::kHeaderSize + kPointerSize * inobject_properties;
// Adjust the map with the extra inobject properties.
- copy->set_inobject_properties(inobject_properties);
+ copy->SetInObjectProperties(inobject_properties);
copy->set_unused_property_fields(inobject_properties);
copy->set_instance_size(new_instance_size);
copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy));
@@ -9369,10 +9327,10 @@ bool Map::EquivalentToForTransition(Map* other) {
bool Map::EquivalentToForNormalization(Map* other,
PropertyNormalizationMode mode) {
- int properties = mode == CLEAR_INOBJECT_PROPERTIES
- ? 0 : other->inobject_properties();
+ int properties =
+ mode == CLEAR_INOBJECT_PROPERTIES ? 0 : other->GetInObjectProperties();
return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() &&
- inobject_properties() == properties;
+ GetInObjectProperties() == properties;
}
@@ -9630,7 +9588,7 @@ static void GetMinInobjectSlack(Map* map, void* data) {
static void ShrinkInstanceSize(Map* map, void* data) {
int slack = *reinterpret_cast<int*>(data);
- map->set_inobject_properties(map->inobject_properties() - slack);
+ map->SetInObjectProperties(map->GetInObjectProperties() - slack);
map->set_unused_property_fields(map->unused_property_fields() - slack);
map->set_instance_size(map->instance_size() - slack * kPointerSize);
@@ -10112,7 +10070,7 @@ void JSFunction::EnsureHasInitialMap(Handle<JSFunction> function) {
} else {
prototype = isolate->factory()->NewFunctionPrototype(function);
}
- map->set_inobject_properties(in_object_properties);
+ map->SetInObjectProperties(in_object_properties);
map->set_unused_property_fields(in_object_properties);
DCHECK(map->has_fast_object_elements());
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698