
Now that the Object rewrite is in place, we have enough tools to implement the mapped `arguments` propreties according to spec. The basic mechanism is that the `arguments` object installs a hidden parameter mapping object that property accesses get filtered through. This is how accessing numeric properties on `arguments` are proxied to the named identifier in the function scope. When `arguments` is instantiated, getters and setters are created for all the numeric properties on the object that correspond to function arguments. These getters and setters can be deleted from the object. This is all pretty intricate, so refer to the spec for details. Note that the `arguments` object itself is still lazily instantiated on first access within a function. This is non-conforming, and we'll have to revisit this once we get around to improving function calls.
41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Runtime/Environment.h>
|
|
#include <LibJS/Runtime/Object.h>
|
|
|
|
namespace JS {
|
|
|
|
class ArgumentsObject final : public Object {
|
|
JS_OBJECT(ArgumentsObject, Object);
|
|
|
|
public:
|
|
ArgumentsObject(GlobalObject&, Environment&);
|
|
|
|
virtual void initialize(GlobalObject&) override;
|
|
virtual ~ArgumentsObject() override;
|
|
|
|
Environment& environment() { return m_environment; }
|
|
|
|
virtual Optional<PropertyDescriptor> internal_get_own_property(PropertyName const&) const override;
|
|
virtual bool internal_define_own_property(PropertyName const&, PropertyDescriptor const&) override;
|
|
virtual Value internal_get(PropertyName const&, Value receiver) const override;
|
|
virtual bool internal_set(PropertyName const&, Value value, Value receiver) override;
|
|
virtual bool internal_delete(PropertyName const&) override;
|
|
|
|
// [[ParameterMap]]
|
|
Object& parameter_map() { return *m_parameter_map; }
|
|
|
|
private:
|
|
virtual void visit_edges(Cell::Visitor&) override;
|
|
|
|
Environment& m_environment;
|
|
Object* m_parameter_map { nullptr };
|
|
};
|
|
|
|
}
|