Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -243,6 +243,10 @@ class RuntimeDecorator : public Base, private jsi::Instrumentation {
return plain_.utf16(sym);
}

size_t length(const String& str) override {
return plain_.length(str);
}

void getStringData(
const jsi::String& str,
void* ctx,
Expand Down Expand Up @@ -822,6 +826,11 @@ class WithRuntimeDecorator : public RuntimeDecorator<Plain, Base> {
return RD::utf16(sym);
}

size_t length(const String& str) override {
Around around{with_};
return RD::length(str);
}

void getStringData(
const jsi::String& str,
void* ctx,
Expand Down
55 changes: 55 additions & 0 deletions packages/react-native/ReactCommon/jsi/jsi/test/testlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,61 @@ TEST_P(JSITest, StringLengthTest) {
EXPECT_EQ(invalid.length(rt), 2);
}

TEST_P(JSITest, DecoratorForwardsStringLength) {
// Decorators should forward length(const String&) to the decorated runtime
// instead of falling back to the default Runtime::length, which copies the
// string via utf16() and bypasses the runtime's own implementation.
class Inner : public RuntimeDecorator<Runtime, Runtime> {
public:
explicit Inner(Runtime& rt) : RuntimeDecorator(rt) {}

size_t length(const String&) override {
++lengthCalls;
return 42;
}

std::u16string utf16(const String& str) override {
++utf16Calls;
return RuntimeDecorator::utf16(str);
}

int lengthCalls = 0;
int utf16Calls = 0;
};

class Outer : public RuntimeDecorator<Runtime, Runtime> {
public:
explicit Outer(Runtime& rt) : RuntimeDecorator(rt) {}
};

struct Count {
void before() {
++beforeCalls;
}
void after() {
++afterCalls;
}
int beforeCalls = 0;
int afterCalls = 0;
};

Inner inner(rt);
String str = String::createFromAscii(inner, "hello");

Outer outer(inner);
EXPECT_EQ(str.length(outer), 42);
EXPECT_EQ(inner.lengthCalls, 1);
EXPECT_EQ(inner.utf16Calls, 0);

Count count;
WithRuntimeDecorator<Count> with(inner, count);
EXPECT_EQ(str.length(with), 42);
EXPECT_EQ(inner.lengthCalls, 2);
EXPECT_EQ(inner.utf16Calls, 0);
EXPECT_EQ(count.beforeCalls, 1);
EXPECT_EQ(count.afterCalls, 1);
}

TEST_P(JSITest, ObjectTest) {
eval("x = {1:2, '3':4, 5:'six', 'seven':['eight', 'nine']}");
Object x = rt.global().getPropertyAsObject(rt, "x");
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -12775,6 +12775,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -12893,6 +12894,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -12391,6 +12391,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -12509,6 +12510,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -12622,6 +12622,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -12740,6 +12741,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -14544,6 +14544,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -14662,6 +14663,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -14226,6 +14226,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -14344,6 +14345,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -14401,6 +14401,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -14519,6 +14520,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -9730,6 +9730,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -9848,6 +9849,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -9554,6 +9554,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -9672,6 +9673,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
2 changes: 2 additions & 0 deletions scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api
Original file line number Diff line number Diff line change
Expand Up @@ -9721,6 +9721,7 @@ class facebook::jsi::RuntimeDecorator : public facebook::jsi::Runtime {
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down Expand Up @@ -9839,6 +9840,7 @@ class facebook::jsi::WithRuntimeDecorator : public facebook::jsi::RuntimeDecorat
protected virtual facebook::jsi::WeakObject createWeakObject(const facebook::jsi::Object& o) override;
protected virtual size_t byteLength(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t byteOffset(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t length(const facebook::jsi::String& str) override;
protected virtual size_t length(const facebook::jsi::TypedArray& typedArray) override;
protected virtual size_t push(const facebook::jsi::Array& a, const facebook::jsi::Value* elements, size_t count) override;
protected virtual size_t size(const facebook::jsi::Array& a) override;
Expand Down
Loading