Ejemplo n.º 1
0
        internal JsValue GetOwnPropertyDescriptor(JsValue thisObject, JsValue[] arguments)
        {
            var o = TypeConverter.ToObject(_engine, arguments.At(0));

            var p    = arguments.At(1);
            var name = TypeConverter.ToPropertyKey(p);

            var desc = o.GetOwnProperty(name);

            return(PropertyDescriptor.FromPropertyDescriptor(Engine, desc));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc
        /// </summary>
        public override bool DefineOwnProperty(JsValue property, PropertyDescriptor desc)
        {
            var arguments = new[] { _target, TypeConverter.ToPropertyKey(property), PropertyDescriptor.FromPropertyDescriptor(_engine, desc, strictUndefined: true) };

            if (!TryCallHandler(TrapDefineProperty, arguments, out var result))
            {
                return(_target.DefineOwnProperty(property, desc));
            }

            var success = TypeConverter.ToBoolean(result);

            if (!success)
            {
                return(false);
            }

            var targetDesc         = _target.GetOwnProperty(property);
            var extensibleTarget   = _target.Extensible;
            var settingConfigFalse = desc.ConfigurableSet && !desc.Configurable;

            if (targetDesc == PropertyDescriptor.Undefined)
            {
                if (!extensibleTarget || settingConfigFalse)
                {
                    ExceptionHelper.ThrowTypeError(_engine.Realm);
                }
            }
            else
            {
                if (!IsCompatiblePropertyDescriptor(extensibleTarget, desc, targetDesc))
                {
                    ExceptionHelper.ThrowTypeError(_engine.Realm);
                }
                if (targetDesc.Configurable && settingConfigFalse)
                {
                    ExceptionHelper.ThrowTypeError(_engine.Realm);
                }

                if (targetDesc.IsDataDescriptor() && !targetDesc.Configurable && targetDesc.Writable)
                {
                    if (desc.WritableSet && !desc.Writable)
                    {
                        ExceptionHelper.ThrowTypeError(_engine.Realm);
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 3
0
        private JsValue GetOwnPropertyDescriptors(JsValue thisObject, JsValue[] arguments)
        {
            var o           = TypeConverter.ToObject(_engine, arguments.At(0));
            var ownKeys     = o.GetOwnPropertyKeys();
            var descriptors = _engine.Object.Construct(0);

            foreach (var key in ownKeys)
            {
                var desc       = o.GetOwnProperty(key);
                var descriptor = PropertyDescriptor.FromPropertyDescriptor(Engine, desc);
                if (descriptor != Undefined)
                {
                    descriptors.CreateDataProperty(key, descriptor);
                }
            }
            return(descriptors);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
        /// </summary>
        private JsValue GetOwnPropertyDescriptors(JsValue thisObject, JsValue[] arguments)
        {
            var o           = TypeConverter.ToObject(_realm, arguments.At(0));
            var ownKeys     = o.GetOwnPropertyKeys();
            var descriptors = _realm.Intrinsics.Object.Construct(0);

            foreach (var key in ownKeys)
            {
                var desc       = o.GetOwnProperty(key);
                var descriptor = PropertyDescriptor.FromPropertyDescriptor(Engine, desc);
                if (!ReferenceEquals(descriptor, Undefined))
                {
                    descriptors.CreateDataProperty(key, descriptor);
                }
            }
            return(descriptors);
        }
Ejemplo n.º 5
0
        public JsValue GetOwnPropertyDescriptor(JsValue thisObject, JsValue[] arguments)
        {
            var oArg = arguments.At(0);
            var o    = oArg.TryCast <ObjectInstance>();

            if (o == null)
            {
                throw new JavaScriptException(Engine.TypeError);
            }

            var p    = arguments.At(1);
            var name = TypeConverter.ToString(p);

            var desc = o.GetOwnProperty(name);

            return(PropertyDescriptor.FromPropertyDescriptor(Engine, desc));
        }
Ejemplo n.º 6
0
        public JsValue GetOwnPropertyDescriptor(JsValue thisObject, JsValue[] arguments)
        {
            var oArg = arguments.At(0);
            var o    = oArg.TryCast <ObjectInstance>();

            if (ReferenceEquals(o, null))
            {
                ExceptionHelper.ThrowTypeError(Engine);
            }

            var p    = arguments.At(1);
            var name = TypeConverter.ToString(p);

            var desc = o.GetOwnProperty(name);

            return(PropertyDescriptor.FromPropertyDescriptor(Engine, desc));
        }