mirror of
https://github.com/wgh136/flutter_qjs.git
synced 2025-09-27 05:27:23 +00:00
support FFI 1.0.0
This commit is contained in:
@@ -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:
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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: () {
|
||||||
|
@@ -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;
|
||||||
|
@@ -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:
|
||||||
|
Reference in New Issue
Block a user