koffi 2.15.0 → 2.16.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/build/koffi/darwin_arm64/koffi.node +0 -0
  3. package/build/koffi/darwin_x64/koffi.node +0 -0
  4. package/build/koffi/freebsd_arm64/koffi.node +0 -0
  5. package/build/koffi/freebsd_ia32/koffi.node +0 -0
  6. package/build/koffi/freebsd_x64/koffi.node +0 -0
  7. package/build/koffi/linux_arm64/koffi.node +0 -0
  8. package/build/koffi/linux_armhf/koffi.node +0 -0
  9. package/build/koffi/linux_ia32/koffi.node +0 -0
  10. package/build/koffi/linux_loong64/koffi.node +0 -0
  11. package/build/koffi/linux_riscv64d/koffi.node +0 -0
  12. package/build/koffi/linux_x64/koffi.node +0 -0
  13. package/build/koffi/musl_arm64/koffi.node +0 -0
  14. package/build/koffi/musl_x64/koffi.node +0 -0
  15. package/build/koffi/openbsd_ia32/koffi.node +0 -0
  16. package/build/koffi/openbsd_x64/koffi.node +0 -0
  17. package/build/koffi/win32_arm64/koffi.node +0 -0
  18. package/build/koffi/win32_ia32/koffi.node +0 -0
  19. package/build/koffi/win32_x64/koffi.node +0 -0
  20. package/doc/pages/index.md +4 -2
  21. package/doc/pages/misc.md +2 -0
  22. package/doc/templates/code.html +1 -2
  23. package/doc/templates/page.html +1 -2
  24. package/index.d.ts +11 -9
  25. package/index.js +9 -9
  26. package/indirect.js +9 -9
  27. package/lib/native/base/base.cc +79 -44
  28. package/lib/native/base/base.hh +31 -33
  29. package/package.json +2 -2
  30. package/src/cnoke/assets/FindCNoke.cmake +16 -10
  31. package/src/cnoke/assets/win_delay_hook.c +4 -0
  32. package/src/cnoke/src/builder.js +49 -46
  33. package/src/koffi/CMakeLists.txt +18 -8
  34. package/src/koffi/src/abi_arm32.cc +222 -219
  35. package/src/koffi/src/abi_arm32_asm.S +1 -29
  36. package/src/koffi/src/abi_arm64.cc +257 -235
  37. package/src/koffi/src/abi_arm64_asm.S +1 -32
  38. package/src/koffi/src/abi_arm64_asm.asm +1 -23
  39. package/src/koffi/src/abi_loong64_asm.S +1 -25
  40. package/src/koffi/src/abi_riscv64.cc +220 -217
  41. package/src/koffi/src/abi_riscv64_asm.S +1 -25
  42. package/src/koffi/src/abi_x64_sysv.cc +196 -192
  43. package/src/koffi/src/abi_x64_sysv_asm.S +1 -31
  44. package/src/koffi/src/abi_x64_win.cc +188 -172
  45. package/src/koffi/src/abi_x64_win_asm.S +144 -0
  46. package/src/koffi/src/abi_x64_win_asm.asm +1 -21
  47. package/src/koffi/src/abi_x86.cc +224 -189
  48. package/src/koffi/src/abi_x86_asm.S +6 -25
  49. package/src/koffi/src/abi_x86_asm.asm +9 -22
  50. package/src/koffi/src/call.cc +246 -428
  51. package/src/koffi/src/call.hh +9 -8
  52. package/src/koffi/src/ffi.cc +142 -88
  53. package/src/koffi/src/ffi.hh +13 -59
  54. package/src/koffi/src/primitives.inc +39 -0
  55. package/src/koffi/src/trampolines/armasm.inc +0 -32770
  56. package/src/koffi/src/trampolines/gnu.inc +0 -24578
  57. package/src/koffi/src/trampolines/masm32.inc +0 -32770
  58. package/src/koffi/src/trampolines/masm64.inc +0 -32770
  59. package/src/koffi/src/trampolines/prototypes.inc +16385 -16385
  60. package/src/koffi/src/util.cc +155 -112
  61. package/src/koffi/src/util.hh +77 -40
  62. package/vendor/node-api-headers/CHANGELOG.md +22 -0
  63. package/vendor/node-api-headers/README.md +6 -17
  64. package/vendor/node-api-headers/include/js_native_api.h +3 -13
  65. package/vendor/node-api-headers/include/js_native_api_types.h +15 -0
  66. package/vendor/node-api-headers/include/node_api.h +0 -4
  67. package/vendor/node-api-headers/include/node_api_types.h +6 -0
  68. package/vendor/node-api-headers/package.json +1 -1
  69. package/vendor/node-api-headers/scripts/update-headers.js +6 -0
