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

Side by Side Diff: src/objects.cc

Issue 1448313002: Prepare to enable in-object properties in subclasses on a case by case basis. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@bytecode-array-sizeof-fix
Patch Set: Addressing comments Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « src/heap/objects-visiting.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <sstream> 9 #include <sstream>
10 10
(...skipping 11878 matching lines...) Expand 10 before | Expand all | Expand 10 after
11889 #if TRACE_MAPS 11889 #if TRACE_MAPS
11890 if (FLAG_trace_maps) { 11890 if (FLAG_trace_maps) {
11891 PrintF("[TraceMaps: InitialMap map= %p SFI= %d_%s ]\n", 11891 PrintF("[TraceMaps: InitialMap map= %p SFI= %d_%s ]\n",
11892 reinterpret_cast<void*>(*map), function->shared()->unique_id(), 11892 reinterpret_cast<void*>(*map), function->shared()->unique_id(),
11893 function->shared()->DebugName()->ToCString().get()); 11893 function->shared()->DebugName()->ToCString().get());
11894 } 11894 }
11895 #endif 11895 #endif
11896 } 11896 }
11897 11897
11898 11898
11899 namespace {
11900
11901 bool CanSubclassHaveInobjectProperties(InstanceType instance_type) {
11902 switch (instance_type) {
11903 case JS_OBJECT_TYPE:
11904 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
11905 case JS_GENERATOR_OBJECT_TYPE:
11906 case JS_MODULE_TYPE:
11907 case JS_VALUE_TYPE:
11908 case JS_DATE_TYPE:
11909 case JS_ARRAY_TYPE:
11910 case JS_MESSAGE_OBJECT_TYPE:
11911 case JS_SET_ITERATOR_TYPE:
11912 case JS_MAP_ITERATOR_TYPE:
11913 case JS_ITERATOR_RESULT_TYPE:
11914 return true;
11915
11916 case JS_TYPED_ARRAY_TYPE:
11917 case JS_DATA_VIEW_TYPE:
11918 case JS_REGEXP_TYPE:
11919 case JS_SET_TYPE:
11920 case JS_MAP_TYPE:
11921 case JS_PROXY_TYPE:
11922 case JS_FUNCTION_PROXY_TYPE:
11923 case JS_WEAK_MAP_TYPE:
11924 case JS_WEAK_SET_TYPE:
11925 case JS_ARRAY_BUFFER_TYPE:
11926 case JS_FUNCTION_TYPE:
11927 return false;
11928
11929 case JS_GLOBAL_PROXY_TYPE:
11930 case JS_GLOBAL_OBJECT_TYPE:
11931 case FIXED_ARRAY_TYPE:
11932 case FIXED_DOUBLE_ARRAY_TYPE:
11933 case ODDBALL_TYPE:
11934 case FOREIGN_TYPE:
11935 case MAP_TYPE:
11936 case CODE_TYPE:
11937 case CELL_TYPE:
11938 case PROPERTY_CELL_TYPE:
11939 case WEAK_CELL_TYPE:
11940 case SYMBOL_TYPE:
11941 case BYTECODE_ARRAY_TYPE:
11942 case HEAP_NUMBER_TYPE:
11943 case MUTABLE_HEAP_NUMBER_TYPE:
11944 case SIMD128_VALUE_TYPE:
11945 case FILLER_TYPE:
11946 case BYTE_ARRAY_TYPE:
11947 case FREE_SPACE_TYPE:
11948 case SHARED_FUNCTION_INFO_TYPE:
11949
11950 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
11951 case FIXED_##TYPE##_ARRAY_TYPE:
11952 #undef TYPED_ARRAY_CASE
11953
11954 #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE:
11955 STRUCT_LIST(MAKE_STRUCT_CASE)
11956 #undef MAKE_STRUCT_CASE
11957 // We must not end up here for these instance types at all.
11958 UNREACHABLE();
11959 // Fall through.
11960 default:
11961 return false;
11962 }
11963 }
11964
11965 } // namespace
11966
11967
11899 void JSFunction::EnsureHasInitialMap(Handle<JSFunction> function) { 11968 void JSFunction::EnsureHasInitialMap(Handle<JSFunction> function) {
11900 if (function->has_initial_map()) return; 11969 if (function->has_initial_map()) return;
11901 Isolate* isolate = function->GetIsolate(); 11970 Isolate* isolate = function->GetIsolate();
11902 11971
11903 // First create a new map with the size and number of in-object properties 11972 // First create a new map with the size and number of in-object properties
11904 // suggested by the function. 11973 // suggested by the function.
11905 InstanceType instance_type; 11974 InstanceType instance_type;
11906 if (function->shared()->is_generator()) { 11975 if (function->shared()->is_generator()) {
11907 instance_type = JS_GENERATOR_OBJECT_TYPE; 11976 instance_type = JS_GENERATOR_OBJECT_TYPE;
11908 } else { 11977 } else {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
11963 Handle<Object> prototype; 12032 Handle<Object> prototype;
11964 if (new_target->has_instance_prototype()) { 12033 if (new_target->has_instance_prototype()) {
11965 prototype = handle(new_target->instance_prototype(), isolate); 12034 prototype = handle(new_target->instance_prototype(), isolate);
11966 } else { 12035 } else {
11967 prototype = isolate->factory()->NewFunctionPrototype(new_target); 12036 prototype = isolate->factory()->NewFunctionPrototype(new_target);
11968 } 12037 }
11969 12038
11970 // Finally link initial map and constructor function if the original 12039 // Finally link initial map and constructor function if the original
11971 // constructor is actually a subclass constructor. 12040 // constructor is actually a subclass constructor.
11972 if (IsSubclassConstructor(new_target->shared()->kind())) { 12041 if (IsSubclassConstructor(new_target->shared()->kind())) {
11973 // TODO(ishell): v8:4531, allow ES6 built-ins subclasses to have 12042 // TODO(ishell): v8:4531, allow ES6 built-ins subclasses to have
11974 // in-object properties. 12043 // in-object properties.
11975 #if 0
11976 InstanceType instance_type = constructor_initial_map->instance_type(); 12044 InstanceType instance_type = constructor_initial_map->instance_type();
11977 int internal_fields = 12045 Handle<Map> map;
11978 JSObject::GetInternalFieldCount(*constructor_initial_map); 12046 if (CanSubclassHaveInobjectProperties(instance_type)) {
11979 int pre_allocated = constructor_initial_map->GetInObjectProperties() - 12047 int internal_fields =
11980 constructor_initial_map->unused_property_fields(); 12048 JSObject::GetInternalFieldCount(*constructor_initial_map);
11981 int instance_size; 12049 int pre_allocated = constructor_initial_map->GetInObjectProperties() -
11982 int in_object_properties; 12050 constructor_initial_map->unused_property_fields();
11983 new_target->CalculateInstanceSizeForDerivedClass( 12051 int instance_size;
11984 instance_type, internal_fields, &instance_size, &in_object_properties); 12052 int in_object_properties;
12053 new_target->CalculateInstanceSizeForDerivedClass(
12054 instance_type, internal_fields, &instance_size,
12055 &in_object_properties);
11985 12056
11986 int unused_property_fields = in_object_properties - pre_allocated; 12057 int unused_property_fields = in_object_properties - pre_allocated;
11987 Handle<Map> map = 12058 map = Map::CopyInitialMap(constructor_initial_map, instance_size,
11988 Map::CopyInitialMap(constructor_initial_map, instance_size, 12059 in_object_properties, unused_property_fields);
11989 in_object_properties, unused_property_fields); 12060 } else {
11990 #endif 12061 map = Map::CopyInitialMap(constructor_initial_map);
11991 Handle<Map> map = Map::CopyInitialMap(constructor_initial_map); 12062 }
11992 12063
11993 JSFunction::SetInitialMap(new_target, map, prototype); 12064 JSFunction::SetInitialMap(new_target, map, prototype);
11994 map->SetConstructor(*constructor); 12065 map->SetConstructor(*constructor);
11995 new_target->StartInobjectSlackTracking(); 12066 new_target->StartInobjectSlackTracking();
11996 return map; 12067 return map;
11997 12068
11998 } else { 12069 } else {
11999 Handle<Map> map = Map::CopyInitialMap(constructor_initial_map); 12070 Handle<Map> map = Map::CopyInitialMap(constructor_initial_map);
12000 DCHECK(prototype->IsJSReceiver()); 12071 DCHECK(prototype->IsJSReceiver());
12001 if (map->prototype() != *prototype) { 12072 if (map->prototype() != *prototype) {
(...skipping 6120 matching lines...) Expand 10 before | Expand all | Expand 10 after
18122 if (cell->value() != *new_value) { 18193 if (cell->value() != *new_value) {
18123 cell->set_value(*new_value); 18194 cell->set_value(*new_value);
18124 Isolate* isolate = cell->GetIsolate(); 18195 Isolate* isolate = cell->GetIsolate();
18125 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18196 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18126 isolate, DependentCode::kPropertyCellChangedGroup); 18197 isolate, DependentCode::kPropertyCellChangedGroup);
18127 } 18198 }
18128 } 18199 }
18129 18200
18130 } // namespace internal 18201 } // namespace internal
18131 } // namespace v8 18202 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/objects-visiting.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698