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); }