@@ -9,12 +9,19 @@ else()
9
9
  endif()
10
10
 
11
11
  if(NODE_JS_LINK_DEF)
12
- add_custom_command(OUTPUT ${NODE_JS_LINK_LIB}
13
- COMMAND ${CMAKE_AR} ${CMAKE_STATIC_LINKER_FLAGS}
14
- /def:${NODE_JS_LINK_DEF} /out:${NODE_JS_LINK_LIB}
15
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
16
- MAIN_DEPENDENCY ${NODE_JS_LINK_DEF})
17
- add_custom_target(node.lib DEPENDS ${NODE_JS_LINK_LIB})
12
+ set(NODE_JS_LINK_LIB "${CMAKE_CURRENT_BINARY_DIR}/node.lib")
13
+ if (MSVC)
14
+ add_custom_command(OUTPUT node.lib
15
+ COMMAND ${CMAKE_AR} ${CMAKE_STATIC_LINKER_FLAGS}
16
+ /def:${NODE_JS_LINK_DEF} /out:${NODE_JS_LINK_LIB}
17
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
18
+ MAIN_DEPENDENCY ${NODE_JS_LINK_DEF})
19
+ else()
20
+ add_custom_command(OUTPUT node.lib
21
+ COMMAND ${CMAKE_DLLTOOL} -d ${NODE_JS_LINK_DEF} -l ${NODE_JS_LINK_LIB}
22
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
23
+ MAIN_DEPENDENCY ${NODE_JS_LINK_DEF})
24
+ endif()
18
25
  endif()
19
26
 
20
27
  function(add_node_addon)
@@ -26,10 +33,10 @@ endfunction()
26
33
 
27
34
  function(target_link_node TARGET)
28
35
  target_include_directories(${TARGET} PRIVATE ${NODE_JS_INCLUDE_DIRS})
36
+ if(NODE_JS_LINK_DEF)
37
+ target_sources(${TARGET} PRIVATE node.lib)
38
+ endif()
29
39
  if(NODE_JS_LINK_LIB)
30
- if(TARGET node.lib)
31
- add_dependencies(${TARGET} node.lib)
32
- endif()
33
40
  target_link_libraries(${TARGET} PRIVATE ${NODE_JS_LINK_LIB})
34
41
  endif()
35
42
  target_compile_options(${TARGET} PRIVATE ${NODE_JS_COMPILE_FLAGS})
@@ -100,7 +107,6 @@ else()
100
107
  endif()
101
108
 
102
109
  if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
103
- message(STATUS ${CMAKE_SYSTEM_PROCESSOR})
104
110
  if(CMAKE_SYSTEM_PROCESSOR MATCHES "(amd64|x86_64)")
105
111
  foreach(lang C CXX)
106
112
  set(CMAKE_${lang}_FLAGS_RELEASE "${CMAKE_${lang}_FLAGS_RELEASE} -mpopcnt -msse4.1 -msse4.2 -mssse3 -mcx16")
@@ -29,4 +29,8 @@ static FARPROC WINAPI self_exe_hook(unsigned int event, DelayLoadInfo *info)
29
29
  return NULL;
30
30
  }
31
31
 
32
+ #if defined(__MINGW32__)
33
+ PfnDliHook __pfnDliNotifyHook2 = self_exe_hook;
34
+ #else
32
35
  const PfnDliHook __pfnDliNotifyHook2 = self_exe_hook;
36
+ #endif
@@ -106,44 +106,41 @@ function Builder(config = {}) {
106
106
  args.push(`-DNODE_JS_INCLUDE_DIRS=${options.api}/include`);
107
107
  }
