mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-13 11:42:38 +03:00
LibJS: Implement Object.getOwnPropertyNames()
This commit is contained in:
parent
62d5f79388
commit
f95a119627
Notes:
sideshowbarker
2024-07-19 08:05:06 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/f95a1196270
@ -27,6 +27,7 @@
|
||||
#include <AK/Function.h>
|
||||
#include <LibJS/Heap/Heap.h>
|
||||
#include <LibJS/Interpreter.h>
|
||||
#include <LibJS/Runtime/Array.h>
|
||||
#include <LibJS/Runtime/ObjectConstructor.h>
|
||||
|
||||
namespace JS {
|
||||
@ -35,6 +36,7 @@ ObjectConstructor::ObjectConstructor()
|
||||
{
|
||||
put("prototype", interpreter().object_prototype());
|
||||
|
||||
put_native_function("getOwnPropertyNames", get_own_property_names);
|
||||
put_native_function("getPrototypeOf", get_prototype_of);
|
||||
put_native_function("setPrototypeOf", set_prototype_of);
|
||||
}
|
||||
@ -48,6 +50,24 @@ Value ObjectConstructor::call(Interpreter& interpreter)
|
||||
return interpreter.heap().allocate<Object>();
|
||||
}
|
||||
|
||||
Value ObjectConstructor::get_own_property_names(Interpreter& interpreter)
|
||||
{
|
||||
if (interpreter.call_frame().arguments.size() < 1)
|
||||
return {};
|
||||
auto* object = interpreter.call_frame().arguments[0].to_object(interpreter.heap());
|
||||
if (interpreter.exception())
|
||||
return {};
|
||||
auto* result = interpreter.heap().allocate<Array>();
|
||||
if (object->is_array()) {
|
||||
auto* array = static_cast<const Array*>(object);
|
||||
for (i32 i = 0; i < array->length(); ++i)
|
||||
result->push(js_string(interpreter.heap(), String::number(i)));
|
||||
}
|
||||
for (auto& it : object->own_properties())
|
||||
result->push(js_string(interpreter.heap(), it.key));
|
||||
return result;
|
||||
}
|
||||
|
||||
Value ObjectConstructor::get_prototype_of(Interpreter& interpreter)
|
||||
{
|
||||
if (interpreter.call_frame().arguments.size() < 1)
|
||||
|
@ -40,6 +40,7 @@ public:
|
||||
private:
|
||||
virtual const char* class_name() const override { return "ObjectConstructor"; }
|
||||
|
||||
static Value get_own_property_names(Interpreter&);
|
||||
static Value get_prototype_of(Interpreter&);
|
||||
static Value set_prototype_of(Interpreter&);
|
||||
};
|
||||
|
15
Libraries/LibJS/Tests/Object.getOwnPropertyNames.js
Normal file
15
Libraries/LibJS/Tests/Object.getOwnPropertyNames.js
Normal file
@ -0,0 +1,15 @@
|
||||
function assert(x) { if (!x) throw 1; }
|
||||
|
||||
try {
|
||||
var names = Object.getOwnPropertyNames([1, 2, 3]);
|
||||
|
||||
assert(names.length === 4);
|
||||
assert(names[0] === '0');
|
||||
assert(names[1] === '1');
|
||||
assert(names[2] === '2');
|
||||
assert(names[3] === 'length');
|
||||
|
||||
console.log("PASS");
|
||||
} catch (e) {
|
||||
console.log("FAIL: " + e);
|
||||
}
|
Loading…
Reference in New Issue
Block a user