internal override ScriptValue Get(ScriptValue property, ScriptValue reciever) { //https://tc39.github.io/ecma262/#sec-arguments-exotic-objects-get-p-receiver var isMapped = ParameterMap.HasOwnProperty(property); if (!isMapped) { return(base.Get(property, reciever)); } return(ParameterMap.Get(property, ParameterMap)); }
internal override bool Delete(ScriptValue property) { //https://tc39.github.io/ecma262/#sec-arguments-exotic-objects-delete-p var isMapped = ParameterMap.HasOwnProperty(property); var result = base.Delete(property); if (result && isMapped) { ParameterMap.Delete(property); } return(result); }
internal override bool DefineOwnProperty(ScriptValue property, PropertyDescriptor descriptor) { //https://tc39.github.io/ecma262/#sec-arguments-exotic-objects-defineownproperty-p-desc var isMapped = ParameterMap.HasOwnProperty(property); var newArgumentDescriptor = descriptor; if (isMapped && descriptor.IsDataDescriptor) { if (!descriptor.Value.HasValue && descriptor.Writable.HasValue && !descriptor.Writable) { newArgumentDescriptor = new PropertyDescriptor(ParameterMap.Get(property), descriptor.Writable, descriptor.Enumerable, descriptor.Configurable); } } var allowed = base.DefineOwnProperty(property, newArgumentDescriptor); if (!allowed) { return(false); } if (isMapped) { if (descriptor.IsAccessorDescriptor) { ParameterMap.Delete(property); } else { if (descriptor.Value.HasValue) { var setStatus = Agent.Set(ParameterMap, property, descriptor.Value.Value, false); Debug.Assert(setStatus); } if (descriptor.Writable.HasValue && !descriptor.Writable) { ParameterMap.Delete(property); } } } return(true); }
internal override bool Set(ScriptValue property, ScriptValue value, ScriptValue receiver) { //https://tc39.github.io/ecma262/#sec-arguments-exotic-objects-set-p-v-receiver var isMapped = false; if (this == receiver) { isMapped = ParameterMap.HasOwnProperty(property); } if (isMapped) { var setStatus = Agent.Set(ParameterMap, property, value, false); Debug.Assert(setStatus); } return(base.Set(property, value, receiver)); }
internal override PropertyDescriptor GetOwnProperty(ScriptValue property) { //https://tc39.github.io/ecma262/#sec-arguments-exotic-objects-getownproperty-p var descriptor = base.GetOwnProperty(property); if (descriptor == null) { return(null); } var isMapped = ParameterMap.HasOwnProperty(property); if (isMapped) { descriptor.Value = ParameterMap.Get(property, ParameterMap); } return(descriptor); }