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)); }
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); }
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); }
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)); }
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); } }
public EcmaPropertyEntry(EcmaPropertyKey key, EcmaValue value) { Key = key; Value = value; }
/// <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); }
public override bool HasProperty(EcmaPropertyKey propertyKey) { return((taintedLevel == null && IsBoundedVariable(propertyKey)) || base.HasProperty(propertyKey)); }
private bool IsBoundedVariable(EcmaPropertyKey propertyKey) { return(propertyKey.IsArrayIndex && propertyKey.ToArrayIndex() < arguments.Length); }