From 8fb26b20af2f75320be439282837238d735a9df8 Mon Sep 17 00:00:00 2001 From: ekibun Date: Mon, 22 Feb 2021 13:07:53 +0800 Subject: [PATCH] v0.3.4 --- .github/workflows/test.yml | 3 +- CHANGELOG.md | 4 + example/lib/highlight.dart | 2 +- example/lib/main.dart | 1 - example/pubspec.lock | 44 ++-- lib/src/engine.dart | 29 ++- lib/src/ffi.dart | 487 +++++++++++++++++++------------------ lib/src/isolate.dart | 19 +- lib/src/object.dart | 36 +-- lib/src/wrapper.dart | 79 +++--- pubspec.lock | 40 +-- pubspec.yaml | 3 +- 12 files changed, 385 insertions(+), 362 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f979c1c..ec97b7c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -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 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index bd07a4b..6897691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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`. diff --git a/example/lib/highlight.dart b/example/lib/highlight.dart index cc2ece1..5316673 100644 --- a/example/lib/highlight.dart +++ b/example/lib/highlight.dart @@ -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; diff --git a/example/lib/main.dart b/example/lib/main.dart index ea3dd57..e295b8b 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -53,7 +53,6 @@ class _TestPageState extends State { 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"); }, diff --git a/example/pubspec.lock b/example/pubspec.lock index 591231c..eba0f46 100644 --- a/example/pubspec.lock +++ b/example/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: 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" diff --git a/lib/src/engine.dart b/lib/src/engine.dart index 538d3d7..b759958 100644 --- a/lib/src/engine.dart +++ b/lib/src/engine.dart @@ -15,8 +15,8 @@ typedef _JsHostPromiseRejectionHandler = void Function(dynamic reason); /// Quickjs engine for flutter. class FlutterQjs { - Pointer _rt; - Pointer _ctx; + Pointer _rt; + Pointer _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(); + final pdata = ptr.cast>(); final argc = pdata.elementAt(1).value.cast().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(); _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; } diff --git a/lib/src/ffi.dart b/lib/src/ffi.dart index 64c3af8..36f6c9c 100644 --- a/lib/src/ffi.dart +++ b/lib/src/ffi.dart @@ -95,6 +95,14 @@ class JSTag { static const FLOAT64 = 7; } +abstract class JSValue extends Opaque {} + +abstract class JSContext extends Opaque {} + +abstract class JSRuntime extends Opaque {} + +abstract class JSPropertyEnum extends Opaque {} + final DynamicLibrary _qjsLib = Platform.environment['FLUTTER_TEST'] == 'true' ? (Platform.isWindows ? DynamicLibrary.open('test/build/Debug/ffiquickjs.dll') @@ -108,40 +116,41 @@ final DynamicLibrary _qjsLib = Platform.environment['FLUTTER_TEST'] == 'true' : DynamicLibrary.process()); /// DLLEXPORT JSValue *jsThrow(JSContext *ctx, JSValue *obj) -final Pointer Function( - Pointer ctx, - Pointer obj, +final Pointer Function( + Pointer ctx, + Pointer obj, ) jsThrow = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, )>>('jsThrow') .asFunction(); /// JSValue *jsEXCEPTION() -final Pointer Function() jsEXCEPTION = _qjsLib - .lookup>('jsEXCEPTION') +final Pointer Function() jsEXCEPTION = _qjsLib + .lookup Function()>>('jsEXCEPTION') .asFunction(); /// JSValue *jsUNDEFINED() -final Pointer Function() jsUNDEFINED = _qjsLib - .lookup>('jsUNDEFINED') +final Pointer Function() jsUNDEFINED = _qjsLib + .lookup Function()>>('jsUNDEFINED') .asFunction(); -typedef _JSChannel = Pointer Function(Pointer ctx, int method, Pointer argv); -typedef _JSChannelNative = Pointer Function( - Pointer ctx, IntPtr method, Pointer argv); +typedef _JSChannel = Pointer Function( + Pointer ctx, int method, Pointer argv); +typedef _JSChannelNative = Pointer Function( + Pointer ctx, IntPtr method, Pointer argv); /// JSRuntime *jsNewRuntime(JSChannel channel) -final Pointer Function( +final Pointer Function( Pointer>, ) _jsNewRuntime = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer>, )>>('jsNewRuntime') .asFunction(); @@ -161,14 +170,20 @@ class _RuntimeOpaque { } } -final Map runtimeOpaques = Map(); +final Map, _RuntimeOpaque> runtimeOpaques = Map(); -Pointer channelDispacher(Pointer ctx, int type, Pointer argv) { - Pointer rt = type == JSChannelType.FREE_OBJECT ? ctx : jsGetRuntime(ctx); +Pointer channelDispacher( + Pointer ctx, + int type, + Pointer argv, +) { + final rt = type == JSChannelType.FREE_OBJECT + ? ctx.cast() + : jsGetRuntime(ctx); return runtimeOpaques[rt]?._channel(ctx, type, argv); } -Pointer jsNewRuntime( +Pointer jsNewRuntime( _JSChannel callback, ReceivePort port, ) { @@ -181,30 +196,30 @@ Pointer jsNewRuntime( /// DLLEXPORT void jsSetMaxStackSize(JSRuntime *rt, size_t stack_size) final void Function( - Pointer, + Pointer, int, ) jsSetMaxStackSize = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, + Pointer, IntPtr, )>>('jsSetMaxStackSize') .asFunction(); /// void jsFreeRuntime(JSRuntime *rt) final void Function( - Pointer, + Pointer, ) _jsFreeRuntime = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, + Pointer, )>>('jsFreeRuntime') .asFunction(); void jsFreeRuntime( - Pointer rt, + Pointer rt, ) { final referenceleak = []; while (true) { @@ -231,30 +246,30 @@ void jsFreeRuntime( } /// JSValue *jsNewCFunction(JSContext *ctx, JSValue *funcData) -final Pointer Function( - Pointer ctx, - Pointer funcData, +final Pointer Function( + Pointer ctx, + Pointer funcData, ) jsNewCFunction = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, )>>('jsNewCFunction') .asFunction(); /// JSContext *jsNewContext(JSRuntime *rt) -final Pointer Function( - Pointer rt, +final Pointer Function( + Pointer rt, ) _jsNewContext = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsNewContext') .asFunction(); -Pointer jsNewContext(Pointer rt) { +Pointer jsNewContext(Pointer rt) { final ctx = _jsNewContext(rt); final runtimeOpaque = runtimeOpaques[rt]; if (runtimeOpaque == null) throw Exception('Runtime has been released!'); @@ -264,29 +279,29 @@ Pointer jsNewContext(Pointer rt) { /// void jsFreeContext(JSContext *ctx) final void Function( - Pointer, + Pointer, ) jsFreeContext = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, + Pointer, )>>('jsFreeContext') .asFunction(); /// JSRuntime *jsGetRuntime(JSContext *ctx) -final Pointer Function( - Pointer, +final Pointer Function( + Pointer, ) jsGetRuntime = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsGetRuntime') .asFunction(); /// JSValue *jsEval(JSContext *ctx, const char *input, size_t input_len, const char *filename, int eval_flags) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, Pointer input, int inputLen, Pointer filename, @@ -294,8 +309,8 @@ final Pointer Function( ) _jsEval = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Pointer, IntPtr, Pointer, @@ -303,8 +318,8 @@ final Pointer Function( )>>('jsEval') .asFunction(); -Pointer jsEval( - Pointer ctx, +Pointer jsEval( + Pointer ctx, String input, String filename, int evalFlags, @@ -326,23 +341,23 @@ Pointer jsEval( /// DLLEXPORT int32_t jsValueGetTag(JSValue *val) final int Function( - Pointer val, + Pointer val, ) jsValueGetTag = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, + Pointer, )>>('jsValueGetTag') .asFunction(); /// void *jsValueGetPtr(JSValue *val) -final Pointer Function( - Pointer val, +final int Function( + Pointer val, ) jsValueGetPtr = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + IntPtr Function( + Pointer, )>>('jsValueGetPtr') .asFunction(); @@ -358,59 +373,59 @@ final int Function( .asFunction(); /// JSValue *jsNewBool(JSContext *ctx, int val) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, int val, ) jsNewBool = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Int32, )>>('jsNewBool') .asFunction(); /// JSValue *jsNewInt64(JSContext *ctx, int64_t val) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, int val, ) jsNewInt64 = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Int64, )>>('jsNewInt64') .asFunction(); /// JSValue *jsNewFloat64(JSContext *ctx, double val) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, double val, ) jsNewFloat64 = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Double, )>>('jsNewFloat64') .asFunction(); /// JSValue *jsNewString(JSContext *ctx, const char *str) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, Pointer str, ) _jsNewString = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Pointer, )>>('jsNewString') .asFunction(); -Pointer jsNewString( - Pointer ctx, +Pointer jsNewString( + Pointer ctx, String str, ) { final utf8str = str.toNativeUtf8(); @@ -420,60 +435,60 @@ Pointer jsNewString( } /// JSValue *jsNewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, Pointer buf, int len, ) jsNewArrayBufferCopy = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Pointer, IntPtr, )>>('jsNewArrayBufferCopy') .asFunction(); /// JSValue *jsNewArray(JSContext *ctx) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, ) jsNewArray = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsNewArray') .asFunction(); /// JSValue *jsNewObject(JSContext *ctx) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, ) jsNewObject = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsNewObject') .asFunction(); /// void jsFreeValue(JSContext *ctx, JSValue *val, int32_t free) final void Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, int free, ) _jsFreeValue = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, - Pointer, + Pointer, + Pointer, Int32, )>>('jsFreeValue') .asFunction(); void jsFreeValue( - Pointer ctx, - Pointer val, { + Pointer ctx, + Pointer val, { bool free = true, }) { _jsFreeValue(ctx, val, free ? 1 : 0); @@ -481,121 +496,121 @@ void jsFreeValue( /// void jsFreeValue(JSRuntime *rt, JSValue *val, int32_t free) final void Function( - Pointer rt, - Pointer val, + Pointer rt, + Pointer val, int free, ) _jsFreeValueRT = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, - Pointer, + Pointer, + Pointer, Int32, )>>('jsFreeValueRT') .asFunction(); void jsFreeValueRT( - Pointer rt, - Pointer val, { + Pointer rt, + Pointer val, { bool free = true, }) { _jsFreeValueRT(rt, val, free ? 1 : 0); } /// JSValue *jsDupValue(JSContext *ctx, JSValueConst *v) -final Pointer Function( - Pointer ctx, - Pointer val, +final Pointer Function( + Pointer ctx, + Pointer val, ) jsDupValue = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, )>>('jsDupValue') .asFunction(); /// JSValue *jsDupValueRT(JSRuntime *rt, JSValue *v) -final Pointer Function( - Pointer rt, - Pointer val, +final Pointer Function( + Pointer rt, + Pointer val, ) jsDupValueRT = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, )>>('jsDupValueRT') .asFunction(); /// int32_t jsToBool(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsToBool = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsToBool') .asFunction(); /// int64_t jsToFloat64(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsToInt64 = _qjsLib .lookup< NativeFunction< Int64 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsToInt64') .asFunction(); /// double jsToFloat64(JSContext *ctx, JSValueConst *val) final double Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsToFloat64 = _qjsLib .lookup< NativeFunction< Double Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsToFloat64') .asFunction(); /// const char *jsToCString(JSContext *ctx, JSValue *val) final Pointer Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) _jsToCString = _qjsLib .lookup< NativeFunction< Pointer Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsToCString') .asFunction(); /// void jsFreeCString(JSContext *ctx, const char *ptr) final void Function( - Pointer ctx, + Pointer ctx, Pointer val, ) jsFreeCString = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, + Pointer, Pointer, )>>('jsFreeCString') .asFunction(); String jsToCString( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) { final ptr = _jsToCString(ctx, val); if (ptr.address == 0) throw Exception('JSValue cannot convert to string'); @@ -606,19 +621,19 @@ String jsToCString( /// DLLEXPORT uint32_t jsNewClass(JSContext *ctx, const char *name) final int Function( - Pointer ctx, + Pointer ctx, Pointer name, ) _jsNewClass = _qjsLib .lookup< NativeFunction< Uint32 Function( - Pointer, + Pointer, Pointer, )>>('jsNewClass') .asFunction(); int jsNewClass( - Pointer ctx, + Pointer ctx, String name, ) { final utf8name = name.toNativeUtf8(); @@ -631,15 +646,15 @@ int jsNewClass( } /// DLLEXPORT JSValue *jsNewObjectClass(JSContext *ctx, uint32_t QJSClassId, void *opaque) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, int classId, int opaque, ) jsNewObjectClass = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Uint32, IntPtr, )>>('jsNewObjectClass') @@ -647,107 +662,107 @@ final Pointer Function( /// DLLEXPORT void *jsGetObjectOpaque(JSValue *obj, uint32_t classid) final int Function( - Pointer obj, + Pointer obj, int classid, ) jsGetObjectOpaque = _qjsLib .lookup< NativeFunction< IntPtr Function( - Pointer, + Pointer, Uint32, )>>('jsGetObjectOpaque') .asFunction(); /// uint8_t *jsGetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst *obj) final Pointer Function( - Pointer ctx, + Pointer ctx, Pointer psize, - Pointer val, + Pointer val, ) jsGetArrayBuffer = _qjsLib .lookup< NativeFunction< Pointer Function( - Pointer, + Pointer, Pointer, - Pointer, + Pointer, )>>('jsGetArrayBuffer') .asFunction(); /// int32_t jsIsFunction(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsIsFunction = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsIsFunction') .asFunction(); /// int32_t jsIsPromise(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsIsPromise = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsIsPromise') .asFunction(); /// int32_t jsIsArray(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsIsArray = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsIsArray') .asFunction(); /// DLLEXPORT int32_t jsIsError(JSContext *ctx, JSValueConst *val); final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsIsError = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsIsError') .asFunction(); /// DLLEXPORT JSValue *jsNewError(JSContext *ctx); -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, ) jsNewError = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsNewError') .asFunction(); /// JSValue *jsGetProperty(JSContext *ctx, JSValueConst *this_obj, /// JSAtom prop) -final Pointer Function( - Pointer ctx, - Pointer thisObj, +final Pointer Function( + Pointer ctx, + Pointer thisObj, int prop, ) jsGetProperty = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, Uint32, )>>('jsGetProperty') .asFunction(); @@ -755,58 +770,58 @@ final Pointer Function( /// int jsDefinePropertyValue(JSContext *ctx, JSValueConst *this_obj, /// JSAtom prop, JSValue *val, int flags) final int Function( - Pointer ctx, - Pointer thisObj, + Pointer ctx, + Pointer thisObj, int prop, - Pointer val, + Pointer val, int flag, ) jsDefinePropertyValue = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer, Uint32, - Pointer, + Pointer, Int32, )>>('jsDefinePropertyValue') .asFunction(); /// void jsFreeAtom(JSContext *ctx, JSAtom v) -final Pointer Function( - Pointer ctx, +final void Function( + Pointer ctx, int v, ) jsFreeAtom = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Void Function( + Pointer, Uint32, )>>('jsFreeAtom') .asFunction(); /// JSAtom jsValueToAtom(JSContext *ctx, JSValueConst *val) final int Function( - Pointer ctx, - Pointer val, + Pointer ctx, + Pointer val, ) jsValueToAtom = _qjsLib .lookup< NativeFunction< Uint32 Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsValueToAtom') .asFunction(); /// JSValue *jsAtomToValue(JSContext *ctx, JSAtom val) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, int val, ) jsAtomToValue = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, Uint32, )>>('jsAtomToValue') .asFunction(); @@ -814,32 +829,32 @@ final Pointer Function( /// int jsGetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab, /// uint32_t *plen, JSValueConst *obj, int flags) final int Function( - Pointer ctx, - Pointer ptab, + Pointer ctx, + Pointer> ptab, Pointer plen, - Pointer obj, + Pointer obj, int flags, ) jsGetOwnPropertyNames = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, - Pointer, + Pointer, + Pointer>, Pointer, - Pointer, + Pointer, Int32, )>>('jsGetOwnPropertyNames') .asFunction(); /// JSAtom jsPropertyEnumGetAtom(JSPropertyEnum *ptab, int i) final int Function( - Pointer ptab, + Pointer ptab, int i, ) jsPropertyEnumGetAtom = _qjsLib .lookup< NativeFunction< Uint32 Function( - Pointer, + Pointer, Int32, )>>('jsPropertyEnumGetAtom') .asFunction(); @@ -853,55 +868,55 @@ final sizeOfJSValue = _sizeOfJSValue(); /// void setJSValueList(JSValue *list, int i, JSValue *val) final void Function( - Pointer list, + Pointer list, int i, - Pointer val, + Pointer val, ) setJSValueList = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, + Pointer, Uint32, - Pointer, + Pointer, )>>('setJSValueList') .asFunction(); /// JSValue *jsCall(JSContext *ctx, JSValueConst *func_obj, JSValueConst *this_obj, /// int argc, JSValueConst *argv) -final Pointer Function( - Pointer ctx, - Pointer funcObj, - Pointer thisObj, +final Pointer Function( + Pointer ctx, + Pointer funcObj, + Pointer thisObj, int argc, - Pointer argv, + Pointer argv, ) _jsCall = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, + Pointer, Int32, - Pointer, + Pointer, )>>('jsCall') .asFunction(); -Pointer jsCall( - Pointer ctx, - Pointer funcObj, - Pointer thisObj, - List argv, +Pointer jsCall( + Pointer ctx, + Pointer funcObj, + Pointer thisObj, + List> argv, ) { - Pointer jsArgs = calloc( + final jsArgs = calloc( argv.length > 0 ? sizeOfJSValue * argv.length : 1, - ); + ).cast(); for (int i = 0; i < argv.length; ++i) { - Pointer jsArg = argv[i]; + Pointer jsArg = argv[i]; setJSValueList(jsArgs, i, jsArg); } - Pointer func1 = jsDupValue(ctx, funcObj); - Pointer _thisObj = thisObj ?? jsUNDEFINED(); - Pointer jsRet = _jsCall(ctx, funcObj, _thisObj, argv.length, jsArgs); + final func1 = jsDupValue(ctx, funcObj); + final _thisObj = thisObj ?? jsUNDEFINED(); + final jsRet = _jsCall(ctx, funcObj, _thisObj, argv.length, jsArgs); if (thisObj == null) { jsFreeValue(ctx, _thisObj); } @@ -913,59 +928,59 @@ Pointer jsCall( /// int jsIsException(JSValueConst *val) final int Function( - Pointer val, + Pointer val, ) jsIsException = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, + Pointer, )>>('jsIsException') .asFunction(); /// JSValue *jsGetException(JSContext *ctx) -final Pointer Function( - Pointer ctx, +final Pointer Function( + Pointer ctx, ) jsGetException = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, + Pointer Function( + Pointer, )>>('jsGetException') .asFunction(); /// int jsExecutePendingJob(JSRuntime *rt) final int Function( - Pointer ctx, + Pointer ctx, ) jsExecutePendingJob = _qjsLib .lookup< NativeFunction< Int32 Function( - Pointer, + Pointer, )>>('jsExecutePendingJob') .asFunction(); /// JSValue *jsNewPromiseCapability(JSContext *ctx, JSValue *resolving_funcs) -final Pointer Function( - Pointer ctx, - Pointer resolvingFuncs, +final Pointer Function( + Pointer ctx, + Pointer resolvingFuncs, ) jsNewPromiseCapability = _qjsLib .lookup< NativeFunction< - Pointer Function( - Pointer, - Pointer, + Pointer Function( + Pointer, + Pointer, )>>('jsNewPromiseCapability') .asFunction(); /// void jsFree(JSContext *ctx, void *ptab) final void Function( - Pointer ctx, - Pointer ptab, + Pointer ctx, + Pointer ptab, ) jsFree = _qjsLib .lookup< NativeFunction< Void Function( - Pointer, - Pointer, + Pointer, + Pointer, )>>('jsFree') .asFunction(); diff --git a/lib/src/isolate.dart b/lib/src/isolate.dart index 14dd23f..2a81a7f 100644 --- a/lib/src/isolate.dart +++ b/lib/src/isolate.dart @@ -115,21 +115,19 @@ void _runJsIsolate(Map spawnMessage) async { }, moduleHandler: (name) { final ptr = calloc>(); - 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(); diff --git a/lib/src/object.dart b/lib/src/object.dart index 73d1530..0240f5d 100644 --- a/lib/src/object.dart +++ b/lib/src/object.dart @@ -49,7 +49,7 @@ class _DartFunction extends JSInvokable { class _DartObject extends JSRef implements JSRefLeakable { Object _obj; - Pointer _ctx; + Pointer _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 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 _val; + Pointer _ctx; /// Create - _JSObject(this._ctx, Pointer _val) { - Pointer rt = jsGetRuntime(_ctx); + _JSObject(this._ctx, Pointer _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 ctx, Pointer val) : super(ctx, val); @override invoke(List 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 arguments, [dynamic thisVal]) { + Pointer _invoke(List arguments, [dynamic thisVal]) { if (_val == null) throw JSError("InternalError: JSValue released"); - List 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, diff --git a/lib/src/wrapper.dart b/lib/src/wrapper.dart index f7c34ca..2ec462a 100644 --- a/lib/src/wrapper.dart +++ b/lib/src/wrapper.dart @@ -7,7 +7,7 @@ */ part of '../flutter_qjs.dart'; -dynamic _parseJSException(Pointer ctx, [Pointer perr]) { +dynamic _parseJSException(Pointer ctx, [Pointer 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 ctx, + Pointer obj, dynamic key, dynamic val, { - Map cache, + Map> 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 _jsGetPropertyValue( + Pointer ctx, + Pointer obj, dynamic key, { Map cache, }) { @@ -53,7 +53,8 @@ Pointer _jsGetPropertyValue( return jsProp; } -Pointer _dartToJs(Pointer ctx, dynamic val, {Map cache}) { +Pointer _dartToJs(Pointer ctx, dynamic val, + {Map> 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 cache}) { } if (val is _JSObject) return jsDupValue(ctx, val._val); if (val is Future) { - final resolvingFunc = malloc(sizeOfJSValue * 2); + final resolvingFunc = malloc(sizeOfJSValue * 2).cast(); final resolvingFunc2 = - Pointer.fromAddress(resolvingFunc.address + sizeOfJSValue); + Pointer.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 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 cache}) { return ret; } if (val is Map) { - Pointer ret = jsNewObject(ctx); + final ret = jsNewObject(ctx); cache[val] = ret; for (MapEntry entry in val.entries) { _definePropertyValue(ctx, ret, entry.key, entry.value, cache: cache); @@ -123,7 +124,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map 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 cache}) { return dartObject; } -dynamic _jsToDart(Pointer ctx, Pointer val, {Map cache}) { +dynamic _jsToDart(Pointer ctx, Pointer val, + {Map 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 cache}) { rt, jsGetObjectOpaque(val, dartObjectClassId)); if (dartObject != null) return dartObject._obj; } - Pointer psize = malloc(); - Pointer buf = jsGetArrayBuffer(ctx, psize, val); - int size = psize.value; + final psize = malloc(); + 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 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 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 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 ptab = malloc(); - Pointer plen = malloc(); - if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) return null; - int len = plen.value; + final ptab = malloc>(); + final plen = malloc(); + if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) { + malloc.free(plen); + malloc.free(ptab); + return null; + } + final len = plen.value; malloc.free(plen); - Map 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); diff --git a/pubspec.lock b/pubspec.lock index d828156..b5f6c6a 100644 --- a/pubspec.lock +++ b/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" diff --git a/pubspec.yaml b/pubspec.yaml index b1f3755..77b5ccd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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