diff options
author | Linus Groh <mail@linusgroh.de> | 2020-05-23 23:27:10 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-24 18:49:58 +0200 |
commit | 9c8d390682fb7e1cf28aeb96975d86f45d61d441 (patch) | |
tree | e0f47da44d6976ca895948dedc9208dfe6c804ed /Libraries/LibJS/Runtime/Accessor.h | |
parent | bdc19563ef1c6ecc04d81eb1f1d5f4cae1610486 (diff) | |
download | serenity-9c8d390682fb7e1cf28aeb96975d86f45d61d441.zip |
LibJS: Refactor Accessor
This changes Accessor's m_{getter,setter} from Value to Function* which
seems like a better API to me - a getter/setter must either be a
function or missing, and the creation of an accessor with other values
must be prevented by the parser and Object.defineProperty() anyway.
Also add Accessor::set_{getter,setter}() so we can reuse an already
created accessor when evaluating an ObjectExpression with getter/setter
shorthand syntax.
Diffstat (limited to 'Libraries/LibJS/Runtime/Accessor.h')
-rw-r--r-- | Libraries/LibJS/Runtime/Accessor.h | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/Libraries/LibJS/Runtime/Accessor.h b/Libraries/LibJS/Runtime/Accessor.h index ad00ad7155..9f7fd9451a 100644 --- a/Libraries/LibJS/Runtime/Accessor.h +++ b/Libraries/LibJS/Runtime/Accessor.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Matthew Olsson <matthewcolsson@gmail.com> + * Copyright (c) 2020, Linus Groh <mail@linusgroh.de> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,41 +27,43 @@ #pragma once -#include <LibJS/Runtime/Cell.h> -#include <LibJS/Runtime/Value.h> +#include <LibJS/Runtime/Function.h> namespace JS { class Accessor final : public Cell { public: - static Accessor* create(Interpreter& interpreter, Value getter, Value setter) + static Accessor* create(Interpreter& interpreter, Function* getter, Function* setter) { return interpreter.heap().allocate<Accessor>(getter, setter); } - Accessor(Value getter, Value setter) + Accessor(Function* getter, Function* setter) : m_getter(getter) , m_setter(setter) { } - Value getter() { return m_getter; } - Value setter() { return m_setter; } + Function* getter() const { return m_getter; } + void set_getter(Function* getter) { m_getter = getter; } - Value call_getter(Value this_object) + Function* setter() const { return m_setter; } + void set_setter(Function* setter) { m_setter = setter; } + + Value call_getter(Value this_value) { - if (!getter().is_function()) + if (!m_getter) return js_undefined(); - return interpreter().call(getter().as_function(), this_object); + return interpreter().call(*m_getter, this_value); } - void call_setter(Value this_object, Value setter_value) + void call_setter(Value this_value, Value setter_value) { - if (!setter().is_function()) + if (!m_setter) return; MarkedValueList arguments(interpreter().heap()); arguments.values().append(setter_value); - interpreter().call(setter().as_function(), this_object, move(arguments)); + interpreter().call(*m_setter, this_value, move(arguments)); } void visit_children(Cell::Visitor& visitor) override @@ -72,8 +75,8 @@ public: private: const char* class_name() const override { return "Accessor"; }; - Value m_getter; - Value m_setter; + Function* m_getter { nullptr }; + Function* m_setter { nullptr }; }; } |