@mentra/crust 3.3.0-dev.656 → 3.3.0-dev.658
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/android/build.gradle +15 -40
- package/android/src/main/java/com/mentra/crust/jsc/JSCRuntime.kt +13 -4
- package/android/src/test/java/com/mentra/crust/jsc/QuickJsLifecycleTest.kt +87 -0
- package/package.json +2 -2
- package/plugin/build/index.d.ts +2 -0
- package/plugin/build/index.js +2 -0
- package/plugin/build/withAndroid.js +39 -0
- package/android/quickjs-consumer-rules.pro +0 -6
- package/android/scripts/test-quickjs-lifecycle.py +0 -45
- package/android/src/main/cpp/quickjs/CMakeLists.txt +0 -20
- package/android/src/main/cpp/quickjs/LICENSE.quickjs-kt.txt +0 -201
- package/android/src/main/cpp/quickjs/README.md +0 -30
- package/android/src/main/cpp/quickjs/c-vector/LICENSE +0 -21
- package/android/src/main/cpp/quickjs/c-vector/cvector.h +0 -479
- package/android/src/main/cpp/quickjs/common/quickjs_version.c +0 -9
- package/android/src/main/cpp/quickjs/common/quickjs_version.h +0 -9
- package/android/src/main/cpp/quickjs/engine/LICENSE +0 -22
- package/android/src/main/cpp/quickjs/engine/VERSION +0 -1
- package/android/src/main/cpp/quickjs/engine/cutils.c +0 -631
- package/android/src/main/cpp/quickjs/engine/cutils.h +0 -347
- package/android/src/main/cpp/quickjs/engine/libbf.c +0 -8475
- package/android/src/main/cpp/quickjs/engine/libbf.h +0 -535
- package/android/src/main/cpp/quickjs/engine/libregexp-opcode.h +0 -57
- package/android/src/main/cpp/quickjs/engine/libregexp.c +0 -2501
- package/android/src/main/cpp/quickjs/engine/libregexp.h +0 -55
- package/android/src/main/cpp/quickjs/engine/libunicode-table.h +0 -4557
- package/android/src/main/cpp/quickjs/engine/libunicode.c +0 -1910
- package/android/src/main/cpp/quickjs/engine/libunicode.h +0 -182
- package/android/src/main/cpp/quickjs/engine/list.h +0 -99
- package/android/src/main/cpp/quickjs/engine/quickjs-atom.h +0 -273
- package/android/src/main/cpp/quickjs/engine/quickjs-opcode.h +0 -372
- package/android/src/main/cpp/quickjs/engine/quickjs.c +0 -55978
- package/android/src/main/cpp/quickjs/engine/quickjs.h +0 -1087
- package/android/src/main/cpp/quickjs/jni/binding_bridge.c +0 -488
- package/android/src/main/cpp/quickjs/jni/binding_bridge.h +0 -32
- package/android/src/main/cpp/quickjs/jni/exception_util.c +0 -64
- package/android/src/main/cpp/quickjs/jni/exception_util.h +0 -21
- package/android/src/main/cpp/quickjs/jni/jni_globals.c +0 -59
- package/android/src/main/cpp/quickjs/jni/jni_globals.h +0 -12
- package/android/src/main/cpp/quickjs/jni/jni_globals_generated.c +0 -855
- package/android/src/main/cpp/quickjs/jni/jni_globals_generated.h +0 -171
- package/android/src/main/cpp/quickjs/jni/js_value_util.c +0 -213
- package/android/src/main/cpp/quickjs/jni/js_value_util.h +0 -71
- package/android/src/main/cpp/quickjs/jni/log_util.h +0 -15
- package/android/src/main/cpp/quickjs/jni/mapping/jni_types_util.c +0 -27
- package/android/src/main/cpp/quickjs/jni/mapping/jni_types_util.h +0 -15
- package/android/src/main/cpp/quickjs/jni/mapping/jobject_to_js_value.c +0 -620
- package/android/src/main/cpp/quickjs/jni/mapping/jobject_to_js_value.h +0 -13
- package/android/src/main/cpp/quickjs/jni/mapping/js_value_to_jobject.c +0 -421
- package/android/src/main/cpp/quickjs/jni/mapping/js_value_to_jobject.h +0 -12
- package/android/src/main/cpp/quickjs/jni/promise_rejection_handler.c +0 -20
- package/android/src/main/cpp/quickjs/jni/promise_rejection_handler.h +0 -10
- package/android/src/main/cpp/quickjs/jni/quickjs_jni.c +0 -735
- package/android/src/main/cpp/quickjs/jni/quickjs_jni.h +0 -40
- package/android/src/testNative/QuickJsLifecycleTest.kt +0 -56
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
#include <string.h>
|
|
2
|
-
#include <stdlib.h>
|
|
3
|
-
#include "js_value_to_jobject.h"
|
|
4
|
-
#include "js_value_util.h"
|
|
5
|
-
#include "jni_globals_generated.h"
|
|
6
|
-
#include "exception_util.h"
|
|
7
|
-
#include "log_util.h"
|
|
8
|
-
#include "jni_types_util.h"
|
|
9
|
-
|
|
10
|
-
jobject to_java_string(JNIEnv *env, const char *str) {
|
|
11
|
-
return str != NULL ? (*env)->NewStringUTF(env, str) : NULL;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
void replace_dots_with_slashes(char *str) {
|
|
15
|
-
if (str == NULL) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
size_t len = strlen(str);
|
|
19
|
-
for (int i = 0; i < len; ++i) {
|
|
20
|
-
if (str[i] == '.') {
|
|
21
|
-
str[i] = '/';
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
jthrowable js_error_to_java_error(JNIEnv *env, JSContext *context, JSValue error) {
|
|
27
|
-
// Get name
|
|
28
|
-
JSValue js_name = JS_GetPropertyStr(context, error, "name");
|
|
29
|
-
|
|
30
|
-
if (JS_IsUndefined(js_name)) {
|
|
31
|
-
// Could be arbitrary types
|
|
32
|
-
const char *c_str = JS_ToCString(context, error);
|
|
33
|
-
const char *str = c_str != NULL ? c_str : "<UNSUPPORTED_ERROR>";
|
|
34
|
-
if (c_str != NULL) {
|
|
35
|
-
JS_FreeCString(context, c_str);
|
|
36
|
-
}
|
|
37
|
-
jthrowable java_error = new_qjs_exception(env, str);
|
|
38
|
-
JS_FreeValue(context, js_name);
|
|
39
|
-
return java_error;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const char *original_name = JS_ToCString(context, js_name);
|
|
43
|
-
const char *name = original_name != NULL ? original_name : "<UNKNOWN_ERROR>";
|
|
44
|
-
|
|
45
|
-
jclass java_error_cls = NULL;
|
|
46
|
-
if (original_name != NULL) {
|
|
47
|
-
char *maybe_cls_name = malloc(strlen(original_name) + 1);
|
|
48
|
-
strcpy(maybe_cls_name, original_name);
|
|
49
|
-
replace_dots_with_slashes(maybe_cls_name);
|
|
50
|
-
java_error_cls = (*env)->FindClass(env, maybe_cls_name);
|
|
51
|
-
jthrowable exception = try_catch_java_exceptions(env);
|
|
52
|
-
if (exception != NULL) {
|
|
53
|
-
java_error_cls = NULL;
|
|
54
|
-
}
|
|
55
|
-
free(maybe_cls_name);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Get message
|
|
59
|
-
JSValue js_message = JS_GetPropertyStr(context, error, "message");
|
|
60
|
-
const char *original_message = JS_ToCString(context, js_message);
|
|
61
|
-
const char *message = original_message != NULL ? original_message : "<NO_MESSAGE>";
|
|
62
|
-
|
|
63
|
-
int name_len = strlen(name);
|
|
64
|
-
int msg_len = strlen(message);
|
|
65
|
-
|
|
66
|
-
// Get stack trace
|
|
67
|
-
JSValue stack = JS_GetPropertyStr(context, error, "stack");
|
|
68
|
-
|
|
69
|
-
char *full_message;
|
|
70
|
-
if (!JS_IsUndefined(stack)) {
|
|
71
|
-
char *joined = js_array_join(context, stack, "\n");
|
|
72
|
-
const char *stack_str = joined != NULL ? joined : JS_ToCString(context, stack);
|
|
73
|
-
|
|
74
|
-
// Join
|
|
75
|
-
if (java_error_cls == NULL) {
|
|
76
|
-
// Add error name to the message
|
|
77
|
-
full_message = (char *) malloc(name_len + msg_len + strlen(stack_str) + 4);
|
|
78
|
-
sprintf(full_message, "%s: %s\n%s", name, message, stack_str);
|
|
79
|
-
} else {
|
|
80
|
-
full_message = (char *) malloc(msg_len + strlen(stack_str) + 2);
|
|
81
|
-
sprintf(full_message, "%s\n%s", message, stack_str);
|
|
82
|
-
}
|
|
83
|
-
// Free
|
|
84
|
-
if (joined != NULL) {
|
|
85
|
-
free((void *) stack_str);
|
|
86
|
-
} else {
|
|
87
|
-
JS_FreeCString(context, stack_str);
|
|
88
|
-
}
|
|
89
|
-
} else {
|
|
90
|
-
if (java_error_cls == NULL) {
|
|
91
|
-
full_message = malloc(name_len + msg_len + 3);
|
|
92
|
-
sprintf(full_message, "%s: %s", name, message);
|
|
93
|
-
} else {
|
|
94
|
-
full_message = malloc(msg_len + 1);
|
|
95
|
-
strcpy(full_message, message);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (original_name != NULL) {
|
|
100
|
-
JS_FreeCString(context, original_name);
|
|
101
|
-
}
|
|
102
|
-
if (original_message != NULL) {
|
|
103
|
-
JS_FreeCString(context, original_message);
|
|
104
|
-
}
|
|
105
|
-
JS_FreeValue(context, js_name);
|
|
106
|
-
JS_FreeValue(context, js_message);
|
|
107
|
-
JS_FreeValue(context, stack);
|
|
108
|
-
|
|
109
|
-
if (java_error_cls != NULL) {
|
|
110
|
-
jmethodID constructor = (*env)->GetMethodID(env, java_error_cls, "<init>",
|
|
111
|
-
"(Ljava/lang/String;)V");
|
|
112
|
-
jthrowable e = try_catch_java_exceptions(env);
|
|
113
|
-
if (e == NULL && constructor != NULL) {
|
|
114
|
-
jstring java_message = (*env)->NewStringUTF(env, full_message);
|
|
115
|
-
return (*env)->NewObject(env, java_error_cls, constructor, java_message);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Fallback to the default error class
|
|
120
|
-
return new_qjs_exception(env, full_message);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
jobjectArray to_java_list(JNIEnv *env, JSContext *context, JSValue value) {
|
|
124
|
-
uint32_t len, i;
|
|
125
|
-
JSValue js_arr_len = JS_GetPropertyStr(context, value, "length");
|
|
126
|
-
JS_ToUint32(context, &len, js_arr_len);
|
|
127
|
-
JS_FreeValue(context, js_arr_len);
|
|
128
|
-
// Create a new java list
|
|
129
|
-
jclass array_list_cls = cls_array_list(env);
|
|
130
|
-
jmethodID array_list_constructor = method_array_list_init_with_capacity(env);
|
|
131
|
-
jobject list = (*env)->NewObject(env, array_list_cls, array_list_constructor, len);
|
|
132
|
-
jmethodID list_add_method = method_list_add(env);
|
|
133
|
-
// Convert items
|
|
134
|
-
for (i = 0; i < len; i++) {
|
|
135
|
-
JSValue val = JS_GetPropertyUint32(context, value, i);
|
|
136
|
-
jobject item = js_value_to_jobject(env, context, val);
|
|
137
|
-
JS_FreeValue(context, val);
|
|
138
|
-
(*env)->CallBooleanMethod(env, list, list_add_method, item);
|
|
139
|
-
(*env)->DeleteLocalRef(env, item);
|
|
140
|
-
}
|
|
141
|
-
return list;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
jobject to_java_set(JNIEnv *env, JSContext *context, JSValue set) {
|
|
145
|
-
// Create a java set
|
|
146
|
-
jclass set_cls = cls_linked_hash_set(env);
|
|
147
|
-
jmethodID constructor = method_linked_hash_set_init(env);
|
|
148
|
-
jmethodID add_method = method_linked_hash_set_add(env);
|
|
149
|
-
jobject java_set = (*env)->NewObject(env, set_cls, constructor);
|
|
150
|
-
|
|
151
|
-
JSValue keys_func = JS_GetPropertyStr(context, set, "keys");
|
|
152
|
-
JSValue iterator = JS_Call(context, keys_func, set, 0, 0);
|
|
153
|
-
JSValue next_func = JS_GetPropertyStr(context, iterator, "next");
|
|
154
|
-
for (;;) {
|
|
155
|
-
JSValue entry = JS_Call(context, next_func, iterator, 0, 0);
|
|
156
|
-
|
|
157
|
-
JSValue done = JS_GetPropertyStr(context, entry, "done");
|
|
158
|
-
if (JS_ToBool(context, done)) {
|
|
159
|
-
JS_FreeValue(context, done);
|
|
160
|
-
JS_FreeValue(context, entry);
|
|
161
|
-
break;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
JSValue key = JS_GetPropertyStr(context, entry, "value");
|
|
165
|
-
|
|
166
|
-
jobject java_key = js_value_to_jobject(env, context, key);
|
|
167
|
-
// Set.add()
|
|
168
|
-
(*env)->CallBooleanMethod(env, java_set, add_method, java_key);
|
|
169
|
-
(*env)->DeleteLocalRef(env, java_key);
|
|
170
|
-
|
|
171
|
-
JS_FreeValue(context, key);
|
|
172
|
-
JS_FreeValue(context, entry);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
JS_FreeValue(context, next_func);
|
|
176
|
-
JS_FreeValue(context, iterator);
|
|
177
|
-
JS_FreeValue(context, keys_func);
|
|
178
|
-
|
|
179
|
-
return java_set;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
jobject to_java_map(JNIEnv *env, JSContext *context, JSValue map) {
|
|
183
|
-
// Create a java map
|
|
184
|
-
jclass map_cls = cls_linked_hash_map(env);
|
|
185
|
-
jmethodID constructor = method_linked_hash_map_init(env);
|
|
186
|
-
jmethodID put_method = method_linked_hash_map_put(env);
|
|
187
|
-
jobject java_map = (*env)->NewObject(env, map_cls, constructor);
|
|
188
|
-
|
|
189
|
-
JSValue entries_func = JS_GetPropertyStr(context, map, "entries");
|
|
190
|
-
JSValue iterator = JS_Call(context, entries_func, map, 0, 0);
|
|
191
|
-
JSValue next_func = JS_GetPropertyStr(context, iterator, "next");
|
|
192
|
-
for (;;) {
|
|
193
|
-
JSValue entry = JS_Call(context, next_func, iterator, 0, 0);
|
|
194
|
-
JSValue done = JS_GetPropertyStr(context, entry, "done");
|
|
195
|
-
if (JS_ToBool(context, done)) {
|
|
196
|
-
JS_FreeValue(context, done);
|
|
197
|
-
JS_FreeValue(context, entry);
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// entry_value = [key, value]
|
|
202
|
-
JSValue entry_value = JS_GetPropertyStr(context, entry, "value");
|
|
203
|
-
JSValue key = JS_GetPropertyUint32(context, entry_value, 0);
|
|
204
|
-
JSValue val = JS_GetPropertyUint32(context, entry_value, 1);
|
|
205
|
-
|
|
206
|
-
jobject java_key = js_value_to_jobject(env, context, key);
|
|
207
|
-
jobject java_val = js_value_to_jobject(env, context, val);
|
|
208
|
-
// Map.put(k, v)
|
|
209
|
-
(*env)->CallObjectMethod(env, java_map, put_method, java_key, java_val);
|
|
210
|
-
(*env)->DeleteLocalRef(env, java_key);
|
|
211
|
-
(*env)->DeleteLocalRef(env, java_val);
|
|
212
|
-
|
|
213
|
-
JS_FreeValue(context, key);
|
|
214
|
-
JS_FreeValue(context, val);
|
|
215
|
-
JS_FreeValue(context, entry_value);
|
|
216
|
-
JS_FreeValue(context, entry);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
JS_FreeValue(context, next_func);
|
|
220
|
-
JS_FreeValue(context, iterator);
|
|
221
|
-
JS_FreeValue(context, entries_func);
|
|
222
|
-
|
|
223
|
-
return java_map;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
jobject object_to_java_js_object(JNIEnv *env, JSContext *context, JSValue value) {
|
|
227
|
-
// This can check circular references for us
|
|
228
|
-
JSValue json = JS_JSONStringify(context, value, JS_UNDEFINED, JS_UNDEFINED);
|
|
229
|
-
if (JS_IsException(json)) {
|
|
230
|
-
JSValue js_err = JS_GetException(context);
|
|
231
|
-
if (!JS_IsNull(js_err)) {
|
|
232
|
-
(*env)->Throw(env, js_error_to_java_error(env, context, js_err));
|
|
233
|
-
}
|
|
234
|
-
JS_FreeValue(context, js_err);
|
|
235
|
-
JS_FreeValue(context, json);
|
|
236
|
-
return NULL;
|
|
237
|
-
}
|
|
238
|
-
JS_FreeValue(context, json);
|
|
239
|
-
|
|
240
|
-
JSPropertyEnum *props;
|
|
241
|
-
uint32_t prop_len;
|
|
242
|
-
JS_GetOwnPropertyNames(context, &props, &prop_len, value,
|
|
243
|
-
JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK);
|
|
244
|
-
// Create a java map
|
|
245
|
-
jclass map_cls = cls_linked_hash_map(env);
|
|
246
|
-
jmethodID constructor = method_linked_hash_map_init(env);
|
|
247
|
-
jmethodID put_method = method_linked_hash_map_put(env);
|
|
248
|
-
jobject java_map = (*env)->NewObject(env, map_cls, constructor);
|
|
249
|
-
|
|
250
|
-
int value_tag = JS_VALUE_GET_TAG(value);
|
|
251
|
-
void *value_ptr = JS_VALUE_GET_PTR(value);
|
|
252
|
-
|
|
253
|
-
for (uint32_t i = 0; i < prop_len; i++) {
|
|
254
|
-
JSAtom prop_atom = props[i].atom;
|
|
255
|
-
JSValue key = JS_AtomToValue(context, prop_atom);
|
|
256
|
-
JSValue val = JS_GetProperty(context, value, prop_atom);
|
|
257
|
-
|
|
258
|
-
if (JS_IsNull(key) || JS_IsUndefined(key)) {
|
|
259
|
-
goto free_values;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (JS_VALUE_GET_TAG(key) == value_tag &&
|
|
263
|
-
JS_VALUE_GET_PTR(key) == value_ptr) {
|
|
264
|
-
// Avoid infinite recursion
|
|
265
|
-
goto free_values;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
jobject java_key = js_value_to_jobject(env, context, key);
|
|
269
|
-
if (try_catch_java_exceptions(env) != NULL) {
|
|
270
|
-
goto free_values;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
jobject java_val;
|
|
274
|
-
if (JS_VALUE_GET_TAG(val) == value_tag &&
|
|
275
|
-
JS_VALUE_GET_PTR(val) == value_ptr) {
|
|
276
|
-
// Avoid infinite recursion
|
|
277
|
-
const char *val_str = JS_ToCString(context, val);
|
|
278
|
-
java_val = to_java_string(env, val_str);
|
|
279
|
-
JS_FreeCString(context, val_str);
|
|
280
|
-
} else if (JS_IsFunction(context, val)) {
|
|
281
|
-
java_val = to_java_string(env, "[Function]");
|
|
282
|
-
} else {
|
|
283
|
-
java_val = js_value_to_jobject(env, context, val);
|
|
284
|
-
if (try_catch_java_exceptions(env) != NULL) {
|
|
285
|
-
goto free_values;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Map.put(k, v)
|
|
290
|
-
(*env)->CallObjectMethod(env, java_map, put_method, java_key, java_val);
|
|
291
|
-
|
|
292
|
-
(*env)->DeleteLocalRef(env, java_key);
|
|
293
|
-
(*env)->DeleteLocalRef(env, java_val);
|
|
294
|
-
|
|
295
|
-
free_values:
|
|
296
|
-
JS_FreeValue(context, key);
|
|
297
|
-
JS_FreeValue(context, val);
|
|
298
|
-
JS_FreeAtom(context, prop_atom);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
js_free(context, props);
|
|
302
|
-
|
|
303
|
-
// Wrap java_map as JsObject
|
|
304
|
-
jclass js_object_cls = cls_js_object(env);
|
|
305
|
-
jmethodID js_object_constructor = method_js_object_init(env);
|
|
306
|
-
jobject js_object = (*env)->NewObject(env, js_object_cls, js_object_constructor, java_map);
|
|
307
|
-
|
|
308
|
-
return js_object;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
jobject js_int8array_to_java_byte_array(JNIEnv *env, JSContext *context, JSValue value) {
|
|
312
|
-
JSValue buffer = JS_GetPropertyStr(context, value, "buffer");
|
|
313
|
-
size_t size;
|
|
314
|
-
uint8_t *c_buffer = JS_GetArrayBuffer(context, &size, buffer);
|
|
315
|
-
if (c_buffer == NULL) {
|
|
316
|
-
JS_FreeValue(context, buffer);
|
|
317
|
-
jni_throw_qjs_exception(env, "Cannot read array buffer.");
|
|
318
|
-
return NULL;
|
|
319
|
-
}
|
|
320
|
-
jbyteArray array = (*env)->NewByteArray(env, size);
|
|
321
|
-
(*env)->SetByteArrayRegion(env, array, 0, size, (jbyte *) c_buffer);
|
|
322
|
-
JS_FreeValue(context, buffer);
|
|
323
|
-
return array;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
jobject js_int8array_to_kt_ubyte_array(JNIEnv *env, JSContext *context, JSValue value) {
|
|
327
|
-
jobject bytes = js_int8array_to_java_byte_array(env, context, value);
|
|
328
|
-
if (bytes == NULL) {
|
|
329
|
-
return NULL;
|
|
330
|
-
}
|
|
331
|
-
return (*env)->NewObject(env, cls_ubyte_array(env), method_ubyte_array_init(env), bytes);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
jobject try_handle_promise_result(JNIEnv *env, JSContext *context, JSValue promise) {
|
|
335
|
-
JSPromiseStateEnum state = JS_PromiseState(context, promise);
|
|
336
|
-
if (state == JS_PROMISE_FULFILLED) {
|
|
337
|
-
return (*env)->NewStringUTF(env, "Promise { <state>: \"fulfilled\" }");
|
|
338
|
-
} else if (state == JS_PROMISE_REJECTED) {
|
|
339
|
-
return (*env)->NewStringUTF(env, "Promise { <state>: \"rejected\" }");
|
|
340
|
-
} else {
|
|
341
|
-
return (*env)->NewStringUTF(env, "Promise { <state>: \"pending\" }");
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
jobject js_value_to_jobject(JNIEnv *env, JSContext *context, JSValue value) {
|
|
346
|
-
int tag = JS_VALUE_GET_TAG(value);
|
|
347
|
-
if (JS_IsNull(value) || JS_IsUndefined(value)) {
|
|
348
|
-
return NULL;
|
|
349
|
-
} else if (JS_IsBool(value)) {
|
|
350
|
-
// Boolean
|
|
351
|
-
int val = JS_ToBool(context, value);
|
|
352
|
-
return java_boxed_boolean(env, val == 1 ? JNI_TRUE : JNI_FALSE);
|
|
353
|
-
} else if (JS_VALUE_IS_NAN(value)) {
|
|
354
|
-
// NaN
|
|
355
|
-
return java_boxed_nan_double(env);
|
|
356
|
-
} else if (tag == JS_TAG_INT) {
|
|
357
|
-
// Long
|
|
358
|
-
int64_t i64;
|
|
359
|
-
JS_ToInt64(context, &i64, value);
|
|
360
|
-
return java_boxed_long(env, i64);
|
|
361
|
-
} else if (tag == JS_TAG_FLOAT64) {
|
|
362
|
-
// Double
|
|
363
|
-
double f64;
|
|
364
|
-
JS_ToFloat64(context, &f64, value);
|
|
365
|
-
return java_boxed_double(env, f64);
|
|
366
|
-
} else if (JS_IsString(value)) {
|
|
367
|
-
// String
|
|
368
|
-
const char *str = JS_ToCString(context, value);
|
|
369
|
-
jobject result = to_java_string(env, str);
|
|
370
|
-
JS_FreeCString(context, str);
|
|
371
|
-
return result;
|
|
372
|
-
} else if (JS_IsError(context, value)) {
|
|
373
|
-
// Error
|
|
374
|
-
return js_error_to_java_error(env, context, value);
|
|
375
|
-
} else if (JS_IsArray(context, value)) {
|
|
376
|
-
// Array
|
|
377
|
-
return to_java_list(env, context, value);
|
|
378
|
-
} else if (tag == JS_TAG_FUNCTION_BYTECODE || tag == JS_TAG_MODULE) {
|
|
379
|
-
// Bytecode
|
|
380
|
-
size_t length;
|
|
381
|
-
uint8_t *buffer = JS_WriteObject(context, &length, value,
|
|
382
|
-
JS_WRITE_OBJ_BYTECODE | JS_WRITE_OBJ_REFERENCE);
|
|
383
|
-
if (buffer == NULL) {
|
|
384
|
-
jni_throw_qjs_exception(env, "Failed to compiled JavaScript code.");
|
|
385
|
-
return NULL;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
jbyteArray java_buffer = (*env)->NewByteArray(env, length);
|
|
389
|
-
(*env)->SetByteArrayRegion(env, java_buffer, 0, length, (jbyte *) buffer);
|
|
390
|
-
|
|
391
|
-
js_free(context, buffer);
|
|
392
|
-
|
|
393
|
-
return java_buffer;
|
|
394
|
-
} else if (JS_IsObject(value)) {
|
|
395
|
-
JSValue global_this = JS_GetGlobalObject(context);
|
|
396
|
-
jobject result;
|
|
397
|
-
|
|
398
|
-
if (js_is_promise_2(context, global_this, value)) {
|
|
399
|
-
result = try_handle_promise_result(env, context, value);
|
|
400
|
-
} else if (js_is_set(context, global_this, value)) {
|
|
401
|
-
result = to_java_set(env, context, value);
|
|
402
|
-
} else if (js_is_map(context, global_this, value)) {
|
|
403
|
-
result = to_java_map(env, context, value);
|
|
404
|
-
} else if (js_is_uint8array(context, global_this, value)) {
|
|
405
|
-
result = js_int8array_to_kt_ubyte_array(env, context, value);
|
|
406
|
-
} else if (js_is_int8array(context, global_this, value)) {
|
|
407
|
-
result = js_int8array_to_java_byte_array(env, context, value);
|
|
408
|
-
} else {
|
|
409
|
-
result = object_to_java_js_object(env, context, value);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
JS_FreeValue(context, global_this);
|
|
413
|
-
|
|
414
|
-
return result;
|
|
415
|
-
} else {
|
|
416
|
-
const char *string = JS_ToCString(context, value);
|
|
417
|
-
jni_throw_qjs_exception(env, "Unsupported js value type: %s, tag: %d", string, tag);
|
|
418
|
-
JS_FreeCString(context, string);
|
|
419
|
-
return NULL;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
#ifndef QJS_KT_JS_VALUE_TO_JOBJECT_H
|
|
2
|
-
#define QJS_KT_JS_VALUE_TO_JOBJECT_H
|
|
3
|
-
|
|
4
|
-
#include "jni.h"
|
|
5
|
-
#include "quickjs.h"
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Convert js value to java object. Throw an exception if the value type is unsupported.
|
|
9
|
-
*/
|
|
10
|
-
jobject js_value_to_jobject(JNIEnv *env, JSContext *context, JSValue value);
|
|
11
|
-
|
|
12
|
-
#endif //QJS_KT_JS_VALUE_TO_JOBJECT_H
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#include <jni.h>
|
|
2
|
-
#include "promise_rejection_handler.h"
|
|
3
|
-
#include "jni_globals.h"
|
|
4
|
-
#include "jni_globals_generated.h"
|
|
5
|
-
#include "js_value_to_jobject.h"
|
|
6
|
-
|
|
7
|
-
void promise_rejection_handler(JSContext *ctx, JSValue promise,
|
|
8
|
-
JSValue reason,
|
|
9
|
-
int is_handled, void *opaque) {
|
|
10
|
-
JNIEnv *env = get_jni_env();
|
|
11
|
-
if (env == NULL) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
jobject host = (jobject) opaque;
|
|
15
|
-
if (!is_handled) {
|
|
16
|
-
(*env)->CallVoidMethod(env, host,
|
|
17
|
-
method_quick_js_set_unhandled_promise_rejection(env),
|
|
18
|
-
js_value_to_jobject(env, ctx, reason));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#ifndef QJS_KT_PROMISE_REJECTION_HANDLER_H
|
|
2
|
-
#define QJS_KT_PROMISE_REJECTION_HANDLER_H
|
|
3
|
-
|
|
4
|
-
#include "quickjs.h"
|
|
5
|
-
|
|
6
|
-
void promise_rejection_handler(JSContext *ctx, JSValue promise,
|
|
7
|
-
JSValue reason,
|
|
8
|
-
int is_handled, void *opaque);
|
|
9
|
-
|
|
10
|
-
#endif //QJS_KT_PROMISE_REJECTION_HANDLER_H
|