mirror of
https://github.com/wgh136/flutter_qjs.git
synced 2025-09-26 21:27:23 +00:00
v0.3.4
This commit is contained in:
3
.github/workflows/test.yml
vendored
3
.github/workflows/test.yml
vendored
@@ -20,7 +20,6 @@ jobs:
|
||||
- name: Flutter action
|
||||
uses: subosito/flutter-action@v1
|
||||
with:
|
||||
channel: "stable"
|
||||
flutter-version: "1.22.4"
|
||||
channel: beta
|
||||
- run: flutter pub get
|
||||
- run: flutter test test/flutter_qjs_test.dart
|
@@ -6,6 +6,10 @@
|
||||
* @LastEditTime: 2020-12-02 11:36:40
|
||||
-->
|
||||
|
||||
## 0.3.4
|
||||
|
||||
* upgrade ffi to 1.0.0.
|
||||
|
||||
## 0.3.3
|
||||
|
||||
* remove `JSInvokable.call`.
|
||||
|
@@ -58,7 +58,7 @@ class CodeInputController extends TextEditingController {
|
||||
String oldText = oldSpan.toPlainText();
|
||||
String newText = value.text;
|
||||
if (oldText == newText) return oldSpan;
|
||||
(spanCall?.timeout(Duration.zero) ?? Future.delayed(Duration.zero))
|
||||
(spanCall?.timeout(Duration.zero) ?? Future.value())
|
||||
.then((_) => spanCall = compute(_convert, value.text).then((lsSpan) {
|
||||
TextSpan newSpan = TextSpan(style: style, children: lsSpan);
|
||||
if (newSpan.toPlainText() == value.text) oldSpan = newSpan;
|
||||
|
@@ -53,7 +53,6 @@ class _TestPageState extends State<TestPage> {
|
||||
if (engine != null) return;
|
||||
engine = IsolateQjs(
|
||||
moduleHandler: (String module) async {
|
||||
if (module == "test") return "export default '${new DateTime.now()}'";
|
||||
return await rootBundle.loadString(
|
||||
"js/" + module.replaceFirst(new RegExp(r".js$"), "") + ".js");
|
||||
},
|
||||
|
@@ -7,56 +7,56 @@ packages:
|
||||
name: async
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.5.0-nullsafety.3"
|
||||
version: "2.5.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.3"
|
||||
version: "2.1.0"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.5"
|
||||
version: "1.1.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.3"
|
||||
version: "1.1.0"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.15.0-nullsafety.5"
|
||||
version: "1.15.0"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
version: "1.0.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
@@ -75,7 +75,7 @@ packages:
|
||||
path: ".."
|
||||
relative: true
|
||||
source: path
|
||||
version: "0.3.3"
|
||||
version: "0.3.4"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@@ -94,21 +94,21 @@ packages:
|
||||
name: matcher
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.12.10-nullsafety.3"
|
||||
version: "0.12.10"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.3.0-nullsafety.6"
|
||||
version: "1.3.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.8.0-nullsafety.3"
|
||||
version: "1.8.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
@@ -120,56 +120,56 @@ packages:
|
||||
name: source_span
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.8.0-nullsafety.4"
|
||||
version: "1.8.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.10.0-nullsafety.6"
|
||||
version: "1.10.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.3"
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.3"
|
||||
version: "1.1.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.2.19-nullsafety.6"
|
||||
version: "0.2.19"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.3.0-nullsafety.5"
|
||||
version: "1.3.0"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.5"
|
||||
version: "2.1.0"
|
||||
sdks:
|
||||
dart: ">=2.12.0-0.0 <3.0.0"
|
||||
flutter: ">=1.20.0 <2.0.0"
|
||||
dart: ">=2.12.0-259.9.beta <3.0.0"
|
||||
flutter: ">=1.20.0"
|
||||
|
@@ -15,8 +15,8 @@ typedef _JsHostPromiseRejectionHandler = void Function(dynamic reason);
|
||||
|
||||
/// Quickjs engine for flutter.
|
||||
class FlutterQjs {
|
||||
Pointer _rt;
|
||||
Pointer _ctx;
|
||||
Pointer<JSRuntime> _rt;
|
||||
Pointer<JSContext> _ctx;
|
||||
|
||||
/// Max stack size for quickjs.
|
||||
final int stackSize;
|
||||
@@ -42,10 +42,10 @@ class FlutterQjs {
|
||||
try {
|
||||
switch (type) {
|
||||
case JSChannelType.METHON:
|
||||
final pdata = ptr.cast<Pointer>();
|
||||
final pdata = ptr.cast<Pointer<JSValue>>();
|
||||
final argc = pdata.elementAt(1).value.cast<Int32>().value;
|
||||
List pargs = [];
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
final pargs = [];
|
||||
for (var i = 0; i < argc; ++i) {
|
||||
pargs.add(_jsToDart(
|
||||
ctx,
|
||||
Pointer.fromAddress(
|
||||
@@ -53,7 +53,10 @@ class FlutterQjs {
|
||||
),
|
||||
));
|
||||
}
|
||||
JSInvokable func = _jsToDart(ctx, pdata.elementAt(3).value);
|
||||
final JSInvokable func = _jsToDart(
|
||||
ctx,
|
||||
pdata.elementAt(3).value,
|
||||
);
|
||||
return _dartToJs(
|
||||
ctx,
|
||||
func.invoke(
|
||||
@@ -68,7 +71,7 @@ class FlutterQjs {
|
||||
Future.microtask(() {
|
||||
malloc.free(ret);
|
||||
});
|
||||
return ret;
|
||||
return ret.cast();
|
||||
case JSChannelType.PROMISE_TRACK:
|
||||
final err = _parseJSException(ctx, ptr);
|
||||
if (hostPromiseRejectionHandler != null) {
|
||||
@@ -76,29 +79,29 @@ class FlutterQjs {
|
||||
} else {
|
||||
print('unhandled promise rejection: $err');
|
||||
}
|
||||
return Pointer.fromAddress(0);
|
||||
return nullptr;
|
||||
case JSChannelType.FREE_OBJECT:
|
||||
Pointer rt = ctx;
|
||||
final rt = ctx.cast<JSRuntime>();
|
||||
_DartObject obj = _DartObject.fromAddress(rt, ptr.address);
|
||||
obj?.free();
|
||||
return Pointer.fromAddress(0);
|
||||
return nullptr;
|
||||
}
|
||||
throw JSError('call channel with wrong type');
|
||||
} catch (e) {
|
||||
if (type == JSChannelType.FREE_OBJECT) {
|
||||
print('DartObject release error: $e');
|
||||
return Pointer.fromAddress(0);
|
||||
return nullptr;
|
||||
}
|
||||
if (type == JSChannelType.MODULE) {
|
||||
print('host Promise Rejection Handler error: $e');
|
||||
return Pointer.fromAddress(0);
|
||||
return nullptr;
|
||||
}
|
||||
final throwObj = _dartToJs(ctx, e);
|
||||
final err = jsThrow(ctx, throwObj);
|
||||
jsFreeValue(ctx, throwObj);
|
||||
if (type == JSChannelType.MODULE) {
|
||||
jsFreeValue(ctx, err);
|
||||
return Pointer.fromAddress(0);
|
||||
return nullptr;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
487
lib/src/ffi.dart
487
lib/src/ffi.dart
File diff suppressed because it is too large
Load Diff
@@ -115,21 +115,19 @@ void _runJsIsolate(Map spawnMessage) async {
|
||||
},
|
||||
moduleHandler: (name) {
|
||||
final ptr = calloc<Pointer<Utf8>>();
|
||||
ptr.value = Pointer.fromAddress(0);
|
||||
ptr.value = Pointer.fromAddress(ptr.address);
|
||||
sendPort.send({
|
||||
#type: #module,
|
||||
#name: name,
|
||||
#ptr: ptr.address,
|
||||
});
|
||||
while (ptr.value.address == 0) sleep(Duration.zero);
|
||||
if (ptr.value.address == -1) throw JSError('Module Not found');
|
||||
final ret = ptr.value.toDartString();
|
||||
sendPort.send({
|
||||
#type: #release,
|
||||
#ptr: ptr.value.address,
|
||||
});
|
||||
while (ptr.value.address == ptr.address) sleep(Duration(microseconds: 1));
|
||||
final ret = ptr.value;
|
||||
malloc.free(ptr);
|
||||
return ret;
|
||||
if (ret.address == -1) throw JSError('Module Not found');
|
||||
final retString = ret.toDartString();
|
||||
malloc.free(ret);
|
||||
return retString;
|
||||
},
|
||||
);
|
||||
port.listen((msg) async {
|
||||
@@ -225,9 +223,6 @@ class IsolateQjs {
|
||||
ptr.value = Pointer.fromAddress(-1);
|
||||
}
|
||||
break;
|
||||
case #release:
|
||||
malloc.free(Pointer.fromAddress(msg[#ptr]));
|
||||
break;
|
||||
}
|
||||
}, onDone: () {
|
||||
close();
|
||||
|
@@ -49,7 +49,7 @@ class _DartFunction extends JSInvokable {
|
||||
|
||||
class _DartObject extends JSRef implements JSRefLeakable {
|
||||
Object _obj;
|
||||
Pointer _ctx;
|
||||
Pointer<JSContext> _ctx;
|
||||
_DartObject(this._ctx, this._obj) {
|
||||
if (_obj is JSRef) {
|
||||
(_obj as JSRef).dup();
|
||||
@@ -57,7 +57,7 @@ class _DartObject extends JSRef implements JSRefLeakable {
|
||||
runtimeOpaques[jsGetRuntime(_ctx)]?.addRef(this);
|
||||
}
|
||||
|
||||
static _DartObject fromAddress(Pointer rt, int val) {
|
||||
static _DartObject fromAddress(Pointer<JSRuntime> rt, int val) {
|
||||
return runtimeOpaques[rt]?.getRef((e) => identityHashCode(e) == val);
|
||||
}
|
||||
|
||||
@@ -116,12 +116,12 @@ class JSError extends _IsolateEncodable {
|
||||
/// JS Object reference
|
||||
/// call [release] to release js object.
|
||||
class _JSObject extends JSRef {
|
||||
Pointer _val;
|
||||
Pointer _ctx;
|
||||
Pointer<JSValue> _val;
|
||||
Pointer<JSContext> _ctx;
|
||||
|
||||
/// Create
|
||||
_JSObject(this._ctx, Pointer _val) {
|
||||
Pointer rt = jsGetRuntime(_ctx);
|
||||
_JSObject(this._ctx, Pointer<JSValue> _val) {
|
||||
final rt = jsGetRuntime(_ctx);
|
||||
this._val = jsDupValue(_ctx, _val);
|
||||
runtimeOpaques[rt]?.addRef(this);
|
||||
}
|
||||
@@ -129,7 +129,7 @@ class _JSObject extends JSRef {
|
||||
@override
|
||||
void destroy() {
|
||||
if (_val == null) return;
|
||||
Pointer rt = jsGetRuntime(_ctx);
|
||||
final rt = jsGetRuntime(_ctx);
|
||||
runtimeOpaques[rt]?.removeRef(this);
|
||||
jsFreeValue(_ctx, _val);
|
||||
_val = null;
|
||||
@@ -145,11 +145,11 @@ class _JSObject extends JSRef {
|
||||
|
||||
/// JS function wrapper
|
||||
class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {
|
||||
_JSFunction(Pointer ctx, Pointer val) : super(ctx, val);
|
||||
_JSFunction(Pointer<JSContext> ctx, Pointer<JSValue> val) : super(ctx, val);
|
||||
|
||||
@override
|
||||
invoke(List<dynamic> arguments, [dynamic thisVal]) {
|
||||
Pointer jsRet = _invoke(arguments, thisVal);
|
||||
final jsRet = _invoke(arguments, thisVal);
|
||||
if (jsRet == null) return;
|
||||
bool isException = jsIsException(jsRet) != 0;
|
||||
if (isException) {
|
||||
@@ -161,17 +161,17 @@ class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {
|
||||
return ret;
|
||||
}
|
||||
|
||||
Pointer _invoke(List<dynamic> arguments, [dynamic thisVal]) {
|
||||
Pointer<JSValue> _invoke(List<dynamic> arguments, [dynamic thisVal]) {
|
||||
if (_val == null) throw JSError("InternalError: JSValue released");
|
||||
List<Pointer> args = arguments
|
||||
final args = arguments
|
||||
.map(
|
||||
(e) => _dartToJs(_ctx, e),
|
||||
)
|
||||
.toList();
|
||||
Pointer jsThis = _dartToJs(_ctx, thisVal);
|
||||
Pointer jsRet = jsCall(_ctx, _val, jsThis, args);
|
||||
final jsThis = _dartToJs(_ctx, thisVal);
|
||||
final jsRet = jsCall(_ctx, _val, jsThis, args);
|
||||
jsFreeValue(_ctx, jsThis);
|
||||
for (Pointer jsArg in args) {
|
||||
for (final jsArg in args) {
|
||||
jsFreeValue(_ctx, jsArg);
|
||||
}
|
||||
return jsRet;
|
||||
@@ -255,15 +255,15 @@ class IsolateFunction extends JSInvokable implements _IsolateEncodable {
|
||||
_destroy();
|
||||
return null;
|
||||
}
|
||||
List args = _decodeData(msg[#args]);
|
||||
Map thisVal = _decodeData(msg[#thisVal]);
|
||||
final List args = _decodeData(msg[#args]);
|
||||
final thisVal = _decodeData(msg[#thisVal]);
|
||||
return _invokable.invoke(args, thisVal);
|
||||
}
|
||||
|
||||
@override
|
||||
Future invoke(List positionalArguments, [thisVal]) async {
|
||||
List dArgs = _encodeData(positionalArguments);
|
||||
Map dThisVal = _encodeData(thisVal);
|
||||
final List dArgs = _encodeData(positionalArguments);
|
||||
final dThisVal = _encodeData(thisVal);
|
||||
return _send({
|
||||
#args: dArgs,
|
||||
#thisVal: dThisVal,
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
part of '../flutter_qjs.dart';
|
||||
|
||||
dynamic _parseJSException(Pointer ctx, [Pointer perr]) {
|
||||
dynamic _parseJSException(Pointer<JSContext> ctx, [Pointer<JSValue> perr]) {
|
||||
final e = perr ?? jsGetException(ctx);
|
||||
var err;
|
||||
try {
|
||||
@@ -20,11 +20,11 @@ dynamic _parseJSException(Pointer ctx, [Pointer perr]) {
|
||||
}
|
||||
|
||||
void _definePropertyValue(
|
||||
Pointer ctx,
|
||||
Pointer obj,
|
||||
Pointer<JSContext> ctx,
|
||||
Pointer<JSValue> obj,
|
||||
dynamic key,
|
||||
dynamic val, {
|
||||
Map<dynamic, dynamic> cache,
|
||||
Map<dynamic, Pointer<JSValue>> cache,
|
||||
}) {
|
||||
final jsAtomVal = _dartToJs(ctx, key, cache: cache);
|
||||
final jsAtom = jsValueToAtom(ctx, jsAtomVal);
|
||||
@@ -39,9 +39,9 @@ void _definePropertyValue(
|
||||
jsFreeValue(ctx, jsAtomVal);
|
||||
}
|
||||
|
||||
Pointer _jsGetPropertyValue(
|
||||
Pointer ctx,
|
||||
Pointer obj,
|
||||
Pointer<JSValue> _jsGetPropertyValue(
|
||||
Pointer<JSContext> ctx,
|
||||
Pointer<JSValue> obj,
|
||||
dynamic key, {
|
||||
Map<dynamic, dynamic> cache,
|
||||
}) {
|
||||
@@ -53,7 +53,8 @@ Pointer _jsGetPropertyValue(
|
||||
return jsProp;
|
||||
}
|
||||
|
||||
Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
Pointer<JSValue> _dartToJs(Pointer<JSContext> ctx, dynamic val,
|
||||
{Map<dynamic, Pointer<JSValue>> cache}) {
|
||||
if (val == null) return jsUNDEFINED();
|
||||
if (val is Error) return _dartToJs(ctx, JSError(val, val.stackTrace));
|
||||
if (val is Exception) return _dartToJs(ctx, JSError(val));
|
||||
@@ -66,17 +67,17 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
}
|
||||
if (val is _JSObject) return jsDupValue(ctx, val._val);
|
||||
if (val is Future) {
|
||||
final resolvingFunc = malloc<Uint8>(sizeOfJSValue * 2);
|
||||
final resolvingFunc = malloc<Uint8>(sizeOfJSValue * 2).cast<JSValue>();
|
||||
final resolvingFunc2 =
|
||||
Pointer.fromAddress(resolvingFunc.address + sizeOfJSValue);
|
||||
Pointer<JSValue>.fromAddress(resolvingFunc.address + sizeOfJSValue);
|
||||
final ret = jsNewPromiseCapability(ctx, resolvingFunc);
|
||||
_JSFunction res = _jsToDart(ctx, resolvingFunc);
|
||||
_JSFunction rej = _jsToDart(ctx, resolvingFunc2);
|
||||
final _JSFunction res = _jsToDart(ctx, resolvingFunc);
|
||||
final _JSFunction rej = _jsToDart(ctx, resolvingFunc2);
|
||||
jsFreeValue(ctx, resolvingFunc, free: false);
|
||||
jsFreeValue(ctx, resolvingFunc2, free: false);
|
||||
malloc.free(resolvingFunc);
|
||||
_DartObject refRes = _DartObject(ctx, res);
|
||||
_DartObject refRej = _DartObject(ctx, rej);
|
||||
final refRes = _DartObject(ctx, res);
|
||||
final refRej = _DartObject(ctx, rej);
|
||||
res.free();
|
||||
rej.free();
|
||||
val.then((value) {
|
||||
@@ -106,7 +107,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
return jsDupValue(ctx, cache[val]);
|
||||
}
|
||||
if (val is List) {
|
||||
Pointer ret = jsNewArray(ctx);
|
||||
final ret = jsNewArray(ctx);
|
||||
cache[val] = ret;
|
||||
for (int i = 0; i < val.length; ++i) {
|
||||
_definePropertyValue(ctx, ret, i, val[i], cache: cache);
|
||||
@@ -114,7 +115,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
return ret;
|
||||
}
|
||||
if (val is Map) {
|
||||
Pointer ret = jsNewObject(ctx);
|
||||
final ret = jsNewObject(ctx);
|
||||
cache[val] = ret;
|
||||
for (MapEntry<dynamic, dynamic> entry in val.entries) {
|
||||
_definePropertyValue(ctx, ret, entry.key, entry.value, cache: cache);
|
||||
@@ -123,7 +124,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
}
|
||||
// wrap Function to JSInvokable
|
||||
final valWrap = JSInvokable._wrap(val);
|
||||
int dartObjectClassId =
|
||||
final dartObjectClassId =
|
||||
runtimeOpaques[jsGetRuntime(ctx)]?.dartObjectClassId ?? 0;
|
||||
if (dartObjectClassId == 0) return jsUNDEFINED();
|
||||
final dartObject = jsNewObjectClass(
|
||||
@@ -139,9 +140,10 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
|
||||
return dartObject;
|
||||
}
|
||||
|
||||
dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
|
||||
dynamic _jsToDart(Pointer<JSContext> ctx, Pointer<JSValue> val,
|
||||
{Map<int, dynamic> cache}) {
|
||||
if (cache == null) cache = Map();
|
||||
int tag = jsValueGetTag(val);
|
||||
final tag = jsValueGetTag(val);
|
||||
if (jsTagIsFloat64(tag) != 0) {
|
||||
return jsToFloat64(ctx, val);
|
||||
}
|
||||
@@ -160,14 +162,14 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
|
||||
rt, jsGetObjectOpaque(val, dartObjectClassId));
|
||||
if (dartObject != null) return dartObject._obj;
|
||||
}
|
||||
Pointer<IntPtr> psize = malloc<IntPtr>();
|
||||
Pointer<Uint8> buf = jsGetArrayBuffer(ctx, psize, val);
|
||||
int size = psize.value;
|
||||
final psize = malloc<IntPtr>();
|
||||
final buf = jsGetArrayBuffer(ctx, psize, val);
|
||||
final size = psize.value;
|
||||
malloc.free(psize);
|
||||
if (buf.address != 0) {
|
||||
return Uint8List.fromList(buf.asTypedList(size));
|
||||
}
|
||||
int valptr = jsValueGetPtr(val).address;
|
||||
final valptr = jsValueGetPtr(val);
|
||||
if (cache.containsKey(valptr)) {
|
||||
return cache[valptr];
|
||||
}
|
||||
@@ -181,8 +183,9 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
|
||||
jsFreeValue(ctx, pstack);
|
||||
return JSError(err, stack);
|
||||
} else if (jsIsPromise(ctx, val) != 0) {
|
||||
Pointer jsPromiseThen = _jsGetPropertyValue(ctx, val, 'then');
|
||||
_JSFunction promiseThen = _jsToDart(ctx, jsPromiseThen, cache: cache);
|
||||
final jsPromiseThen = _jsGetPropertyValue(ctx, val, 'then');
|
||||
final _JSFunction promiseThen =
|
||||
_jsToDart(ctx, jsPromiseThen, cache: cache);
|
||||
jsFreeValue(ctx, jsPromiseThen);
|
||||
final completer = Completer();
|
||||
completer.future.catchError((e) {});
|
||||
@@ -199,30 +202,34 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
|
||||
], jsPromise);
|
||||
jsPromise.free();
|
||||
promiseThen.free();
|
||||
bool isException = jsIsException(jsRet) != 0;
|
||||
final isException = jsIsException(jsRet) != 0;
|
||||
jsFreeValue(ctx, jsRet);
|
||||
if (isException) throw _parseJSException(ctx);
|
||||
return completer.future;
|
||||
} else if (jsIsArray(ctx, val) != 0) {
|
||||
Pointer jslength = _jsGetPropertyValue(ctx, val, 'length');
|
||||
int length = jsToInt64(ctx, jslength);
|
||||
List<dynamic> ret = [];
|
||||
final jslength = _jsGetPropertyValue(ctx, val, 'length');
|
||||
final length = jsToInt64(ctx, jslength);
|
||||
final ret = [];
|
||||
cache[valptr] = ret;
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (var i = 0; i < length; ++i) {
|
||||
final jsProp = _jsGetPropertyValue(ctx, val, i);
|
||||
ret.add(_jsToDart(ctx, jsProp, cache: cache));
|
||||
jsFreeValue(ctx, jsProp);
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
Pointer<Pointer> ptab = malloc<Pointer>();
|
||||
Pointer<Uint32> plen = malloc<Uint32>();
|
||||
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) return null;
|
||||
int len = plen.value;
|
||||
final ptab = malloc<Pointer<JSPropertyEnum>>();
|
||||
final plen = malloc<Uint32>();
|
||||
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) {
|
||||
malloc.free(plen);
|
||||
malloc.free(ptab);
|
||||
return null;
|
||||
}
|
||||
final len = plen.value;
|
||||
malloc.free(plen);
|
||||
Map<dynamic, dynamic> ret = Map();
|
||||
final ret = Map();
|
||||
cache[valptr] = ret;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (var i = 0; i < len; ++i) {
|
||||
final jsAtom = jsPropertyEnumGetAtom(ptab.value, i);
|
||||
final jsAtomValue = jsAtomToValue(ctx, jsAtom);
|
||||
final jsProp = jsGetProperty(ctx, val, jsAtom);
|
||||
|
40
pubspec.lock
40
pubspec.lock
@@ -7,56 +7,56 @@ packages:
|
||||
name: async
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.5.0-nullsafety.3"
|
||||
version: "2.5.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.3"
|
||||
version: "2.1.0"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.5"
|
||||
version: "1.1.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.3"
|
||||
version: "1.1.0"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.15.0-nullsafety.5"
|
||||
version: "1.15.0"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: ffi
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
version: "1.0.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
@@ -73,21 +73,21 @@ packages:
|
||||
name: matcher
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.12.10-nullsafety.3"
|
||||
version: "0.12.10"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.3.0-nullsafety.6"
|
||||
version: "1.3.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.8.0-nullsafety.3"
|
||||
version: "1.8.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
@@ -99,56 +99,56 @@ packages:
|
||||
name: source_span
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.8.0-nullsafety.4"
|
||||
version: "1.8.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.10.0-nullsafety.6"
|
||||
version: "1.10.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.3"
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0-nullsafety.3"
|
||||
version: "1.1.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0-nullsafety.3"
|
||||
version: "1.2.0"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.2.19-nullsafety.6"
|
||||
version: "0.2.19"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.3.0-nullsafety.5"
|
||||
version: "1.3.0"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0-nullsafety.5"
|
||||
version: "2.1.0"
|
||||
sdks:
|
||||
dart: ">=2.12.0-0.0 <3.0.0"
|
||||
dart: ">=2.12.0-259.9.beta <3.0.0"
|
||||
flutter: ">=1.20.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
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!
|
||||
version: 0.3.3
|
||||
version: 0.3.4
|
||||
homepage: https://github.com/ekibun/flutter_qjs
|
||||
|
||||
environment:
|
||||
@@ -26,6 +26,7 @@ flutter:
|
||||
# be modified. They are used by the tooling to maintain consistency when
|
||||
# adding or updating assets for this project.
|
||||
plugin:
|
||||
implements: flutter_qjs
|
||||
platforms:
|
||||
# This plugin project was generated without specifying any
|
||||
# platforms with the `--platform` argument. If you see the `fake_platform` map below, remove it and
|
||||
|
Reference in New Issue
Block a user