diff --git a/Libraries/LibJS/Runtime/NumberConstructor.cpp b/Libraries/LibJS/Runtime/NumberConstructor.cpp index 4a5c9fc80c..47dd980482 100644 --- a/Libraries/LibJS/Runtime/NumberConstructor.cpp +++ b/Libraries/LibJS/Runtime/NumberConstructor.cpp @@ -69,7 +69,7 @@ Value NumberConstructor::construct(Interpreter& interpreter) number = 0; else number = interpreter.argument(0).to_number().as_double(); - return Value(interpreter.heap().allocate(number)); + return NumberObject::create(interpreter.global_object(), number); } Value NumberConstructor::is_safe_integer(Interpreter& interpreter) diff --git a/Libraries/LibJS/Runtime/NumberObject.cpp b/Libraries/LibJS/Runtime/NumberObject.cpp index de2955fb5c..d9beed48bd 100644 --- a/Libraries/LibJS/Runtime/NumberObject.cpp +++ b/Libraries/LibJS/Runtime/NumberObject.cpp @@ -26,16 +26,23 @@ #include #include +#include #include #include #include namespace JS { -NumberObject::NumberObject(double value) +NumberObject* NumberObject::create(GlobalObject& global_object, double value) +{ + auto& interpreter = global_object.interpreter(); + return interpreter.heap().allocate(value, *interpreter.number_prototype()); +} + +NumberObject::NumberObject(double value, Object& prototype) : m_value(value) { - set_prototype(interpreter().number_prototype()); + set_prototype(&prototype); } NumberObject::~NumberObject() diff --git a/Libraries/LibJS/Runtime/NumberObject.h b/Libraries/LibJS/Runtime/NumberObject.h index 845cb46902..a5a06c297d 100644 --- a/Libraries/LibJS/Runtime/NumberObject.h +++ b/Libraries/LibJS/Runtime/NumberObject.h @@ -32,7 +32,9 @@ namespace JS { class NumberObject : public Object { public: - explicit NumberObject(double); + static NumberObject* create(GlobalObject&, double); + + NumberObject(double, Object& prototype); virtual ~NumberObject() override; virtual Value value_of() const override { return Value(m_value); } diff --git a/Libraries/LibJS/Runtime/NumberPrototype.cpp b/Libraries/LibJS/Runtime/NumberPrototype.cpp index 5cad2b1e2a..9db8c33604 100644 --- a/Libraries/LibJS/Runtime/NumberPrototype.cpp +++ b/Libraries/LibJS/Runtime/NumberPrototype.cpp @@ -30,9 +30,8 @@ namespace JS { NumberPrototype::NumberPrototype() - : NumberObject(0) + : NumberObject(0, *interpreter().object_prototype()) { - set_prototype(interpreter().object_prototype()); } NumberPrototype::~NumberPrototype() diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp index 07521777a2..cd400082ff 100644 --- a/Libraries/LibJS/Runtime/Value.cpp +++ b/Libraries/LibJS/Runtime/Value.cpp @@ -116,7 +116,7 @@ Object* Value::to_object(Heap& heap) const return heap.allocate(m_value.as_string); if (is_number()) - return heap.allocate(m_value.as_double); + return NumberObject::create(heap.interpreter().global_object(), m_value.as_double); if (is_boolean()) return heap.allocate(m_value.as_bool);