add option to change max stack size.

This commit is contained in:
ekibun
2021-01-03 21:47:14 +08:00
parent d7224dd840
commit e8ba97011a
9 changed files with 41 additions and 5 deletions

View File

@@ -6,6 +6,10 @@
* @LastEditTime: 2020-12-02 11:36:40 * @LastEditTime: 2020-12-02 11:36:40
--> -->
## 0.2.2
* add option to change max stack size.
## 0.2.1 ## 0.2.1
* code cleanup. * code cleanup.

View File

@@ -16,7 +16,9 @@ This plugin is a simple js engine for flutter using the `quickjs` project with `
Firstly, create a `FlutterQjs` object, then call `dispatch` to dispatch event loop: Firstly, create a `FlutterQjs` object, then call `dispatch` to dispatch event loop:
```dart ```dart
final engine = FlutterQjs() final engine = FlutterQjs(
stackSize: 1024 * 1024, // change stack size here.
);
engine.dispatch(); engine.dispatch();
``` ```

View File

@@ -71,6 +71,11 @@ extern "C"
return rt; return rt;
} }
DLLEXPORT void jsSetMaxStackSize(JSRuntime *rt, size_t stack_size)
{
JS_SetMaxStackSize(rt, stack_size);
}
DLLEXPORT void jsFreeRuntime(JSRuntime *rt) DLLEXPORT void jsFreeRuntime(JSRuntime *rt)
{ {
JS_SetRuntimeOpaque(rt, nullptr); JS_SetRuntimeOpaque(rt, nullptr);

View File

@@ -21,6 +21,8 @@ extern "C"
DLLEXPORT JSRuntime *jsNewRuntime(JSChannel channel); DLLEXPORT JSRuntime *jsNewRuntime(JSChannel channel);
DLLEXPORT void jsSetMaxStackSize(JSRuntime *rt, size_t stack_size);
DLLEXPORT void jsFreeRuntime(JSRuntime *rt); DLLEXPORT void jsFreeRuntime(JSRuntime *rt);
DLLEXPORT JSContext *jsNewContext(JSRuntime *rt); DLLEXPORT JSContext *jsNewContext(JSRuntime *rt);

View File

@@ -82,7 +82,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "0.2.1" version: "0.2.2"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter

View File

@@ -132,6 +132,19 @@ Pointer jsNewRuntime(
return rt; return rt;
} }
/// DLLEXPORT void jsSetMaxStackSize(JSRuntime *rt, size_t stack_size)
final void Function(
Pointer,
int,
) jsSetMaxStackSize = qjsLib
.lookup<
NativeFunction<
Void Function(
Pointer,
IntPtr,
)>>("jsSetMaxStackSize")
.asFunction();
/// void jsFreeRuntime(JSRuntime *rt) /// void jsFreeRuntime(JSRuntime *rt)
final void Function( final void Function(
Pointer, Pointer,

View File

@@ -23,6 +23,9 @@ class FlutterQjs {
Pointer _rt; Pointer _rt;
Pointer _ctx; Pointer _ctx;
/// Max stack size for quickjs.
final int stackSize;
/// Message Port for event loop. Close it to stop dispatching event loop. /// Message Port for event loop. Close it to stop dispatching event loop.
ReceivePort port = ReceivePort(); ReceivePort port = ReceivePort();
@@ -35,7 +38,7 @@ class FlutterQjs {
/// Quickjs engine for flutter. /// Quickjs engine for flutter.
/// ///
/// Pass handlers to implement js-dart interaction and resolving modules. /// Pass handlers to implement js-dart interaction and resolving modules.
FlutterQjs({this.methodHandler, this.moduleHandler}); FlutterQjs({this.methodHandler, this.moduleHandler, this.stackSize});
_ensureEngine() { _ensureEngine() {
if (_rt != null) return; if (_rt != null) return;
@@ -69,6 +72,8 @@ class FlutterQjs {
return err; return err;
} }
}, port); }, port);
if (this.stackSize != null && this.stackSize > 0)
jsSetMaxStackSize(_rt, this.stackSize);
_ctx = jsNewContextWithPromsieWrapper(_rt); _ctx = jsNewContextWithPromsieWrapper(_rt);
} }

View File

@@ -147,6 +147,7 @@ void _runJsIsolate(Map spawnMessage) async {
ReceivePort port = ReceivePort(); ReceivePort port = ReceivePort();
sendPort.send(port.sendPort); sendPort.send(port.sendPort);
var qjs = FlutterQjs( var qjs = FlutterQjs(
stackSize: spawnMessage['stackSize'],
methodHandler: methodHandler, methodHandler: methodHandler,
moduleHandler: (name) { moduleHandler: (name) {
var ptr = allocate<Pointer<Utf8>>(); var ptr = allocate<Pointer<Utf8>>();
@@ -211,6 +212,9 @@ typedef JsIsolateSpawn = void Function(SendPort sendPort);
class IsolateQjs { class IsolateQjs {
Future<SendPort> _sendPort; Future<SendPort> _sendPort;
/// Max stack size for quickjs.
final int stackSize;
/// Handler to manage js call with `channel(method, [...args])` function. /// Handler to manage js call with `channel(method, [...args])` function.
/// The function must be a top-level function or a static method. /// The function must be a top-level function or a static method.
JsMethodHandler methodHandler; JsMethodHandler methodHandler;
@@ -222,7 +226,7 @@ class IsolateQjs {
/// ///
/// Pass handlers to implement js-dart interaction and resolving modules. The `methodHandler` is /// Pass handlers to implement js-dart interaction and resolving modules. The `methodHandler` is
/// used in isolate, so **the handler function must be a top-level function or a static method**. /// used in isolate, so **the handler function must be a top-level function or a static method**.
IsolateQjs({this.methodHandler, this.moduleHandler}); IsolateQjs({this.methodHandler, this.moduleHandler, this.stackSize});
_ensureEngine() { _ensureEngine() {
if (_sendPort != null) return; if (_sendPort != null) return;
@@ -232,6 +236,7 @@ class IsolateQjs {
{ {
'port': port.sendPort, 'port': port.sendPort,
'handler': methodHandler, 'handler': methodHandler,
'stackSize': stackSize,
}, },
errorsAreFatal: true, errorsAreFatal: true,
); );

View File

@@ -1,6 +1,6 @@
name: flutter_qjs name: flutter_qjs
description: This plugin is a simple js engine for flutter using the `quickjs` project. Plugin currently supports all the platforms except web! description: This plugin is a simple js engine for flutter using the `quickjs` project. Plugin currently supports all the platforms except web!
version: 0.2.1 version: 0.2.2
homepage: https://github.com/ekibun/flutter_qjs homepage: https://github.com/ekibun/flutter_qjs
environment: environment: