Explorar el Código

feat: vmcore/lib添加了对windows的支持

vmcore支持使用msys2/mingw64编译
SongZihuan hace 4 años
padre
commit
3058e148c3

+ 9 - 10
vmcore/CMakeLists.txt

@@ -8,12 +8,18 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/include)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/ofunc/include)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/md5/include)
 
-IF (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+MESSAGE("CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}")
+IF (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
     INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/include)
     LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/linux)
-    LINK_LIBRARIES(ffi)
+ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
+    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/include)
+    LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/windows)
 ENDIF()
 
+LINK_LIBRARIES(ffi)  # 添加库
+
+# 搜索源文件
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/memory MEM_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/parser PASER_LIST)
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
@@ -26,11 +32,4 @@ AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/md5 MD5_LIST)
 
 ADD_LIBRARY(vmcore SHARED ${SRC_LIST} ${GC_LIST} ${PASER_LIST} ${MEM_LIST} ${FILE_LIST} ${ARGUMENT_LIST} ${OFUNC_LIST} ${HANDLER_LIST} ${CLIB_LIST} ${MD5_LIST})
 TARGET_LINK_LIBRARIES(vmcore m)
-
-IF (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
-    TARGET_LINK_LIBRARIES(vmcore dl)
-ELSE()
-    TARGET_LINK_LIBRARIES(vmcore libffi)
-    ADD_LIBRARY(dlwin32 STATIC src/win/dlfcn_win32.c)
-    TARGET_LINK_LIBRARIES(vmcore dlwin32)
-ENDIF()
+TARGET_LINK_LIBRARIES(vmcore dl)

+ 4 - 6
vmcore/include/macro.h

@@ -2,6 +2,9 @@
 #define VIRTUALMATH_MACRO_H
 
 #include <stdio.h>
+#include <inttypes.h>
+#include <stdint.h>
+
 #include <errno.h>
 #include <math.h>
 #include <string.h>
@@ -16,14 +19,9 @@
 #include <locale.h>
 #include <getopt.h>
 #include <unistd.h>
+#include <dlfcn.h>
 #include "ffi.h"
 
-#ifdef __linux__
-#include <dlfcn.h>
-#else
-#include <windows.h>
-#include "win/dlfcn_win32.h"
-#endif
 
 // 布尔逻辑的定义
 #define bool int

BIN
vmcore/lib/windows/libffi-7.dll


+ 4 - 4
vmcore/src/parameter.c

@@ -995,11 +995,11 @@ break
 static bool setFFIArgFromType(ArgumentFFI *af, Argument *arg, unsigned int i) {
     switch (af->type[i]) {
         setFFIArgFromTypeNumber(af_sint, int16_t);
-        setFFIArgFromTypeNumber(af_usint, u_int16_t);
+        setFFIArgFromTypeNumber(af_usint, uint16_t);
         setFFIArgFromTypeNumber(af_int, int32_t);
-        setFFIArgFromTypeNumber(af_uint, u_int32_t);
+        setFFIArgFromTypeNumber(af_uint, uint32_t);
         setFFIArgFromTypeNumber(af_lint, int64_t);
-        setFFIArgFromTypeNumber(af_ulint, u_int64_t);
+        setFFIArgFromTypeNumber(af_ulint, uint64_t);
 
         setFFIArgFromTypeNumber(af_float, float);
         setFFIArgFromTypeNumber(af_ldouble, long double);
@@ -1024,7 +1024,7 @@ static bool setFFIArgFromType(ArgumentFFI *af, Argument *arg, unsigned int i) {
         break;
 
         setFFIArgFromTypeChar(af_char, int8_t);
-        setFFIArgFromTypeChar(af_uchar, u_int8_t);
+        setFFIArgFromTypeChar(af_uchar, uint8_t);
 
         case af_str:
             af->arg_v[i] = memCalloc(1, sizeof(char *));  // af->arg_v是ffi_type **arg_v, 即 *arg_v[]

+ 2 - 2
vmcore/src/runcall.c

@@ -264,7 +264,7 @@ static bool makeFFIReturn(enum ArgumentFFIType af, void **re_v) {
         case af_usint:
         case af_uint:
         case af_ulint:
-            *re_v = memCalloc(1, sizeof(u_int64_t));  // 无论是int32或者是int64,都申请int64_t的内存 (否则libffi会提升类型,导致内存溢出)
+            *re_v = memCalloc(1, sizeof(uint64_t));  // 无论是int32或者是int64,都申请int64_t的内存 (否则libffi会提升类型,导致内存溢出)
             break;
 
         case af_char:
@@ -303,7 +303,7 @@ static bool FFIReturnValue(enum ArgumentFFIType aft, void *re_v, fline line, cha
         case af_usint:
         case af_uint:
         case af_ulint:
-            makeIntValue((vint)*(u_int64_t *)re_v, line, file, CNEXT_NT);  // 先以(int64_t)读取void *类型的数据, 再转换成(vint)类型 (避免大端和小端模式的行为不同)
+            makeIntValue((vint)*(uint64_t *)re_v, line, file, CNEXT_NT);  // 先以(int64_t)读取void *类型的数据, 再转换成(vint)类型 (避免大端和小端模式的行为不同)
             break;
 
         case af_sint:

+ 4 - 4
vmcore/src/value.c

@@ -75,10 +75,10 @@ Value *makeIntValue(vint num, fline line, char *file, FUNC_NT) {
 Value *makeDouValue(vdou num, fline line, char *file, FUNC_NT) {
     Value *tmp = NULL;
     setResultCore(result);
-    if (isnanl(num) || isinfl(num)) {
-        setResultError(E_TypeException, L"decimal exception / [inf/nan]", LINEFILE, true, CNEXT_NT);
-        return NULL;
-    }
+//    if (isnanl(num) || isinfl(num)) {
+//        setResultError(E_TypeException, L"decimal exception / [inf/nan]", LINEFILE, true, CNEXT_NT);
+//        return NULL;
+//    }
     callBackCore(inter->data.base_obj[B_DOU], NULL, line, file, 0, CNEXT_NT);
     if (!CHECK_RESULT(result))
         return NULL;