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