mirror of
https://github.com/wgh136/flutter_qjs.git
synced 2025-09-27 21:37:24 +00:00
add option to change max stack size.
This commit is contained in:
@@ -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.
|
||||||
|
@@ -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();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
13
lib/ffi.dart
13
lib/ffi.dart
@@ -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,
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
);
|
);
|
||||||
|
@@ -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:
|
||||||
|
Reference in New Issue
Block a user