support FFI 1.0.0

This commit is contained in:
narumi
2021-02-22 00:36:08 +08:00
parent 0de94f12e2
commit 54baa25c87
5 changed files with 33 additions and 33 deletions

View File

@@ -62,11 +62,11 @@ class FlutterQjs {
)); ));
case JSChannelType.MODULE: case JSChannelType.MODULE:
if (moduleHandler == null) throw JSError('No ModuleHandler'); if (moduleHandler == null) throw JSError('No ModuleHandler');
final ret = Utf8.toUtf8(moduleHandler( final ret = moduleHandler(
Utf8.fromUtf8(ptr.cast<Utf8>()), ptr.cast<Utf8>().toDartString(),
)); ).toNativeUtf8();
Future.microtask(() { Future.microtask(() {
free(ret); malloc.free(ret);
}); });
return ret; return ret;
case JSChannelType.PROMISE_TRACK: case JSChannelType.PROMISE_TRACK:

View File

@@ -309,17 +309,17 @@ Pointer jsEval(
String filename, String filename,
int evalFlags, int evalFlags,
) { ) {
final utf8input = Utf8.toUtf8(input); final utf8input = input.toNativeUtf8();
final utf8filename = Utf8.toUtf8(filename); final utf8filename = filename.toNativeUtf8();
final val = _jsEval( final val = _jsEval(
ctx, ctx,
utf8input, utf8input,
Utf8.strlen(utf8input), utf8input.length,
utf8filename, utf8filename,
evalFlags, evalFlags,
); );
free(utf8input); malloc.free(utf8input);
free(utf8filename); malloc.free(utf8filename);
runtimeOpaques[jsGetRuntime(ctx)]._port.sendPort.send(#eval); runtimeOpaques[jsGetRuntime(ctx)]._port.sendPort.send(#eval);
return val; return val;
} }
@@ -413,9 +413,9 @@ Pointer jsNewString(
Pointer ctx, Pointer ctx,
String str, String str,
) { ) {
final utf8str = Utf8.toUtf8(str); final utf8str = str.toNativeUtf8();
final jsStr = _jsNewString(ctx, utf8str); final jsStr = _jsNewString(ctx, utf8str);
free(utf8str); malloc.free(utf8str);
return jsStr; return jsStr;
} }
@@ -599,7 +599,7 @@ String jsToCString(
) { ) {
final ptr = _jsToCString(ctx, val); final ptr = _jsToCString(ctx, val);
if (ptr.address == 0) throw Exception('JSValue cannot convert to string'); if (ptr.address == 0) throw Exception('JSValue cannot convert to string');
final str = Utf8.fromUtf8(ptr); final str = ptr.toDartString();
jsFreeCString(ctx, ptr); jsFreeCString(ctx, ptr);
return str; return str;
} }
@@ -621,12 +621,12 @@ int jsNewClass(
Pointer ctx, Pointer ctx,
String name, String name,
) { ) {
final utf8name = Utf8.toUtf8(name); final utf8name = name.toNativeUtf8();
final val = _jsNewClass( final val = _jsNewClass(
ctx, ctx,
utf8name, utf8name,
); );
free(utf8name); malloc.free(utf8name);
return val; return val;
} }
@@ -892,8 +892,8 @@ Pointer jsCall(
Pointer thisObj, Pointer thisObj,
List<Pointer> argv, List<Pointer> argv,
) { ) {
Pointer jsArgs = allocate<Uint8>( Pointer jsArgs = calloc<Uint8>(
count: argv.length > 0 ? sizeOfJSValue * argv.length : 1, argv.length > 0 ? sizeOfJSValue * argv.length : 1,
); );
for (int i = 0; i < argv.length; ++i) { for (int i = 0; i < argv.length; ++i) {
Pointer jsArg = argv[i]; Pointer jsArg = argv[i];
@@ -906,7 +906,7 @@ Pointer jsCall(
jsFreeValue(ctx, _thisObj); jsFreeValue(ctx, _thisObj);
} }
jsFreeValue(ctx, func1); jsFreeValue(ctx, func1);
free(jsArgs); malloc.free(jsArgs);
runtimeOpaques[jsGetRuntime(ctx)]._port.sendPort.send(#call); runtimeOpaques[jsGetRuntime(ctx)]._port.sendPort.send(#call);
return jsRet; return jsRet;
} }

View File

@@ -114,7 +114,7 @@ void _runJsIsolate(Map spawnMessage) async {
}); });
}, },
moduleHandler: (name) { moduleHandler: (name) {
final ptr = allocate<Pointer<Utf8>>(); final ptr = calloc<Pointer<Utf8>>();
ptr.value = Pointer.fromAddress(0); ptr.value = Pointer.fromAddress(0);
sendPort.send({ sendPort.send({
#type: #module, #type: #module,
@@ -123,12 +123,12 @@ void _runJsIsolate(Map spawnMessage) async {
}); });
while (ptr.value.address == 0) sleep(Duration.zero); while (ptr.value.address == 0) sleep(Duration.zero);
if (ptr.value.address == -1) throw JSError('Module Not found'); if (ptr.value.address == -1) throw JSError('Module Not found');
final ret = Utf8.fromUtf8(ptr.value); final ret = ptr.value.toDartString();
sendPort.send({ sendPort.send({
#type: #release, #type: #release,
#ptr: ptr.value.address, #ptr: ptr.value.address,
}); });
free(ptr); malloc.free(ptr);
return ret; return ret;
}, },
); );
@@ -220,13 +220,13 @@ class IsolateQjs {
case #module: case #module:
final ptr = Pointer<Pointer>.fromAddress(msg[#ptr]); final ptr = Pointer<Pointer>.fromAddress(msg[#ptr]);
try { try {
ptr.value = Utf8.toUtf8(await moduleHandler(msg[#name])); ptr.value = (await moduleHandler(msg[#name])).toNativeUtf8();
} catch (e) { } catch (e) {
ptr.value = Pointer.fromAddress(-1); ptr.value = Pointer.fromAddress(-1);
} }
break; break;
case #release: case #release:
free(Pointer.fromAddress(msg[#ptr])); malloc.free(Pointer.fromAddress(msg[#ptr]));
break; break;
} }
}, onDone: () { }, onDone: () {

View File

@@ -66,7 +66,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
} }
if (val is _JSObject) return jsDupValue(ctx, val._val); if (val is _JSObject) return jsDupValue(ctx, val._val);
if (val is Future) { if (val is Future) {
final resolvingFunc = allocate<Uint8>(count: sizeOfJSValue * 2); final resolvingFunc = malloc<Uint8>(sizeOfJSValue * 2);
final resolvingFunc2 = final resolvingFunc2 =
Pointer.fromAddress(resolvingFunc.address + sizeOfJSValue); Pointer.fromAddress(resolvingFunc.address + sizeOfJSValue);
final ret = jsNewPromiseCapability(ctx, resolvingFunc); final ret = jsNewPromiseCapability(ctx, resolvingFunc);
@@ -74,7 +74,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
_JSFunction rej = _jsToDart(ctx, resolvingFunc2); _JSFunction rej = _jsToDart(ctx, resolvingFunc2);
jsFreeValue(ctx, resolvingFunc, free: false); jsFreeValue(ctx, resolvingFunc, free: false);
jsFreeValue(ctx, resolvingFunc2, free: false); jsFreeValue(ctx, resolvingFunc2, free: false);
free(resolvingFunc); malloc.free(resolvingFunc);
_DartObject refRes = _DartObject(ctx, res); _DartObject refRes = _DartObject(ctx, res);
_DartObject refRej = _DartObject(ctx, rej); _DartObject refRej = _DartObject(ctx, rej);
res.free(); res.free();
@@ -95,11 +95,11 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
if (val is double) return jsNewFloat64(ctx, val); if (val is double) return jsNewFloat64(ctx, val);
if (val is String) return jsNewString(ctx, val); if (val is String) return jsNewString(ctx, val);
if (val is Uint8List) { if (val is Uint8List) {
final ptr = allocate<Uint8>(count: val.length); final ptr = malloc<Uint8>(val.length);
final byteList = ptr.asTypedList(val.length); final byteList = ptr.asTypedList(val.length);
byteList.setAll(0, val); byteList.setAll(0, val);
final ret = jsNewArrayBufferCopy(ctx, ptr, val.length); final ret = jsNewArrayBufferCopy(ctx, ptr, val.length);
free(ptr); malloc.free(ptr);
return ret; return ret;
} }
if (cache.containsKey(val)) { if (cache.containsKey(val)) {
@@ -160,10 +160,10 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
rt, jsGetObjectOpaque(val, dartObjectClassId)); rt, jsGetObjectOpaque(val, dartObjectClassId));
if (dartObject != null) return dartObject._obj; if (dartObject != null) return dartObject._obj;
} }
Pointer<IntPtr> psize = allocate<IntPtr>(); Pointer<IntPtr> psize = malloc<IntPtr>();
Pointer<Uint8> buf = jsGetArrayBuffer(ctx, psize, val); Pointer<Uint8> buf = jsGetArrayBuffer(ctx, psize, val);
int size = psize.value; int size = psize.value;
free(psize); malloc.free(psize);
if (buf.address != 0) { if (buf.address != 0) {
return Uint8List.fromList(buf.asTypedList(size)); return Uint8List.fromList(buf.asTypedList(size));
} }
@@ -215,11 +215,11 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
} }
return ret; return ret;
} else { } else {
Pointer<Pointer> ptab = allocate<Pointer>(); Pointer<Pointer> ptab = malloc<Pointer>();
Pointer<Uint32> plen = allocate<Uint32>(); Pointer<Uint32> plen = malloc<Uint32>();
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) return null; if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) return null;
int len = plen.value; int len = plen.value;
free(plen); malloc.free(plen);
Map<dynamic, dynamic> ret = Map(); Map<dynamic, dynamic> ret = Map();
cache[valptr] = ret; cache[valptr] = ret;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i) {
@@ -233,7 +233,7 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
jsFreeAtom(ctx, jsAtom); jsFreeAtom(ctx, jsAtom);
} }
jsFree(ctx, ptab.value); jsFree(ctx, ptab.value);
free(ptab); malloc.free(ptab);
return ret; return ret;
} }
break; break;

View File

@@ -10,7 +10,7 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
ffi: ^0.1.3 ffi: ^1.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: