Skip to content

Commit a7e8b25

Browse files
committed
run UI/NSApplicationMain as a task, fix for v8 napi on release mode
1 parent 2848475 commit a7e8b25

File tree

9 files changed

+105
-31
lines changed

9 files changed

+105
-31
lines changed

NativeScript/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ set(SOURCE_FILES
128128
ffi/InlineFunctions.mm
129129
ffi/ClassBuilder.mm
130130
ffi/NativeScriptException.mm
131+
ffi/Tasks.cpp
131132
)
132133

133134
if(ENABLE_JS_RUNTIME)

NativeScript/ffi/CFunction.mm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include "ClassMember.h"
33
#include "ObjCBridge.h"
44
#include "ffi/NativeScriptException.h"
5+
#include "ffi/Tasks.h"
6+
#include "jsr.h"
57

68
namespace nativescript {
79

@@ -52,7 +54,10 @@
5254
auto bridgeState = ObjCBridgeState::InstanceData(env);
5355
MDSectionOffset offset = (MDSectionOffset)((size_t)_offset);
5456

57+
auto name = bridgeState->metadata->getString(offset);
58+
5559
auto func = bridgeState->getCFunction(env, offset);
60+
5661
auto cif = func->cif;
5762

5863
size_t argc = cif->argc;
@@ -72,6 +77,31 @@
7277
}
7378
}
7479

80+
81+
if (strcmp(name, "UIApplicationMain") == 0 || strcmp(name, "NSApplicationMain") == 0) {
82+
void **avaluesPtr = new void*[cif->argc];
83+
memcpy(avaluesPtr, avalues, cif->argc * sizeof(void*));
84+
85+
Tasks::Register([env, cif, func, rvalue, avaluesPtr]() {
86+
NapiScope scope(env);
87+
88+
void * avalues[cif->argc];
89+
memcpy(avalues, avaluesPtr, cif->argc * sizeof(void*));
90+
delete[] avaluesPtr;
91+
92+
@try {
93+
ffi_call(&cif->cif, FFI_FN(func->fnptr), rvalue, avalues);
94+
} @catch (NSException* exception) {
95+
std::string message = exception.description.UTF8String;
96+
NSLog(@"ObjC->JS: Exception in CFunction (task): %s", message.c_str());
97+
nativescript::NativeScriptException nativeScriptException(message);
98+
nativeScriptException.ReThrowToJS(env);
99+
}
100+
});
101+
102+
return nullptr;
103+
}
104+
75105
@try {
76106
ffi_call(&cif->cif, FFI_FN(func->fnptr), rvalue, avalues);
77107
} @catch (NSException* exception) {

NativeScript/ffi/ClassMember.mm

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,7 @@ napi_value JS_NSObject_alloc(napi_env env, napi_callback_info cbinfo) {
144144
}
145145
}
146146

147-
inline bool objcNativeCall(napi_env env, napi_value jsThis, Cif* cif, id self, void** avalues,
148-
void* rvalue) {
147+
inline bool objcNativeCall(napi_env env, Cif* cif, id self, void** avalues, void* rvalue) {
149148
bool classMethod = class_isMetaClass(object_getClass(self));
150149

151150
bool supercall = classMethod
@@ -252,7 +251,7 @@ inline id assertSelf(napi_env env, napi_value jsThis) {
252251

253252
id rvalue;
254253

255-
if (!objcNativeCall(env, jsThis, cif, self, avalues, &rvalue)) {
254+
if (!objcNativeCall(env, cif, self, avalues, &rvalue)) {
256255
return nullptr;
257256
}
258257

@@ -319,7 +318,7 @@ inline id assertSelf(napi_env env, napi_value jsThis) {
319318
}
320319
}
321320

322-
if (!objcNativeCall(env, jsThis, cif, self, avalues, rvalue)) {
321+
if (!objcNativeCall(env, cif, self, avalues, rvalue)) {
323322
return nullptr;
324323
}
325324

@@ -361,7 +360,7 @@ inline id assertSelf(napi_env env, napi_value jsThis) {
361360
void* avalues[2] = {&self, &method->methodOrGetter.selector};
362361
void* rvalue = cif->rvalue;
363362

364-
if (!objcNativeCall(env, jsThis, cif, self, avalues, rvalue)) {
363+
if (!objcNativeCall(env, cif, self, avalues, rvalue)) {
365364
return nullptr;
366365
}
367366

@@ -403,7 +402,7 @@ inline id assertSelf(napi_env env, napi_value jsThis) {
403402
bool shouldFree = false;
404403
cif->argTypes[0]->toNative(env, argv, avalues[2], &shouldFree, &shouldFree);
405404

406-
if (!objcNativeCall(env, jsThis, cif, self, avalues, rvalue)) {
405+
if (!objcNativeCall(env, cif, self, avalues, rvalue)) {
407406
return nullptr;
408407
}
409408

NativeScript/ffi/Tasks.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "Tasks.h"
2+
3+
namespace nativescript {
4+
5+
void Tasks::Register(std::function<void()> task) {
6+
tasks_.push_back(task);
7+
}
8+
9+
void Tasks::Drain() {
10+
auto i = std::begin(tasks_);
11+
while (i != std::end(tasks_)) {
12+
std::function<void()> task = *i;
13+
task();
14+
i = tasks_.erase(i);
15+
++i;
16+
}
17+
}
18+
19+
void Tasks::ClearTasks() {
20+
tasks_.clear();
21+
}
22+
23+
std::vector<std::function<void()>> Tasks::tasks_;
24+
25+
}

NativeScript/ffi/Tasks.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef Tasks_h
2+
#define Tasks_h
3+
4+
#include <vector>
5+
#include <functional>
6+
7+
namespace nativescript {
8+
9+
class Tasks {
10+
public:
11+
static void Register(std::function<void()> task);
12+
static void Drain();
13+
static void ClearTasks();
14+
private:
15+
static std::vector<std::function<void()>> tasks_;
16+
};
17+
18+
}
19+
20+
#endif /* Tasks_h */

NativeScript/napi/v8/v8-api.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -641,9 +641,8 @@ inline napi_status Wrap(napi_env env, napi_value js_object, void* native_object,
641641
env->isolate,
642642
v8::String::NewFromUtf8(env->isolate, "napi_private").ToLocalChecked());
643643

644-
CHECK(obj->SetPrivate(context, pkey,
645-
v8::External::New(env->isolate, reference))
646-
.FromJust());
644+
obj->SetPrivate(context, pkey,
645+
v8::External::New(env->isolate, reference));
647646
}
648647

649648
return GET_RETURN_STATUS(env);

NativeScript/runtime/NativeScript.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "NativeScript.h"
22
#include "Runtime.h"
33
#include "RuntimeConfig.h"
4+
#include "ffi/Tasks.h"
45

56
using namespace nativescript;
67

@@ -25,12 +26,14 @@ - (void)runScriptString:(NSString*)script runLoop:(BOOL)runLoop {
2526
if (runLoop) {
2627
runtime_->RunLoop();
2728
}
29+
Tasks::Drain();
2830
}
2931

3032
- (void)runMainApplication {
3133
std::string spec = "./app/bundle.js";
3234
runtime_->RunModule(spec);
3335
runtime_->RunLoop();
36+
Tasks::Drain();
3437
}
3538

3639
- (bool)liveSync {

build_all_ios.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
set -e
33

44
rm -rf ./dist
5-
./update_version.sh
5+
# don't run if NO_UPDATE_VERSION is set
6+
if [ -z "$NO_UPDATE_VERSION" ]; then
7+
./update_version.sh
8+
fi
69
./build_metadata_generator.sh
710
./build_nativescript.sh --no-vision
811
./build_tklivesync.sh --no-vision

build_nativescript.sh

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ VERBOSE=$(to_bool ${VERBOSE:=false})
3232
BUILD_MACOS_CLI=$(to_bool ${BUILD_MACOS_CLI:=false})
3333
EMBED_METADATA=$(to_bool ${EMBED_METADATA:=false})
3434
CONFIG_BUILD=RelWithDebInfo
35-
CONFIG_SIMPLE=Debug
36-
37-
ANY_FRAMEWORK=$(to_bool ${ANY_FRAMEWORK:=false})
38-
if $BUILD_CATALYST || $BUILD_IPHONE || $BUILD_SIMULATOR || $BUILD_VISION || $BUILD_MACOS; then
39-
ANY_FRAMEWORK=$(to_bool ${ANY_FRAMEWORK:=true})
40-
fi
4135

4236
TARGET_ENGINE=${TARGET_ENGINE:=v8} # default to v8 for compat
4337
METADATA_SIZE=${METADATA_SIZE:=0}
@@ -153,34 +147,34 @@ fi
153147

154148
XCFRAMEWORKS=()
155149
if $BUILD_CATALYST; then
156-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/catalyst/$CONFIG_SIMPLE-maccatalyst/NativeScript.framework"
157-
-debug-symbols "$DIST/intermediates/catalyst/$CONFIG_SIMPLE-maccatalyst/NativeScript.framework.dSYM" )
150+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/catalyst/$CONFIG_BUILD-maccatalyst/NativeScript.framework"
151+
-debug-symbols "$DIST/intermediates/catalyst/$CONFIG_BUILD-maccatalyst/NativeScript.framework.dSYM" )
158152
fi
159153

160154
if $BUILD_SIMULATOR; then
161-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/ios-sim/$CONFIG_SIMPLE-iphonesimulator/NativeScript.framework"
162-
-debug-symbols "$DIST/intermediates/ios-sim/$CONFIG_SIMPLE-iphonesimulator/NativeScript.framework.dSYM" )
155+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/ios-sim/$CONFIG_BUILD-iphonesimulator/NativeScript.framework"
156+
-debug-symbols "$DIST/intermediates/ios-sim/$CONFIG_BUILD-iphonesimulator/NativeScript.framework.dSYM" )
163157
fi
164158

165159
if $BUILD_IPHONE; then
166-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/ios/$CONFIG_SIMPLE-iphoneos/NativeScript.framework"
167-
-debug-symbols "$DIST/intermediates/ios/$CONFIG_SIMPLE-iphoneos/NativeScript.framework.dSYM" )
160+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/ios/$CONFIG_BUILD-iphoneos/NativeScript.framework"
161+
-debug-symbols "$DIST/intermediates/ios/$CONFIG_BUILD-iphoneos/NativeScript.framework.dSYM" )
168162
fi
169163

170164
if $BUILD_MACOS; then
171-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/macos/$CONFIG_SIMPLE/NativeScript.framework"
172-
-debug-symbols "$DIST/intermediates/macos/$CONFIG_SIMPLE/NativeScript.framework.dSYM" )
165+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/macos/$CONFIG_BUILD/NativeScript.framework"
166+
-debug-symbols "$DIST/intermediates/macos/$CONFIG_BUILD/NativeScript.framework.dSYM" )
173167
fi
174168

