// 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 { // ES6 section 26.1.10 Reflect.isExtensible transitioning javascript builtin ReflectIsExtensible(js-implicit context: NativeContext)(object: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError( MessageTemplate::kCalledOnNonObject, 'Reflect.isExtensible'); return object::ObjectIsExtensibleImpl(objectJSReceiver); } // ES6 section 26.1.12 Reflect.preventExtensions transitioning javascript builtin ReflectPreventExtensions(js-implicit context: NativeContext)(object: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError( MessageTemplate::kCalledOnNonObject, 'Reflect.preventExtensions'); return object::ObjectPreventExtensionsDontThrow(objectJSReceiver); } // ES6 section 26.1.8 Reflect.getPrototypeOf transitioning javascript builtin ReflectGetPrototypeOf(js-implicit context: NativeContext)(object: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError( MessageTemplate::kCalledOnNonObject, 'Reflect.getPrototypeOf'); return object::JSReceiverGetPrototypeOf(objectJSReceiver); } // ES6 section 26.1.14 Reflect.setPrototypeOf transitioning javascript builtin ReflectSetPrototypeOf( js-implicit context: NativeContext)(object: JSAny, proto: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError( MessageTemplate::kCalledOnNonObject, 'Reflect.setPrototypeOf'); typeswitch (proto) { case (proto: JSReceiver|Null): { return object::ObjectSetPrototypeOfDontThrow(objectJSReceiver, proto); } case (JSAny): { ThrowTypeError(MessageTemplate::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: NativeContext)(...arguments): JSAny { const object: JSAny = arguments[0]; const objectJSReceiver = Cast(object) otherwise ThrowTypeError(MessageTemplate::kCalledOnNonObject, 'Reflect.get'); const propertyKey: JSAny = arguments[1]; const name: AnyName = ToName(propertyKey); const receiver: JSAny = arguments.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: NativeContext)(object: JSAny, key: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError( MessageTemplate::kCalledOnNonObject, 'Reflect.deleteProperty'); return DeleteProperty(objectJSReceiver, key, LanguageMode::kSloppy); } // ES section #sec-reflect.has transitioning javascript builtin ReflectHas(js-implicit context: NativeContext)( object: JSAny, key: JSAny): JSAny { const objectJSReceiver = Cast(object) otherwise ThrowTypeError(MessageTemplate::kCalledOnNonObject, 'Reflect.has'); return HasProperty(objectJSReceiver, key); } } // namespace reflect