summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-06-23 17:56:57 +0200
committerAndreas Kling <kling@serenityos.org>2020-06-23 17:56:57 +0200
commit0166a1fa7467ec9737ca52c35a5e977303757d6d (patch)
tree4e833892ab4d00ca6f68a1478ef7562063bb60a2
parentba641e97d9326be94b0b281fe140b5849c626b50 (diff)
downloadserenity-0166a1fa7467ec9737ca52c35a5e977303757d6d.zip
LibJS: Make NativeProperty a plain Cell instead of an Object
This removes the need for NativeProperty objects to have a prototype, which just made things confusing.
-rw-r--r--Libraries/LibJS/Forward.h1
-rw-r--r--Libraries/LibJS/Runtime/NativeProperty.cpp5
-rw-r--r--Libraries/LibJS/Runtime/NativeProperty.h8
-rw-r--r--Libraries/LibJS/Runtime/Object.cpp26
-rw-r--r--Libraries/LibJS/Runtime/Object.h1
-rw-r--r--Libraries/LibJS/Runtime/Value.h17
6 files changed, 33 insertions, 25 deletions
diff --git a/Libraries/LibJS/Forward.h b/Libraries/LibJS/Forward.h
index 31a58d52d9..833206e001 100644
--- a/Libraries/LibJS/Forward.h
+++ b/Libraries/LibJS/Forward.h
@@ -89,6 +89,7 @@ class HeapBlock;
class Interpreter;
class LexicalEnvironment;
class MarkedValueList;
+class NativeProperty;
class PrimitiveString;
class Reference;
class ScopeNode;
diff --git a/Libraries/LibJS/Runtime/NativeProperty.cpp b/Libraries/LibJS/Runtime/NativeProperty.cpp
index 0993a871e0..86a19d6579 100644
--- a/Libraries/LibJS/Runtime/NativeProperty.cpp
+++ b/Libraries/LibJS/Runtime/NativeProperty.cpp
@@ -29,9 +29,8 @@
namespace JS {
-NativeProperty::NativeProperty(GlobalObject& global_object, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter)
- : Object(Object::ConstructWithoutPrototypeTag::Tag, global_object)
- , m_getter(move(getter))
+NativeProperty::NativeProperty(AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter)
+ : m_getter(move(getter))
, m_setter(move(setter))
{
}
diff --git a/Libraries/LibJS/Runtime/NativeProperty.h b/Libraries/LibJS/Runtime/NativeProperty.h
index 1cdcbc4f2d..b3474bfe67 100644
--- a/Libraries/LibJS/Runtime/NativeProperty.h
+++ b/Libraries/LibJS/Runtime/NativeProperty.h
@@ -31,18 +31,16 @@
namespace JS {
-class NativeProperty final : public Object {
- JS_OBJECT(NativeProperty, Object);
-
+class NativeProperty final : public Cell {
public:
- NativeProperty(GlobalObject&, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter);
+ NativeProperty(AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter);
virtual ~NativeProperty() override;
Value get(Interpreter&, GlobalObject&) const;
void set(Interpreter&, GlobalObject&, Value);
private:
- virtual bool is_native_property() const override { return true; }
+ virtual const char* class_name() const override { return "NativeProperty"; }
AK::Function<Value(Interpreter&, GlobalObject&)> m_getter;
AK::Function<void(Interpreter&, GlobalObject&, Value)> m_setter;
diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp
index 1bd852c96e..df59e092a5 100644
--- a/Libraries/LibJS/Runtime/Object.cpp
+++ b/Libraries/LibJS/Runtime/Object.cpp
@@ -171,7 +171,7 @@ Value Object::get_own_property(const Object& this_object, PropertyName property_
if (value_here.is_accessor()) {
return value_here.as_accessor().call_getter(Value(const_cast<Object*>(this)));
}
- if (value_here.is_object() && value_here.as_object().is_native_property())
+ if (value_here.is_native_property())
return call_native_property_getter(const_cast<Object*>(&this_object), value_here);
return value_here;
}
@@ -282,7 +282,7 @@ Optional<PropertyDescriptor> Object::get_own_property_descriptor(PropertyName pr
}
PropertyDescriptor descriptor { attributes, {}, nullptr, nullptr };
- if (value.is_object() && value.as_object().is_native_property()) {
+ if (value.is_native_property()) {
auto result = call_native_property_getter(const_cast<Object*>(this), value);
descriptor.value = result.value_or(js_undefined());
} else if (value.is_accessor()) {
@@ -492,7 +492,7 @@ bool Object::put_own_property(Object& this_object, const FlyString& property_nam
if (value.is_empty())
return true;
- if (value_here.is_object() && value_here.as_object().is_native_property()) {
+ if (value_here.is_native_property()) {
call_native_property_setter(const_cast<Object*>(&this_object), value_here, value);
} else {
m_storage[metadata.value().offset] = value;
@@ -539,7 +539,7 @@ bool Object::put_own_property_by_index(Object& this_object, u32 property_index,
if (value.is_empty())
return true;
- if (value_here.is_object() && value_here.as_object().is_native_property()) {
+ if (value_here.is_native_property()) {
call_native_property_setter(const_cast<Object*>(&this_object), value_here, value);
} else {
m_indexed_properties.put(&this_object, property_index, value, attributes, mode == PutOwnPropertyMode::Put);
@@ -643,7 +643,7 @@ bool Object::put_by_index(u32 property_index, Value value)
value_here.value.as_accessor().call_setter(object, value);
return true;
}
- if (value_here.value.is_object() && value_here.value.as_object().is_native_property()) {
+ if (value_here.value.is_native_property()) {
call_native_property_setter(const_cast<Object*>(this), value_here.value, value);
return true;
}
@@ -678,7 +678,7 @@ bool Object::put(PropertyName property_name, Value value)
value_here.as_accessor().call_setter(Value(this), value);
return true;
}
- if (value_here.is_object() && value_here.as_object().is_native_property()) {
+ if (value_here.is_native_property()) {
call_native_property_setter(const_cast<Object*>(this), value_here, value);
return true;
}
@@ -704,7 +704,7 @@ bool Object::define_native_function(const FlyString& property_name, AK::Function
bool Object::define_native_property(const FlyString& property_name, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter, PropertyAttributes attribute)
{
- return define_property(property_name, heap().allocate<NativeProperty>(global_object(), global_object(), move(getter), move(setter)), attribute);
+ return define_property(property_name, heap().allocate<NativeProperty>(global_object(), move(getter), move(setter)), attribute);
}
void Object::visit_children(Cell::Visitor& visitor)
@@ -809,24 +809,20 @@ Value Object::invoke(const FlyString& property_name, Optional<MarkedValueList> a
Value Object::call_native_property_getter(Object* this_object, Value property) const
{
- ASSERT(property.is_object());
- ASSERT(property.as_object().is_native_property());
- auto& native_property = static_cast<NativeProperty&>(property.as_object());
+ ASSERT(property.is_native_property());
auto& call_frame = interpreter().push_call_frame();
call_frame.this_value = this_object;
- auto result = native_property.get(interpreter(), global_object());
+ auto result = property.as_native_property().get(interpreter(), global_object());
interpreter().pop_call_frame();
return result;
}
void Object::call_native_property_setter(Object* this_object, Value property, Value value) const
{
- ASSERT(property.is_object());
- ASSERT(property.as_object().is_native_property());
- auto& native_property = static_cast<NativeProperty&>(property.as_object());
+ ASSERT(property.is_native_property());
auto& call_frame = interpreter().push_call_frame();
call_frame.this_value = this_object;
- native_property.set(interpreter(), global_object(), value);
+ property.as_native_property().set(interpreter(), global_object(), value);
interpreter().pop_call_frame();
}
diff --git a/Libraries/LibJS/Runtime/Object.h b/Libraries/LibJS/Runtime/Object.h
index e8b7771381..cdc5381b02 100644
--- a/Libraries/LibJS/Runtime/Object.h
+++ b/Libraries/LibJS/Runtime/Object.h
@@ -110,7 +110,6 @@ public:
virtual bool is_function() const { return false; }
virtual bool is_native_function() const { return false; }
virtual bool is_bound_function() const { return false; }
- virtual bool is_native_property() const { return false; }
virtual bool is_proxy_object() const { return false; }
virtual bool is_regexp_object() const { return false; }
virtual bool is_boolean_object() const { return false; }
diff --git a/Libraries/LibJS/Runtime/Value.h b/Libraries/LibJS/Runtime/Value.h
index 6343003328..0092232b72 100644
--- a/Libraries/LibJS/Runtime/Value.h
+++ b/Libraries/LibJS/Runtime/Value.h
@@ -51,6 +51,7 @@ public:
Symbol,
Accessor,
BigInt,
+ NativeProperty,
};
enum class PreferredType {
@@ -69,7 +70,8 @@ public:
bool is_symbol() const { return m_type == Type::Symbol; }
bool is_accessor() const { return m_type == Type::Accessor; };
bool is_bigint() const { return m_type == Type::BigInt; };
- bool is_cell() const { return is_string() || is_accessor() || is_object() || is_bigint() || is_symbol(); }
+ bool is_native_property() const { return m_type == Type::NativeProperty; }
+ bool is_cell() const { return is_string() || is_accessor() || is_object() || is_bigint() || is_symbol() || is_native_property(); }
bool is_array() const;
bool is_function() const;
@@ -147,6 +149,12 @@ public:
m_value.as_bigint = bigint;
}
+ Value(NativeProperty* native_property)
+ : m_type(Type::NativeProperty)
+ {
+ m_value.as_native_property = native_property;
+ }
+
explicit Value(Type type)
: m_type(type)
{
@@ -220,6 +228,12 @@ public:
return *m_value.as_bigint;
}
+ NativeProperty& as_native_property()
+ {
+ ASSERT(is_native_property());
+ return *m_value.as_native_property;
+ }
+
Array& as_array();
Function& as_function();
@@ -259,6 +273,7 @@ private:
Cell* as_cell;
Accessor* as_accessor;
BigInt* as_bigint;
+ NativeProperty* as_native_property;
} m_value;
};