Skip to content

Commit

Permalink
Add default implementation for Object.create(prototype)
Browse files Browse the repository at this point in the history
Summary:
Add default implementation for `Object.create` with custom parent. This
default implementation calls into the global object to get the
`Object.create` function, and then calls that function with the
prototype.

Differential Revision: D66485209
  • Loading branch information
Chi Tsai authored and facebook-github-bot committed Nov 26, 2024
1 parent f70c3ca commit 6443d6c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
9 changes: 9 additions & 0 deletions packages/react-native/ReactCommon/jsi/jsi/decorator.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ class RuntimeDecorator : public Base, private jsi::Instrumentation {
return plain_.utf16(sym);
}

Object createObjectWithPrototype(const Object& prototype) override {
return plain_.createObjectWithPrototype(prototype);
}

Object createObject() override {
return plain_.createObject();
};
Expand Down Expand Up @@ -695,6 +699,11 @@ class WithRuntimeDecorator : public RuntimeDecorator<Plain, Base> {
return RD::createValueFromJsonUtf8(json, length);
};

Object createObjectWithPrototype(const Object& prototype) override {
Around around{with_};
return RD::createObjectWithPrototype(prototype);
}

Object createObject() override {
Around around{with_};
return RD::createObject();
Expand Down
7 changes: 7 additions & 0 deletions packages/react-native/ReactCommon/jsi/jsi/jsi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,13 @@ std::u16string Runtime::utf16(const String& str) {
return convertUTF8ToUTF16(utf8Str);
}

Object Runtime::createObjectWithPrototype(const Object& prototype) {
auto createFn = global()
.getPropertyAsObject(*this, "Object")
.getPropertyAsFunction(*this, "create");
return createFn.call(*this, prototype).asObject(*this);
}

Pointer& Pointer::operator=(Pointer&& other) noexcept {
if (ptr_) {
ptr_->invalidate();
Expand Down
6 changes: 6 additions & 0 deletions packages/react-native/ReactCommon/jsi/jsi/jsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ class JSI_EXPORT Runtime {
virtual Object createObject(std::shared_ptr<HostObject> ho) = 0;
virtual std::shared_ptr<HostObject> getHostObject(const jsi::Object&) = 0;
virtual HostFunctionType& getHostFunction(const jsi::Function&) = 0;
virtual Object createObjectWithPrototype(const Object& prototype);

virtual bool hasNativeState(const jsi::Object&) = 0;
virtual std::shared_ptr<NativeState> getNativeState(const jsi::Object&) = 0;
Expand Down Expand Up @@ -688,6 +689,11 @@ class JSI_EXPORT Object : public Pointer {
return runtime.createObject(ho);
}

/// Creates a new Object with the custom prototype
Object create(Runtime& runtime, const Object& prototype) {
return runtime.createObjectWithPrototype(prototype);
}

/// \return whether this and \c obj are the same JSObject or not.
static bool strictEquals(Runtime& runtime, const Object& a, const Object& b) {
return runtime.strictEquals(a, b);
Expand Down
21 changes: 21 additions & 0 deletions packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1635,6 +1635,27 @@ TEST_P(JSITest, UTF16Test) {
EXPECT_EQ(str.utf16(rd), u"\uFFFD\u007A");
}

TEST_P(JSITest, ObjectCreateWithPrototype) {
// This Runtime Decorator is used to test the default implementation of
// Object.create(prototype)
class RD : public RuntimeDecorator<Runtime, Runtime> {
public:
RD(Runtime& rt) : RuntimeDecorator(rt) {}

Object createObjectWithPrototype(const Object& prototype) override {
return Runtime::createObjectWithPrototype(prototype);
}
};

RD rd = RD(rt);
Object prototype(rd);

prototype.setProperty(rd, "someProperty", 123);

Object child = rd.createObjectWithPrototype(prototype);
EXPECT_EQ(child.getProperty(rd, "someProperty").getNumber(), 123);
}

INSTANTIATE_TEST_CASE_P(
Runtimes,
JSITest,
Expand Down

0 comments on commit 6443d6c

Please sign in to comment.