// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. namespace reflect { const kCalledOnNonObject: constexpr MessageTemplate generates 'MessageTemplate::kCalledOnNonObject'; // ES6 section 26.1.10 Reflect.isExtensible transitioning javascript builtin ReflectIsExtensible(js-implicit context: Context)(object: JSAny): JSAny { const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.isExtensible'); return object::ObjectIsExtensible(objectJSReceiver); } // ES6 section 26.1.12 Reflect.preventExtensions transitioning javascript builtin ReflectPreventExtensions(js-implicit context: Context)(object: JSAny): JSAny { const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.preventExtensions'); return object::ObjectPreventExtensionsDontThrow(objectJSReceiver); } // ES6 section 26.1.8 Reflect.getPrototypeOf transitioning javascript builtin ReflectGetPrototypeOf(js-implicit context: Context)(object: JSAny): JSAny { const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.getPrototypeOf'); return object::JSReceiverGetPrototypeOf(objectJSReceiver); } // ES6 section 26.1.14 Reflect.setPrototypeOf transitioning javascript builtin ReflectSetPrototypeOf( js-implicit context: Context)(object: JSAny, proto: JSAny): JSAny { const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.setPrototypeOf'); typeswitch (proto) { case (proto: JSReceiver | Null): { return object::ObjectSetPrototypeOfDontThrow(objectJSReceiver, proto); } case (JSAny): { ThrowTypeError(kProtoObjectOrNull, proto); } } } extern transitioning builtin ToName(implicit context: Context)(JSAny): AnyName; type OnNonExistent constexpr 'OnNonExistent'; const kReturnUndefined: constexpr OnNonExistent generates 'OnNonExistent::kReturnUndefined'; extern macro SmiConstant(constexpr OnNonExistent): Smi; extern transitioning builtin GetPropertyWithReceiver( implicit context: Context)(JSAny, Name, JSAny, Smi): JSAny; // ES6 section 26.1.6 Reflect.get transitioning javascript builtin ReflectGet(js-implicit context: Context)(...arguments): JSAny { const length = arguments.length; const object: JSAny = length > 0 ? arguments[0] : Undefined; const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.get'); const propertyKey: JSAny = length > 1 ? arguments[1] : Undefined; const name: AnyName = ToName(propertyKey); const receiver: JSAny = length > 2 ? arguments[2] : objectJSReceiver; return GetPropertyWithReceiver( objectJSReceiver, name, receiver, SmiConstant(kReturnUndefined)); } // ES6 section 26.1.4 Reflect.deleteProperty transitioning javascript builtin ReflectDeleteProperty( js-implicit context: Context)(object: JSAny, key: JSAny): JSAny { const objectJSReceiver = Cast<JSReceiver>(object) otherwise ThrowTypeError(kCalledOnNonObject, 'Reflect.deleteProperty'); return DeleteProperty(objectJSReceiver, key, kSloppy); } } // namespace reflect