175169
if $BUILD_VISION; then
176-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/visionos/$CONFIG_SIMPLE-xros/NativeScript.framework"
177-
-debug-symbols "$DIST/intermediates/visionos/$CONFIG_SIMPLE-xros/NativeScript.framework.dSYM" )
170+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/visionos/$CONFIG_BUILD-xros/NativeScript.framework"
171+
-debug-symbols "$DIST/intermediates/visionos/$CONFIG_BUILD-xros/NativeScript.framework.dSYM" )
178172

179-
XCFRAMEWORKS+=( -framework "$DIST/intermediates/visionos-sim/$CONFIG_SIMPLE-xros/NativeScript.framework"
180-
-debug-symbols "$DIST/intermediates/visionos-sim/$CONFIG_SIMPLE-xros/NativeScript.framework.dSYM" )
173+
XCFRAMEWORKS+=( -framework "$DIST/intermediates/visionos-sim/$CONFIG_BUILD-xros/NativeScript.framework"
174+
-debug-symbols "$DIST/intermediates/visionos-sim/$CONFIG_BUILD-xros/NativeScript.framework.dSYM" )
181175
fi
182176

183-
if $ANY_FRAMEWORK; then
177+
if [[ -n "${XCFRAMEWORKS[@]}" ]]; then
184178

185179
checkpoint "Creating NativeScript.xcframework"
186180
OUTPUT_DIR="$DIST/NativeScript.xcframework"
@@ -193,15 +187,15 @@ if $BUILD_MACOS; then
193187

194188
checkpoint "Creating NativeScript.node"
195189

196-
cp -r "$DIST/intermediates/macos/$CONFIG_SIMPLE/libNativeScript.dylib" "$DIST/NativeScript.node"
190+
cp -r "$DIST/intermediates/macos/$CONFIG_BUILD/libNativeScript.dylib" "$DIST/NativeScript.node"
197191

198192
fi
199193

200194
if $BUILD_MACOS_CLI; then
201195

202196
checkpoint "Creating NativeScript CLI"
203197

204-
cp -r "$DIST/intermediates/macos/$CONFIG_SIMPLE/NativeScript" "$DIST/nsr"
198+
cp -r "$DIST/intermediates/macos/$CONFIG_BUILD/NativeScript" "$DIST/nsr"
205199

206200
fi
207201

0 commit comments

Comments
 (0)