コード例 #1
0
 public override bool DefineOwnProperty(EcmaPropertyKey propertyKey, EcmaPropertyDescriptor descriptor)
 {
     if (IsBoundedVariable(propertyKey))
     {
         int index = (int)propertyKey.ToArrayIndex();
         EnsureTainted();
         if (taintedLevel[index] != TaintLevel.BindingTainted)
         {
             if (descriptor.HasValue)
             {
                 arguments[index] = descriptor.Value;
             }
             taintedLevel[index] = !descriptor.IsAccessorDescriptor && (!descriptor.HasWritable || descriptor.Writable) ? TaintLevel.AttributeTainted : TaintLevel.BindingTainted;
         }
     }
     return(base.DefineOwnProperty(propertyKey, descriptor));
 }
コード例 #2
0
        private bool TryGetResult(EcmaPropertyKey propertyKey, EcmaValue value, out bool done, out EcmaValue result)
        {
            RuntimeObject method = target.GetMethod(propertyKey);

            if (method == null)
            {
                result = value;
                done   = true;
                return(false);
            }
            EcmaValue obj = method.Call(target, value);

            Guard.ArgumentIsObject(obj);
            done   = obj[WellKnownProperty.Done].ToBoolean();
            result = obj[WellKnownProperty.Value];
            return(true);
        }
コード例 #3
0
        public override EcmaPropertyDescriptor GetOwnProperty(EcmaPropertyKey propertyKey)
        {
            EcmaPropertyDescriptor current = base.GetOwnProperty(propertyKey);

            if (EcmaValueUtility.TryIndexByPropertyKey(arguments, propertyKey, out EcmaValue value))
            {
                if (taintedLevel == null)
                {
                    return(new EcmaPropertyDescriptor(value, EcmaPropertyAttributes.DefaultDataProperty));
                }
                if (taintedLevel[propertyKey.ToArrayIndex()] == TaintLevel.AttributeTainted)
                {
                    current.Value = value;
                }
            }
            return(current);
        }
コード例 #4
0
        private static EcmaValue InternalizeJsonProperty(RuntimeObject holder, EcmaPropertyKey property, EcmaValue reviver)
        {
            EcmaValue value = holder.Get(property);

            if (value.Type == EcmaValueType.Object)
            {
                RuntimeObject obj = value.ToObject();
                if (EcmaArray.IsArray(value))
                {
                    for (long i = 0, length = value[WellKnownProperty.Length].ToLength(); i < length; i++)
                    {
                        EcmaValue newValue = InternalizeJsonProperty(obj, i, reviver);
                        if (newValue.Type == EcmaValueType.Undefined)
                        {
                            obj.Delete(i);
                        }
                        else
                        {
                            obj.CreateDataProperty(i, newValue);
                        }
                    }
                }
                else
                {
                    foreach (EcmaPropertyKey key in obj.GetEnumerableOwnPropertyKeys().ToArray())
                    {
                        EcmaValue newValue = InternalizeJsonProperty(obj, key, reviver);
                        if (newValue.Type == EcmaValueType.Undefined)
                        {
                            obj.Delete(key);
                        }
                        else
                        {
                            obj.CreateDataProperty(key, newValue);
                        }
                    }
                }
            }
            return(reviver.Call(holder, property.ToValue(), value));
        }
コード例 #5
0
        private void SerializeJsonProperty(TextWriter writer, Stack <RuntimeObject> stack, RuntimeObject holder, EcmaPropertyKey property)
        {
            EcmaValue value = TransformValue(holder, property, holder.Get(property));

            if (value.Type != EcmaValueType.Undefined)
            {
                WritePropertyValue(writer, stack, value);
            }
        }
コード例 #6
0
 public EcmaPropertyEntry(EcmaPropertyKey key, EcmaValue value)
 {
     Key   = key;
     Value = value;
 }
コード例 #7
0
 /// <summary>
 /// Gets value of the specified property from the object.
 /// </summary>
 /// <param name="index">Property name.</param>
 /// <returns>Value associated with the property name, -or- <see cref="Undefined"/> if property does not exist.</returns>
 public                   EcmaValue this[EcmaPropertyKey index] {
     get { return(binder.TryGet(handle, index, out EcmaValue value) ? value : default); }
コード例 #8
0
 public override bool HasProperty(EcmaPropertyKey propertyKey)
 {
     return((taintedLevel == null && IsBoundedVariable(propertyKey)) || base.HasProperty(propertyKey));
 }
コード例 #9
0
 private bool IsBoundedVariable(EcmaPropertyKey propertyKey)
 {
     return(propertyKey.IsArrayIndex && propertyKey.ToArrayIndex() < arguments.Length);
 }