Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 2d3fa6820b02ee6df6f053b3b7013b55c37d46fc..c68d279621f0f82d8f2508ee7526ff302be79517 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -2326,6 +2326,42 @@ MaybeHandle<Object> Object::ArraySpeciesConstructor( |
} |
} |
+// ES6 section 7.3.20 SpeciesConstructor ( O, defaultConstructor ) |
+MUST_USE_RESULT MaybeHandle<Object> Object::SpeciesConstructor( |
+ Isolate* isolate, Handle<JSReceiver> recv, |
+ Handle<JSFunction> default_ctor) { |
+ Handle<Object> ctor_obj; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, ctor_obj, |
+ JSObject::GetProperty(recv, isolate->factory()->constructor_string()), |
+ Object); |
+ |
+ if (ctor_obj->IsUndefined(isolate)) return default_ctor; |
+ |
+ if (!ctor_obj->IsJSReceiver()) { |
+ THROW_NEW_ERROR(isolate, |
+ NewTypeError(MessageTemplate::kConstructorNotReceiver), |
+ Object); |
+ } |
+ |
+ Handle<JSReceiver> ctor = Handle<JSReceiver>::cast(ctor_obj); |
+ |
+ Handle<Object> species; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, species, |
+ JSObject::GetProperty(ctor, isolate->factory()->species_symbol()), |
+ Object); |
+ |
+ if (species->IsNullOrUndefined(isolate)) { |
+ return default_ctor; |
+ } |
+ |
+ if (species->IsConstructor()) return species; |
+ |
+ THROW_NEW_ERROR( |
+ isolate, NewTypeError(MessageTemplate::kSpeciesNotConstructor), Object); |
+} |
+ |
bool Object::IterationHasObservableEffects() { |
// Check that this object is an array. |
if (!IsJSArray()) return true; |