diff --git a/library/src/main/c/quickjs-jni.c b/library/src/main/c/quickjs-jni.c index 2f45eff..6b193a3 100644 --- a/library/src/main/c/quickjs-jni.c +++ b/library/src/main/c/quickjs-jni.c @@ -47,6 +47,18 @@ Java_com_hippo_quickjs_android_QuickJS_setRuntimeMallocLimit( JS_SetMemoryLimit(qj_rt->rt, (size_t) malloc_limit); } +JNIEXPORT void JNICALL +Java_com_hippo_quickjs_android_QuickJS_setRuntimeMaxStackSize( + JNIEnv *env, + jclass __unused clazz, + jlong runtime, + jint stack_size +) { + QJRuntime *qj_rt = (QJRuntime *) runtime; + CHECK_NULL(env, qj_rt, MSG_NULL_JS_RUNTIME); + JS_SetMaxStackSize(qj_rt->rt, (size_t) stack_size); +} + static int on_interrupt(JSRuntime __unused *rt, void *opaque) { int result = 0; diff --git a/library/src/main/java/com/hippo/quickjs/android/JSRuntime.java b/library/src/main/java/com/hippo/quickjs/android/JSRuntime.java index 7bf81d2..015ff52 100644 --- a/library/src/main/java/com/hippo/quickjs/android/JSRuntime.java +++ b/library/src/main/java/com/hippo/quickjs/android/JSRuntime.java @@ -59,6 +59,21 @@ public synchronized void setMallocLimit(int mallocLimit) { QuickJS.setRuntimeMallocLimit(pointer, mallocLimit); } + /** + * Set max stack size for this JSRuntime. + * Only positive number and {@code 0} are accepted. + * {@code 0} for no stack size check. + */ + public synchronized void setMaxStackSize(int stackSize) { + checkClosed(); + + if (stackSize < 0) { + throw new IllegalArgumentException("Only positive number and 0 are accepted as max stack size"); + } + + QuickJS.setRuntimeMaxStackSize(pointer, stackSize); + } + /** * Set the InterruptHandler for this JSRuntime. * {@link InterruptHandler#onInterrupt()} is called every 10000 js instructions. diff --git a/library/src/main/java/com/hippo/quickjs/android/QuickJS.java b/library/src/main/java/com/hippo/quickjs/android/QuickJS.java index 7b68dd7..af551a2 100644 --- a/library/src/main/java/com/hippo/quickjs/android/QuickJS.java +++ b/library/src/main/java/com/hippo/quickjs/android/QuickJS.java @@ -109,6 +109,7 @@ public QuickJS build() { static native long createRuntime(); static native void setRuntimeMallocLimit(long runtime, int mallocLimit); + static native void setRuntimeMaxStackSize(long runtime, int stackSize); static native void setRuntimeInterruptHandler(long runtime, JSRuntime.InterruptHandler interruptHandler); static native void destroyRuntime(long runtime);