Skip to content

Commit 78a5ff6

Browse files
committed
perf(ffi): remove method host-fn from interceptor, defer to prototype
The V8 HostObject interceptor was creating and caching host functions for every method access, adding expando lookup + Value copy overhead on every call. Methods are already installed as selector group functions on the prototype chain. Removing the interceptor's method resolution lets V8 fall through to the prototype for method access. Tests: v8 710/0 (3 skipped due to unrelated build issue)
1 parent 0f07587 commit 78a5ff6

86 files changed

Lines changed: 13919 additions & 7674 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/npm_trusted_release.yml

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ on:
4444
required: false
4545
type: string
4646
default: next
47-
npm-tag:
48-
description: "Optional npm dist-tag override for publish, e.g. latest for the RN preview default install"
49-
required: false
50-
type: string
5147
dry-run:
5248
description: "Run release steps without making changes (no git push, no publish)"
5349
required: false
@@ -144,14 +140,12 @@ jobs:
144140
RELEASE_TYPE: ${{ inputs.release-type }}
145141
PACKAGE_VERSION: ${{ inputs.version }}
146142
PREID: ${{ inputs.preid }}
147-
NPM_TAG_OVERRIDE: ${{ inputs.npm-tag }}
148143
TARGET: ${{ matrix.target }}
149144
run: |
150145
set -euo pipefail
151146
release_type="$RELEASE_TYPE"
152147
package_version="$PACKAGE_VERSION"
153148
preid="$PREID"
154-
npm_tag_override="$NPM_TAG_OVERRIDE"
155149
target="$TARGET"
156150
if [ "$target" = "react-native" ]; then
157151
pkg_dir="packages/react-native"
@@ -178,20 +172,7 @@ jobs:
178172
popd >/dev/null
179173
180174
NPM_TAG=$(NPM_VERSION="$NPM_VERSION" node ./scripts/get-npm-tag.js "$npm_tag_target")
181-
if [ -n "$npm_tag_override" ]; then
182-
case "$npm_tag_override" in
183-
*[[:space:]]*)
184-
echo "Invalid npm tag override '$npm_tag_override': dist-tags cannot contain whitespace." >&2
185-
exit 1
186-
;;
187-
esac
188-
if printf '%s\n' "$npm_tag_override" | grep -Eq '^[0-9]+(\.[0-9]+)*$'; then
189-
echo "Invalid npm tag override '$npm_tag_override': dist-tags must not look like semver versions." >&2
190-
exit 1
191-
fi
192-
NPM_TAG="$npm_tag_override"
193-
fi
194-
if [ -n "$package_version" ] && [ "$release_type" = "prerelease" ] && [ -z "$npm_tag_override" ] && [ "$NPM_TAG" = "latest" ]; then
175+
if [ -n "$package_version" ] && [ "$release_type" = "prerelease" ] && [ "$NPM_TAG" = "latest" ]; then
195176
echo "Exact prerelease publishes must include a prerelease identifier (for example 9.0.0-preview.0)." >&2
196177
exit 1
197178
fi
@@ -365,7 +346,6 @@ jobs:
365346
RELEASE_TYPE: ${{ inputs.release-type }}
366347
PACKAGE_VERSION: ${{ inputs.version }}
367348
PREID: ${{ inputs.preid }}
368-
NPM_TAG_OVERRIDE: ${{ inputs.npm-tag }}
369349
DRY_RUN: ${{ inputs.dry-run }}
370350
TARGETS: ${{ needs.matrix.outputs.targets }}
371351
BUILD_RESULT: ${{ needs.build.result }}
@@ -375,7 +355,6 @@ jobs:
375355
echo "Release type: $RELEASE_TYPE"
376356
echo "Exact version: $PACKAGE_VERSION"
377357
echo "Preid: $PREID"
378-
echo "NPM tag override: $NPM_TAG_OVERRIDE"
379358
echo "Dry run: $DRY_RUN"
380359
echo "Targets: $TARGETS"
381360
echo "Build result: $BUILD_RESULT"

