@@ -13056,14 +13056,19 @@ MaybeHandle<Map> JSFunction::GetDerivedMap(Isolate* isolate,
13056
13056
constructor_initial_map->unused_property_fields();
13057
13057
int instance_size;
13058
13058
int in_object_properties;
13059
- CalculateInstanceSizeForDerivedClass(function, instance_type,
13060
- embedder_fields, &instance_size,
13061
- &in_object_properties);
13059
+ bool success = CalculateInstanceSizeForDerivedClass(
13060
+ function, instance_type, embedder_fields, &instance_size,
13061
+ &in_object_properties);
13062
13062
13063
13063
int unused_property_fields = in_object_properties - pre_allocated;
13064
- Handle<Map> map =
13065
- Map::CopyInitialMap(constructor_initial_map, instance_size,
13066
- in_object_properties, unused_property_fields);
13064
+
13065
+ Handle<Map> map;
13066
+ if (success) {
13067
+ map = Map::CopyInitialMap(constructor_initial_map, instance_size,
13068
+ in_object_properties, unused_property_fields);
13069
+ } else {
13070
+ map = Map::CopyInitialMap(constructor_initial_map);
13071
+ }
13067
13072
map->set_new_target_is_base(false);
13068
13073
13069
13074
JSFunction::SetInitialMap(function, map, prototype);
@@ -13789,12 +13794,14 @@ void JSFunction::CalculateInstanceSizeHelper(InstanceType instance_type,
13789
13794
requested_embedder_fields;
13790
13795
}
13791
13796
13792
- void JSFunction::CalculateInstanceSizeForDerivedClass(
13797
+ // static
13798
+ bool JSFunction::CalculateInstanceSizeForDerivedClass(
13793
13799
Handle<JSFunction> function, InstanceType instance_type,
13794
13800
int requested_embedder_fields, int* instance_size,
13795
13801
int* in_object_properties) {
13796
13802
Isolate* isolate = function->GetIsolate();
13797
13803
int expected_nof_properties = 0;
13804
+ bool result = true;
13798
13805
for (PrototypeIterator iter(isolate, function, kStartAtReceiver);
13799
13806
!iter.IsAtEnd(); iter.Advance()) {
13800
13807
Handle<JSReceiver> current =
@@ -13808,6 +13815,11 @@ void JSFunction::CalculateInstanceSizeForDerivedClass(
13808
13815
Compiler::Compile(func, Compiler::CLEAR_EXCEPTION)) {
13809
13816
DCHECK(shared->is_compiled());
13810
13817
expected_nof_properties += shared->expected_nof_properties();
13818
+ } else if (!shared->is_compiled()) {
13819
+ // In case there was a compilation error for the constructor we will
13820
+ // throw an error during instantiation. Hence we directly return 0;
13821
+ result = false;
13822
+ break;
13811
13823
}
13812
13824
if (!IsDerivedConstructor(shared->kind())) {
13813
13825
break;
@@ -13816,6 +13828,7 @@ void JSFunction::CalculateInstanceSizeForDerivedClass(
13816
13828
CalculateInstanceSizeHelper(instance_type, requested_embedder_fields,
13817
13829
expected_nof_properties, instance_size,
13818
13830
in_object_properties);
13831
+ return result;
13819
13832
}
13820
13833
13821
13834
0 commit comments