From 3c41d0d250fcb7784e65ea1a4ddefe068fbce0a2 Mon Sep 17 00:00:00 2001 From: ekibun Date: Fri, 25 Sep 2020 00:01:18 +0800 Subject: [PATCH] refactor cmake --- android/src/main/cxx/CMakeLists.txt | 16 ++-------------- cxx/ffi.cpp | 9 +++------ cxx/ffi.h | 2 -- cxx/quickjs.cmake | 17 +++++++++++++++++ ios/CMakeLists.txt | 19 ++----------------- {macos => ios}/ios.toolchain.cmake | 0 lib/ffi.dart | 23 ++++++----------------- lib/flutter_qjs.dart | 2 -- lib/wrapper.dart | 15 --------------- linux/CMakeLists.txt | 18 +++--------------- macos/CMakeLists.txt | 16 +--------------- test/CMakeLists.txt | 22 ++++------------------ test/flutter_qjs_test.dart | 10 +++++----- windows/CMakeLists.txt | 18 ++---------------- 14 files changed, 45 insertions(+), 142 deletions(-) create mode 100644 cxx/quickjs.cmake rename {macos => ios}/ios.toolchain.cmake (100%) diff --git a/android/src/main/cxx/CMakeLists.txt b/android/src/main/cxx/CMakeLists.txt index c02b04f..346fdc1 100644 --- a/android/src/main/cxx/CMakeLists.txt +++ b/android/src/main/cxx/CMakeLists.txt @@ -11,7 +11,7 @@ set(JNI_LIB_NAME qjs) # You can define multiple libraries, and CMake builds them for you. # Gradle automatically packages shared libraries with your APK. -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../cxx) +include("${CMAKE_CURRENT_SOURCE_DIR}/../../../../cxx/quickjs.cmake") add_library( # Sets the name of the library. ${JNI_LIB_NAME} @@ -22,18 +22,6 @@ add_library( # Sets the name of the library. # Provides a relative path to your source file(s). ${CXX_LIB_DIR}/ffi.cpp ) -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDUMP_LEAKS -DCONFIG_VERSION=\\\"${QUICKJS_VERSION}\\\"") -target_sources(${JNI_LIB_NAME} PUBLIC - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) -target_compile_features(${JNI_LIB_NAME} PUBLIC cxx_std_17) - # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library @@ -53,7 +41,7 @@ find_library( # Sets the name of the path variable. target_link_libraries( # Specifies the target library. ${JNI_LIB_NAME} - + quickjs # Links the target library to the log library # included in the NDK. ${log-lib} ) \ No newline at end of file diff --git a/cxx/ffi.cpp b/cxx/ffi.cpp index bc84494..b766e1d 100644 --- a/cxx/ffi.cpp +++ b/cxx/ffi.cpp @@ -3,7 +3,7 @@ * @Author: ekibun * @Date: 2020-09-06 18:32:45 * @LastEditors: ekibun - * @LastEditTime: 2020-09-24 00:28:11 + * @LastEditTime: 2020-09-24 22:32:15 */ #include "ffi.h" #include @@ -156,11 +156,13 @@ extern "C" DLLEXPORT void jsFreeValue(JSContext *ctx, JSValue *v) { JS_FreeValue(ctx, *v); + delete v; } DLLEXPORT void jsFreeValueRT(JSRuntime *rt, JSValue *v) { JS_FreeValueRT(rt, *v); + delete v; } DLLEXPORT JSValue *jsDupValue(JSContext *ctx, JSValueConst *v) @@ -217,11 +219,6 @@ extern "C" return JS_IsArray(ctx, *val); } - DLLEXPORT void deleteJSValue(JSValueConst *val) - { - delete val; - } - DLLEXPORT JSValue *jsGetProperty(JSContext *ctx, JSValueConst *this_obj, JSAtom prop) { diff --git a/cxx/ffi.h b/cxx/ffi.h index d2b59ce..4fdeff8 100644 --- a/cxx/ffi.h +++ b/cxx/ffi.h @@ -75,8 +75,6 @@ extern "C" DLLEXPORT int32_t jsIsArray(JSContext *ctx, JSValueConst *val); - DLLEXPORT void deleteJSValue(JSValueConst *val); - DLLEXPORT JSValue *jsGetProperty(JSContext *ctx, JSValueConst *this_obj, JSAtom prop); diff --git a/cxx/quickjs.cmake b/cxx/quickjs.cmake new file mode 100644 index 0000000..955cbfa --- /dev/null +++ b/cxx/quickjs.cmake @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.7 FATAL_ERROR) +set(CXX_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}) + +# quickjs +set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) +file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) +add_library(quickjs STATIC + ${QUICK_JS_LIB_DIR}/cutils.c + ${QUICK_JS_LIB_DIR}/libregexp.c + ${QUICK_JS_LIB_DIR}/libunicode.c + ${QUICK_JS_LIB_DIR}/quickjs.c +) + +project(quickjs LANGUAGES C) +target_compile_options(quickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") +target_compile_options(quickjs PRIVATE "-DDUMP_LEAKS") + diff --git a/ios/CMakeLists.txt b/ios/CMakeLists.txt index 7eb5bf6..47f0068 100644 --- a/ios/CMakeLists.txt +++ b/ios/CMakeLists.txt @@ -1,25 +1,10 @@ cmake_minimum_required(VERSION 3.7 FATAL_ERROR) project(flutter_qjs LANGUAGES CXX) -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cxx) +include("${CMAKE_CURRENT_SOURCE_DIR}/../cxx/quickjs.cmake") add_library(flutter_qjs SHARED ${CXX_LIB_DIR}/ffi.cpp) -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -add_library(quickjs STATIC - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) - -project(quickjs LANGUAGES C) -target_compile_options(quickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") -target_compile_options(quickjs PRIVATE "-DDUMP_LEAKS") - set(CMAKE_CXX_STANDARD 17) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output/$ENV{ABI}) set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "6SA4A2R2GU" CACHE INTERNAL "") target_link_libraries(flutter_qjs PRIVATE quickjs) @@ -33,7 +18,7 @@ set_target_properties(flutter_qjs PROPERTIES VERSION 1.0.0 # "compatibility version" in semantic format in Mach-O binary file SOVERSION 1.0.0 - PUBLIC_HEADER ffi.cpp + PUBLIC_HEADER ffi.h XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Development" # RESOURCE "${RESOURCE_FILES}" ) \ No newline at end of file diff --git a/macos/ios.toolchain.cmake b/ios/ios.toolchain.cmake similarity index 100% rename from macos/ios.toolchain.cmake rename to ios/ios.toolchain.cmake diff --git a/lib/ffi.dart b/lib/ffi.dart index c597963..0c67ce5 100644 --- a/lib/ffi.dart +++ b/lib/ffi.dart @@ -3,7 +3,7 @@ * @Author: ekibun * @Date: 2020-09-19 10:29:04 * @LastEditors: ekibun - * @LastEditTime: 2020-09-22 00:23:36 + * @LastEditTime: 2020-09-24 23:25:32 */ import 'dart:ffi'; import 'dart:io'; @@ -51,8 +51,10 @@ class JSTag { final DynamicLibrary qjsLib = Platform.environment['FLUTTER_TEST'] == 'true' ? (Platform.isWindows - ? DynamicLibrary.open("test/build/Debug/flutter_qjs.dll") - : DynamicLibrary.process()) + ? DynamicLibrary.open("test/build/Debug/ffiquickjs.dll") + : Platform.isMacOS + ? DynamicLibrary.open("macos/flutterqjs.framework/flutterqjs") + : DynamicLibrary.process()) : (Platform.isWindows ? DynamicLibrary.open("flutter_qjs_plugin.dll") : Platform.isAndroid @@ -512,17 +514,6 @@ final int Function( )>>("jsIsArray") .asFunction(); -/// void deleteJSValue(JSValueConst *val) -final void Function( - Pointer val, -) deleteJSValue = qjsLib - .lookup< - NativeFunction< - Void Function( - Pointer, - )>>("deleteJSValue") - .asFunction(); - /// JSValue *jsGetProperty(JSContext *ctx, JSValueConst *this_obj, /// JSAtom prop) final Pointer Function( @@ -683,10 +674,8 @@ Pointer jsCall( Pointer jsRet = _jsCall(ctx, funcObj, _thisObj, argv.length, jsArgs); if (thisObj == null) { jsFreeValue(ctx, _thisObj); - deleteJSValue(_thisObj); } jsFreeValue(ctx, func1); - deleteJSValue(func1); free(jsArgs); runtimeOpaques[jsGetRuntime(ctx)].port.sendPort.send('call'); return jsRet; @@ -736,4 +725,4 @@ final Pointer Function( Pointer, Pointer, )>>("jsNewPromiseCapability") - .asFunction(); \ No newline at end of file + .asFunction(); diff --git a/lib/flutter_qjs.dart b/lib/flutter_qjs.dart index f866ab1..4cb27aa 100644 --- a/lib/flutter_qjs.dart +++ b/lib/flutter_qjs.dart @@ -45,7 +45,6 @@ class FlutterQjs { var err = jsThrowInternalError(ctx, e.toString() + "\n" + stack.toString()); if (method.address == 0) { jsFreeValue(ctx, err); - deleteJSValue(err); return Pointer.fromAddress(0); } return err; @@ -112,7 +111,6 @@ class FlutterQjs { } var ret = runtimeOpaques[_rt]?.promsieToFuture(jsval); jsFreeValue(_ctx, jsval); - deleteJSValue(jsval); return ret; } } diff --git a/lib/wrapper.dart b/lib/wrapper.dart index 28142a2..8fe8357 100644 --- a/lib/wrapper.dart +++ b/lib/wrapper.dart @@ -26,7 +26,6 @@ class JSRefValue implements JSRef { void release() { if (val != null) { jsFreeValue(ctx, val); - deleteJSValue(val); } val = null; ctx = null; @@ -73,12 +72,10 @@ class JSFunction extends JSRefValue { Pointer jsRet = jsCall(ctx, val, null, args); for (Pointer jsArg in args) { jsFreeValue(ctx, jsArg); - deleteJSValue(jsArg); } bool isException = jsIsException(jsRet) != 0; var ret = jsToDart(ctx, jsRet); jsFreeValue(ctx, jsRet); - deleteJSValue(jsRet); if (isException) { throw Exception(parseJSException(ctx)); } @@ -92,7 +89,6 @@ Pointer jsGetPropertyStr(Pointer ctx, Pointer val, String prop) { Pointer jsProp = jsGetProperty(ctx, val, jsAtom); jsFreeAtom(ctx, jsAtom); jsFreeValue(ctx, jsAtomVal); - deleteJSValue(jsAtomVal); return jsProp; } @@ -105,10 +101,8 @@ String parseJSException(Pointer ctx, {Pointer e}) { err += '\n' + jsToCString(ctx, stack); } jsFreeValue(ctx, stack); - deleteJSValue(stack); } jsFreeValue(ctx, e); - deleteJSValue(e); return err; } @@ -163,7 +157,6 @@ Pointer dartToJs(Pointer ctx, dynamic val, {Map cache}) { ); jsFreeAtom(ctx, jsAtom); jsFreeValue(ctx, jsAtomVal); - deleteJSValue(jsAtomVal); } return ret; } @@ -182,7 +175,6 @@ Pointer dartToJs(Pointer ctx, dynamic val, {Map cache}) { ); jsFreeAtom(ctx, jsAtom); jsFreeValue(ctx, jsAtomVal); - deleteJSValue(jsAtomVal); } return ret; } @@ -219,7 +211,6 @@ dynamic jsToDart(Pointer ctx, Pointer val, {Map cache}) { } else if (jsIsArray(ctx, val) != 0) { Pointer jslength = jsGetPropertyStr(ctx, val, "length"); int length = jsToInt64(ctx, jslength); - deleteJSValue(jslength); List ret = List(); cache[valptr] = ret; for (int i = 0; i < length; ++i) { @@ -228,10 +219,8 @@ dynamic jsToDart(Pointer ctx, Pointer val, {Map cache}) { var jsProp = jsGetProperty(ctx, val, jsAtom); jsFreeAtom(ctx, jsAtom); jsFreeValue(ctx, jsAtomVal); - deleteJSValue(jsAtomVal); ret.add(jsToDart(ctx, jsProp, cache: cache)); jsFreeValue(ctx, jsProp); - deleteJSValue(jsProp); } return ret; } else { @@ -248,9 +237,7 @@ dynamic jsToDart(Pointer ctx, Pointer val, {Map cache}) { var jsProp = jsGetProperty(ctx, val, jsAtom); ret[jsToDart(ctx, jsAtomValue, cache: cache)] = jsToDart(ctx, jsProp, cache: cache); jsFreeValue(ctx, jsAtomValue); - deleteJSValue(jsAtomValue); jsFreeValue(ctx, jsProp); - deleteJSValue(jsProp); jsFreeAtom(ctx, jsAtom); } free(ptab); @@ -283,7 +270,6 @@ Pointer jsNewContextWithPromsieWrapper(Pointer rt) { JSEvalType.GLOBAL); var promiseWrapper = JSRefValue(ctx, jsPromiseWrapper); jsFreeValue(ctx, jsPromiseWrapper); - deleteJSValue(jsPromiseWrapper); runtimeOpaques[rt].promsieToFuture = (promise) { var completer = Completer(); var wrapper = promiseWrapper.val; @@ -291,7 +277,6 @@ Pointer jsNewContextWithPromsieWrapper(Pointer rt) { var jsPromise = jsCall(ctx, wrapper, null, [promise]); runtimeOpaques[rt].ref.add(JSPromise(ctx, jsPromise, completer)); jsFreeValue(ctx, jsPromise); - deleteJSValue(jsPromise); return completer.future; }; diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 35f9cac..f261603 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -1,19 +1,7 @@ cmake_minimum_required(VERSION 3.10) -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cxx) - -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -add_library(libquickjs SHARED - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) -project(libquickjs LANGUAGES C) -target_compile_options(libquickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") -target_compile_options(libquickjs PRIVATE "-DDUMP_LEAKS") +include("${CMAKE_CURRENT_SOURCE_DIR}/../cxx/quickjs.cmake") +target_compile_options(quickjs PRIVATE "-fPIC") set(PROJECT_NAME "flutter_qjs") project(${PROJECT_NAME} LANGUAGES CXX) @@ -33,7 +21,7 @@ target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) -target_link_libraries(${PLUGIN_NAME} PRIVATE libquickjs) +target_link_libraries(${PLUGIN_NAME} PRIVATE quickjs) target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) # List of absolute paths to libraries that should be bundled with the plugin diff --git a/macos/CMakeLists.txt b/macos/CMakeLists.txt index 8a6e55a..c61ac2b 100644 --- a/macos/CMakeLists.txt +++ b/macos/CMakeLists.txt @@ -1,23 +1,9 @@ cmake_minimum_required(VERSION 3.7 FATAL_ERROR) project(flutterqjs LANGUAGES CXX) -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cxx) +include("${CMAKE_CURRENT_SOURCE_DIR}/../cxx/quickjs.cmake") add_library(flutterqjs SHARED ${CXX_LIB_DIR}/ffi.cpp) -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -add_library(quickjs STATIC - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) - -project(quickjs LANGUAGES C) -target_compile_options(quickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") -target_compile_options(quickjs PRIVATE "-DDUMP_LEAKS") - set(CMAKE_CXX_STANDARD 17) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output/$ENV{ABI}) set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "6SA4A2R2GU" CACHE INTERNAL "") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 11b7fee..7f04fc7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,21 +1,7 @@ cmake_minimum_required(VERSION 3.7 FATAL_ERROR) -project(ffi_library LANGUAGES CXX) -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cxx) +project(ffiquickjs LANGUAGES CXX) -add_library(flutter_qjs SHARED ${CXX_LIB_DIR}/ffi.cpp) +include("${CMAKE_CURRENT_SOURCE_DIR}/../cxx/quickjs.cmake") -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -add_library(libquickjs STATIC - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) - -project(libquickjs LANGUAGES C) -target_compile_options(libquickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") -target_compile_options(libquickjs PRIVATE "-DDUMP_LEAKS") - -target_link_libraries(flutter_qjs PRIVATE libquickjs) +add_library(ffiquickjs SHARED ${CXX_LIB_DIR}/ffi.cpp) +target_link_libraries(ffiquickjs PRIVATE quickjs) \ No newline at end of file diff --git a/test/flutter_qjs_test.dart b/test/flutter_qjs_test.dart index 87c4e6b..07276eb 100644 --- a/test/flutter_qjs_test.dart +++ b/test/flutter_qjs_test.dart @@ -3,7 +3,7 @@ * @Author: ekibun * @Date: 2020-09-06 13:02:46 * @LastEditors: ekibun - * @LastEditTime: 2020-09-21 01:39:49 + * @LastEditTime: 2020-09-24 22:55:33 */ import 'dart:convert'; import 'dart:io'; @@ -12,7 +12,7 @@ import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:flutter_test/flutter_test.dart'; void main() async { - test('make', () async { + test('make.windows', () async { final utf8Encoding = Encoding.getByName('utf-8'); final cmakePath = "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/cmake.exe"; @@ -38,7 +38,7 @@ void main() async { stdout.write(result.stdout); stderr.write(result.stderr); expect(result.exitCode, 0); - }); + }, testOn: 'windows'); test('jsToDart', () async { final qjs = FlutterQjs(); qjs.setMethodHandler((method, args) { @@ -57,8 +57,8 @@ void main() async { 0.1, true, false, 1, "world", module ])); """, "").then((value) { - print(value); - }); + print(value); + }); Future.delayed(Duration(seconds: 5)).then((v) { qjs.close(); }); diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index bf2d2af..7c6d3cf 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -1,19 +1,5 @@ cmake_minimum_required(VERSION 3.15) - -set(CXX_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cxx) - -# quickjs -set(QUICK_JS_LIB_DIR ${CXX_LIB_DIR}/quickjs) -file (STRINGS "${QUICK_JS_LIB_DIR}/VERSION" QUICKJS_VERSION) -add_library(libquickjs STATIC - ${QUICK_JS_LIB_DIR}/cutils.c - ${QUICK_JS_LIB_DIR}/libregexp.c - ${QUICK_JS_LIB_DIR}/libunicode.c - ${QUICK_JS_LIB_DIR}/quickjs.c -) -project(libquickjs LANGUAGES C) -target_compile_options(libquickjs PRIVATE "-DCONFIG_VERSION=\"${QUICKJS_VERSION}\"") -target_compile_options(libquickjs PRIVATE "-DDUMP_LEAKS") +include("${CMAKE_CURRENT_SOURCE_DIR}/../cxx/quickjs.cmake") set(PROJECT_NAME "flutter_qjs") project(${PROJECT_NAME} LANGUAGES CXX) @@ -31,7 +17,7 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin libquickjs) +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin quickjs) # List of absolute paths to libraries that should be bundled with the plugin set(flutter_qjs_bundled_libraries