.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ packages/*/types
6565
SwiftBindgen
6666

6767
# Generated Objective-C/C dispatch wrappers
68-
NativeScript/ffi/*/GeneratedSignatureDispatch.inc
69-
NativeScript/ffi/*/GeneratedSignatureDispatch.inc.stamp
68+
NativeScript/ffi/napi/GeneratedSignatureDispatch.inc
69+
NativeScript/ffi/napi/GeneratedSignatureDispatch.inc.stamp
7070

7171
# React Native TurboModule package staging
7272
packages/react-native/dist/
7373
packages/react-native/ios/vendor/
7474
packages/react-native/metadata/
75-
packages/react-native/native-api/
75+
packages/react-native/native-api-jsi/

NativeScript/CMakeLists.txt

Lines changed: 52 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
2020
# Arguments
2121
set(TARGET_PLATFORM "macos" CACHE STRING "Target platform for the Objective-C bridge")
2222
set(TARGET_ENGINE "v8" CACHE STRING "Target JS engine for the NativeScript runtime")
23-
set(NS_FFI_BACKEND "auto" CACHE STRING "FFI backend: auto, napi, v8, jsc, quickjs, or hermes")
23+
set(NS_FFI_BACKEND "auto" CACHE STRING "FFI backend: auto, napi, or direct")
2424
set(NS_GSD_BACKEND "auto" CACHE STRING "Generated signature dispatch backend: auto, v8, jsc, quickjs, hermes, napi, or none")
2525
set(METADATA_SIZE 0 CACHE STRING "Size of embedded metadata in bytes")
2626
set(BUILD_CLI_BINARY OFF CACHE BOOL "Build the NativeScript CLI binary")
2727
set(BUILD_MACOS_NODE_API OFF CACHE BOOL "Build the NativeScript macOS Node API dylib")
28-
set_property(CACHE NS_FFI_BACKEND PROPERTY STRINGS auto napi v8 jsc quickjs hermes)
28+
set_property(CACHE NS_FFI_BACKEND PROPERTY STRINGS auto napi direct)
2929
set_property(CACHE NS_GSD_BACKEND PROPERTY STRINGS auto v8 jsc quickjs hermes napi none)
3030

3131
if (BUILD_MACOS_NODE_API)
@@ -139,46 +139,36 @@ message(STATUS "GENERIC_NAPI = ${GENERIC_NAPI}")
139139
if(NS_FFI_BACKEND STREQUAL "auto")
140140
if(GENERIC_NAPI OR TARGET_ENGINE_NONE)
141141
set(NS_EFFECTIVE_FFI_BACKEND "napi")
142-
elseif(TARGET_ENGINE_HERMES)
143-
set(NS_EFFECTIVE_FFI_BACKEND "hermes")
144-
elseif(TARGET_ENGINE_V8)
145-
set(NS_EFFECTIVE_FFI_BACKEND "v8")
146-
elseif(TARGET_ENGINE_JSC)
147-
set(NS_EFFECTIVE_FFI_BACKEND "jsc")
148-
elseif(TARGET_ENGINE_QUICKJS)
149-
set(NS_EFFECTIVE_FFI_BACKEND "quickjs")
142+
elseif(TARGET_ENGINE_HERMES OR TARGET_ENGINE_V8 OR TARGET_ENGINE_JSC OR TARGET_ENGINE_QUICKJS)
143+
set(NS_EFFECTIVE_FFI_BACKEND "direct")
150144
else()
151145
set(NS_EFFECTIVE_FFI_BACKEND "napi")
152146
endif()
153-
elseif(NS_FFI_BACKEND STREQUAL "napi" OR
154-
NS_FFI_BACKEND STREQUAL "v8" OR
155-
NS_FFI_BACKEND STREQUAL "jsc" OR
156-
NS_FFI_BACKEND STREQUAL "quickjs" OR
157-
NS_FFI_BACKEND STREQUAL "hermes")
147+
elseif(NS_FFI_BACKEND STREQUAL "napi" OR NS_FFI_BACKEND STREQUAL "direct")
158148
set(NS_EFFECTIVE_FFI_BACKEND "${NS_FFI_BACKEND}")
159149
else()
160150
message(FATAL_ERROR "Unknown NS_FFI_BACKEND: ${NS_FFI_BACKEND}")
161151
endif()
162152

163-
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
153+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct" AND
164154
(GENERIC_NAPI OR TARGET_ENGINE_NONE OR BUILD_MACOS_NODE_API))
165-
message(FATAL_ERROR
166-
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} requires an embedded JS runtime build")
155+
message(FATAL_ERROR "NS_FFI_BACKEND=direct requires an embedded JS runtime build")
167156
endif()
168157

169-
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
170-
NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "${TARGET_ENGINE}")
158+
message(STATUS "NS_FFI_BACKEND = ${NS_FFI_BACKEND} (${NS_EFFECTIVE_FFI_BACKEND})")
159+
160+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct" AND
161+
NOT (NS_GSD_BACKEND STREQUAL "auto" OR NS_GSD_BACKEND STREQUAL "none"))
171162
message(FATAL_ERROR
172-
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} requires TARGET_ENGINE=${NS_EFFECTIVE_FFI_BACKEND}")
163+
"NS_GSD_BACKEND is only used by the Node-API FFI backend. "
164+
"Use NS_GSD_BACKEND=auto or none with NS_FFI_BACKEND=direct.")
173165
endif()
174166

175-
message(STATUS "NS_FFI_BACKEND = ${NS_FFI_BACKEND} (${NS_EFFECTIVE_FFI_BACKEND})")
176-
177167
if(NS_GSD_BACKEND STREQUAL "auto")
178-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
179-
set(NS_EFFECTIVE_GSD_BACKEND "napi")
168+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
169+
set(NS_EFFECTIVE_GSD_BACKEND "none")
180170
else()
181-
set(NS_EFFECTIVE_GSD_BACKEND "${NS_EFFECTIVE_FFI_BACKEND}")
171+
set(NS_EFFECTIVE_GSD_BACKEND "napi")
182172
endif()
183173
elseif(NS_GSD_BACKEND STREQUAL "v8" OR
184174
NS_GSD_BACKEND STREQUAL "jsc" OR
@@ -210,18 +200,13 @@ if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
210200
"NS_FFI_BACKEND=napi is the pure Node-API FFI backend and only supports "
211201
"NS_GSD_BACKEND=napi or none.")
212202
endif()
213-
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
214-
NS_EFFECTIVE_GSD_BACKEND STREQUAL "napi")
215-
message(FATAL_ERROR
216-
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} cannot use NS_GSD_BACKEND=napi. "
217-
"Use the matching engine backend or none.")
218-
endif()
219203

220204
message(STATUS "NS_GSD_BACKEND = ${NS_GSD_BACKEND} (${NS_EFFECTIVE_GSD_BACKEND})")
221205

222206
# Set up sources
223207
include_directories(
224208
./
209+
ffi/shared
225210
../metadata-generator/include
226211
napi/common
227212
libffi/${LIBFFI_BUILD}/include
@@ -254,33 +239,33 @@ set(FFI_NAPI_SOURCE_FILES
254239
ffi/napi/ClassBuilder.mm
255240
)
256241

257-
set(FFI_ENGINE_SHARED_SOURCE_FILES
258-
ffi/shared/MetadataState.mm
242+
set(FFI_DIRECT_SHARED_SOURCE_FILES
243+
ffi/shared/direct/EmbeddedMetadata.mm
259244
)
260245

261-
set(FFI_HERMES_ENGINE_SOURCE_FILES
262-
${FFI_ENGINE_SHARED_SOURCE_FILES}
263-
ffi/hermes/NativeApiJsi.mm
246+
set(FFI_HERMES_DIRECT_SOURCE_FILES
247+
${FFI_DIRECT_SHARED_SOURCE_FILES}
248+
ffi/hermes/jsi/NativeApiJsi.mm
264249
)
265250

266-
set(FFI_V8_ENGINE_SOURCE_FILES
267-
${FFI_ENGINE_SHARED_SOURCE_FILES}
251+
set(FFI_V8_DIRECT_SOURCE_FILES
252+
${FFI_DIRECT_SHARED_SOURCE_FILES}
268253
ffi/v8/NativeApiV8.mm
269254
ffi/v8/NativeApiV8HostObjects.mm
270255
ffi/v8/NativeApiV8Runtime.mm
271256
ffi/v8/NativeApiV8Value.mm
272257
)
273258

274-
set(FFI_JSC_ENGINE_SOURCE_FILES
275-
${FFI_ENGINE_SHARED_SOURCE_FILES}
259+
set(FFI_JSC_DIRECT_SOURCE_FILES
260+
${FFI_DIRECT_SHARED_SOURCE_FILES}
276261
ffi/jsc/NativeApiJSC.mm
277262
ffi/jsc/NativeApiJSCHostObjects.mm
278263
ffi/jsc/NativeApiJSCRuntime.mm
279264
ffi/jsc/NativeApiJSCValue.mm
280265
)
281266

282-
set(FFI_QUICKJS_ENGINE_SOURCE_FILES
283-
${FFI_ENGINE_SHARED_SOURCE_FILES}
267+
set(FFI_QUICKJS_DIRECT_SOURCE_FILES
268+
${FFI_DIRECT_SHARED_SOURCE_FILES}
284269
ffi/quickjs/NativeApiQuickJSHostObjects.mm
285270
ffi/quickjs/NativeApiQuickJS.mm
286271
ffi/quickjs/NativeApiQuickJSRuntime.mm
@@ -343,10 +328,10 @@ if(ENABLE_JS_RUNTIME)
343328
napi/v8/SimpleAllocator.cpp
344329
)
345330

346-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "v8")
331+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
347332
set(SOURCE_FILES
348333
${SOURCE_FILES}
349-
${FFI_V8_ENGINE_SOURCE_FILES}
334+
${FFI_V8_DIRECT_SOURCE_FILES}
350335
)
351336
endif()
352337

@@ -374,10 +359,10 @@ if(ENABLE_JS_RUNTIME)
374359
napi/hermes/jsr.cpp
375360
)
376361

377-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "hermes")
362+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
378363
set(SOURCE_FILES
379364
${SOURCE_FILES}
380-
${FFI_HERMES_ENGINE_SOURCE_FILES}
365+
${FFI_HERMES_DIRECT_SOURCE_FILES}
381366
)
382367
endif()
383368

@@ -413,10 +398,10 @@ if(ENABLE_JS_RUNTIME)
413398
napi/quickjs/jsr.cpp
414399
)
415400

416-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "quickjs")
401+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
417402
set(SOURCE_FILES
418403
${SOURCE_FILES}
419-
${FFI_QUICKJS_ENGINE_SOURCE_FILES}
404+
${FFI_QUICKJS_DIRECT_SOURCE_FILES}
420405
)
421406
endif()
422407

@@ -432,10 +417,10 @@ if(ENABLE_JS_RUNTIME)
432417
napi/jsc/jsr.cpp
433418
)
434419

435-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "jsc")
420+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
436421
set(SOURCE_FILES
437422
${SOURCE_FILES}
438-
${FFI_JSC_ENGINE_SOURCE_FILES}
423+
${FFI_JSC_DIRECT_SOURCE_FILES}
439424
)
440425
endif()
441426

@@ -526,48 +511,40 @@ elseif(TARGET_ENGINE_JSC)
526511
target_compile_definitions(${NAME} PRIVATE TARGET_ENGINE_JSC)
527512
endif()
528513

514+
set(NS_GSD_BACKEND_V8_VALUE 0)
515+
set(NS_GSD_BACKEND_JSC_VALUE 0)
516+
set(NS_GSD_BACKEND_QUICKJS_VALUE 0)
529517
set(NS_GSD_BACKEND_HERMES_VALUE 0)
530518
set(NS_GSD_BACKEND_NAPI_VALUE 0)
531-
set(NS_GSD_BACKEND_PREPARED_VALUE 0)
519+
set(NS_FFI_BACKEND_DIRECT_VALUE 0)
532520
set(NS_FFI_BACKEND_NAPI_VALUE 0)
533-
set(NS_FFI_BACKEND_V8_VALUE 0)
534-
set(NS_FFI_BACKEND_JSC_VALUE 0)
535-
set(NS_FFI_BACKEND_QUICKJS_VALUE 0)
536-
set(NS_FFI_BACKEND_HERMES_VALUE 0)
537521

538522
if(NS_EFFECTIVE_GSD_BACKEND STREQUAL "v8")
539-
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
523+
set(NS_GSD_BACKEND_V8_VALUE 1)
540524
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "jsc")
541-
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
525+
set(NS_GSD_BACKEND_JSC_VALUE 1)
542526
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "quickjs")
543-
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
527+
set(NS_GSD_BACKEND_QUICKJS_VALUE 1)
544528
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "hermes")
545529
set(NS_GSD_BACKEND_HERMES_VALUE 1)
546530
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "napi")
547531
set(NS_GSD_BACKEND_NAPI_VALUE 1)
548532
endif()
549533

550-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
534+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
535+
set(NS_FFI_BACKEND_DIRECT_VALUE 1)
536+
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
551537
set(NS_FFI_BACKEND_NAPI_VALUE 1)
552-
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "v8")
553-
set(NS_FFI_BACKEND_V8_VALUE 1)
554-
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "jsc")
555-
set(NS_FFI_BACKEND_JSC_VALUE 1)
556-
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "quickjs")
557-
set(NS_FFI_BACKEND_QUICKJS_VALUE 1)
558-
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "hermes")
559-
set(NS_FFI_BACKEND_HERMES_VALUE 1)
560538
endif()
561539

562540
target_compile_definitions(${NAME} PRIVATE
541+
NS_GSD_BACKEND_V8=${NS_GSD_BACKEND_V8_VALUE}
542+
NS_GSD_BACKEND_JSC=${NS_GSD_BACKEND_JSC_VALUE}
543+
NS_GSD_BACKEND_QUICKJS=${NS_GSD_BACKEND_QUICKJS_VALUE}
563544
NS_GSD_BACKEND_HERMES=${NS_GSD_BACKEND_HERMES_VALUE}
564545
NS_GSD_BACKEND_NAPI=${NS_GSD_BACKEND_NAPI_VALUE}
565-
NS_GSD_BACKEND_PREPARED=${NS_GSD_BACKEND_PREPARED_VALUE}
546+
NS_FFI_BACKEND_DIRECT=${NS_FFI_BACKEND_DIRECT_VALUE}
566547
NS_FFI_BACKEND_NAPI=${NS_FFI_BACKEND_NAPI_VALUE}
567-
NS_FFI_BACKEND_V8=${NS_FFI_BACKEND_V8_VALUE}
568-
NS_FFI_BACKEND_JSC=${NS_FFI_BACKEND_JSC_VALUE}
569-
NS_FFI_BACKEND_QUICKJS=${NS_FFI_BACKEND_QUICKJS_VALUE}
570-
NS_FFI_BACKEND_HERMES=${NS_FFI_BACKEND_HERMES_VALUE}
571548
)
572549

573550
set(FRAMEWORK_VERSION_VALUE "${VERSION}")
@@ -680,13 +657,13 @@ if(TARGET_ENGINE_V8)
680657
# Prefer universal sim slice if present
681658
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework")
682659
if(NOT EXISTS "${V8_SLICE_DIR}")
683-
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework")
660+
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework") # fallback
684661
endif()
685662
elseif(TARGET_PLATFORM STREQUAL "ios")
686663
# Prefer universal sim slice if present
687664
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework")
688665
if(NOT EXISTS "${V8_SLICE_DIR}")
689-
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework")
666+
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework") # fallback
690667
endif()
691668
elseif(TARGET_PLATFORM STREQUAL "visionos-sim")
692669
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/xrsimulator-arm64/libv8_monolith.framework")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#ifndef NATIVE_API_JSI_H
2+
#define NATIVE_API_JSI_H
3+
4+
#include <functional>
5+
#include <memory>
6+
#include <utility>
7+
8+
#include <jsi/jsi.h>
9+
10+
namespace nativescript {
11+
12+
class NativeApiJsiScheduler {
13+
public:
14+
virtual ~NativeApiJsiScheduler() = default;
15+
virtual void invokeOnJS(std::function<void()> task) = 0;
16+
virtual void invokeOnUI(std::function<void()> task) = 0;
17+
};
18+
19+
struct NativeApiJsiConfig {
20+
const char* metadataPath = nullptr;
21+
const void* metadataPtr = nullptr;
22+
const char* globalName = "__nativeScriptNativeApi";
23+
std::shared_ptr<NativeApiJsiScheduler> scheduler = nullptr;
24+
std::function<void(std::function<void()>)> nativeInvocationInvoker = nullptr;
25+
std::function<void(std::function<void()>)> nativeCallbackInvoker = nullptr;
26+
std::function<void(std::function<void()>)> jsThreadCallbackInvoker = nullptr;
27+
bool installGlobalSymbols = false;
28+
};
29+
30+
facebook::jsi::Object CreateNativeApiJSI(
31+
facebook::jsi::Runtime& runtime,
32+
const NativeApiJsiConfig& config = NativeApiJsiConfig{});
33+
34+
void InstallNativeApiJSI(
35+
facebook::jsi::Runtime& runtime,
36+
const NativeApiJsiConfig& config = NativeApiJsiConfig{});
37+
38+
} // namespace nativescript
39+
40+
extern "C" void NativeScriptInstallNativeApiJSI(
41+
facebook::jsi::Runtime* runtime, const char* metadataPath);
42+
43+
#endif // NATIVE_API_JSI_H

0 commit comments

Comments
 (0)