108
108
 
109
- // Download or create Node import library (Windows)
110
- if (process.platform == 'win32') {
111
- if (options.api == null) {
112
- let dirname;
113
- switch (arch) {
114
- case 'ia32': { dirname = 'win-x86'; } break;
115
- case 'x64': { dirname = 'win-x64'; } break;
116
- case 'arm64': { dirname = 'win-arm64'; } break;
117
-
118
- default: {
119
- throw new Error(`Unsupported architecture '${arch}' for Node on Windows`);
120
- } break;
121
- }
122
-
123
- let destname = `${cache_dir}/node_v${runtime_version}_${arch}.lib`;
124
-
125
- if (!fs.existsSync(destname)) {
126
- fs.mkdirSync(cache_dir, { recursive: true, mode: 0o755 });
109
+ args.push(`-DCMAKE_MODULE_PATH=${app_dir}/assets`);
127
110
 
128
- let url = `https://nodejs.org/dist/v${runtime_version}/${dirname}/node.lib`;
129
- await tools.download_http(url, destname);
130
- }
111
+ let win32 = (process.platform == 'win32');
112
+ let msvc = (process.platform == 'win32' && process.env.MSYSTEM == null);
113
+ let darwin = (process.platform == 'darwin');
114
+
115
+ // Handle Node import library on Windows
116
+ if (win32) {
117
+ if (msvc) {
118
+ if (options.api == null) {
119
+ let dirname;
120
+ switch (arch) {
121
+ case 'ia32': { dirname = 'win-x86'; } break;
122
+ case 'x64': { dirname = 'win-x64'; } break;
123
+ case 'arm64': { dirname = 'win-arm64'; } break;
124
+
125
+ default: {
126
+ throw new Error(`Unsupported architecture '${arch}' for Node on Windows`);
127
+ } break;
128
+ }
131
129
 
132
- fs.copyFileSync(destname, work_dir + '/node.lib');
133
- } else {
134
- args.push(`-DNODE_JS_LINK_DEF=${options.api}/def/node_api.def`);
135
- }
136
- }
130
+ let destname = `${cache_dir}/node_v${runtime_version}_${arch}.lib`;
137
131
 
138
- args.push(`-DCMAKE_MODULE_PATH=${app_dir}/assets`);
132
+ if (!fs.existsSync(destname)) {
133
+ fs.mkdirSync(cache_dir, { recursive: true, mode: 0o755 });
139
134
 
140
- // Set platform flags
141
- switch (process.platform) {
142
- case 'win32': {
143
- fs.copyFileSync(`${app_dir}/assets/win_delay_hook.c`, work_dir + '/win_delay_hook.c');
135
+ let url = `https://nodejs.org/dist/v${runtime_version}/${dirname}/node.lib`;
136
+ await tools.download_http(url, destname);
137
+ }
144
138
 
145
- args.push(`-DNODE_JS_SOURCES=${work_dir}/win_delay_hook.c`);
146
- args.push(`-DNODE_JS_LINK_LIB=${work_dir}/node.lib`);
139
+ fs.copyFileSync(destname, work_dir + '/node.lib');
140
+ args.push(`-DNODE_JS_LINK_LIB=${work_dir}/node.lib`);
141
+ } else {
142
+ args.push(`-DNODE_JS_LINK_DEF=${options.api}/def/node_api.def`);
143
+ }
147
144
 
148
145
  switch (arch) {
149
146
  case 'ia32': {
@@ -159,22 +156,29 @@ function Builder(config = {}) {
159
156
  args.push('-A', 'x64');
160
157
  } break;
161
158
  }
162
- } break;
163
159
 
164
- case 'darwin': {
165
- args.push('-DNODE_JS_LINK_FLAGS=-undefined;dynamic_lookup');
160
+ fs.copyFileSync(`${app_dir}/assets/win_delay_hook.c`, work_dir + '/win_delay_hook.c');
161
+ args.push(`-DNODE_JS_SOURCES=${work_dir}/win_delay_hook.c`);
162
+ } else {
163
+ args.push(`-DNODE_JS_LINK_LIB=node.dll`);
164
+ }
165
+ }
166
+
167
+ if (darwin) {
168
+ args.push('-DNODE_JS_LINK_FLAGS=-undefined;dynamic_lookup');
166
169
 
167
- switch (arch) {
168
- case 'arm64': { args.push('-DCMAKE_OSX_ARCHITECTURES=arm64'); } break;
169
- case 'x64': { args.push('-DCMAKE_OSX_ARCHITECTURES=x86_64'); } break;
170
- }
171
- } break;
170
+ switch (arch) {
171
+ case 'arm64': { args.push('-DCMAKE_OSX_ARCHITECTURES=arm64'); } break;
172
+ case 'x64': { args.push('-DCMAKE_OSX_ARCHITECTURES=x86_64'); } break;
173
+ }
172
174
  }
173
175
 
174
- if (process.platform != 'win32') {
175
- // Prefer Ninja if available
176
- if (spawnSync('ninja', ['--version']).status === 0)
176
+ if (!msvc) {
177
+ if (spawnSync('ninja', ['--version']).status === 0) {
177
178
  args.push('-G', 'Ninja');
179
+ } else if (process.platform == 'win32') {
180
+ args.push('-G', 'MinGW Makefiles');
181
+ }
178
182
 
179
183
  // Use CCache if available
180
184
  if (spawnSync('ccache', ['--version']).status === 0) {
@@ -182,9 +186,8 @@ function Builder(config = {}) {
182
186
  args.push('-DCMAKE_CXX_COMPILER_LAUNCHER=ccache');
183
187
  }
184
188
  }
185
-
186
189
  if (prefer_clang) {
187
- if (process.platform == 'win32') {
190
+ if (msvc) {
188
191
  args.push('-T', 'ClangCL');
189
192
  } else {
190
193
  args.push('-DCMAKE_C_COMPILER=clang');
@@ -99,7 +99,11 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
99
99
  list(APPEND KOFFI_SRC src/abi_riscv64.cc src/abi_loong64_asm.S)
100
100
  else()
101
101
  if(WIN32)
102
- list(APPEND KOFFI_SRC src/abi_x64_win.cc src/abi_x64_win_asm.asm)
102
+ if(MSVC)
103
+ list(APPEND KOFFI_SRC src/abi_x64_win.cc src/abi_x64_win_asm.asm)
104
+ else()
105
+ list(APPEND KOFFI_SRC src/abi_x64_win.cc src/abi_x64_win_asm.S)
106
+ endif()
103
107
  else()
104
108
  list(APPEND KOFFI_SRC src/abi_x64_sysv.cc src/abi_x64_sysv_asm.S)
105
109
  endif()
@@ -121,13 +125,19 @@ target_include_directories(koffi PRIVATE . ../.. ../../vendor/node-addon-api)
121
125
 
122
126
  if(WIN32)
123
127
  set(UV_LINK_LIB "${CMAKE_CURRENT_BINARY_DIR}/uv.lib")
124
- add_custom_command(OUTPUT ${UV_LINK_LIB}
125
- COMMAND ${CMAKE_AR} ${CMAKE_STATIC_LINKER_FLAGS}
126
- /def:src/uv.def /out:${UV_LINK_LIB}
127
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
128
- MAIN_DEPENDENCY src/uv.def)
129
- add_custom_target(uv.lib DEPENDS ${UV_LINK_LIB})
130
- add_dependencies(koffi uv.lib)
128
+ if(MSVC)
129
+ add_custom_command(OUTPUT uv.lib
130
+ COMMAND ${CMAKE_AR} ${CMAKE_STATIC_LINKER_FLAGS}
131
+ /def:src/uv.def /out:${UV_LINK_LIB}
132
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
133
+ MAIN_DEPENDENCY src/uv.def)
134
+ else()
135
+ add_custom_command(OUTPUT uv.lib
136
+ COMMAND ${CMAKE_DLLTOOL} -d src/uv.def -l ${UV_LINK_LIB}
137
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
138
+ MAIN_DEPENDENCY src/uv.def)
139
+ endif()
140
+ target_sources(koffi PRIVATE uv.lib)
131
141
  target_link_libraries(koffi PRIVATE ${UV_LINK_LIB})
132
142
  endif()
133
143