Exemplo n.º 1
0
        public virtual void Put(string p, IDynamic value, bool @throw)
        {
            if (!CanPut(p))
            {
                if (@throw)
                {
                    throw Environment.CreateTypeError("");
                }
                return;
            }

            var ownDesc = GetOwnProperty(p);

            if (ownDesc != null && ownDesc.IsDataDescriptor)
            {
                var valueDesc = new SPropertyDescriptor()
                {
                    Value = value
                };
                DefineOwnProperty(p, valueDesc, @throw);
                return;
            }

            var desc = GetProperty(p);

            if (desc != null && desc.IsAccessorDescriptor)
            {
                ((ICallable)desc.Set).Call(Environment, this, new SArgs(Environment, value));
                return;
            }

            var newDesc = Environment.CreateDataDescriptor(value, true, true, true);

            DefineOwnProperty(p, newDesc, @throw);
        }
Exemplo n.º 2
0
        public IPropertyDescriptor ToPropertyDescriptor(IObject obj)
        {
            // 8.10.5 ToPropertyDescriptor ( Obj )

            Debug.Assert(obj != null);

            var desc = new SPropertyDescriptor();

            if (obj.HasProperty("enumerable"))
            {
                desc.Enumerable = obj.Get("enumerable").ConvertToBoolean().BaseValue;
            }

            if (obj.HasProperty("configurable"))
            {
                desc.Enumerable = obj.Get("configurable").ConvertToBoolean().BaseValue;
            }

            if (obj.HasProperty("value"))
            {
                desc.Value = obj.Get("value");
            }

            if (obj.HasProperty("writable"))
            {
                desc.Writable = obj.Get("writable").ConvertToBoolean().BaseValue;
            }

            if (obj.HasProperty("get"))
            {
                var getter = obj.Get("get");
                if (getter.TypeCode != LanguageTypeCode.Undefined && !(getter is ICallable))
                {
                    throw CreateTypeError("");
                }
                desc.Get = getter;
            }

            if (obj.HasProperty("set"))
            {
                var setter = obj.Get("set");
                if (setter.TypeCode != LanguageTypeCode.Undefined && !(setter is ICallable))
                {
                    throw CreateTypeError("");
                }
                desc.Get = setter;
            }

            if (desc.Get != null || desc.Set != null)
            {
                if (desc.Value != null || desc.Writable != null)
                {
                    throw CreateTypeError("");
                }
            }

            return(desc);
        }