Better error message for NAPI modules which access unsupported libuv functions (#18503)

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
This commit is contained in:
Zack Radisic
2025-03-26 23:57:10 -07:00
committed by GitHub
parent 53f311fdd9
commit 5c0fa6dc21
34 changed files with 12278 additions and 163 deletions

View File

@@ -785,6 +785,10 @@ target_include_directories(${bun} PRIVATE
${NODEJS_HEADERS_PATH}/include
)
if(NOT WIN32)
target_include_directories(${bun} PRIVATE ${CWD}/src/bun.js/bindings/libuv)
endif()
if(LINUX)
include(CheckIncludeFiles)
check_include_files("sys/queue.h" HAVE_SYS_QUEUE_H)

View File

@@ -44,6 +44,7 @@
"build:release:with_logs": "cmake . -DCMAKE_BUILD_TYPE=Release -DENABLE_LOGS=true -GNinja -Bbuild-release && ninja -Cbuild-release",
"build:debug-zig-release": "cmake . -DCMAKE_BUILD_TYPE=Release -DZIG_OPTIMIZE=Debug -GNinja -Bbuild-debug-zig-release && ninja -Cbuild-debug-zig-release",
"css-properties": "bun run src/css/properties/generate_properties.ts",
"uv-posix-stubs": "bun run src/bun.js/bindings/libuv/generate_uv_posix_stubs.ts",
"bump": "bun ./scripts/bump.ts",
"typecheck": "tsc --noEmit && cd test && bun run typecheck",
"fmt": "bun run prettier",

View File

@@ -130,6 +130,7 @@ pub const Features = struct {
pub var s3: usize = 0;
pub var csrf_verify: usize = 0;
pub var csrf_generate: usize = 0;
pub var unsupported_uv_function: usize = 0;
comptime {
@export(&napi_module_register, .{ .name = "Bun__napi_module_register_count" });

View File

@@ -363,6 +363,8 @@ static char* toFileURI(std::span<const char> span)
extern "C" size_t Bun__process_dlopen_count;
extern "C" void CrashHandler__setDlOpenAction(const char* action);
JSC_DEFINE_HOST_FUNCTION(Process_functionDlopen, (JSC::JSGlobalObject * globalObject_, JSC::CallFrame* callFrame))
{
Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(globalObject_);
@@ -438,7 +440,9 @@ JSC_DEFINE_HOST_FUNCTION(Process_functionDlopen, (JSC::JSGlobalObject * globalOb
HMODULE handle = Bun__LoadLibraryBunString(&filename_str);
#else
CString utf8 = filename.utf8();
CrashHandler__setDlOpenAction(utf8.data());
void* handle = dlopen(utf8.data(), RTLD_LAZY);
CrashHandler__setDlOpenAction(nullptr);
#endif
globalObject->m_pendingNapiModuleDlopenHandle = handle;

View File

@@ -0,0 +1,14 @@
# libuv copied headers
These are copied headers from libuv which are used by `bun uv-posix-stubs` to generate stubs which crash with a helpful error message when a NAPI
module tries to access a libuv function which is not supported in Bun.
libuv commit hash: bb706f5fe71827f667f0bce532e95ce0698a498d
## Generating symbol stubs
1. Clone libuv repo using the above hash
2. Use the following command to get the list of symbols: `llvm-nm -g libuv.dylib | grep _uv &> symbols.txt`, you're gonna have to clean them up a bit this is not automated sorry ( ͡° ͜ʖ ͡°)
3. Update `src/symbol.txt` and `src/linker.lds` and `src/symbols.dyn`
4. Update the `symbols` list in `generate_uv_posix_stubs.ts`
5. Run `bun uv-posix-stubs`

View File

@@ -0,0 +1,20 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"dependencies": {
"tree-sitter": "^0.22.4",
"tree-sitter-c": "^0.23.5",
},
},
},
"packages": {
"node-addon-api": ["node-addon-api@8.3.1", "", {}, "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA=="],
"node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
"tree-sitter": ["tree-sitter@0.22.4", "", { "dependencies": { "node-addon-api": "^8.3.0", "node-gyp-build": "^4.8.4" } }, "sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg=="],
"tree-sitter-c": ["tree-sitter-c@0.23.5", "", { "dependencies": { "node-addon-api": "^8.3.0", "node-gyp-build": "^4.8.4" }, "peerDependencies": { "tree-sitter": "^0.22.1" }, "optionalPeers": ["tree-sitter"] }, "sha512-riDWhqVIt8J14R7G0YMKlUy8E7eYR0Vp6DSGL90nX5CTAXkORCyp4WaOgNtfo8dEsHyZF5e/4E9Z9kWj+qLnTQ=="],
}
}

View File

@@ -0,0 +1,376 @@
import path, { join } from "path";
import { symbols, test_skipped } from "./generate_uv_posix_stubs_constants";
import Parser from "tree-sitter";
import C from "tree-sitter-c";
const parser = new Parser();
parser.setLanguage(C);
const overrides = {
uv_setup_args: {
args: ["argc", "argv"],
decls: ["int argc", "char **argv"],
},
uv_udp_try_send2: {
args: ["arg0", "arg1", "arg2", "arg3", "arg4", "arg5"],
decls: [
"uv_udp_t* arg0",
"unsigned int arg1",
"uv_buf_t** arg2",
"unsigned int* arg3",
"struct sockaddr** arg4",
"unsigned int arg5",
],
},
};
type TestInfo = {
decls: string[];
args: string[];
};
function assert(condition: boolean, message: string) {
if (!condition) {
console.error(message);
process.exit(1);
}
}
/**
* 1. Use ripgrep to find the filename + line number of the symbol's declaration is in the libuv headers
* 2. Find the range of text which makes up the declaration
* 3. Generate and return stub
*/
async function generate(symbol_name: string): Promise<[stub: string, symbol_name: string, types: TestInfo]> {
console.log("Looking for", symbol_name);
const HEADER_PATH = import.meta.dir;
const output = await Bun.$`rg -n ${symbol_name + "\\("}`.cwd(HEADER_PATH).text();
if (!output.includes("UV_EXTERN")) {
console.error("Symbol not found!");
process.exit(1);
}
let matches: { filename: string; lineNumber: number; rest: string }[] = [];
const lines = output.split("\n");
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const match = parseOutput(line);
if (!match) continue;
const { filename, lineNumber, rest } = match;
if (!rest.includes("UV_EXTERN")) continue;
// ending in one line
if (rest.indexOf(";") == rest.length - 1) {
// console.log("Found single liner!");
matches.push({ filename, lineNumber, rest });
} else {
const absoluteFilepath = join(HEADER_PATH, filename);
const fileContents = await Bun.file(absoluteFilepath).text();
console.log(absoluteFilepath, "Found multi-liner!", lineNumber);
const fileLines = fileContents.split("\n");
let found = false;
let j = lineNumber;
while (j < fileLines.length) {
if (fileLines[j].indexOf(";") == fileLines[j].length - 1) {
found = true;
break;
}
console.log("j", j);
j++;
}
if (!found) {
console.error("Multi-liner end not found!");
process.exit(1);
}
const multiLine = fileLines.slice(lineNumber, j + 1).join("\n");
console.log(`MULTILINE (${lineNumber} -> ${j + 1})`);
matches.push({ filename, lineNumber, rest: multiLine });
// console.log(matches[matches.length - 1]);
i = j;
}
}
if (matches.length !== 1) {
console.error("Found", matches.length, "matches!");
console.error(matches);
process.exit(1);
}
const { filename, lineNumber, rest } = matches[0];
function extractParameterTypes(decl: string): TestInfo {
if (overrides[symbol_name]) return overrides[symbol_name];
console.log("DECL", decl);
decl = decl.replace("UV_EXTERN", "");
const rootNode = parser.parse(decl).rootNode;
assert(rootNode.children[0].type === "declaration", "Root node must be a declaration");
const declNode = rootNode.children[0];
console.log("DECL NODE", declNode.children);
let functionDeclNode = declNode.children.find(n => n.type === "function_declarator")!;
// it can be a PointerDeclaratorNode:
// uv_loop_t* uv_default_loop
if (!functionDeclNode) {
const pointerDeclaratorNode = declNode.children.find(n => n.type === "pointer_declarator")!;
assert(!!pointerDeclaratorNode, "Pointer declarator not found");
console.log("POINTER DECLARATOR", pointerDeclaratorNode.children);
functionDeclNode = pointerDeclaratorNode.children.find(n => n.type === "function_declarator")!;
}
assert(!!functionDeclNode, "Function declarator not found");
const parameterListNode = functionDeclNode.children.find(n => n.type === "parameter_list")!;
assert(!!parameterListNode, "Parameter list not found");
const parameterDeclarationNodes = parameterListNode.children.filter(n => n.type === "parameter_declaration")!;
assert(parameterDeclarationNodes.length > 0, "Must have exactly one parameter declaration");
let decls: string[] = [];
let args: string[] = [];
let i = 0;
for (const parameterDeclarationNode of parameterDeclarationNodes) {
console.log("PARAM", parameterDeclarationNode.children.length, parameterDeclarationNode.text);
const last_idx = parameterDeclarationNode.children.length - 1;
const last = parameterDeclarationNode.children[last_idx];
if (last.type === "primitive_type") {
if (last.text === "void") {
decls.push("(void) 0");
args.push("void");
continue;
}
const arg = `arg${i++}`;
decls.push(`${last.text} ${arg}`);
args.push(arg);
continue;
}
if (last.type === "array_declarator") {
const arg = `arg${i++}`;
const ident = last.children[0].text;
const array_declarator = last.children
.slice(1)
.map(n => n.text)
.join("");
const type = parameterDeclarationNode.children
.slice(0, last_idx)
.map(n => n.text)
.join(" ");
console.log("IDENT", ident, "TYPE", type, "ARRAY DECLARATOR", array_declarator);
decls.push(`${type} *${arg}`);
args.push(arg);
continue;
}
// function pointer
if (last.type === "function_declarator") {
console.log("FUNCTION DECLARATOR", last.children);
const return_ty = parameterDeclarationNode.children[0].text;
// console.log("LMAO", );
const arg = `arg${i++}`;
const param_list = last.children[1];
if (param_list.type !== "parameter_list") {
throw new Error("expect param list man");
}
args.push(arg);
const decl = `${return_ty} (*${arg})${param_list.text}`;
decls.push(decl);
continue;
}
assert(
last.type === "identifier" || last.type === "pointer_declarator" || last.type === "abstract_pointer_declarator", // ||
// last.type === "array_declarator",
`${symbol_name} Inalid param type, but got: ` + last.type,
);
let type = "";
for (let i = 0; i < last_idx; i++) {
type += parameterDeclarationNode.children[i].text;
type += " ";
}
console.log(type, "LAST TYPE lol", last.type);
if (last.type === "pointer_declarator" || last.type === "abstract_pointer_declarator") {
let cur = last;
do {
type += "*";
assert(cur.children[0].type === "*", "Pointer declarator must have a *");
cur = cur.children[1];
} while (!!cur && cur.type === "pointer_declarator" && cur.children.length > 0);
}
const arg = `arg${i++}`;
decls.push(`${type} ${arg}`);
args.push(arg);
}
// function extractParam(node: Parser.SyntaxNode): [decl: string, arg: string] {}
return { decls, args };
}
function addStub(symbolName: string, decl: string): [stub: string, symbol_name: string, types: TestInfo] {
assert(decl.includes("UV_EXTERN"), "Must include UV_EXTERN: \n" + decl);
const types = extractParameterTypes(decl);
types.decls = types.decls.map(d => d + ";");
if (types.args.length === 1 && types.args[0] === "void") {
types.decls = [];
types.args = [];
}
const decl_without_semicolon = decl.replaceAll(";", "").trim();
console.log(decl_without_semicolon);
const contents = `${decl_without_semicolon} {
__bun_throw_not_implemented("${symbolName}");
__builtin_unreachable();
}`;
// await Bun.write(stubPath, contents);
return [contents, symbolName, types];
}
function parseOutput(line: string): { filename: string; lineNumber: number; rest: string } | null {
// Match pattern: filename:linenumber:rest
const match = line.match(/^([^:]+):(\d+):(.*)$/);
if (!match) {
return null;
}
return {
filename: match[1],
lineNumber: parseInt(match[2], 10) - 1,
rest: match[3],
};
}
return addStub(symbol_name, rest);
}
// const symbols = ["uv_async_init"];
if (!Bun.which("rg")) {
console.error("You need ripgrep bro");
process.exit(1);
}
for (const symbol of symbols) {
await generate(symbol);
}
let parts = await Promise.all(symbols.map(s => generate(s)));
const final_contents = `// GENERATED CODE - DO NOT MODIFY BY HAND
#include "uv-posix-polyfills.h"
#if OS(LINUX) || OS(DARWIN)
${parts.map(([stub, _]) => stub).join("\n\n")}
#endif
`;
await Bun.write(join(import.meta.dir, "../", "uv-posix-stubs.cpp"), final_contents);
if (Bun.which("clang-format")) {
await Bun.$`clang-format -i ${join(import.meta.dir, "../", "uv-posix-stubs.cpp")}`;
}
const test_plugin_contents = ` // GENERATED CODE ... NO TOUCHY!!
#include <node_api.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <uv.h>
napi_value call_uv_func(napi_env env, napi_callback_info info) {
napi_status status;
size_t argc = 2;
napi_value args[2];
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
if (status != napi_ok) {
napi_throw_error(env, NULL, "Failed to parse arguments");
return NULL;
}
if (argc < 1) {
napi_throw_error(env, NULL, "Wrong number of arguments");
return NULL;
}
napi_value arg = args[0];
char buffer[256];
size_t buffer_size = sizeof(buffer);
size_t copied;
status = napi_get_value_string_utf8(env, arg, buffer, buffer_size, &copied);
if (status != napi_ok) {
napi_throw_error(env, NULL, "Failed to get string value");
return NULL;
}
buffer[copied] = '\\0';
printf("Got string: %s\\n", buffer);
${parts
.map(([_, symbol_name, types]) => {
if (test_skipped.includes(symbol_name)) return "";
return `
if (strcmp(buffer, "${symbol_name}") == 0) {
${types.decls.join("\n")}
${symbol_name}(${types.args.join(", ")});
return NULL;
}
`;
})
.join("\n\n")}
napi_throw_error(env, NULL, "Function not found");
return NULL;
}
napi_value Init(napi_env env, napi_value exports) {
napi_status status;
napi_value fn_call_uv_func;
// Register call_uv_func function
status =
napi_create_function(env, NULL, 0, call_uv_func, NULL, &fn_call_uv_func);
if (status != napi_ok) {
napi_throw_error(env, NULL, "Failed to create call_uv_func function");
return NULL;
}
status = napi_set_named_property(env, exports, "callUVFunc", fn_call_uv_func);
if (status != napi_ok) {
napi_throw_error(env, NULL,
"Failed to add call_uv_func function to exports");
return NULL;
}
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
`;
const plugin_path_ = join(import.meta.dir, "../", "../", "test", "napi", "uv-stub-stuff", "plugin.c");
await Bun.write(plugin_path_, test_plugin_contents);
if (Bun.which("clang-format")) {
await Bun.$`clang-format -i ${plugin_path_}`.quiet();
}
// for (const symbol of symbols) {
// await generate("uv_if_indextoiid");
// }
// console.log("DONE");

View File

@@ -0,0 +1,335 @@
export const test_skipped = [
"uv_getrusage_thread",
"uv_thread_detach",
"uv_thread_getname",
"uv_thread_getpriority",
"uv_thread_setname",
"uv_udp_try_send2",
"uv_utf16_length_as_wtf8",
"uv_utf16_to_wtf8",
"uv_wtf8_length_as_utf16",
"uv_wtf8_to_utf16",
"uv_thread_setpriority",
];
export const symbols = [
"uv_accept",
"uv_async_init",
"uv_async_send",
"uv_available_parallelism",
"uv_backend_fd",
"uv_backend_timeout",
"uv_barrier_destroy",
"uv_barrier_init",
"uv_barrier_wait",
"uv_buf_init",
"uv_cancel",
"uv_chdir",
"uv_check_init",
"uv_check_start",
"uv_check_stop",
"uv_clock_gettime",
"uv_close",
"uv_cond_broadcast",
"uv_cond_destroy",
"uv_cond_init",
"uv_cond_signal",
"uv_cond_timedwait",
"uv_cond_wait",
"uv_cpu_info",
"uv_cpumask_size",
"uv_cwd",
"uv_default_loop",
"uv_disable_stdio_inheritance",
"uv_dlclose",
"uv_dlerror",
"uv_dlopen",
"uv_dlsym",
"uv_err_name",
"uv_err_name_r",
"uv_exepath",
"uv_fileno",
"uv_free_cpu_info",
"uv_free_interface_addresses",
"uv_freeaddrinfo",
"uv_fs_access",
"uv_fs_chmod",
"uv_fs_chown",
"uv_fs_close",
"uv_fs_closedir",
"uv_fs_copyfile",
"uv_fs_event_getpath",
"uv_fs_event_init",
"uv_fs_event_start",
"uv_fs_event_stop",
"uv_fs_fchmod",
"uv_fs_fchown",
"uv_fs_fdatasync",
"uv_fs_fstat",
"uv_fs_fsync",
"uv_fs_ftruncate",
"uv_fs_futime",
"uv_fs_get_path",
"uv_fs_get_ptr",
"uv_fs_get_result",
"uv_fs_get_statbuf",
"uv_fs_get_system_error",
"uv_fs_get_type",
"uv_fs_lchown",
"uv_fs_link",
"uv_fs_lstat",
"uv_fs_lutime",
"uv_fs_mkdir",
"uv_fs_mkdtemp",
"uv_fs_mkstemp",
"uv_fs_open",
"uv_fs_opendir",
"uv_fs_poll_getpath",
"uv_fs_poll_init",
"uv_fs_poll_start",
"uv_fs_poll_stop",
"uv_fs_read",
"uv_fs_readdir",
"uv_fs_readlink",
"uv_fs_realpath",
"uv_fs_rename",
"uv_fs_req_cleanup",
"uv_fs_rmdir",
"uv_fs_scandir",
"uv_fs_scandir_next",
"uv_fs_sendfile",
"uv_fs_stat",
"uv_fs_statfs",
"uv_fs_symlink",
"uv_fs_unlink",
"uv_fs_utime",
"uv_fs_write",
"uv_get_available_memory",
"uv_get_constrained_memory",
"uv_get_free_memory",
"uv_get_osfhandle",
"uv_get_process_title",
"uv_get_total_memory",
"uv_getaddrinfo",
"uv_getnameinfo",
"uv_getrusage",
"uv_getrusage_thread",
"uv_gettimeofday",
"uv_guess_handle",
"uv_handle_get_data",
"uv_handle_get_loop",
"uv_handle_get_type",
"uv_handle_set_data",
"uv_handle_size",
"uv_handle_type_name",
"uv_has_ref",
"uv_hrtime",
"uv_idle_init",
"uv_idle_start",
"uv_idle_stop",
"uv_if_indextoiid",
"uv_if_indextoname",
"uv_inet_ntop",
"uv_inet_pton",
"uv_interface_addresses",
"uv_ip4_addr",
"uv_ip4_name",
"uv_ip6_addr",
"uv_ip6_name",
"uv_ip_name",
"uv_is_active",
"uv_is_closing",
"uv_is_readable",
"uv_is_writable",
"uv_key_create",
"uv_key_delete",
"uv_key_get",
"uv_key_set",
"uv_kill",
"uv_library_shutdown",
"uv_listen",
"uv_loadavg",
"uv_loop_alive",
"uv_loop_close",
"uv_loop_configure",
"uv_loop_delete",
"uv_loop_fork",
"uv_loop_get_data",
"uv_loop_init",
"uv_loop_new",
"uv_loop_set_data",
"uv_loop_size",
"uv_metrics_idle_time",
"uv_metrics_info",
"uv_mutex_destroy",
"uv_mutex_init",
"uv_mutex_init_recursive",
"uv_mutex_lock",
"uv_mutex_trylock",
"uv_mutex_unlock",
"uv_now",
"uv_once",
"uv_open_osfhandle",
"uv_os_environ",
"uv_os_free_environ",
"uv_os_free_group",
"uv_os_free_passwd",
"uv_os_get_group",
"uv_os_get_passwd",
"uv_os_get_passwd2",
"uv_os_getenv",
"uv_os_gethostname",
// Defined in uv-posix-polyfills.cpp
// "uv_os_getpid",
// Defined in uv-posix-polyfills.cpp
// "uv_os_getppid",
"uv_os_getpriority",
"uv_os_homedir",
"uv_os_setenv",
"uv_os_setpriority",
"uv_os_tmpdir",
"uv_os_uname",
"uv_os_unsetenv",
"uv_pipe",
"uv_pipe_bind",
"uv_pipe_bind2",
"uv_pipe_chmod",
"uv_pipe_connect",
"uv_pipe_connect2",
"uv_pipe_getpeername",
"uv_pipe_getsockname",
"uv_pipe_init",
"uv_pipe_open",
"uv_pipe_pending_count",
"uv_pipe_pending_instances",
"uv_pipe_pending_type",
"uv_poll_init",
"uv_poll_init_socket",
"uv_poll_start",
"uv_poll_stop",
"uv_prepare_init",
"uv_prepare_start",
"uv_prepare_stop",
"uv_print_active_handles",
"uv_print_all_handles",
"uv_process_get_pid",
"uv_process_kill",
"uv_queue_work",
"uv_random",
"uv_read_start",
"uv_read_stop",
"uv_recv_buffer_size",
"uv_ref",
"uv_replace_allocator",
"uv_req_get_data",
"uv_req_get_type",
"uv_req_set_data",
"uv_req_size",
"uv_req_type_name",
"uv_resident_set_memory",
"uv_run",
"uv_rwlock_destroy",
"uv_rwlock_init",
"uv_rwlock_rdlock",
"uv_rwlock_rdunlock",
"uv_rwlock_tryrdlock",
"uv_rwlock_trywrlock",
"uv_rwlock_wrlock",
"uv_rwlock_wrunlock",
"uv_sem_destroy",
"uv_sem_init",
"uv_sem_post",
"uv_sem_trywait",
"uv_sem_wait",
"uv_send_buffer_size",
"uv_set_process_title",
"uv_setup_args",
"uv_shutdown",
"uv_signal_init",
"uv_signal_start",
"uv_signal_start_oneshot",
"uv_signal_stop",
"uv_sleep",
"uv_socketpair",
"uv_spawn",
"uv_stop",
"uv_stream_get_write_queue_size",
"uv_stream_set_blocking",
"uv_strerror",
"uv_strerror_r",
"uv_tcp_bind",
"uv_tcp_close_reset",
"uv_tcp_connect",
"uv_tcp_getpeername",
"uv_tcp_getsockname",
"uv_tcp_init",
"uv_tcp_init_ex",
"uv_tcp_keepalive",
"uv_tcp_nodelay",
"uv_tcp_open",
"uv_tcp_simultaneous_accepts",
"uv_thread_create",
"uv_thread_create_ex",
"uv_thread_detach",
"uv_thread_equal",
"uv_thread_getaffinity",
"uv_thread_getcpu",
"uv_thread_getname",
"uv_thread_getpriority",
"uv_thread_join",
"uv_thread_self",
"uv_thread_setaffinity",
"uv_thread_setname",
"uv_thread_setpriority",
"uv_timer_again",
"uv_timer_get_due_in",
"uv_timer_get_repeat",
"uv_timer_init",
"uv_timer_set_repeat",
"uv_timer_start",
"uv_timer_stop",
"uv_translate_sys_error",
"uv_try_write",
"uv_try_write2",
"uv_tty_get_vterm_state",
"uv_tty_get_winsize",
"uv_tty_init",
// Defined in wtf-bindings.cpp
// "uv_tty_reset_mode",
"uv_tty_set_mode",
"uv_tty_set_vterm_state",
"uv_udp_bind",
"uv_udp_connect",
"uv_udp_get_send_queue_count",
"uv_udp_get_send_queue_size",
"uv_udp_getpeername",
"uv_udp_getsockname",
"uv_udp_init",
"uv_udp_init_ex",
"uv_udp_open",
"uv_udp_recv_start",
"uv_udp_recv_stop",
"uv_udp_send",
"uv_udp_set_broadcast",
"uv_udp_set_membership",
"uv_udp_set_multicast_interface",
"uv_udp_set_multicast_loop",
"uv_udp_set_multicast_ttl",
"uv_udp_set_source_membership",
"uv_udp_set_ttl",
"uv_udp_try_send",
"uv_udp_try_send2",
"uv_udp_using_recvmmsg",
"uv_unref",
"uv_update_time",
"uv_uptime",
"uv_utf16_length_as_wtf8",
"uv_utf16_to_wtf8",
"uv_version",
"uv_version_string",
"uv_walk",
"uv_write",
"uv_write2",
"uv_wtf8_length_as_utf16",
"uv_wtf8_to_utf16",
];

View File

@@ -0,0 +1,6 @@
{
"dependencies": {
"tree-sitter": "^0.22.4",
"tree-sitter-c": "^0.23.5"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_AIX_H
#define UV_AIX_H
#define UV_PLATFORM_LOOP_FIELDS \
int fs_fd; \
#define UV_PLATFORM_FS_EVENT_FIELDS \
uv__io_t event_watcher; \
char *dir_filename; \
#endif /* UV_AIX_H */

View File

@@ -0,0 +1,34 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_BSD_H
#define UV_BSD_H
#define UV_PLATFORM_FS_EVENT_FIELDS \
uv__io_t event_watcher; \
#define UV_IO_PRIVATE_PLATFORM_FIELDS \
int rcount; \
int wcount; \
#define UV_HAVE_KQUEUE 1
#endif /* UV_BSD_H */

View File

@@ -0,0 +1,61 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_DARWIN_H
#define UV_DARWIN_H
#if defined(__APPLE__) && defined(__MACH__)
# include <mach/mach.h>
# include <mach/task.h>
# include <mach/semaphore.h>
# include <TargetConditionals.h>
# define UV_PLATFORM_SEM_T semaphore_t
#endif
#define UV_IO_PRIVATE_PLATFORM_FIELDS \
int rcount; \
int wcount; \
#define UV_PLATFORM_LOOP_FIELDS \
uv_thread_t cf_thread; \
void* _cf_reserved; \
void* cf_state; \
uv_mutex_t cf_mutex; \
uv_sem_t cf_sem; \
struct uv__queue cf_signals; \
#define UV_PLATFORM_FS_EVENT_FIELDS \
uv__io_t event_watcher; \
char* realpath; \
int realpath_len; \
int cf_flags; \
uv_async_t* cf_cb; \
struct uv__queue cf_events; \
struct uv__queue cf_member; \
int cf_error; \
uv_mutex_t cf_mutex; \
#define UV_STREAM_PRIVATE_PLATFORM_FIELDS \
void* select; \
#define UV_HAVE_KQUEUE 1
#endif /* UV_DARWIN_H */

View File

@@ -0,0 +1,483 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_ERRNO_H_
#define UV_ERRNO_H_
#include <errno.h>
#if EDOM > 0
# define UV__ERR(x) (-(x))
#else
# define UV__ERR(x) (x)
#endif
#define UV__EOF (-4095)
#define UV__UNKNOWN (-4094)
#define UV__EAI_ADDRFAMILY (-3000)
#define UV__EAI_AGAIN (-3001)
#define UV__EAI_BADFLAGS (-3002)
#define UV__EAI_CANCELED (-3003)
#define UV__EAI_FAIL (-3004)
#define UV__EAI_FAMILY (-3005)
#define UV__EAI_MEMORY (-3006)
#define UV__EAI_NODATA (-3007)
#define UV__EAI_NONAME (-3008)
#define UV__EAI_OVERFLOW (-3009)
#define UV__EAI_SERVICE (-3010)
#define UV__EAI_SOCKTYPE (-3011)
#define UV__EAI_BADHINTS (-3013)
#define UV__EAI_PROTOCOL (-3014)
/* Only map to the system errno on non-Windows platforms. It's apparently
* a fairly common practice for Windows programmers to redefine errno codes.
*/
#if defined(E2BIG) && !defined(_WIN32)
# define UV__E2BIG UV__ERR(E2BIG)
#else
# define UV__E2BIG (-4093)
#endif
#if defined(EACCES) && !defined(_WIN32)
# define UV__EACCES UV__ERR(EACCES)
#else
# define UV__EACCES (-4092)
#endif
#if defined(EADDRINUSE) && !defined(_WIN32)
# define UV__EADDRINUSE UV__ERR(EADDRINUSE)
#else
# define UV__EADDRINUSE (-4091)
#endif
#if defined(EADDRNOTAVAIL) && !defined(_WIN32)
# define UV__EADDRNOTAVAIL UV__ERR(EADDRNOTAVAIL)
#else
# define UV__EADDRNOTAVAIL (-4090)
#endif
#if defined(EAFNOSUPPORT) && !defined(_WIN32)
# define UV__EAFNOSUPPORT UV__ERR(EAFNOSUPPORT)
#else
# define UV__EAFNOSUPPORT (-4089)
#endif
#if defined(EAGAIN) && !defined(_WIN32)
# define UV__EAGAIN UV__ERR(EAGAIN)
#else
# define UV__EAGAIN (-4088)
#endif
#if defined(EALREADY) && !defined(_WIN32)
# define UV__EALREADY UV__ERR(EALREADY)
#else
# define UV__EALREADY (-4084)
#endif
#if defined(EBADF) && !defined(_WIN32)
# define UV__EBADF UV__ERR(EBADF)
#else
# define UV__EBADF (-4083)
#endif
#if defined(EBUSY) && !defined(_WIN32)
# define UV__EBUSY UV__ERR(EBUSY)
#else
# define UV__EBUSY (-4082)
#endif
#if defined(ECANCELED) && !defined(_WIN32)
# define UV__ECANCELED UV__ERR(ECANCELED)
#else
# define UV__ECANCELED (-4081)
#endif
#if defined(ECHARSET) && !defined(_WIN32)
# define UV__ECHARSET UV__ERR(ECHARSET)
#else
# define UV__ECHARSET (-4080)
#endif
#if defined(ECONNABORTED) && !defined(_WIN32)
# define UV__ECONNABORTED UV__ERR(ECONNABORTED)
#else
# define UV__ECONNABORTED (-4079)
#endif
#if defined(ECONNREFUSED) && !defined(_WIN32)
# define UV__ECONNREFUSED UV__ERR(ECONNREFUSED)
#else
# define UV__ECONNREFUSED (-4078)
#endif
#if defined(ECONNRESET) && !defined(_WIN32)
# define UV__ECONNRESET UV__ERR(ECONNRESET)
#else
# define UV__ECONNRESET (-4077)
#endif
#if defined(EDESTADDRREQ) && !defined(_WIN32)
# define UV__EDESTADDRREQ UV__ERR(EDESTADDRREQ)
#else
# define UV__EDESTADDRREQ (-4076)
#endif
#if defined(EEXIST) && !defined(_WIN32)
# define UV__EEXIST UV__ERR(EEXIST)
#else
# define UV__EEXIST (-4075)
#endif
#if defined(EFAULT) && !defined(_WIN32)
# define UV__EFAULT UV__ERR(EFAULT)
#else
# define UV__EFAULT (-4074)
#endif
#if defined(EHOSTUNREACH) && !defined(_WIN32)
# define UV__EHOSTUNREACH UV__ERR(EHOSTUNREACH)
#else
# define UV__EHOSTUNREACH (-4073)
#endif
#if defined(EINTR) && !defined(_WIN32)
# define UV__EINTR UV__ERR(EINTR)
#else
# define UV__EINTR (-4072)
#endif
#if defined(EINVAL) && !defined(_WIN32)
# define UV__EINVAL UV__ERR(EINVAL)
#else
# define UV__EINVAL (-4071)
#endif
#if defined(EIO) && !defined(_WIN32)
# define UV__EIO UV__ERR(EIO)
#else
# define UV__EIO (-4070)
#endif
#if defined(EISCONN) && !defined(_WIN32)
# define UV__EISCONN UV__ERR(EISCONN)
#else
# define UV__EISCONN (-4069)
#endif
#if defined(EISDIR) && !defined(_WIN32)
# define UV__EISDIR UV__ERR(EISDIR)
#else
# define UV__EISDIR (-4068)
#endif
#if defined(ELOOP) && !defined(_WIN32)
# define UV__ELOOP UV__ERR(ELOOP)
#else
# define UV__ELOOP (-4067)
#endif
#if defined(EMFILE) && !defined(_WIN32)
# define UV__EMFILE UV__ERR(EMFILE)
#else
# define UV__EMFILE (-4066)
#endif
#if defined(EMSGSIZE) && !defined(_WIN32)
# define UV__EMSGSIZE UV__ERR(EMSGSIZE)
#else
# define UV__EMSGSIZE (-4065)
#endif
#if defined(ENAMETOOLONG) && !defined(_WIN32)
# define UV__ENAMETOOLONG UV__ERR(ENAMETOOLONG)
#else
# define UV__ENAMETOOLONG (-4064)
#endif
#if defined(ENETDOWN) && !defined(_WIN32)
# define UV__ENETDOWN UV__ERR(ENETDOWN)
#else
# define UV__ENETDOWN (-4063)
#endif
#if defined(ENETUNREACH) && !defined(_WIN32)
# define UV__ENETUNREACH UV__ERR(ENETUNREACH)
#else
# define UV__ENETUNREACH (-4062)
#endif
#if defined(ENFILE) && !defined(_WIN32)
# define UV__ENFILE UV__ERR(ENFILE)
#else
# define UV__ENFILE (-4061)
#endif
#if defined(ENOBUFS) && !defined(_WIN32)
# define UV__ENOBUFS UV__ERR(ENOBUFS)
#else
# define UV__ENOBUFS (-4060)
#endif
#if defined(ENODEV) && !defined(_WIN32)
# define UV__ENODEV UV__ERR(ENODEV)
#else
# define UV__ENODEV (-4059)
#endif
#if defined(ENOENT) && !defined(_WIN32)
# define UV__ENOENT UV__ERR(ENOENT)
#else
# define UV__ENOENT (-4058)
#endif
#if defined(ENOMEM) && !defined(_WIN32)
# define UV__ENOMEM UV__ERR(ENOMEM)
#else
# define UV__ENOMEM (-4057)
#endif
#if defined(ENONET) && !defined(_WIN32)
# define UV__ENONET UV__ERR(ENONET)
#else
# define UV__ENONET (-4056)
#endif
#if defined(ENOSPC) && !defined(_WIN32)
# define UV__ENOSPC UV__ERR(ENOSPC)
#else
# define UV__ENOSPC (-4055)
#endif
#if defined(ENOSYS) && !defined(_WIN32)
# define UV__ENOSYS UV__ERR(ENOSYS)
#else
# define UV__ENOSYS (-4054)
#endif
#if defined(ENOTCONN) && !defined(_WIN32)
# define UV__ENOTCONN UV__ERR(ENOTCONN)
#else
# define UV__ENOTCONN (-4053)
#endif
#if defined(ENOTDIR) && !defined(_WIN32)
# define UV__ENOTDIR UV__ERR(ENOTDIR)
#else
# define UV__ENOTDIR (-4052)
#endif
#if defined(ENOTEMPTY) && !defined(_WIN32)
# define UV__ENOTEMPTY UV__ERR(ENOTEMPTY)
#else
# define UV__ENOTEMPTY (-4051)
#endif
#if defined(ENOTSOCK) && !defined(_WIN32)
# define UV__ENOTSOCK UV__ERR(ENOTSOCK)
#else
# define UV__ENOTSOCK (-4050)
#endif
#if defined(ENOTSUP) && !defined(_WIN32)
# define UV__ENOTSUP UV__ERR(ENOTSUP)
#else
# define UV__ENOTSUP (-4049)
#endif
#if defined(EPERM) && !defined(_WIN32)
# define UV__EPERM UV__ERR(EPERM)
#else
# define UV__EPERM (-4048)
#endif
#if defined(EPIPE) && !defined(_WIN32)
# define UV__EPIPE UV__ERR(EPIPE)
#else
# define UV__EPIPE (-4047)
#endif
#if defined(EPROTO) && !defined(_WIN32)
# define UV__EPROTO UV__ERR(EPROTO)
#else
# define UV__EPROTO (-4046)
#endif
#if defined(EPROTONOSUPPORT) && !defined(_WIN32)
# define UV__EPROTONOSUPPORT UV__ERR(EPROTONOSUPPORT)
#else
# define UV__EPROTONOSUPPORT (-4045)
#endif
#if defined(EPROTOTYPE) && !defined(_WIN32)
# define UV__EPROTOTYPE UV__ERR(EPROTOTYPE)
#else
# define UV__EPROTOTYPE (-4044)
#endif
#if defined(EROFS) && !defined(_WIN32)
# define UV__EROFS UV__ERR(EROFS)
#else
# define UV__EROFS (-4043)
#endif
#if defined(ESHUTDOWN) && !defined(_WIN32)
# define UV__ESHUTDOWN UV__ERR(ESHUTDOWN)
#else
# define UV__ESHUTDOWN (-4042)
#endif
#if defined(ESPIPE) && !defined(_WIN32)
# define UV__ESPIPE UV__ERR(ESPIPE)
#else
# define UV__ESPIPE (-4041)
#endif
#if defined(ESRCH) && !defined(_WIN32)
# define UV__ESRCH UV__ERR(ESRCH)
#else
# define UV__ESRCH (-4040)
#endif
#if defined(ETIMEDOUT) && !defined(_WIN32)
# define UV__ETIMEDOUT UV__ERR(ETIMEDOUT)
#else
# define UV__ETIMEDOUT (-4039)
#endif
#if defined(ETXTBSY) && !defined(_WIN32)
# define UV__ETXTBSY UV__ERR(ETXTBSY)
#else
# define UV__ETXTBSY (-4038)
#endif
#if defined(EXDEV) && !defined(_WIN32)
# define UV__EXDEV UV__ERR(EXDEV)
#else
# define UV__EXDEV (-4037)
#endif
#if defined(EFBIG) && !defined(_WIN32)
# define UV__EFBIG UV__ERR(EFBIG)
#else
# define UV__EFBIG (-4036)
#endif
#if defined(ENOPROTOOPT) && !defined(_WIN32)
# define UV__ENOPROTOOPT UV__ERR(ENOPROTOOPT)
#else
# define UV__ENOPROTOOPT (-4035)
#endif
#if defined(ERANGE) && !defined(_WIN32)
# define UV__ERANGE UV__ERR(ERANGE)
#else
# define UV__ERANGE (-4034)
#endif
#if defined(ENXIO) && !defined(_WIN32)
# define UV__ENXIO UV__ERR(ENXIO)
#else
# define UV__ENXIO (-4033)
#endif
#if defined(EMLINK) && !defined(_WIN32)
# define UV__EMLINK UV__ERR(EMLINK)
#else
# define UV__EMLINK (-4032)
#endif
/* EHOSTDOWN is not visible on BSD-like systems when _POSIX_C_SOURCE is
* defined. Fortunately, its value is always 64 so it's possible albeit
* icky to hard-code it.
*/
#if defined(EHOSTDOWN) && !defined(_WIN32)
# define UV__EHOSTDOWN UV__ERR(EHOSTDOWN)
#elif defined(__APPLE__) || \
defined(__DragonFly__) || \
defined(__FreeBSD__) || \
defined(__NetBSD__) || \
defined(__OpenBSD__)
# define UV__EHOSTDOWN (-64)
#else
# define UV__EHOSTDOWN (-4031)
#endif
#if defined(EREMOTEIO) && !defined(_WIN32)
# define UV__EREMOTEIO UV__ERR(EREMOTEIO)
#else
# define UV__EREMOTEIO (-4030)
#endif
#if defined(ENOTTY) && !defined(_WIN32)
# define UV__ENOTTY UV__ERR(ENOTTY)
#else
# define UV__ENOTTY (-4029)
#endif
#if defined(EFTYPE) && !defined(_WIN32)
# define UV__EFTYPE UV__ERR(EFTYPE)
#else
# define UV__EFTYPE (-4028)
#endif
#if defined(EILSEQ) && !defined(_WIN32)
# define UV__EILSEQ UV__ERR(EILSEQ)
#else
# define UV__EILSEQ (-4027)
#endif
#if defined(EOVERFLOW) && !defined(_WIN32)
# define UV__EOVERFLOW UV__ERR(EOVERFLOW)
#else
# define UV__EOVERFLOW (-4026)
#endif
#if defined(ESOCKTNOSUPPORT) && !defined(_WIN32)
# define UV__ESOCKTNOSUPPORT UV__ERR(ESOCKTNOSUPPORT)
#else
# define UV__ESOCKTNOSUPPORT (-4025)
#endif
/* FreeBSD defines ENODATA in /usr/include/c++/v1/errno.h which is only visible
* if C++ is being used. Define it directly to avoid problems when integrating
* libuv in a C++ project.
*/
#if defined(ENODATA) && !defined(_WIN32)
# define UV__ENODATA UV__ERR(ENODATA)
#elif defined(__FreeBSD__)
# define UV__ENODATA (-9919)
#else
# define UV__ENODATA (-4024)
#endif
#if defined(EUNATCH) && !defined(_WIN32)
# define UV__EUNATCH UV__ERR(EUNATCH)
#else
# define UV__EUNATCH (-4023)
#endif
#if defined(ENOEXEC) && !defined(_WIN32)
# define UV__ENOEXEC UV__ERR(ENOEXEC)
#else
# define UV__ENOEXEC (-4022)
#endif
#endif /* UV_ERRNO_H_ */

View File

@@ -0,0 +1,34 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_LINUX_H
#define UV_LINUX_H
#define UV_PLATFORM_LOOP_FIELDS \
uv__io_t inotify_read_watcher; \
void* inotify_watchers; \
int inotify_fd; \
#define UV_PLATFORM_FS_EVENT_FIELDS \
struct uv__queue watchers; \
int wd; \
#endif /* UV_LINUX_H */

View File

@@ -0,0 +1,33 @@
/* Copyright libuv project contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_MVS_H
#define UV_MVS_H
#define UV_PLATFORM_SEM_T long
#define UV_PLATFORM_LOOP_FIELDS \
void* ep; \
#define UV_PLATFORM_FS_EVENT_FIELDS \
char rfis_rftok[8]; \
#endif /* UV_MVS_H */

View File

@@ -0,0 +1,31 @@
/* Copyright libuv project contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_POSIX_H
#define UV_POSIX_H
#define UV_PLATFORM_LOOP_FIELDS \
struct pollfd* poll_fds; \
size_t poll_fds_used; \
size_t poll_fds_size; \
unsigned char poll_fds_iterating; \
#endif /* UV_POSIX_H */

View File

@@ -0,0 +1,44 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_SUNOS_H
#define UV_SUNOS_H
#include <sys/port.h>
#include <port.h>
/* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c,
* add the fs_event fields even when this version of SunOS doesn't support
* file watching.
*/
#define UV_PLATFORM_LOOP_FIELDS \
uv__io_t fs_event_watcher; \
int fs_fd; \
#if defined(PORT_SOURCE_FILE)
# define UV_PLATFORM_FS_EVENT_FIELDS \
file_obj_t fo; \
int fd; \
#endif /* defined(PORT_SOURCE_FILE) */
#endif /* UV_SUNOS_H */

View File

@@ -0,0 +1,37 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/*
* This file is private to libuv. It provides common functionality to both
* Windows and Unix backends.
*/
#ifndef UV_THREADPOOL_H_
#define UV_THREADPOOL_H_
struct uv__work {
void (*work)(struct uv__work *w);
void (*done)(struct uv__work *w, int status);
struct uv_loop_s* loop;
struct uv__queue wq;
};
#endif /* UV_THREADPOOL_H_ */

View File

@@ -0,0 +1,521 @@
/*-
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef UV_TREE_H_
#define UV_TREE_H_
#ifndef UV__UNUSED
# if __GNUC__
# define UV__UNUSED __attribute__((unused))
# else
# define UV__UNUSED
# endif
#endif
/*
* This file defines data structures for red-black trees.
* A red-black tree is a binary search tree with the node color as an
* extra attribute. It fulfills a set of conditions:
* - every search path from the root to a leaf consists of the
* same number of black nodes,
* - each red node (except for the root) has a black parent,
* - each leaf node is black.
*
* Every operation on a red-black tree is bounded as O(lg n).
* The maximum height of a red-black tree is 2lg (n+1).
*/
/* Macros that define a red-black tree */
#define RB_HEAD(name, type) \
struct name { \
struct type *rbh_root; /* root of the tree */ \
}
#define RB_INITIALIZER(root) \
{ NULL }
#define RB_INIT(root) do { \
(root)->rbh_root = NULL; \
} while (/*CONSTCOND*/ 0)
#define RB_BLACK 0
#define RB_RED 1
#define RB_ENTRY(type) \
struct { \
struct type *rbe_left; /* left element */ \
struct type *rbe_right; /* right element */ \
struct type *rbe_parent; /* parent element */ \
int rbe_color; /* node color */ \
}
#define RB_LEFT(elm, field) (elm)->field.rbe_left
#define RB_RIGHT(elm, field) (elm)->field.rbe_right
#define RB_PARENT(elm, field) (elm)->field.rbe_parent
#define RB_COLOR(elm, field) (elm)->field.rbe_color
#define RB_ROOT(head) (head)->rbh_root
#define RB_EMPTY(head) (RB_ROOT(head) == NULL)
#define RB_SET(elm, parent, field) do { \
RB_PARENT(elm, field) = parent; \
RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \
RB_COLOR(elm, field) = RB_RED; \
} while (/*CONSTCOND*/ 0)
#define RB_SET_BLACKRED(black, red, field) do { \
RB_COLOR(black, field) = RB_BLACK; \
RB_COLOR(red, field) = RB_RED; \
} while (/*CONSTCOND*/ 0)
#ifndef RB_AUGMENT
#define RB_AUGMENT(x) do {} while (0)
#endif
#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
(tmp) = RB_RIGHT(elm, field); \
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \
RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
} \
RB_AUGMENT(elm); \
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
else \
RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
} else \
(head)->rbh_root = (tmp); \
RB_LEFT(tmp, field) = (elm); \
RB_PARENT(elm, field) = (tmp); \
RB_AUGMENT(tmp); \
if ((RB_PARENT(tmp, field))) \
RB_AUGMENT(RB_PARENT(tmp, field)); \
} while (/*CONSTCOND*/ 0)
#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
(tmp) = RB_LEFT(elm, field); \
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \
RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
} \
RB_AUGMENT(elm); \
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
else \
RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
} else \
(head)->rbh_root = (tmp); \
RB_RIGHT(tmp, field) = (elm); \
RB_PARENT(elm, field) = (tmp); \
RB_AUGMENT(tmp); \
if ((RB_PARENT(tmp, field))) \
RB_AUGMENT(RB_PARENT(tmp, field)); \
} while (/*CONSTCOND*/ 0)
/* Generates prototypes and inline functions */
#define RB_PROTOTYPE(name, type, field, cmp) \
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \
attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
attr struct type *name##_RB_REMOVE(struct name *, struct type *); \
attr struct type *name##_RB_INSERT(struct name *, struct type *); \
attr struct type *name##_RB_FIND(struct name *, struct type *); \
attr struct type *name##_RB_NFIND(struct name *, struct type *); \
attr struct type *name##_RB_NEXT(struct type *); \
attr struct type *name##_RB_PREV(struct type *); \
attr struct type *name##_RB_MINMAX(struct name *, int); \
\
/* Main rb operation.
* Moves node close to the key of elm to top
*/
#define RB_GENERATE(name, type, field, cmp) \
RB_GENERATE_INTERNAL(name, type, field, cmp,)
#define RB_GENERATE_STATIC(name, type, field, cmp) \
RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
attr void \
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
{ \
struct type *parent, *gparent, *tmp; \
while ((parent = RB_PARENT(elm, field)) != NULL && \
RB_COLOR(parent, field) == RB_RED) { \
gparent = RB_PARENT(parent, field); \
if (parent == RB_LEFT(gparent, field)) { \
tmp = RB_RIGHT(gparent, field); \
if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
RB_COLOR(tmp, field) = RB_BLACK; \
RB_SET_BLACKRED(parent, gparent, field); \
elm = gparent; \
continue; \
} \
if (RB_RIGHT(parent, field) == elm) { \
RB_ROTATE_LEFT(head, parent, tmp, field); \
tmp = parent; \
parent = elm; \
elm = tmp; \
} \
RB_SET_BLACKRED(parent, gparent, field); \
RB_ROTATE_RIGHT(head, gparent, tmp, field); \
} else { \
tmp = RB_LEFT(gparent, field); \
if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
RB_COLOR(tmp, field) = RB_BLACK; \
RB_SET_BLACKRED(parent, gparent, field); \
elm = gparent; \
continue; \
} \
if (RB_LEFT(parent, field) == elm) { \
RB_ROTATE_RIGHT(head, parent, tmp, field); \
tmp = parent; \
parent = elm; \
elm = tmp; \
} \
RB_SET_BLACKRED(parent, gparent, field); \
RB_ROTATE_LEFT(head, gparent, tmp, field); \
} \
} \
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
} \
\
attr void \
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \
struct type *elm) \
{ \
struct type *tmp; \
while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \
elm != RB_ROOT(head)) { \
if (RB_LEFT(parent, field) == elm) { \
tmp = RB_RIGHT(parent, field); \
if (RB_COLOR(tmp, field) == RB_RED) { \
RB_SET_BLACKRED(tmp, parent, field); \
RB_ROTATE_LEFT(head, parent, tmp, field); \
tmp = RB_RIGHT(parent, field); \
} \
if ((RB_LEFT(tmp, field) == NULL || \
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
(RB_RIGHT(tmp, field) == NULL || \
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
RB_COLOR(tmp, field) = RB_RED; \
elm = parent; \
parent = RB_PARENT(elm, field); \
} else { \
if (RB_RIGHT(tmp, field) == NULL || \
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \
struct type *oleft; \
if ((oleft = RB_LEFT(tmp, field)) \
!= NULL) \
RB_COLOR(oleft, field) = RB_BLACK; \
RB_COLOR(tmp, field) = RB_RED; \
RB_ROTATE_RIGHT(head, tmp, oleft, field); \
tmp = RB_RIGHT(parent, field); \
} \
RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
RB_COLOR(parent, field) = RB_BLACK; \
if (RB_RIGHT(tmp, field)) \
RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \
RB_ROTATE_LEFT(head, parent, tmp, field); \
elm = RB_ROOT(head); \
break; \
} \
} else { \
tmp = RB_LEFT(parent, field); \
if (RB_COLOR(tmp, field) == RB_RED) { \
RB_SET_BLACKRED(tmp, parent, field); \
RB_ROTATE_RIGHT(head, parent, tmp, field); \
tmp = RB_LEFT(parent, field); \
} \
if ((RB_LEFT(tmp, field) == NULL || \
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
(RB_RIGHT(tmp, field) == NULL || \
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
RB_COLOR(tmp, field) = RB_RED; \
elm = parent; \
parent = RB_PARENT(elm, field); \
} else { \
if (RB_LEFT(tmp, field) == NULL || \
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \
struct type *oright; \
if ((oright = RB_RIGHT(tmp, field)) \
!= NULL) \
RB_COLOR(oright, field) = RB_BLACK; \
RB_COLOR(tmp, field) = RB_RED; \
RB_ROTATE_LEFT(head, tmp, oright, field); \
tmp = RB_LEFT(parent, field); \
} \
RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
RB_COLOR(parent, field) = RB_BLACK; \
if (RB_LEFT(tmp, field)) \
RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \
RB_ROTATE_RIGHT(head, parent, tmp, field); \
elm = RB_ROOT(head); \
break; \
} \
} \
} \
if (elm) \
RB_COLOR(elm, field) = RB_BLACK; \
} \
\
attr struct type * \
name##_RB_REMOVE(struct name *head, struct type *elm) \
{ \
struct type *child, *parent, *old = elm; \
int color; \
if (RB_LEFT(elm, field) == NULL) \
child = RB_RIGHT(elm, field); \
else if (RB_RIGHT(elm, field) == NULL) \
child = RB_LEFT(elm, field); \
else { \
struct type *left; \
elm = RB_RIGHT(elm, field); \
while ((left = RB_LEFT(elm, field)) != NULL) \
elm = left; \
child = RB_RIGHT(elm, field); \
parent = RB_PARENT(elm, field); \
color = RB_COLOR(elm, field); \
if (child) \
RB_PARENT(child, field) = parent; \
if (parent) { \
if (RB_LEFT(parent, field) == elm) \
RB_LEFT(parent, field) = child; \
else \
RB_RIGHT(parent, field) = child; \
RB_AUGMENT(parent); \
} else \
RB_ROOT(head) = child; \
if (RB_PARENT(elm, field) == old) \
parent = elm; \
(elm)->field = (old)->field; \
if (RB_PARENT(old, field)) { \
if (RB_LEFT(RB_PARENT(old, field), field) == old) \
RB_LEFT(RB_PARENT(old, field), field) = elm; \
else \
RB_RIGHT(RB_PARENT(old, field), field) = elm; \
RB_AUGMENT(RB_PARENT(old, field)); \
} else \
RB_ROOT(head) = elm; \
RB_PARENT(RB_LEFT(old, field), field) = elm; \
if (RB_RIGHT(old, field)) \
RB_PARENT(RB_RIGHT(old, field), field) = elm; \
if (parent) { \
left = parent; \
do { \
RB_AUGMENT(left); \
} while ((left = RB_PARENT(left, field)) != NULL); \
} \
goto color; \
} \
parent = RB_PARENT(elm, field); \
color = RB_COLOR(elm, field); \
if (child) \
RB_PARENT(child, field) = parent; \
if (parent) { \
if (RB_LEFT(parent, field) == elm) \
RB_LEFT(parent, field) = child; \
else \
RB_RIGHT(parent, field) = child; \
RB_AUGMENT(parent); \
} else \
RB_ROOT(head) = child; \
color: \
if (color == RB_BLACK) \
name##_RB_REMOVE_COLOR(head, parent, child); \
return (old); \
} \
\
/* Inserts a node into the RB tree */ \
attr struct type * \
name##_RB_INSERT(struct name *head, struct type *elm) \
{ \
struct type *tmp; \
struct type *parent = NULL; \
int comp = 0; \
tmp = RB_ROOT(head); \
while (tmp) { \
parent = tmp; \
comp = (cmp)(elm, parent); \
if (comp < 0) \
tmp = RB_LEFT(tmp, field); \
else if (comp > 0) \
tmp = RB_RIGHT(tmp, field); \
else \
return (tmp); \
} \
RB_SET(elm, parent, field); \
if (parent != NULL) { \
if (comp < 0) \
RB_LEFT(parent, field) = elm; \
else \
RB_RIGHT(parent, field) = elm; \
RB_AUGMENT(parent); \
} else \
RB_ROOT(head) = elm; \
name##_RB_INSERT_COLOR(head, elm); \
return (NULL); \
} \
\
/* Finds the node with the same key as elm */ \
attr struct type * \
name##_RB_FIND(struct name *head, struct type *elm) \
{ \
struct type *tmp = RB_ROOT(head); \
int comp; \
while (tmp) { \
comp = cmp(elm, tmp); \
if (comp < 0) \
tmp = RB_LEFT(tmp, field); \
else if (comp > 0) \
tmp = RB_RIGHT(tmp, field); \
else \
return (tmp); \
} \
return (NULL); \
} \
\
/* Finds the first node greater than or equal to the search key */ \
attr struct type * \
name##_RB_NFIND(struct name *head, struct type *elm) \
{ \
struct type *tmp = RB_ROOT(head); \
struct type *res = NULL; \
int comp; \
while (tmp) { \
comp = cmp(elm, tmp); \
if (comp < 0) { \
res = tmp; \
tmp = RB_LEFT(tmp, field); \
} \
else if (comp > 0) \
tmp = RB_RIGHT(tmp, field); \
else \
return (tmp); \
} \
return (res); \
} \
\
/* ARGSUSED */ \
attr struct type * \
name##_RB_NEXT(struct type *elm) \
{ \
if (RB_RIGHT(elm, field)) { \
elm = RB_RIGHT(elm, field); \
while (RB_LEFT(elm, field)) \
elm = RB_LEFT(elm, field); \
} else { \
if (RB_PARENT(elm, field) && \
(elm == RB_LEFT(RB_PARENT(elm, field), field))) \
elm = RB_PARENT(elm, field); \
else { \
while (RB_PARENT(elm, field) && \
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
elm = RB_PARENT(elm, field); \
elm = RB_PARENT(elm, field); \
} \
} \
return (elm); \
} \
\
/* ARGSUSED */ \
attr struct type * \
name##_RB_PREV(struct type *elm) \
{ \
if (RB_LEFT(elm, field)) { \
elm = RB_LEFT(elm, field); \
while (RB_RIGHT(elm, field)) \
elm = RB_RIGHT(elm, field); \
} else { \
if (RB_PARENT(elm, field) && \
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
elm = RB_PARENT(elm, field); \
else { \
while (RB_PARENT(elm, field) && \
(elm == RB_LEFT(RB_PARENT(elm, field), field))) \
elm = RB_PARENT(elm, field); \
elm = RB_PARENT(elm, field); \
} \
} \
return (elm); \
} \
\
attr struct type * \
name##_RB_MINMAX(struct name *head, int val) \
{ \
struct type *tmp = RB_ROOT(head); \
struct type *parent = NULL; \
while (tmp) { \
parent = tmp; \
if (val < 0) \
tmp = RB_LEFT(tmp, field); \
else \
tmp = RB_RIGHT(tmp, field); \
} \
return (parent); \
}
#define RB_NEGINF -1
#define RB_INF 1
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
#define RB_NEXT(name, x) name##_RB_NEXT(x)
#define RB_PREV(name, x) name##_RB_PREV(x)
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
#define RB_FOREACH(x, name, head) \
for ((x) = RB_MIN(name, head); \
(x) != NULL; \
(x) = name##_RB_NEXT(x))
#define RB_FOREACH_FROM(x, name, y) \
for ((x) = (y); \
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
(x) = (y))
#define RB_FOREACH_SAFE(x, name, head, y) \
for ((x) = RB_MIN(name, head); \
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
(x) = (y))
#define RB_FOREACH_REVERSE(x, name, head) \
for ((x) = RB_MAX(name, head); \
(x) != NULL; \
(x) = name##_RB_PREV(x))
#define RB_FOREACH_REVERSE_FROM(x, name, y) \
for ((x) = (y); \
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
(x) = (y))
#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \
for ((x) = RB_MAX(name, head); \
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
(x) = (y))
#endif /* UV_TREE_H_ */

View File

@@ -0,0 +1,512 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_UNIX_H
#define UV_UNIX_H
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h> /* MAXHOSTNAMELEN on Solaris */
#include <termios.h>
#include <pwd.h>
#if !defined(__MVS__)
#include <semaphore.h>
#include <sys/param.h> /* MAXHOSTNAMELEN on Linux and the BSDs */
#endif
#include <pthread.h>
#include <signal.h>
#include "uv/threadpool.h"
#if defined(__linux__)
# include "uv/linux.h"
#elif defined (__MVS__)
# include "uv/os390.h"
#elif defined(__PASE__) /* __PASE__ and _AIX are both defined on IBM i */
# include "uv/posix.h" /* IBM i needs uv/posix.h, not uv/aix.h */
#elif defined(_AIX)
# include "uv/aix.h"
#elif defined(__sun)
# include "uv/sunos.h"
#elif defined(__APPLE__)
# include "uv/darwin.h"
#elif defined(__DragonFly__) || \
defined(__FreeBSD__) || \
defined(__OpenBSD__) || \
defined(__NetBSD__)
# include "uv/bsd.h"
#elif defined(__CYGWIN__) || \
defined(__MSYS__) || \
defined(__HAIKU__) || \
defined(__QNX__) || \
defined(__GNU__)
# include "uv/posix.h"
#endif
#ifndef NI_MAXHOST
# define NI_MAXHOST 1025
#endif
#ifndef NI_MAXSERV
# define NI_MAXSERV 32
#endif
#ifndef UV_IO_PRIVATE_PLATFORM_FIELDS
# define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */
#endif
struct uv__io_s;
struct uv_loop_s;
typedef void (*uv__io_cb)(struct uv_loop_s* loop,
struct uv__io_s* w,
unsigned int events);
typedef struct uv__io_s uv__io_t;
struct uv__io_s {
uv__io_cb cb;
struct uv__queue pending_queue;
struct uv__queue watcher_queue;
unsigned int pevents; /* Pending event mask i.e. mask at next tick. */
unsigned int events; /* Current event mask. */
int fd;
UV_IO_PRIVATE_PLATFORM_FIELDS
};
#ifndef UV_PLATFORM_SEM_T
# define UV_PLATFORM_SEM_T sem_t
#endif
#ifndef UV_PLATFORM_LOOP_FIELDS
# define UV_PLATFORM_LOOP_FIELDS /* empty */
#endif
#ifndef UV_PLATFORM_FS_EVENT_FIELDS
# define UV_PLATFORM_FS_EVENT_FIELDS /* empty */
#endif
#ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS
# define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */
#endif
/* Note: May be cast to struct iovec. See writev(2). */
typedef struct uv_buf_t {
char* base;
size_t len;
} uv_buf_t;
typedef int uv_file;
typedef int uv_os_sock_t;
typedef int uv_os_fd_t;
typedef pid_t uv_pid_t;
#define UV_ONCE_INIT PTHREAD_ONCE_INIT
typedef pthread_once_t uv_once_t;
typedef pthread_t uv_thread_t;
typedef pthread_mutex_t uv_mutex_t;
typedef pthread_rwlock_t uv_rwlock_t;
typedef UV_PLATFORM_SEM_T uv_sem_t;
typedef pthread_cond_t uv_cond_t;
typedef pthread_key_t uv_key_t;
/* Note: guard clauses should match uv_barrier_init's in src/unix/thread.c. */
#if defined(_AIX) || \
defined(__OpenBSD__) || \
!defined(PTHREAD_BARRIER_SERIAL_THREAD)
/* TODO(bnoordhuis) Merge into uv_barrier_t in v2. */
struct _uv_barrier {
uv_mutex_t mutex;
uv_cond_t cond;
unsigned threshold;
unsigned in;
unsigned out;
};
typedef struct {
struct _uv_barrier* b;
# if defined(PTHREAD_BARRIER_SERIAL_THREAD)
/* TODO(bnoordhuis) Remove padding in v2. */
char pad[sizeof(pthread_barrier_t) - sizeof(struct _uv_barrier*)];
# endif
} uv_barrier_t;
#else
typedef pthread_barrier_t uv_barrier_t;
#endif
/* Platform-specific definitions for uv_spawn support. */
typedef gid_t uv_gid_t;
typedef uid_t uv_uid_t;
typedef struct dirent uv__dirent_t;
#define UV_DIR_PRIVATE_FIELDS \
DIR* dir;
#if defined(DT_UNKNOWN)
# define HAVE_DIRENT_TYPES
# if defined(DT_REG)
# define UV__DT_FILE DT_REG
# else
# define UV__DT_FILE -1
# endif
# if defined(DT_DIR)
# define UV__DT_DIR DT_DIR
# else
# define UV__DT_DIR -2
# endif
# if defined(DT_LNK)
# define UV__DT_LINK DT_LNK
# else
# define UV__DT_LINK -3
# endif
# if defined(DT_FIFO)
# define UV__DT_FIFO DT_FIFO
# else
# define UV__DT_FIFO -4
# endif
# if defined(DT_SOCK)
# define UV__DT_SOCKET DT_SOCK
# else
# define UV__DT_SOCKET -5
# endif
# if defined(DT_CHR)
# define UV__DT_CHAR DT_CHR
# else
# define UV__DT_CHAR -6
# endif
# if defined(DT_BLK)
# define UV__DT_BLOCK DT_BLK
# else
# define UV__DT_BLOCK -7
# endif
#endif
/* Platform-specific definitions for uv_dlopen support. */
#define UV_DYNAMIC /* empty */
typedef struct {
void* handle;
char* errmsg;
} uv_lib_t;
#define UV_LOOP_PRIVATE_FIELDS \
unsigned long flags; \
int backend_fd; \
struct uv__queue pending_queue; \
struct uv__queue watcher_queue; \
uv__io_t** watchers; \
unsigned int nwatchers; \
unsigned int nfds; \
struct uv__queue wq; \
uv_mutex_t wq_mutex; \
uv_async_t wq_async; \
uv_rwlock_t cloexec_lock; \
uv_handle_t* closing_handles; \
struct uv__queue process_handles; \
struct uv__queue prepare_handles; \
struct uv__queue check_handles; \
struct uv__queue idle_handles; \
struct uv__queue async_handles; \
void (*async_unused)(void); /* TODO(bnoordhuis) Remove in libuv v2. */ \
uv__io_t async_io_watcher; \
int async_wfd; \
struct { \
void* min; \
unsigned int nelts; \
} timer_heap; \
uint64_t timer_counter; \
uint64_t time; \
int signal_pipefd[2]; \
uv__io_t signal_io_watcher; \
uv_signal_t child_watcher; \
int emfile_fd; \
UV_PLATFORM_LOOP_FIELDS \
#define UV_REQ_TYPE_PRIVATE /* empty */
#define UV_REQ_PRIVATE_FIELDS /* empty */
#define UV_PRIVATE_REQ_TYPES /* empty */
#define UV_WRITE_PRIVATE_FIELDS \
struct uv__queue queue; \
unsigned int write_index; \
uv_buf_t* bufs; \
unsigned int nbufs; \
int error; \
uv_buf_t bufsml[4]; \
#define UV_CONNECT_PRIVATE_FIELDS \
struct uv__queue queue; \
#define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */
#define UV_UDP_SEND_PRIVATE_FIELDS \
struct uv__queue queue; \
union { \
struct sockaddr addr; \
struct sockaddr_storage storage; \
} u; \
unsigned int nbufs; \
uv_buf_t* bufs; \
ssize_t status; \
uv_udp_send_cb send_cb; \
uv_buf_t bufsml[4]; \
#define UV_HANDLE_PRIVATE_FIELDS \
uv_handle_t* next_closing; \
unsigned int flags; \
#define UV_STREAM_PRIVATE_FIELDS \
uv_connect_t *connect_req; \
uv_shutdown_t *shutdown_req; \
uv__io_t io_watcher; \
struct uv__queue write_queue; \
struct uv__queue write_completed_queue; \
uv_connection_cb connection_cb; \
int delayed_error; \
int accepted_fd; \
void* queued_fds; \
UV_STREAM_PRIVATE_PLATFORM_FIELDS \
#define UV_TCP_PRIVATE_FIELDS /* empty */
#define UV_UDP_PRIVATE_FIELDS \
uv_alloc_cb alloc_cb; \
uv_udp_recv_cb recv_cb; \
uv__io_t io_watcher; \
struct uv__queue write_queue; \
struct uv__queue write_completed_queue; \
#define UV_PIPE_PRIVATE_FIELDS \
const char* pipe_fname; /* NULL or strdup'ed */
#define UV_POLL_PRIVATE_FIELDS \
uv__io_t io_watcher;
#define UV_PREPARE_PRIVATE_FIELDS \
uv_prepare_cb prepare_cb; \
struct uv__queue queue; \
#define UV_CHECK_PRIVATE_FIELDS \
uv_check_cb check_cb; \
struct uv__queue queue; \
#define UV_IDLE_PRIVATE_FIELDS \
uv_idle_cb idle_cb; \
struct uv__queue queue; \
#define UV_ASYNC_PRIVATE_FIELDS \
uv_async_cb async_cb; \
struct uv__queue queue; \
int pending; \
#define UV_TIMER_PRIVATE_FIELDS \
uv_timer_cb timer_cb; \
union { \
void* heap[3]; \
struct uv__queue queue; \
} node; \
uint64_t timeout; \
uint64_t repeat; \
uint64_t start_id;
#define UV_GETADDRINFO_PRIVATE_FIELDS \
struct uv__work work_req; \
uv_getaddrinfo_cb cb; \
struct addrinfo* hints; \
char* hostname; \
char* service; \
struct addrinfo* addrinfo; \
int retcode;
#define UV_GETNAMEINFO_PRIVATE_FIELDS \
struct uv__work work_req; \
uv_getnameinfo_cb getnameinfo_cb; \
struct sockaddr_storage storage; \
int flags; \
char host[NI_MAXHOST]; \
char service[NI_MAXSERV]; \
int retcode;
#define UV_PROCESS_PRIVATE_FIELDS \
struct uv__queue queue; \
int status; \
#define UV_FS_PRIVATE_FIELDS \
const char *new_path; \
uv_file file; \
int flags; \
mode_t mode; \
unsigned int nbufs; \
uv_buf_t* bufs; \
off_t off; \
uv_uid_t uid; \
uv_gid_t gid; \
double atime; \
double mtime; \
struct uv__work work_req; \
uv_buf_t bufsml[4]; \
#define UV_WORK_PRIVATE_FIELDS \
struct uv__work work_req;
#define UV_TTY_PRIVATE_FIELDS \
struct termios orig_termios; \
int mode;
#define UV_SIGNAL_PRIVATE_FIELDS \
/* RB_ENTRY(uv_signal_s) tree_entry; */ \
struct { \
struct uv_signal_s* rbe_left; \
struct uv_signal_s* rbe_right; \
struct uv_signal_s* rbe_parent; \
int rbe_color; \
} tree_entry; \
/* Use two counters here so we don have to fiddle with atomics. */ \
unsigned int caught_signals; \
unsigned int dispatched_signals;
#define UV_FS_EVENT_PRIVATE_FIELDS \
uv_fs_event_cb cb; \
UV_PLATFORM_FS_EVENT_FIELDS \
/* fs open() flags supported on this platform: */
#if defined(O_APPEND)
# define UV_FS_O_APPEND O_APPEND
#else
# define UV_FS_O_APPEND 0
#endif
#if defined(O_CREAT)
# define UV_FS_O_CREAT O_CREAT
#else
# define UV_FS_O_CREAT 0
#endif
#if defined(__linux__) && defined(__arm__)
# define UV_FS_O_DIRECT 0x10000
#elif defined(__linux__) && defined(__m68k__)
# define UV_FS_O_DIRECT 0x10000
#elif defined(__linux__) && defined(__mips__)
# define UV_FS_O_DIRECT 0x08000
#elif defined(__linux__) && defined(__powerpc__)
# define UV_FS_O_DIRECT 0x20000
#elif defined(__linux__) && defined(__s390x__)
# define UV_FS_O_DIRECT 0x04000
#elif defined(__linux__) && defined(__x86_64__)
# define UV_FS_O_DIRECT 0x04000
#elif defined(__linux__) && defined(__loongarch__)
# define UV_FS_O_DIRECT 0x04000
#elif defined(O_DIRECT)
# define UV_FS_O_DIRECT O_DIRECT
#else
# define UV_FS_O_DIRECT 0
#endif
#if defined(O_DIRECTORY)
# define UV_FS_O_DIRECTORY O_DIRECTORY
#else
# define UV_FS_O_DIRECTORY 0
#endif
#if defined(O_DSYNC)
# define UV_FS_O_DSYNC O_DSYNC
#else
# define UV_FS_O_DSYNC 0
#endif
#if defined(O_EXCL)
# define UV_FS_O_EXCL O_EXCL
#else
# define UV_FS_O_EXCL 0
#endif
#if defined(O_EXLOCK)
# define UV_FS_O_EXLOCK O_EXLOCK
#else
# define UV_FS_O_EXLOCK 0
#endif
#if defined(O_NOATIME)
# define UV_FS_O_NOATIME O_NOATIME
#else
# define UV_FS_O_NOATIME 0
#endif
#if defined(O_NOCTTY)
# define UV_FS_O_NOCTTY O_NOCTTY
#else
# define UV_FS_O_NOCTTY 0
#endif
#if defined(O_NOFOLLOW)
# define UV_FS_O_NOFOLLOW O_NOFOLLOW
#else
# define UV_FS_O_NOFOLLOW 0
#endif
#if defined(O_NONBLOCK)
# define UV_FS_O_NONBLOCK O_NONBLOCK
#else
# define UV_FS_O_NONBLOCK 0
#endif
#if defined(O_RDONLY)
# define UV_FS_O_RDONLY O_RDONLY
#else
# define UV_FS_O_RDONLY 0
#endif
#if defined(O_RDWR)
# define UV_FS_O_RDWR O_RDWR
#else
# define UV_FS_O_RDWR 0
#endif
#if defined(O_SYMLINK)
# define UV_FS_O_SYMLINK O_SYMLINK
#else
# define UV_FS_O_SYMLINK 0
#endif
#if defined(O_SYNC)
# define UV_FS_O_SYNC O_SYNC
#else
# define UV_FS_O_SYNC 0
#endif
#if defined(O_TRUNC)
# define UV_FS_O_TRUNC O_TRUNC
#else
# define UV_FS_O_TRUNC 0
#endif
#if defined(O_WRONLY)
# define UV_FS_O_WRONLY O_WRONLY
#else
# define UV_FS_O_WRONLY 0
#endif
/* fs open() flags supported on other platforms: */
#define UV_FS_O_FILEMAP 0
#define UV_FS_O_RANDOM 0
#define UV_FS_O_SHORT_LIVED 0
#define UV_FS_O_SEQUENTIAL 0
#define UV_FS_O_TEMPORARY 0
#endif /* UV_UNIX_H */

View File

@@ -0,0 +1,43 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef UV_VERSION_H
#define UV_VERSION_H
/*
* Versions with the same major number are ABI stable. API is allowed to
* evolve between minor releases, but only in a backwards compatible way.
* Make sure you update the -soname directives in configure.ac
* whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but
* not UV_VERSION_PATCH.)
*/
#define UV_VERSION_MAJOR 1
#define UV_VERSION_MINOR 50
#define UV_VERSION_PATCH 1
#define UV_VERSION_IS_RELEASE 0
#define UV_VERSION_SUFFIX "dev"
#define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \
(UV_VERSION_MINOR << 8) | \
(UV_VERSION_PATCH))
#endif /* UV_VERSION_H */

View File

@@ -0,0 +1,698 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0A00
#endif
#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
typedef intptr_t ssize_t;
# define SSIZE_MAX INTPTR_MAX
# define _SSIZE_T_
# define _SSIZE_T_DEFINED
#endif
#include <winsock2.h>
#ifndef LOCALE_INVARIANT
# define LOCALE_INVARIANT 0x007f
#endif
#include <mswsock.h>
/* Disable the typedef in mstcpip.h of MinGW. */
#define _TCP_INITIAL_RTO_PARAMETERS _TCP_INITIAL_RTO_PARAMETERS__AVOID
#define TCP_INITIAL_RTO_PARAMETERS TCP_INITIAL_RTO_PARAMETERS__AVOID
#define PTCP_INITIAL_RTO_PARAMETERS PTCP_INITIAL_RTO_PARAMETERS__AVOID
#include <ws2tcpip.h>
#undef _TCP_INITIAL_RTO_PARAMETERS
#undef TCP_INITIAL_RTO_PARAMETERS
#undef PTCP_INITIAL_RTO_PARAMETERS
#include <windows.h>
#include <process.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdint.h>
#include "uv/tree.h"
#include "uv/threadpool.h"
#define MAX_PIPENAME_LEN 256
#ifndef S_IFLNK
# define S_IFLNK 0xA000
#endif
/* Define missing in Windows Kit Include\{VERSION}\ucrt\sys\stat.h */
#if defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES && !defined(S_IFIFO)
# define S_IFIFO _S_IFIFO
#endif
/* Additional signals supported by uv_signal and or uv_kill. The CRT defines
* the following signals already:
*
* #define SIGINT 2
* #define SIGILL 4
* #define SIGABRT_COMPAT 6
* #define SIGFPE 8
* #define SIGSEGV 11
* #define SIGTERM 15
* #define SIGBREAK 21
* #define SIGABRT 22
*
* The additional signals have values that are common on other Unix
* variants (Linux and Darwin)
*/
#define SIGHUP 1
#define SIGQUIT 3
#define SIGKILL 9
#define SIGWINCH 28
/* Redefine NSIG to take SIGWINCH into consideration */
#if defined(NSIG) && NSIG <= SIGWINCH
# undef NSIG
#endif
#ifndef NSIG
# define NSIG SIGWINCH + 1
#endif
/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many unix-like
* platforms. However MinGW doesn't define it, so we do. */
#ifndef SIGABRT_COMPAT
# define SIGABRT_COMPAT 6
#endif
/*
* Guids and typedefs for winsock extension functions
* Mingw32 doesn't have these :-(
*/
#ifndef WSAID_ACCEPTEX
# define WSAID_ACCEPTEX \
{0xb5367df1, 0xcbac, 0x11cf, \
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
# define WSAID_CONNECTEX \
{0x25a207b9, 0xddf3, 0x4660, \
{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
# define WSAID_GETACCEPTEXSOCKADDRS \
{0xb5367df2, 0xcbac, 0x11cf, \
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
# define WSAID_DISCONNECTEX \
{0x7fda2e11, 0x8630, 0x436f, \
{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
# define WSAID_TRANSMITFILE \
{0xb5367df0, 0xcbac, 0x11cf, \
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
typedef BOOL (PASCAL *LPFN_ACCEPTEX)
(SOCKET sListenSocket,
SOCKET sAcceptSocket,
PVOID lpOutputBuffer,
DWORD dwReceiveDataLength,
DWORD dwLocalAddressLength,
DWORD dwRemoteAddressLength,
LPDWORD lpdwBytesReceived,
LPOVERLAPPED lpOverlapped);
typedef BOOL (PASCAL *LPFN_CONNECTEX)
(SOCKET s,
const struct sockaddr* name,
int namelen,
PVOID lpSendBuffer,
DWORD dwSendDataLength,
LPDWORD lpdwBytesSent,
LPOVERLAPPED lpOverlapped);
typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS)
(PVOID lpOutputBuffer,
DWORD dwReceiveDataLength,
DWORD dwLocalAddressLength,
DWORD dwRemoteAddressLength,
LPSOCKADDR* LocalSockaddr,
LPINT LocalSockaddrLength,
LPSOCKADDR* RemoteSockaddr,
LPINT RemoteSockaddrLength);
typedef BOOL (PASCAL *LPFN_DISCONNECTEX)
(SOCKET hSocket,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags,
DWORD reserved);
typedef BOOL (PASCAL *LPFN_TRANSMITFILE)
(SOCKET hSocket,
HANDLE hFile,
DWORD nNumberOfBytesToWrite,
DWORD nNumberOfBytesPerSend,
LPOVERLAPPED lpOverlapped,
LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
DWORD dwFlags);
typedef PVOID RTL_SRWLOCK;
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
#endif
typedef int (WSAAPI* LPFN_WSARECV)
(SOCKET socket,
LPWSABUF buffers,
DWORD buffer_count,
LPDWORD bytes,
LPDWORD flags,
LPWSAOVERLAPPED overlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
typedef int (WSAAPI* LPFN_WSARECVFROM)
(SOCKET socket,
LPWSABUF buffers,
DWORD buffer_count,
LPDWORD bytes,
LPDWORD flags,
struct sockaddr* addr,
LPINT addr_len,
LPWSAOVERLAPPED overlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
#ifndef _NTDEF_
typedef LONG NTSTATUS;
typedef NTSTATUS *PNTSTATUS;
#endif
#ifndef RTL_CONDITION_VARIABLE_INIT
typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE;
#endif
typedef struct _AFD_POLL_HANDLE_INFO {
HANDLE Handle;
ULONG Events;
NTSTATUS Status;
} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
typedef struct _AFD_POLL_INFO {
LARGE_INTEGER Timeout;
ULONG NumberOfHandles;
ULONG Exclusive;
AFD_POLL_HANDLE_INFO Handles[1];
} AFD_POLL_INFO, *PAFD_POLL_INFO;
#define UV_MSAFD_PROVIDER_COUNT 4
/**
* It should be possible to cast uv_buf_t[] to WSABUF[]
* see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx
*/
typedef struct uv_buf_t {
ULONG len;
char* base;
} uv_buf_t;
typedef int uv_file;
typedef SOCKET uv_os_sock_t;
typedef HANDLE uv_os_fd_t;
typedef int uv_pid_t;
typedef HANDLE uv_thread_t;
typedef HANDLE uv_sem_t;
typedef CRITICAL_SECTION uv_mutex_t;
/* This condition variable implementation is based on the SetEvent solution
* (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
* We could not use the SignalObjectAndWait solution (section 3.4) because
* it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and
* uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs.
*/
typedef union {
CONDITION_VARIABLE cond_var;
struct {
unsigned int waiters_count;
CRITICAL_SECTION waiters_count_lock;
HANDLE signal_event;
HANDLE broadcast_event;
} unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */
} uv_cond_t;
typedef struct {
SRWLOCK read_write_lock_;
/* TODO: retained for ABI compatibility; remove me in v2.x */
#ifdef _WIN64
unsigned char padding_[72];
#else
unsigned char padding_[44];
#endif
} uv_rwlock_t;
typedef struct {
unsigned threshold;
unsigned in;
uv_mutex_t mutex;
/* TODO: in v2 make this a uv_cond_t, without unused_ */
CONDITION_VARIABLE cond;
unsigned out;
} uv_barrier_t;
typedef struct {
DWORD tls_index;
} uv_key_t;
#define UV_ONCE_INIT { 0, NULL }
typedef struct uv_once_s {
unsigned char unused;
INIT_ONCE init_once;
} uv_once_t;
/* Platform-specific definitions for uv_spawn support. */
typedef unsigned char uv_uid_t;
typedef unsigned char uv_gid_t;
typedef struct uv__dirent_s {
int d_type;
char d_name[1];
} uv__dirent_t;
#define UV_DIR_PRIVATE_FIELDS \
HANDLE dir_handle; \
WIN32_FIND_DATAW find_data; \
BOOL need_find_call;
#define HAVE_DIRENT_TYPES
#define UV__DT_DIR UV_DIRENT_DIR
#define UV__DT_FILE UV_DIRENT_FILE
#define UV__DT_LINK UV_DIRENT_LINK
#define UV__DT_FIFO UV_DIRENT_FIFO
#define UV__DT_SOCKET UV_DIRENT_SOCKET
#define UV__DT_CHAR UV_DIRENT_CHAR
#define UV__DT_BLOCK UV_DIRENT_BLOCK
/* Platform-specific definitions for uv_dlopen support. */
#define UV_DYNAMIC FAR WINAPI
typedef struct {
HMODULE handle;
char* errmsg;
} uv_lib_t;
#define UV_LOOP_PRIVATE_FIELDS \
/* The loop's I/O completion port */ \
HANDLE iocp; \
/* The current time according to the event loop. in msecs. */ \
uint64_t time; \
/* Tail of a single-linked circular queue of pending reqs. If the queue */ \
/* is empty, tail_ is NULL. If there is only one item, */ \
/* tail_->next_req == tail_ */ \
uv_req_t* pending_reqs_tail; \
/* Head of a single-linked list of closed handles */ \
uv_handle_t* endgame_handles; \
/* TODO(bnoordhuis) Stop heap-allocating |timer_heap| in libuv v2.x. */ \
void* timer_heap; \
/* Lists of active loop (prepare / check / idle) watchers */ \
uv_prepare_t* prepare_handles; \
uv_check_t* check_handles; \
uv_idle_t* idle_handles; \
/* This pointer will refer to the prepare/check/idle handle whose */ \
/* callback is scheduled to be called next. This is needed to allow */ \
/* safe removal from one of the lists above while that list being */ \
/* iterated over. */ \
uv_prepare_t* next_prepare_handle; \
uv_check_t* next_check_handle; \
uv_idle_t* next_idle_handle; \
/* This handle holds the peer sockets for the fast variant of uv_poll_t */ \
SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \
/* No longer used. */ \
unsigned int active_tcp_streams; \
/* No longer used. */ \
unsigned int active_udp_streams; \
/* Counter to started timer */ \
uint64_t timer_counter; \
/* Threadpool */ \
struct uv__queue wq; \
uv_mutex_t wq_mutex; \
uv_async_t wq_async;
#define UV_REQ_TYPE_PRIVATE \
/* TODO: remove the req suffix */ \
UV_ACCEPT, \
UV_FS_EVENT_REQ, \
UV_POLL_REQ, \
UV_PROCESS_EXIT, \
UV_READ, \
UV_UDP_RECV, \
UV_WAKEUP, \
UV_SIGNAL_REQ,
#define UV_REQ_PRIVATE_FIELDS \
union { \
/* Used by I/O operations */ \
struct { \
OVERLAPPED overlapped; \
size_t queued_bytes; \
} io; \
/* in v2, we can move these to the UV_CONNECT_PRIVATE_FIELDS */ \
struct { \
ULONG_PTR result; /* overlapped.Internal is reused to hold the result */\
HANDLE pipeHandle; \
DWORD duplex_flags; \
WCHAR* name; \
} connect; \
} u; \
struct uv_req_s* next_req;
#define UV_WRITE_PRIVATE_FIELDS \
int coalesced; \
uv_buf_t write_buffer; \
HANDLE event_handle; \
HANDLE wait_handle;
#define UV_CONNECT_PRIVATE_FIELDS \
/* empty */
#define UV_SHUTDOWN_PRIVATE_FIELDS \
/* empty */
#define UV_UDP_SEND_PRIVATE_FIELDS \
/* empty */
#define UV_PRIVATE_REQ_TYPES \
typedef struct uv_pipe_accept_s { \
UV_REQ_FIELDS \
HANDLE pipeHandle; \
struct uv_pipe_accept_s* next_pending; \
} uv_pipe_accept_t; \
\
typedef struct uv_tcp_accept_s { \
UV_REQ_FIELDS \
SOCKET accept_socket; \
char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \
HANDLE event_handle; \
HANDLE wait_handle; \
struct uv_tcp_accept_s* next_pending; \
} uv_tcp_accept_t; \
\
typedef struct uv_read_s { \
UV_REQ_FIELDS \
HANDLE event_handle; \
HANDLE wait_handle; \
} uv_read_t;
#define uv_stream_connection_fields \
unsigned int write_reqs_pending; \
uv_shutdown_t* shutdown_req;
#define uv_stream_server_fields \
uv_connection_cb connection_cb;
#define UV_STREAM_PRIVATE_FIELDS \
unsigned int reqs_pending; \
int activecnt; \
uv_read_t read_req; \
union { \
struct { uv_stream_connection_fields } conn; \
struct { uv_stream_server_fields } serv; \
} stream;
#define uv_tcp_server_fields \
uv_tcp_accept_t* accept_reqs; \
unsigned int processed_accepts; \
uv_tcp_accept_t* pending_accepts; \
LPFN_ACCEPTEX func_acceptex;
#define uv_tcp_connection_fields \
uv_buf_t read_buffer; \
LPFN_CONNECTEX func_connectex;
#define UV_TCP_PRIVATE_FIELDS \
SOCKET socket; \
int delayed_error; \
union { \
struct { uv_tcp_server_fields } serv; \
struct { uv_tcp_connection_fields } conn; \
} tcp;
#define UV_UDP_PRIVATE_FIELDS \
SOCKET socket; \
unsigned int reqs_pending; \
int activecnt; \
uv_req_t recv_req; \
uv_buf_t recv_buffer; \
struct sockaddr_storage recv_from; \
int recv_from_len; \
uv_udp_recv_cb recv_cb; \
uv_alloc_cb alloc_cb; \
LPFN_WSARECV func_wsarecv; \
LPFN_WSARECVFROM func_wsarecvfrom;
#define uv_pipe_server_fields \
int pending_instances; \
uv_pipe_accept_t* accept_reqs; \
uv_pipe_accept_t* pending_accepts;
#define uv_pipe_connection_fields \
uv_timer_t* eof_timer; \
uv_write_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
DWORD ipc_remote_pid; \
union { \
uint32_t payload_remaining; \
uint64_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
} ipc_data_frame; \
struct uv__queue ipc_xfer_queue; \
int ipc_xfer_queue_length; \
uv_write_t* non_overlapped_writes_tail; \
CRITICAL_SECTION readfile_thread_lock; \
volatile HANDLE readfile_thread_handle;
#define UV_PIPE_PRIVATE_FIELDS \
HANDLE handle; \
WCHAR* name; \
union { \
struct { uv_pipe_server_fields } serv; \
struct { uv_pipe_connection_fields } conn; \
} pipe;
/* TODO: put the parser states in a union - TTY handles are always half-duplex
* so read-state can safely overlap write-state. */
#define UV_TTY_PRIVATE_FIELDS \
HANDLE handle; \
union { \
struct { \
/* Used for readable TTY handles */ \
union { \
/* TODO: remove me in v2.x. */ \
HANDLE unused_; \
int mode; \
} mode; \
uv_buf_t read_line_buffer; \
HANDLE read_raw_wait; \
/* Fields used for translating win keystrokes into vt100 characters */ \
char last_key[8]; \
unsigned char last_key_offset; \
unsigned char last_key_len; \
WCHAR last_utf16_high_surrogate; \
INPUT_RECORD last_input_record; \
} rd; \
struct { \
/* Used for writable TTY handles */ \
/* utf8-to-utf16 conversion state */ \
unsigned int utf8_codepoint; \
unsigned char utf8_bytes_left; \
/* eol conversion state */ \
unsigned char previous_eol; \
/* ansi parser state */ \
unsigned short ansi_parser_state; \
unsigned char ansi_csi_argc; \
unsigned short ansi_csi_argv[4]; \
COORD saved_position; \
WORD saved_attributes; \
} wr; \
} tty;
#define UV_POLL_PRIVATE_FIELDS \
SOCKET socket; \
/* Used in fast mode */ \
SOCKET peer_socket; \
AFD_POLL_INFO afd_poll_info_1; \
AFD_POLL_INFO afd_poll_info_2; \
/* Used in fast and slow mode. */ \
uv_req_t poll_req_1; \
uv_req_t poll_req_2; \
unsigned char submitted_events_1; \
unsigned char submitted_events_2; \
unsigned char mask_events_1; \
unsigned char mask_events_2; \
unsigned char events;
#define UV_TIMER_PRIVATE_FIELDS \
union { \
void* heap[3]; \
struct uv__queue queue; \
} node; \
int unused; \
uint64_t timeout; \
uint64_t repeat; \
uint64_t start_id; \
uv_timer_cb timer_cb;
#define UV_ASYNC_PRIVATE_FIELDS \
struct uv_req_s async_req; \
uv_async_cb async_cb; \
/* char to avoid alignment issues */ \
char volatile async_sent;
#define UV_PREPARE_PRIVATE_FIELDS \
uv_prepare_t* prepare_prev; \
uv_prepare_t* prepare_next; \
uv_prepare_cb prepare_cb;
#define UV_CHECK_PRIVATE_FIELDS \
uv_check_t* check_prev; \
uv_check_t* check_next; \
uv_check_cb check_cb;
#define UV_IDLE_PRIVATE_FIELDS \
uv_idle_t* idle_prev; \
uv_idle_t* idle_next; \
uv_idle_cb idle_cb;
#define UV_HANDLE_PRIVATE_FIELDS \
uv_handle_t* endgame_next; \
unsigned int flags;
#define UV_GETADDRINFO_PRIVATE_FIELDS \
struct uv__work work_req; \
uv_getaddrinfo_cb getaddrinfo_cb; \
void* alloc; \
WCHAR* node; \
WCHAR* service; \
/* The addrinfoW field is used to store a pointer to the hints, and */ \
/* later on to store the result of GetAddrInfoW. The final result will */ \
/* be converted to struct addrinfo* and stored in the addrinfo field. */ \
struct addrinfoW* addrinfow; \
struct addrinfo* addrinfo; \
int retcode;
#define UV_GETNAMEINFO_PRIVATE_FIELDS \
struct uv__work work_req; \
uv_getnameinfo_cb getnameinfo_cb; \
struct sockaddr_storage storage; \
int flags; \
char host[NI_MAXHOST]; \
char service[NI_MAXSERV]; \
int retcode;
#define UV_PROCESS_PRIVATE_FIELDS \
struct uv_process_exit_s { \
UV_REQ_FIELDS \
} exit_req; \
void* unused; /* TODO: retained for ABI compat; remove this in v2.x. */ \
int exit_signal; \
HANDLE wait_handle; \
HANDLE process_handle; \
volatile char exit_cb_pending;
#define UV_FS_PRIVATE_FIELDS \
struct uv__work work_req; \
int flags; \
DWORD sys_errno_; \
union { \
/* TODO: remove me in 0.9. */ \
WCHAR* pathw; \
int fd; \
} file; \
union { \
struct { \
int mode; \
WCHAR* new_pathw; \
int file_flags; \
int fd_out; \
unsigned int nbufs; \
uv_buf_t* bufs; \
int64_t offset; \
uv_buf_t bufsml[4]; \
} info; \
struct { \
double atime; \
double mtime; \
} time; \
} fs;
#define UV_WORK_PRIVATE_FIELDS \
struct uv__work work_req;
#define UV_FS_EVENT_PRIVATE_FIELDS \
struct uv_fs_event_req_s { \
UV_REQ_FIELDS \
} req; \
HANDLE dir_handle; \
int req_pending; \
uv_fs_event_cb cb; \
WCHAR* filew; \
WCHAR* short_filew; \
WCHAR* dirw; \
char* buffer;
#define UV_SIGNAL_PRIVATE_FIELDS \
RB_ENTRY(uv_signal_s) tree_entry; \
struct uv_req_s signal_req; \
unsigned long pending_signum;
#ifndef F_OK
#define F_OK 0
#endif
#ifndef R_OK
#define R_OK 4
#endif
#ifndef W_OK
#define W_OK 2
#endif
#ifndef X_OK
#define X_OK 1
#endif
/* fs open() flags supported on this platform: */
#define UV_FS_O_APPEND _O_APPEND
#define UV_FS_O_CREAT _O_CREAT
#define UV_FS_O_EXCL _O_EXCL
#define UV_FS_O_FILEMAP 0x20000000
#define UV_FS_O_RANDOM _O_RANDOM
#define UV_FS_O_RDONLY _O_RDONLY
#define UV_FS_O_RDWR _O_RDWR
#define UV_FS_O_SEQUENTIAL _O_SEQUENTIAL
#define UV_FS_O_SHORT_LIVED _O_SHORT_LIVED
#define UV_FS_O_TEMPORARY _O_TEMPORARY
#define UV_FS_O_TRUNC _O_TRUNC
#define UV_FS_O_WRONLY _O_WRONLY
/* fs open() flags supported on other platforms (or mapped on this platform): */
#define UV_FS_O_DIRECT 0x02000000 /* FILE_FLAG_NO_BUFFERING */
#define UV_FS_O_DIRECTORY 0
#define UV_FS_O_DSYNC 0x04000000 /* FILE_FLAG_WRITE_THROUGH */
#define UV_FS_O_EXLOCK 0x10000000 /* EXCLUSIVE SHARING MODE */
#define UV_FS_O_NOATIME 0
#define UV_FS_O_NOCTTY 0
#define UV_FS_O_NOFOLLOW 0
#define UV_FS_O_NONBLOCK 0
#define UV_FS_O_SYMLINK 0
#define UV_FS_O_SYNC 0x08000000 /* FILE_FLAG_WRITE_THROUGH */

View File

@@ -2,6 +2,11 @@
#if OS(LINUX) || OS(DARWIN)
void __bun_throw_not_implemented(const char* symbol_name)
{
CrashHandler__unsupportedUVFunction(symbol_name);
}
uv_pid_t uv_os_getpid()
{
return getpid();

View File

@@ -1,15 +1,19 @@
#pragma once
#include "root.h"
#include <stdint.h>
#include <stdio.h>
#if OS(LINUX) || OS(DARWIN)
typedef int uv_pid_t;
// These functions are called by the stubs to crash with a nice error message
// when accessing a libuv functin which we do not support on posix
extern "C" void CrashHandler__unsupportedUVFunction(const char* function_name);
void __bun_throw_not_implemented(const char* symbol_name);
// Returns the current process ID.
extern "C" BUN_EXPORT uv_pid_t uv_os_getpid();
// libuv headers will use UV_EXTERN
#define UV_EXTERN extern "C" __attribute__((visibility("default"))) __attribute__((used))
// Returns the parent process ID.
extern "C" BUN_EXPORT uv_pid_t uv_os_getppid();
#include <uv.h>
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -53,10 +53,7 @@ var panic_mutex = bun.Mutex{};
threadlocal var panic_stage: usize = 0;
threadlocal var inside_native_plugin: ?[*:0]const u8 = null;
export fn CrashHandler__setInsideNativePlugin(name: ?[*:0]const u8) callconv(.C) void {
inside_native_plugin = name;
}
threadlocal var unsupported_uv_function: ?[*:0]const u8 = null;
/// This can be set by various parts of the codebase to indicate a broader
/// action being taken. It is printed when a crash happens, which can help
@@ -69,7 +66,6 @@ pub threadlocal var current_action: ?Action = null;
var before_crash_handlers: std.ArrayListUnmanaged(struct { *anyopaque, *const OnBeforeCrash }) = .{};
// TODO: I don't think it's safe to lock/unlock a mutex inside a signal handler.
var before_crash_handlers_mutex: bun.Mutex = .{};
const CPUFeatures = @import("./bun.js/bindings/CPUFeatures.zig");
@@ -137,6 +133,8 @@ pub const Action = union(enum) {
kind: bun.ImportKind,
} else void,
dlopen: []const u8,
pub fn format(act: Action, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void {
switch (act) {
.parse => |path| try writer.print("parsing {s}", .{path}),
@@ -168,6 +166,7 @@ pub const Action = union(enum) {
res.kind.label(),
});
},
.dlopen => |path| try writer.print("while loading native module: {s}", .{path}),
}
}
};
@@ -247,6 +246,20 @@ pub fn crashHandler(
\\
;
writer.print(Output.prettyFmt(fmt, true), .{native_plugin_name}) catch std.posix.abort();
} else if (bun.analytics.Features.unsupported_uv_function > 0) {
const name = unsupported_uv_function orelse "<unknown>";
const fmt =
\\Bun encountered a crash when running a NAPI module that tried to call
\\the <red>{s}<r> libuv function.
\\
\\Bun is actively working on supporting all libuv functions for POSIX
\\systems, please see this issue to track our progress:
\\
\\<cyan>https://github.com/oven-sh/bun/issues/4290<r>
\\
\\
;
writer.print(Output.prettyFmt(fmt, true), .{name}) catch std.posix.abort();
}
} else {
if (Output.enable_ansi_colors) {
@@ -346,6 +359,20 @@ pub fn crashHandler(
\\
\\
, true), .{native_plugin_name}) catch std.posix.abort();
} else if (bun.analytics.Features.unsupported_uv_function > 0) {
const name = unsupported_uv_function orelse "<unknown>";
const fmt =
\\Bun encountered a crash when running a NAPI module that tried to call
\\the <red>{s}<r> libuv function.
\\
\\Bun is actively working on supporting all libuv functions for POSIX
\\systems, please see this issue to track our progress:
\\
\\<cyan>https://github.com/oven-sh/bun/issues/4290<r>
\\
\\
;
writer.print(Output.prettyFmt(fmt, true), .{name}) catch std.posix.abort();
} else if (reason == .out_of_memory) {
writer.writeAll(
\\Bun has run out of memory.
@@ -1831,10 +1858,33 @@ pub fn isPanicking() bool {
return panicking.load(.monotonic) > 0;
}
export fn CrashHandler__setInsideNativePlugin(name: ?[*:0]const u8) callconv(.C) void {
inside_native_plugin = name;
}
fn unsupportUVFunction(name: ?[*:0]const u8) callconv(.C) void {
bun.analytics.Features.unsupported_uv_function += 1;
unsupported_uv_function = name;
std.debug.panic("unsupported uv function: {s}", .{name.?});
}
export fn Bun__crashHandler(message_ptr: [*]u8, message_len: usize) noreturn {
crashHandler(.{ .panic = message_ptr[0..message_len] }, null, @returnAddress());
}
export fn CrashHandler__setDlOpenAction(action: ?[*:0]const u8) void {
if (action) |str| {
bun.debugAssert(current_action == null);
current_action = .{ .dlopen = bun.sliceTo(str, 0) };
} else {
bun.debugAssert(current_action != null and current_action.? == .dlopen);
current_action = null;
}
}
comptime {
_ = &Bun__crashHandler;
if (!bun.Environment.isWindows) {
@export(&unsupportUVFunction, .{ .name = "CrashHandler__unsupportedUVFunction" });
}
}

View File

@@ -4,8 +4,324 @@ BUN_1.2 {
node_api_*;
node_module_register;
uv_os_getpid;
uv_os_getppid;
uv_accept;
uv_async_init;
uv_async_send;
uv_available_parallelism;
uv_backend_fd;
uv_backend_timeout;
uv_barrier_destroy;
uv_barrier_init;
uv_barrier_wait;
uv_buf_init;
uv_cancel;
uv_chdir;
uv_check_init;
uv_check_start;
uv_check_stop;
uv_clock_gettime;
uv_close;
uv_cond_broadcast;
uv_cond_destroy;
uv_cond_init;
uv_cond_signal;
uv_cond_timedwait;
uv_cond_wait;
uv_cpu_info;
uv_cpumask_size;
uv_cwd;
uv_default_loop;
uv_disable_stdio_inheritance;
uv_dlclose;
uv_dlerror;
uv_dlopen;
uv_dlsym;
uv_err_name;
uv_err_name_r;
uv_exepath;
uv_fileno;
uv_free_cpu_info;
uv_free_interface_addresses;
uv_freeaddrinfo;
uv_fs_access;
uv_fs_chmod;
uv_fs_chown;
uv_fs_close;
uv_fs_closedir;
uv_fs_copyfile;
uv_fs_event_getpath;
uv_fs_event_init;
uv_fs_event_start;
uv_fs_event_stop;
uv_fs_fchmod;
uv_fs_fchown;
uv_fs_fdatasync;
uv_fs_fstat;
uv_fs_fsync;
uv_fs_ftruncate;
uv_fs_futime;
uv_fs_get_path;
uv_fs_get_ptr;
uv_fs_get_result;
uv_fs_get_statbuf;
uv_fs_get_system_error;
uv_fs_get_type;
uv_fs_lchown;
uv_fs_link;
uv_fs_lstat;
uv_fs_lutime;
uv_fs_mkdir;
uv_fs_mkdtemp;
uv_fs_mkstemp;
uv_fs_open;
uv_fs_opendir;
uv_fs_poll_getpath;
uv_fs_poll_init;
uv_fs_poll_start;
uv_fs_poll_stop;
uv_fs_read;
uv_fs_readdir;
uv_fs_readlink;
uv_fs_realpath;
uv_fs_rename;
uv_fs_req_cleanup;
uv_fs_rmdir;
uv_fs_scandir;
uv_fs_scandir_next;
uv_fs_sendfile;
uv_fs_stat;
uv_fs_statfs;
uv_fs_symlink;
uv_fs_unlink;
uv_fs_utime;
uv_fs_write;
uv_get_available_memory;
uv_get_constrained_memory;
uv_get_free_memory;
uv_get_osfhandle;
uv_get_process_title;
uv_get_total_memory;
uv_getaddrinfo;
uv_getnameinfo;
uv_getrusage;
uv_getrusage_thread;
uv_gettimeofday;
uv_guess_handle;
uv_handle_get_data;
uv_handle_get_loop;
uv_handle_get_type;
uv_handle_set_data;
uv_handle_size;
uv_handle_type_name;
uv_has_ref;
uv_hrtime;
uv_idle_init;
uv_idle_start;
uv_idle_stop;
uv_if_indextoiid;
uv_if_indextoname;
uv_inet_ntop;
uv_inet_pton;
uv_interface_addresses;
uv_ip_name;
uv_ip4_addr;
uv_ip4_name;
uv_ip6_addr;
uv_ip6_name;
uv_is_active;
uv_is_closing;
uv_is_readable;
uv_is_writable;
uv_key_create;
uv_key_delete;
uv_key_get;
uv_key_set;
uv_kill;
uv_library_shutdown;
uv_listen;
uv_loadavg;
uv_loop_alive;
uv_loop_close;
uv_loop_configure;
uv_loop_delete;
uv_loop_fork;
uv_loop_get_data;
uv_loop_init;
uv_loop_new;
uv_loop_set_data;
uv_loop_size;
uv_metrics_idle_time;
uv_metrics_info;
uv_mutex_destroy;
uv_mutex_init;
uv_mutex_init_recursive;
uv_mutex_lock;
uv_mutex_trylock;
uv_mutex_unlock;
uv_now;
uv_once;
uv_open_osfhandle;
uv_os_environ;
uv_os_free_environ;
uv_os_free_group;
uv_os_free_passwd;
uv_os_get_group;
uv_os_get_passwd;
uv_os_get_passwd2;
uv_os_getenv;
uv_os_gethostname;
uv_os_getpid;
uv_os_getppid;
uv_os_getpriority;
uv_os_homedir;
uv_os_setenv;
uv_os_setpriority;
uv_os_tmpdir;
uv_os_uname;
uv_os_unsetenv;
uv_pipe;
uv_pipe_bind;
uv_pipe_bind2;
uv_pipe_chmod;
uv_pipe_connect;
uv_pipe_connect2;
uv_pipe_getpeername;
uv_pipe_getsockname;
uv_pipe_init;
uv_pipe_open;
uv_pipe_pending_count;
uv_pipe_pending_instances;
uv_pipe_pending_type;
uv_poll_init;
uv_poll_init_socket;
uv_poll_start;
uv_poll_stop;
uv_prepare_init;
uv_prepare_start;
uv_prepare_stop;
uv_print_active_handles;
uv_print_all_handles;
uv_process_get_pid;
uv_process_kill;
uv_queue_work;
uv_random;
uv_read_start;
uv_read_stop;
uv_recv_buffer_size;
uv_ref;
uv_replace_allocator;
uv_req_get_data;
uv_req_get_type;
uv_req_set_data;
uv_req_size;
uv_req_type_name;
uv_resident_set_memory;
uv_run;
uv_rwlock_destroy;
uv_rwlock_init;
uv_rwlock_rdlock;
uv_rwlock_rdunlock;
uv_rwlock_tryrdlock;
uv_rwlock_trywrlock;
uv_rwlock_wrlock;
uv_rwlock_wrunlock;
uv_sem_destroy;
uv_sem_init;
uv_sem_post;
uv_sem_trywait;
uv_sem_wait;
uv_send_buffer_size;
uv_set_process_title;
uv_setup_args;
uv_shutdown;
uv_signal_init;
uv_signal_start;
uv_signal_start_oneshot;
uv_signal_stop;
uv_sleep;
uv_socketpair;
uv_spawn;
uv_stop;
uv_stream_get_write_queue_size;
uv_stream_set_blocking;
uv_strerror;
uv_strerror_r;
uv_tcp_bind;
uv_tcp_close_reset;
uv_tcp_connect;
uv_tcp_getpeername;
uv_tcp_getsockname;
uv_tcp_init;
uv_tcp_init_ex;
uv_tcp_keepalive;
uv_tcp_nodelay;
uv_tcp_open;
uv_tcp_simultaneous_accepts;
uv_thread_create;
uv_thread_create_ex;
uv_thread_detach;
uv_thread_equal;
uv_thread_getaffinity;
uv_thread_getcpu;
uv_thread_getname;
uv_thread_getpriority;
uv_thread_join;
uv_thread_self;
uv_thread_setaffinity;
uv_thread_setname;
uv_thread_setpriority;
uv_timer_again;
uv_timer_get_due_in;
uv_timer_get_repeat;
uv_timer_init;
uv_timer_set_repeat;
uv_timer_start;
uv_timer_stop;
uv_translate_sys_error;
uv_try_write;
uv_try_write2;
uv_tty_get_vterm_state;
uv_tty_get_winsize;
uv_tty_init;
uv_tty_reset_mode;
uv_tty_set_mode;
uv_tty_set_vterm_state;
uv_udp_bind;
uv_udp_connect;
uv_udp_get_send_queue_count;
uv_udp_get_send_queue_size;
uv_udp_getpeername;
uv_udp_getsockname;
uv_udp_init;
uv_udp_init_ex;
uv_udp_open;
uv_udp_recv_start;
uv_udp_recv_stop;
uv_udp_send;
uv_udp_set_broadcast;
uv_udp_set_membership;
uv_udp_set_multicast_interface;
uv_udp_set_multicast_loop;
uv_udp_set_multicast_ttl;
uv_udp_set_source_membership;
uv_udp_set_ttl;
uv_udp_try_send;
uv_udp_try_send2;
uv_udp_using_recvmmsg;
uv_unref;
uv_update_time;
uv_uptime;
uv_utf16_length_as_wtf8;
uv_utf16_to_wtf8;
uv_version;
uv_version_string;
uv_walk;
uv_write;
uv_write2;
uv_wtf8_length_as_utf16;
uv_wtf8_to_utf16;
extern "C++" {
v8::*;

View File

@@ -2109,6 +2109,325 @@ const napi_functions_to_export = .{
node_api_create_external_string_utf16,
};
const uv_functions_to_export = if (bun.Environment.isPosix) struct {
pub extern "c" fn uv_accept() void;
pub extern "c" fn uv_async_init() void;
pub extern "c" fn uv_async_send() void;
pub extern "c" fn uv_available_parallelism() void;
pub extern "c" fn uv_backend_fd() void;
pub extern "c" fn uv_backend_timeout() void;
pub extern "c" fn uv_barrier_destroy() void;
pub extern "c" fn uv_barrier_init() void;
pub extern "c" fn uv_barrier_wait() void;
pub extern "c" fn uv_buf_init() void;
pub extern "c" fn uv_cancel() void;
pub extern "c" fn uv_chdir() void;
pub extern "c" fn uv_check_init() void;
pub extern "c" fn uv_check_start() void;
pub extern "c" fn uv_check_stop() void;
pub extern "c" fn uv_clock_gettime() void;
pub extern "c" fn uv_close() void;
pub extern "c" fn uv_cond_broadcast() void;
pub extern "c" fn uv_cond_destroy() void;
pub extern "c" fn uv_cond_init() void;
pub extern "c" fn uv_cond_signal() void;
pub extern "c" fn uv_cond_timedwait() void;
pub extern "c" fn uv_cond_wait() void;
pub extern "c" fn uv_cpu_info() void;
pub extern "c" fn uv_cpumask_size() void;
pub extern "c" fn uv_cwd() void;
pub extern "c" fn uv_default_loop() void;
pub extern "c" fn uv_disable_stdio_inheritance() void;
pub extern "c" fn uv_dlclose() void;
pub extern "c" fn uv_dlerror() void;
pub extern "c" fn uv_dlopen() void;
pub extern "c" fn uv_dlsym() void;
pub extern "c" fn uv_err_name() void;
pub extern "c" fn uv_err_name_r() void;
pub extern "c" fn uv_exepath() void;
pub extern "c" fn uv_fileno() void;
pub extern "c" fn uv_free_cpu_info() void;
pub extern "c" fn uv_free_interface_addresses() void;
pub extern "c" fn uv_freeaddrinfo() void;
pub extern "c" fn uv_fs_access() void;
pub extern "c" fn uv_fs_chmod() void;
pub extern "c" fn uv_fs_chown() void;
pub extern "c" fn uv_fs_close() void;
pub extern "c" fn uv_fs_closedir() void;
pub extern "c" fn uv_fs_copyfile() void;
pub extern "c" fn uv_fs_event_getpath() void;
pub extern "c" fn uv_fs_event_init() void;
pub extern "c" fn uv_fs_event_start() void;
pub extern "c" fn uv_fs_event_stop() void;
pub extern "c" fn uv_fs_fchmod() void;
pub extern "c" fn uv_fs_fchown() void;
pub extern "c" fn uv_fs_fdatasync() void;
pub extern "c" fn uv_fs_fstat() void;
pub extern "c" fn uv_fs_fsync() void;
pub extern "c" fn uv_fs_ftruncate() void;
pub extern "c" fn uv_fs_futime() void;
pub extern "c" fn uv_fs_get_path() void;
pub extern "c" fn uv_fs_get_ptr() void;
pub extern "c" fn uv_fs_get_result() void;
pub extern "c" fn uv_fs_get_statbuf() void;
pub extern "c" fn uv_fs_get_system_error() void;
pub extern "c" fn uv_fs_get_type() void;
pub extern "c" fn uv_fs_lchown() void;
pub extern "c" fn uv_fs_link() void;
pub extern "c" fn uv_fs_lstat() void;
pub extern "c" fn uv_fs_lutime() void;
pub extern "c" fn uv_fs_mkdir() void;
pub extern "c" fn uv_fs_mkdtemp() void;
pub extern "c" fn uv_fs_mkstemp() void;
pub extern "c" fn uv_fs_open() void;
pub extern "c" fn uv_fs_opendir() void;
pub extern "c" fn uv_fs_poll_getpath() void;
pub extern "c" fn uv_fs_poll_init() void;
pub extern "c" fn uv_fs_poll_start() void;
pub extern "c" fn uv_fs_poll_stop() void;
pub extern "c" fn uv_fs_read() void;
pub extern "c" fn uv_fs_readdir() void;
pub extern "c" fn uv_fs_readlink() void;
pub extern "c" fn uv_fs_realpath() void;
pub extern "c" fn uv_fs_rename() void;
pub extern "c" fn uv_fs_req_cleanup() void;
pub extern "c" fn uv_fs_rmdir() void;
pub extern "c" fn uv_fs_scandir() void;
pub extern "c" fn uv_fs_scandir_next() void;
pub extern "c" fn uv_fs_sendfile() void;
pub extern "c" fn uv_fs_stat() void;
pub extern "c" fn uv_fs_statfs() void;
pub extern "c" fn uv_fs_symlink() void;
pub extern "c" fn uv_fs_unlink() void;
pub extern "c" fn uv_fs_utime() void;
pub extern "c" fn uv_fs_write() void;
pub extern "c" fn uv_get_available_memory() void;
pub extern "c" fn uv_get_constrained_memory() void;
pub extern "c" fn uv_get_free_memory() void;
pub extern "c" fn uv_get_osfhandle() void;
pub extern "c" fn uv_get_process_title() void;
pub extern "c" fn uv_get_total_memory() void;
pub extern "c" fn uv_getaddrinfo() void;
pub extern "c" fn uv_getnameinfo() void;
pub extern "c" fn uv_getrusage() void;
pub extern "c" fn uv_getrusage_thread() void;
pub extern "c" fn uv_gettimeofday() void;
pub extern "c" fn uv_guess_handle() void;
pub extern "c" fn uv_handle_get_data() void;
pub extern "c" fn uv_handle_get_loop() void;
pub extern "c" fn uv_handle_get_type() void;
pub extern "c" fn uv_handle_set_data() void;
pub extern "c" fn uv_handle_size() void;
pub extern "c" fn uv_handle_type_name() void;
pub extern "c" fn uv_has_ref() void;
pub extern "c" fn uv_hrtime() void;
pub extern "c" fn uv_idle_init() void;
pub extern "c" fn uv_idle_start() void;
pub extern "c" fn uv_idle_stop() void;
pub extern "c" fn uv_if_indextoiid() void;
pub extern "c" fn uv_if_indextoname() void;
pub extern "c" fn uv_inet_ntop() void;
pub extern "c" fn uv_inet_pton() void;
pub extern "c" fn uv_interface_addresses() void;
pub extern "c" fn uv_ip_name() void;
pub extern "c" fn uv_ip4_addr() void;
pub extern "c" fn uv_ip4_name() void;
pub extern "c" fn uv_ip6_addr() void;
pub extern "c" fn uv_ip6_name() void;
pub extern "c" fn uv_is_active() void;
pub extern "c" fn uv_is_closing() void;
pub extern "c" fn uv_is_readable() void;
pub extern "c" fn uv_is_writable() void;
pub extern "c" fn uv_key_create() void;
pub extern "c" fn uv_key_delete() void;
pub extern "c" fn uv_key_get() void;
pub extern "c" fn uv_key_set() void;
pub extern "c" fn uv_kill() void;
pub extern "c" fn uv_library_shutdown() void;
pub extern "c" fn uv_listen() void;
pub extern "c" fn uv_loadavg() void;
pub extern "c" fn uv_loop_alive() void;
pub extern "c" fn uv_loop_close() void;
pub extern "c" fn uv_loop_configure() void;
pub extern "c" fn uv_loop_delete() void;
pub extern "c" fn uv_loop_fork() void;
pub extern "c" fn uv_loop_get_data() void;
pub extern "c" fn uv_loop_init() void;
pub extern "c" fn uv_loop_new() void;
pub extern "c" fn uv_loop_set_data() void;
pub extern "c" fn uv_loop_size() void;
pub extern "c" fn uv_metrics_idle_time() void;
pub extern "c" fn uv_metrics_info() void;
pub extern "c" fn uv_mutex_destroy() void;
pub extern "c" fn uv_mutex_init() void;
pub extern "c" fn uv_mutex_init_recursive() void;
pub extern "c" fn uv_mutex_lock() void;
pub extern "c" fn uv_mutex_trylock() void;
pub extern "c" fn uv_mutex_unlock() void;
pub extern "c" fn uv_now() void;
pub extern "c" fn uv_once() void;
pub extern "c" fn uv_open_osfhandle() void;
pub extern "c" fn uv_os_environ() void;
pub extern "c" fn uv_os_free_environ() void;
pub extern "c" fn uv_os_free_group() void;
pub extern "c" fn uv_os_free_passwd() void;
pub extern "c" fn uv_os_get_group() void;
pub extern "c" fn uv_os_get_passwd() void;
pub extern "c" fn uv_os_get_passwd2() void;
pub extern "c" fn uv_os_getenv() void;
pub extern "c" fn uv_os_gethostname() void;
pub extern "c" fn uv_os_getpid() void;
pub extern "c" fn uv_os_getppid() void;
pub extern "c" fn uv_os_getpriority() void;
pub extern "c" fn uv_os_homedir() void;
pub extern "c" fn uv_os_setenv() void;
pub extern "c" fn uv_os_setpriority() void;
pub extern "c" fn uv_os_tmpdir() void;
pub extern "c" fn uv_os_uname() void;
pub extern "c" fn uv_os_unsetenv() void;
pub extern "c" fn uv_pipe() void;
pub extern "c" fn uv_pipe_bind() void;
pub extern "c" fn uv_pipe_bind2() void;
pub extern "c" fn uv_pipe_chmod() void;
pub extern "c" fn uv_pipe_connect() void;
pub extern "c" fn uv_pipe_connect2() void;
pub extern "c" fn uv_pipe_getpeername() void;
pub extern "c" fn uv_pipe_getsockname() void;
pub extern "c" fn uv_pipe_init() void;
pub extern "c" fn uv_pipe_open() void;
pub extern "c" fn uv_pipe_pending_count() void;
pub extern "c" fn uv_pipe_pending_instances() void;
pub extern "c" fn uv_pipe_pending_type() void;
pub extern "c" fn uv_poll_init() void;
pub extern "c" fn uv_poll_init_socket() void;
pub extern "c" fn uv_poll_start() void;
pub extern "c" fn uv_poll_stop() void;
pub extern "c" fn uv_prepare_init() void;
pub extern "c" fn uv_prepare_start() void;
pub extern "c" fn uv_prepare_stop() void;
pub extern "c" fn uv_print_active_handles() void;
pub extern "c" fn uv_print_all_handles() void;
pub extern "c" fn uv_process_get_pid() void;
pub extern "c" fn uv_process_kill() void;
pub extern "c" fn uv_queue_work() void;
pub extern "c" fn uv_random() void;
pub extern "c" fn uv_read_start() void;
pub extern "c" fn uv_read_stop() void;
pub extern "c" fn uv_recv_buffer_size() void;
pub extern "c" fn uv_ref() void;
pub extern "c" fn uv_replace_allocator() void;
pub extern "c" fn uv_req_get_data() void;
pub extern "c" fn uv_req_get_type() void;
pub extern "c" fn uv_req_set_data() void;
pub extern "c" fn uv_req_size() void;
pub extern "c" fn uv_req_type_name() void;
pub extern "c" fn uv_resident_set_memory() void;
pub extern "c" fn uv_run() void;
pub extern "c" fn uv_rwlock_destroy() void;
pub extern "c" fn uv_rwlock_init() void;
pub extern "c" fn uv_rwlock_rdlock() void;
pub extern "c" fn uv_rwlock_rdunlock() void;
pub extern "c" fn uv_rwlock_tryrdlock() void;
pub extern "c" fn uv_rwlock_trywrlock() void;
pub extern "c" fn uv_rwlock_wrlock() void;
pub extern "c" fn uv_rwlock_wrunlock() void;
pub extern "c" fn uv_sem_destroy() void;
pub extern "c" fn uv_sem_init() void;
pub extern "c" fn uv_sem_post() void;
pub extern "c" fn uv_sem_trywait() void;
pub extern "c" fn uv_sem_wait() void;
pub extern "c" fn uv_send_buffer_size() void;
pub extern "c" fn uv_set_process_title() void;
pub extern "c" fn uv_setup_args() void;
pub extern "c" fn uv_shutdown() void;
pub extern "c" fn uv_signal_init() void;
pub extern "c" fn uv_signal_start() void;
pub extern "c" fn uv_signal_start_oneshot() void;
pub extern "c" fn uv_signal_stop() void;
pub extern "c" fn uv_sleep() void;
pub extern "c" fn uv_socketpair() void;
pub extern "c" fn uv_spawn() void;
pub extern "c" fn uv_stop() void;
pub extern "c" fn uv_stream_get_write_queue_size() void;
pub extern "c" fn uv_stream_set_blocking() void;
pub extern "c" fn uv_strerror() void;
pub extern "c" fn uv_strerror_r() void;
pub extern "c" fn uv_tcp_bind() void;
pub extern "c" fn uv_tcp_close_reset() void;
pub extern "c" fn uv_tcp_connect() void;
pub extern "c" fn uv_tcp_getpeername() void;
pub extern "c" fn uv_tcp_getsockname() void;
pub extern "c" fn uv_tcp_init() void;
pub extern "c" fn uv_tcp_init_ex() void;
pub extern "c" fn uv_tcp_keepalive() void;
pub extern "c" fn uv_tcp_nodelay() void;
pub extern "c" fn uv_tcp_open() void;
pub extern "c" fn uv_tcp_simultaneous_accepts() void;
pub extern "c" fn uv_thread_create() void;
pub extern "c" fn uv_thread_create_ex() void;
pub extern "c" fn uv_thread_detach() void;
pub extern "c" fn uv_thread_equal() void;
pub extern "c" fn uv_thread_getaffinity() void;
pub extern "c" fn uv_thread_getcpu() void;
pub extern "c" fn uv_thread_getname() void;
pub extern "c" fn uv_thread_getpriority() void;
pub extern "c" fn uv_thread_join() void;
pub extern "c" fn uv_thread_self() void;
pub extern "c" fn uv_thread_setaffinity() void;
pub extern "c" fn uv_thread_setname() void;
pub extern "c" fn uv_thread_setpriority() void;
pub extern "c" fn uv_timer_again() void;
pub extern "c" fn uv_timer_get_due_in() void;
pub extern "c" fn uv_timer_get_repeat() void;
pub extern "c" fn uv_timer_init() void;
pub extern "c" fn uv_timer_set_repeat() void;
pub extern "c" fn uv_timer_start() void;
pub extern "c" fn uv_timer_stop() void;
pub extern "c" fn uv_translate_sys_error() void;
pub extern "c" fn uv_try_write() void;
pub extern "c" fn uv_try_write2() void;
pub extern "c" fn uv_tty_get_vterm_state() void;
pub extern "c" fn uv_tty_get_winsize() void;
pub extern "c" fn uv_tty_init() void;
pub extern "c" fn uv_tty_reset_mode() void;
pub extern "c" fn uv_tty_set_mode() void;
pub extern "c" fn uv_tty_set_vterm_state() void;
pub extern "c" fn uv_udp_bind() void;
pub extern "c" fn uv_udp_connect() void;
pub extern "c" fn uv_udp_get_send_queue_count() void;
pub extern "c" fn uv_udp_get_send_queue_size() void;
pub extern "c" fn uv_udp_getpeername() void;
pub extern "c" fn uv_udp_getsockname() void;
pub extern "c" fn uv_udp_init() void;
pub extern "c" fn uv_udp_init_ex() void;
pub extern "c" fn uv_udp_open() void;
pub extern "c" fn uv_udp_recv_start() void;
pub extern "c" fn uv_udp_recv_stop() void;
pub extern "c" fn uv_udp_send() void;
pub extern "c" fn uv_udp_set_broadcast() void;
pub extern "c" fn uv_udp_set_membership() void;
pub extern "c" fn uv_udp_set_multicast_interface() void;
pub extern "c" fn uv_udp_set_multicast_loop() void;
pub extern "c" fn uv_udp_set_multicast_ttl() void;
pub extern "c" fn uv_udp_set_source_membership() void;
pub extern "c" fn uv_udp_set_ttl() void;
pub extern "c" fn uv_udp_try_send() void;
pub extern "c" fn uv_udp_try_send2() void;
pub extern "c" fn uv_udp_using_recvmmsg() void;
pub extern "c" fn uv_unref() void;
pub extern "c" fn uv_update_time() void;
pub extern "c" fn uv_uptime() void;
pub extern "c" fn uv_utf16_length_as_wtf8() void;
pub extern "c" fn uv_utf16_to_wtf8() void;
pub extern "c" fn uv_version() void;
pub extern "c" fn uv_version_string() void;
pub extern "c" fn uv_walk() void;
pub extern "c" fn uv_write() void;
pub extern "c" fn uv_write2() void;
pub extern "c" fn uv_wtf8_length_as_utf16() void;
pub extern "c" fn uv_wtf8_to_utf16() void;
} else struct {};
pub fn fixDeadCodeElimination() void {
JSC.markBinding(@src());
@@ -2116,6 +2435,10 @@ pub fn fixDeadCodeElimination() void {
std.mem.doNotOptimizeAway(&fn_name);
}
inline for (comptime std.meta.declarations(uv_functions_to_export)) |decl| {
std.mem.doNotOptimizeAway(&@field(uv_functions_to_export, decl.name));
}
inline for (comptime std.meta.declarations(V8API)) |decl| {
std.mem.doNotOptimizeAway(&@field(V8API, decl.name));
}

View File

@@ -1,4 +1,71 @@
{
__ZN2v811HandleScope12CreateHandleEPNS_8internal7IsolateEm;
__ZN2v811HandleScopeC1EPNS_7IsolateE;
__ZN2v811HandleScopeD1Ev;
__ZN2v811HandleScopeD2Ev;
__ZN2v812api_internal12ToLocalEmptyEv;
__ZN2v812api_internal13DisposeGlobalEPm;
__ZN2v812api_internal17FromJustIsNothingEv;
__ZN2v812api_internal18GlobalizeReferenceEPNS_8internal7IsolateEm;
__ZN2v814ObjectTemplate11NewInstanceENS_5LocalINS_7ContextEEE;
__ZN2v814ObjectTemplate21SetInternalFieldCountEi;
__ZN2v814ObjectTemplate3NewEPNS_7IsolateENS_5LocalINS_16FunctionTemplateEEE;
__ZN2v816FunctionTemplate11GetFunctionENS_5LocalINS_7ContextEEE;
__ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeEPKNS_9CFunctionEttt;
__ZN2v820EscapableHandleScopeC1EPNS_7IsolateE;
__ZN2v820EscapableHandleScopeC2EPNS_7IsolateE;
__ZN2v820EscapableHandleScopeD1Ev;
__ZN2v820EscapableHandleScopeD2Ev;
__ZN2v824EscapableHandleScopeBase10EscapeSlotEPm;
__ZN2v824EscapableHandleScopeBaseC2EPNS_7IsolateE;
__ZN2v85Array3NewEPNS_7IsolateEPNS_5LocalINS_5ValueEEEm;
__ZN2v86Number3NewEPNS_7IsolateEd;
__ZN2v86Object16GetInternalFieldEi;
__ZN2v86Object16SetInternalFieldEiNS_5LocalINS_4DataEEE;
__ZN2v86Object20SlowGetInternalFieldEi;
__ZN2v86Object3NewEPNS_7IsolateE;
__ZN2v86Object3SetENS_5LocalINS_7ContextEEENS1_INS_5ValueEEES5_;
__ZN2v86String11NewFromUtf8EPNS_7IsolateEPKcNS_13NewStringTypeEi;
__ZN2v86String14NewFromOneByteEPNS_7IsolateEPKhNS_13NewStringTypeEi;
__ZN2v87Boolean3NewEPNS_7IsolateEb;
__ZN2v87Context10GetIsolateEv;
__ZN2v87Isolate10GetCurrentEv;
__ZN2v87Isolate13TryGetCurrentEv;
__ZN2v87Isolate17GetCurrentContextEv;
__ZN2v88External3NewEPNS_7IsolateEPv;
__ZN2v88Function7SetNameENS_5LocalINS_6StringEEE;
__ZN2v88internal35IsolateFromNeverReadOnlySpaceObjectEm;
__ZN3JSC9CallFrame13describeFrameEv;
__ZN4node25AddEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_;
__ZN4node28RemoveEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_;
__ZNK2v814ObjectTemplate18InternalFieldCountEv;
__ZNK2v85Value10FullIsTrueEv;
__ZNK2v85Value10IsFunctionEv;
__ZNK2v85Value11FullIsFalseEv;
__ZNK2v85Value11IsUndefinedEv;
__ZNK2v85Value11Uint32ValueENS_5LocalINS_7ContextEEE;
__ZNK2v85Value17IsNullOrUndefinedEv;
__ZNK2v85Value6IsNullEv;
__ZNK2v85Value6IsTrueEv;
__ZNK2v85Value7IsFalseEv;
__ZNK2v85Value8IsNumberEv;
__ZNK2v85Value8IsObjectEv;
__ZNK2v85Value8IsStringEv;
__ZNK2v85Value8IsUint32Ev;
__ZNK2v85Value9IsBooleanEv;
__ZNK2v86Number5ValueEv;
__ZNK2v86String10IsExternalEv;
__ZNK2v86String10Utf8LengthEPNS_7IsolateE;
__ZNK2v86String17IsExternalOneByteEv;
__ZNK2v86String17IsExternalTwoByteEv;
__ZNK2v86String19ContainsOnlyOneByteEv;
__ZNK2v86String6LengthEv;
__ZNK2v86String9IsOneByteEv;
__ZNK2v86String9WriteUtf8EPNS_7IsolateEPciPii;
__ZNK2v87Boolean5ValueEv;
__ZNK2v88External5ValueEv;
__ZNK2v88Function7GetNameEv;
_dumpBtjsTrace;
_napi_acquire_threadsafe_function;
_napi_add_async_cleanup_hook;
_napi_add_env_cleanup_hook;
@@ -17,22 +84,22 @@
_napi_coerce_to_number;
_napi_coerce_to_object;
_napi_coerce_to_string;
_napi_create_array;
_napi_create_array_with_length;
_napi_create_array;
_napi_create_arraybuffer;
_napi_create_async_work;
_napi_create_bigint_int64;
_napi_create_bigint_uint64;
_napi_create_bigint_words;
_napi_create_buffer;
_napi_create_buffer_copy;
_napi_create_buffer;
_napi_create_dataview;
_napi_create_date;
_napi_create_double;
_napi_create_error;
_napi_create_external;
_napi_create_external_arraybuffer;
_napi_create_external_buffer;
_napi_create_external;
_napi_create_function;
_napi_create_int32;
_napi_create_int64;
@@ -75,8 +142,8 @@
_napi_get_new_target;
_napi_get_node_version;
_napi_get_null;
_napi_get_property;
_napi_get_property_names;
_napi_get_property;
_napi_get_prototype;
_napi_get_reference_value;
_napi_get_threadsafe_function_context;
@@ -135,94 +202,341 @@
_napi_set_named_property;
_napi_set_property;
_napi_strict_equals;
_napi_throw;
_napi_throw_error;
_napi_throw_range_error;
_napi_throw_type_error;
_napi_throw;
_napi_type_tag_object;
_napi_typeof;
_napi_unref_threadsafe_function;
_napi_unwrap;
_napi_wrap;
_node_api_create_buffer_from_arraybuffer;
_node_api_create_external_string_latin1;
_node_api_create_external_string_utf16;
_node_api_create_syntax_error;
_node_api_symbol_for;
_node_api_throw_syntax_error;
_node_api_create_buffer_from_arraybuffer;
_node_api_get_module_file_name;
_node_api_post_finalizer;
_node_api_create_property_key_latin1;
_node_api_create_property_key_utf16;
_node_api_create_property_key_utf8;
__ZN2v87Isolate10GetCurrentEv;
__ZN2v87Isolate13TryGetCurrentEv;
__ZN2v87Isolate17GetCurrentContextEv;
__ZN4node25AddEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_;
__ZN4node28RemoveEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_;
__ZN2v86Number3NewEPNS_7IsolateEd;
__ZNK2v86Number5ValueEv;
__ZN2v86String11NewFromUtf8EPNS_7IsolateEPKcNS_13NewStringTypeEi;
__ZNK2v86String9WriteUtf8EPNS_7IsolateEPciPii;
__ZN2v812api_internal12ToLocalEmptyEv;
__ZNK2v86String6LengthEv;
__ZN2v88External3NewEPNS_7IsolateEPv;
__ZNK2v88External5ValueEv;
__ZN2v86Object3NewEPNS_7IsolateE;
__ZN2v86Object3SetENS_5LocalINS_7ContextEEENS1_INS_5ValueEEES5_;
__ZN2v86Object16SetInternalFieldEiNS_5LocalINS_4DataEEE;
__ZN2v86Object20SlowGetInternalFieldEi;
__ZN2v811HandleScope12CreateHandleEPNS_8internal7IsolateEm;
__ZN2v811HandleScopeC1EPNS_7IsolateE;
__ZN2v811HandleScopeD1Ev;
__ZN2v811HandleScopeD2Ev;
__ZN2v816FunctionTemplate11GetFunctionENS_5LocalINS_7ContextEEE;
__ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeEPKNS_9CFunctionEttt;
__ZN2v814ObjectTemplate11NewInstanceENS_5LocalINS_7ContextEEE;
__ZN2v814ObjectTemplate21SetInternalFieldCountEi;
__ZNK2v814ObjectTemplate18InternalFieldCountEv;
__ZN2v814ObjectTemplate3NewEPNS_7IsolateENS_5LocalINS_16FunctionTemplateEEE;
__ZN2v824EscapableHandleScopeBase10EscapeSlotEPm;
__ZN2v824EscapableHandleScopeBaseC2EPNS_7IsolateE;
__ZN2v88internal35IsolateFromNeverReadOnlySpaceObjectEm;
_node_api_create_syntax_error;
_node_api_get_module_file_name;
_node_api_post_finalizer;
_node_api_symbol_for;
_node_api_throw_syntax_error;
_node_module_register;
__ZN3JSC9CallFrame13describeFrameEv;
__ZN2v85Array3NewEPNS_7IsolateEPNS_5LocalINS_5ValueEEEm;
__ZN2v88Function7SetNameENS_5LocalINS_6StringEEE;
__ZNK2v85Value9IsBooleanEv;
__ZNK2v87Boolean5ValueEv;
__ZNK2v85Value10FullIsTrueEv;
__ZNK2v85Value11FullIsFalseEv;
__ZN2v820EscapableHandleScopeC1EPNS_7IsolateE;
__ZN2v820EscapableHandleScopeC2EPNS_7IsolateE;
__ZN2v820EscapableHandleScopeD1Ev;
__ZN2v820EscapableHandleScopeD2Ev;
__ZNK2v85Value8IsObjectEv;
__ZNK2v85Value8IsNumberEv;
__ZNK2v85Value8IsUint32Ev;
__ZNK2v85Value11Uint32ValueENS_5LocalINS_7ContextEEE;
__ZNK2v85Value11IsUndefinedEv;
__ZNK2v85Value6IsNullEv;
__ZNK2v85Value17IsNullOrUndefinedEv;
__ZNK2v85Value6IsTrueEv;
__ZNK2v85Value7IsFalseEv;
__ZNK2v85Value8IsStringEv;
__ZN2v87Boolean3NewEPNS_7IsolateEb;
__ZN2v86Object16GetInternalFieldEi;
__ZN2v87Context10GetIsolateEv;
__ZN2v86String14NewFromOneByteEPNS_7IsolateEPKhNS_13NewStringTypeEi;
__ZNK2v86String10Utf8LengthEPNS_7IsolateE;
__ZNK2v86String10IsExternalEv;
__ZNK2v86String17IsExternalOneByteEv;
__ZNK2v86String17IsExternalTwoByteEv;
__ZNK2v86String9IsOneByteEv;
__ZNK2v86String19ContainsOnlyOneByteEv;
__ZN2v812api_internal18GlobalizeReferenceEPNS_8internal7IsolateEm;
__ZN2v812api_internal13DisposeGlobalEPm;
__ZNK2v88Function7GetNameEv;
__ZNK2v85Value10IsFunctionEv;
__ZN2v812api_internal17FromJustIsNothingEv;
_uv_accept;
_uv_async_init;
_uv_async_send;
_uv_available_parallelism;
_uv_backend_fd;
_uv_backend_timeout;
_uv_barrier_destroy;
_uv_barrier_init;
_uv_barrier_wait;
_uv_buf_init;
_uv_cancel;
_uv_chdir;
_uv_check_init;
_uv_check_start;
_uv_check_stop;
_uv_clock_gettime;
_uv_close;
_uv_cond_broadcast;
_uv_cond_destroy;
_uv_cond_init;
_uv_cond_signal;
_uv_cond_timedwait;
_uv_cond_wait;
_uv_cpu_info;
_uv_cpumask_size;
_uv_cwd;
_uv_default_loop;
_uv_disable_stdio_inheritance;
_uv_dlclose;
_uv_dlerror;
_uv_dlopen;
_uv_dlsym;
_uv_err_name_r;
_uv_err_name;
_uv_exepath;
_uv_fileno;
_uv_free_cpu_info;
_uv_free_interface_addresses;
_uv_freeaddrinfo;
_uv_fs_access;
_uv_fs_chmod;
_uv_fs_chown;
_uv_fs_close;
_uv_fs_closedir;
_uv_fs_copyfile;
_uv_fs_event_getpath;
_uv_fs_event_init;
_uv_fs_event_start;
_uv_fs_event_stop;
_uv_fs_fchmod;
_uv_fs_fchown;
_uv_fs_fdatasync;
_uv_fs_fstat;
_uv_fs_fsync;
_uv_fs_ftruncate;
_uv_fs_futime;
_uv_fs_get_path;
_uv_fs_get_ptr;
_uv_fs_get_result;
_uv_fs_get_statbuf;
_uv_fs_get_system_error;
_uv_fs_get_type;
_uv_fs_lchown;
_uv_fs_link;
_uv_fs_lstat;
_uv_fs_lutime;
_uv_fs_mkdir;
_uv_fs_mkdtemp;
_uv_fs_mkstemp;
_uv_fs_open;
_uv_fs_opendir;
_uv_fs_poll_getpath;
_uv_fs_poll_init;
_uv_fs_poll_start;
_uv_fs_poll_stop;
_uv_fs_read;
_uv_fs_readdir;
_uv_fs_readlink;
_uv_fs_realpath;
_uv_fs_rename;
_uv_fs_req_cleanup;
_uv_fs_rmdir;
_uv_fs_scandir_next;
_uv_fs_scandir;
_uv_fs_sendfile;
_uv_fs_stat;
_uv_fs_statfs;
_uv_fs_symlink;
_uv_fs_unlink;
_uv_fs_utime;
_uv_fs_write;
_uv_get_available_memory;
_uv_get_constrained_memory;
_uv_get_free_memory;
_uv_get_osfhandle;
_uv_get_process_title;
_uv_get_total_memory;
_uv_getaddrinfo;
_uv_getnameinfo;
_uv_getrusage_thread;
_uv_getrusage;
_uv_gettimeofday;
_uv_guess_handle;
_uv_handle_get_data;
_uv_handle_get_loop;
_uv_handle_get_type;
_uv_handle_set_data;
_uv_handle_size;
_uv_handle_type_name;
_uv_has_ref;
_uv_hrtime;
_uv_idle_init;
_uv_idle_start;
_uv_idle_stop;
_uv_if_indextoiid;
_uv_if_indextoname;
_uv_inet_ntop;
_uv_inet_pton;
_uv_interface_addresses;
_uv_ip_name;
_uv_ip4_addr;
_uv_ip4_name;
_uv_ip6_addr;
_uv_ip6_name;
_uv_is_active;
_uv_is_closing;
_uv_is_readable;
_uv_is_writable;
_uv_key_create;
_uv_key_delete;
_uv_key_get;
_uv_key_set;
_uv_kill;
_uv_library_shutdown;
_uv_listen;
_uv_loadavg;
_uv_loop_alive;
_uv_loop_close;
_uv_loop_configure;
_uv_loop_delete;
_uv_loop_fork;
_uv_loop_get_data;
_uv_loop_init;
_uv_loop_new;
_uv_loop_set_data;
_uv_loop_size;
_uv_metrics_idle_time;
_uv_metrics_info;
_uv_mutex_destroy;
_uv_mutex_init_recursive;
_uv_mutex_init;
_uv_mutex_lock;
_uv_mutex_trylock;
_uv_mutex_unlock;
_uv_now;
_uv_once;
_uv_open_osfhandle;
_uv_os_environ;
_uv_os_free_environ;
_uv_os_free_group;
_uv_os_free_passwd;
_uv_os_get_group;
_uv_os_get_passwd;
_uv_os_get_passwd2;
_uv_os_getenv;
_uv_os_gethostname;
_uv_os_getpid;
_uv_os_getppid;
_dumpBtjsTrace;
_uv_os_getpriority;
_uv_os_homedir;
_uv_os_setenv;
_uv_os_setpriority;
_uv_os_tmpdir;
_uv_os_uname;
_uv_os_unsetenv;
_uv_pipe_bind;
_uv_pipe_bind2;
_uv_pipe_chmod;
_uv_pipe_connect;
_uv_pipe_connect2;
_uv_pipe_getpeername;
_uv_pipe_getsockname;
_uv_pipe_init;
_uv_pipe_open;
_uv_pipe_pending_count;
_uv_pipe_pending_instances;
_uv_pipe_pending_type;
_uv_pipe;
_uv_poll_init_socket;
_uv_poll_init;
_uv_poll_start;
_uv_poll_stop;
_uv_prepare_init;
_uv_prepare_start;
_uv_prepare_stop;
_uv_print_active_handles;
_uv_print_all_handles;
_uv_process_get_pid;
_uv_process_kill;
_uv_queue_work;
_uv_random;
_uv_read_start;
_uv_read_stop;
_uv_recv_buffer_size;
_uv_ref;
_uv_replace_allocator;
_uv_req_get_data;
_uv_req_get_type;
_uv_req_set_data;
_uv_req_size;
_uv_req_type_name;
_uv_resident_set_memory;
_uv_run;
_uv_rwlock_destroy;
_uv_rwlock_init;
_uv_rwlock_rdlock;
_uv_rwlock_rdunlock;
_uv_rwlock_tryrdlock;
_uv_rwlock_trywrlock;
_uv_rwlock_wrlock;
_uv_rwlock_wrunlock;
_uv_sem_destroy;
_uv_sem_init;
_uv_sem_post;
_uv_sem_trywait;
_uv_sem_wait;
_uv_send_buffer_size;
_uv_set_process_title;
_uv_setup_args;
_uv_shutdown;
_uv_signal_init;
_uv_signal_start_oneshot;
_uv_signal_start;
_uv_signal_stop;
_uv_sleep;
_uv_socketpair;
_uv_spawn;
_uv_stop;
_uv_stream_get_write_queue_size;
_uv_stream_set_blocking;
_uv_strerror_r;
_uv_strerror;
_uv_tcp_bind;
_uv_tcp_close_reset;
_uv_tcp_connect;
_uv_tcp_getpeername;
_uv_tcp_getsockname;
_uv_tcp_init_ex;
_uv_tcp_init;
_uv_tcp_keepalive;
_uv_tcp_nodelay;
_uv_tcp_open;
_uv_tcp_simultaneous_accepts;
_uv_thread_create_ex;
_uv_thread_create;
_uv_thread_detach;
_uv_thread_equal;
_uv_thread_getaffinity;
_uv_thread_getcpu;
_uv_thread_getname;
_uv_thread_getpriority;
_uv_thread_join;
_uv_thread_self;
_uv_thread_setaffinity;
_uv_thread_setname;
_uv_thread_setpriority;
_uv_timer_again;
_uv_timer_get_due_in;
_uv_timer_get_repeat;
_uv_timer_init;
_uv_timer_set_repeat;
_uv_timer_start;
_uv_timer_stop;
_uv_translate_sys_error;
_uv_try_write;
_uv_try_write2;
_uv_tty_get_vterm_state;
_uv_tty_get_winsize;
_uv_tty_init;
_uv_tty_reset_mode;
_uv_tty_set_mode;
_uv_tty_set_vterm_state;
_uv_udp_bind;
_uv_udp_connect;
_uv_udp_get_send_queue_count;
_uv_udp_get_send_queue_size;
_uv_udp_getpeername;
_uv_udp_getsockname;
_uv_udp_init_ex;
_uv_udp_init;
_uv_udp_open;
_uv_udp_recv_start;
_uv_udp_recv_stop;
_uv_udp_send;
_uv_udp_set_broadcast;
_uv_udp_set_membership;
_uv_udp_set_multicast_interface;
_uv_udp_set_multicast_loop;
_uv_udp_set_multicast_ttl;
_uv_udp_set_source_membership;
_uv_udp_set_ttl;
_uv_udp_try_send;
_uv_udp_try_send2;
_uv_udp_using_recvmmsg;
_uv_unref;
_uv_update_time;
_uv_uptime;
_uv_utf16_length_as_wtf8;
_uv_utf16_to_wtf8;
_uv_version_string;
_uv_version;
_uv_walk;
_uv_write;
_uv_write2;
_uv_wtf8_length_as_utf16;
_uv_wtf8_to_utf16;
};

View File

@@ -1,3 +1,70 @@
__ZN2v811HandleScope12CreateHandleEPNS_8internal7IsolateEm
__ZN2v811HandleScopeC1EPNS_7IsolateE
__ZN2v811HandleScopeD1Ev
__ZN2v811HandleScopeD2Ev
__ZN2v812api_internal12ToLocalEmptyEv
__ZN2v812api_internal13DisposeGlobalEPm
__ZN2v812api_internal17FromJustIsNothingEv
__ZN2v812api_internal18GlobalizeReferenceEPNS_8internal7IsolateEm
__ZN2v814ObjectTemplate11NewInstanceENS_5LocalINS_7ContextEEE
__ZN2v814ObjectTemplate21SetInternalFieldCountEi
__ZN2v814ObjectTemplate3NewEPNS_7IsolateENS_5LocalINS_16FunctionTemplateEEE
__ZN2v816FunctionTemplate11GetFunctionENS_5LocalINS_7ContextEEE
__ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeEPKNS_9CFunctionEttt
__ZN2v820EscapableHandleScopeC1EPNS_7IsolateE
__ZN2v820EscapableHandleScopeC2EPNS_7IsolateE
__ZN2v820EscapableHandleScopeD1Ev
__ZN2v820EscapableHandleScopeD2Ev
__ZN2v824EscapableHandleScopeBase10EscapeSlotEPm
__ZN2v824EscapableHandleScopeBaseC2EPNS_7IsolateE
__ZN2v85Array3NewEPNS_7IsolateEPNS_5LocalINS_5ValueEEEm
__ZN2v86Number3NewEPNS_7IsolateEd
__ZN2v86Object16GetInternalFieldEi
__ZN2v86Object16SetInternalFieldEiNS_5LocalINS_4DataEEE
__ZN2v86Object20SlowGetInternalFieldEi
__ZN2v86Object3NewEPNS_7IsolateE
__ZN2v86Object3SetENS_5LocalINS_7ContextEEENS1_INS_5ValueEEES5_
__ZN2v86String11NewFromUtf8EPNS_7IsolateEPKcNS_13NewStringTypeEi
__ZN2v86String14NewFromOneByteEPNS_7IsolateEPKhNS_13NewStringTypeEi
__ZN2v87Boolean3NewEPNS_7IsolateEb
__ZN2v87Context10GetIsolateEv
__ZN2v87Isolate10GetCurrentEv
__ZN2v87Isolate13TryGetCurrentEv
__ZN2v87Isolate17GetCurrentContextEv
__ZN2v88External3NewEPNS_7IsolateEPv
__ZN2v88Function7SetNameENS_5LocalINS_6StringEEE
__ZN2v88internal35IsolateFromNeverReadOnlySpaceObjectEm
__ZN3JSC9CallFrame13describeFrameEv
__ZN4node25AddEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_
__ZN4node28RemoveEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_
__ZNK2v814ObjectTemplate18InternalFieldCountEv
__ZNK2v85Value10FullIsTrueEv
__ZNK2v85Value10IsFunctionEv
__ZNK2v85Value11FullIsFalseEv
__ZNK2v85Value11IsUndefinedEv
__ZNK2v85Value11Uint32ValueENS_5LocalINS_7ContextEEE
__ZNK2v85Value17IsNullOrUndefinedEv
__ZNK2v85Value6IsNullEv
__ZNK2v85Value6IsTrueEv
__ZNK2v85Value7IsFalseEv
__ZNK2v85Value8IsNumberEv
__ZNK2v85Value8IsObjectEv
__ZNK2v85Value8IsStringEv
__ZNK2v85Value8IsUint32Ev
__ZNK2v85Value9IsBooleanEv
__ZNK2v86Number5ValueEv
__ZNK2v86String10IsExternalEv
__ZNK2v86String10Utf8LengthEPNS_7IsolateE
__ZNK2v86String17IsExternalOneByteEv
__ZNK2v86String17IsExternalTwoByteEv
__ZNK2v86String19ContainsOnlyOneByteEv
__ZNK2v86String6LengthEv
__ZNK2v86String9IsOneByteEv
__ZNK2v86String9WriteUtf8EPNS_7IsolateEPciPii
__ZNK2v87Boolean5ValueEv
__ZNK2v88External5ValueEv
__ZNK2v88Function7GetNameEv
_dumpBtjsTrace
_napi_acquire_threadsafe_function
_napi_add_async_cleanup_hook
_napi_add_env_cleanup_hook
@@ -143,84 +210,331 @@ _napi_typeof
_napi_unref_threadsafe_function
_napi_unwrap
_napi_wrap
_node_api_create_buffer_from_arraybuffer
_node_api_create_external_string_latin1
_node_api_create_external_string_utf16
_node_api_create_syntax_error
_node_api_symbol_for
_node_api_throw_syntax_error
_node_api_create_buffer_from_arraybuffer
_node_api_get_module_file_name
_node_api_post_finalizer
_node_api_create_property_key_latin1
_node_api_create_property_key_utf16
_node_api_create_property_key_utf8
__ZN2v87Isolate10GetCurrentEv
__ZN2v87Isolate13TryGetCurrentEv
__ZN2v87Isolate17GetCurrentContextEv
__ZN4node25AddEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_
__ZN4node28RemoveEnvironmentCleanupHookEPN2v87IsolateEPFvPvES3_
__ZN2v86Number3NewEPNS_7IsolateEd
__ZNK2v86Number5ValueEv
__ZN2v86String11NewFromUtf8EPNS_7IsolateEPKcNS_13NewStringTypeEi
__ZNK2v86String9WriteUtf8EPNS_7IsolateEPciPii
__ZN2v812api_internal12ToLocalEmptyEv
__ZNK2v86String6LengthEv
__ZN2v88External3NewEPNS_7IsolateEPv
__ZNK2v88External5ValueEv
__ZN2v86Object3NewEPNS_7IsolateE
__ZN2v86Object3SetENS_5LocalINS_7ContextEEENS1_INS_5ValueEEES5_
__ZN2v86Object16SetInternalFieldEiNS_5LocalINS_4DataEEE
__ZN2v86Object20SlowGetInternalFieldEi
__ZN2v811HandleScope12CreateHandleEPNS_8internal7IsolateEm
__ZN2v811HandleScopeC1EPNS_7IsolateE
__ZN2v811HandleScopeD1Ev
__ZN2v811HandleScopeD2Ev
__ZN2v816FunctionTemplate11GetFunctionENS_5LocalINS_7ContextEEE
__ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeEPKNS_9CFunctionEttt
__ZN2v814ObjectTemplate11NewInstanceENS_5LocalINS_7ContextEEE
__ZN2v814ObjectTemplate21SetInternalFieldCountEi
__ZNK2v814ObjectTemplate18InternalFieldCountEv
__ZN2v814ObjectTemplate3NewEPNS_7IsolateENS_5LocalINS_16FunctionTemplateEEE
__ZN2v824EscapableHandleScopeBase10EscapeSlotEPm
__ZN2v824EscapableHandleScopeBaseC2EPNS_7IsolateE
__ZN2v88internal35IsolateFromNeverReadOnlySpaceObjectEm
_node_api_create_syntax_error
_node_api_get_module_file_name
_node_api_post_finalizer
_node_api_symbol_for
_node_api_throw_syntax_error
_node_module_register
__ZN3JSC9CallFrame13describeFrameEv
__ZN2v85Array3NewEPNS_7IsolateEPNS_5LocalINS_5ValueEEEm
__ZN2v88Function7SetNameENS_5LocalINS_6StringEEE
__ZNK2v85Value9IsBooleanEv
__ZNK2v87Boolean5ValueEv
__ZNK2v85Value10FullIsTrueEv
__ZNK2v85Value11FullIsFalseEv
__ZN2v820EscapableHandleScopeC1EPNS_7IsolateE
__ZN2v820EscapableHandleScopeC2EPNS_7IsolateE
__ZN2v820EscapableHandleScopeD1Ev
__ZN2v820EscapableHandleScopeD2Ev
__ZNK2v85Value8IsObjectEv
__ZNK2v85Value8IsNumberEv
__ZNK2v85Value8IsUint32Ev
__ZNK2v85Value11Uint32ValueENS_5LocalINS_7ContextEEE
__ZNK2v85Value11IsUndefinedEv
__ZNK2v85Value6IsNullEv
__ZNK2v85Value17IsNullOrUndefinedEv
__ZNK2v85Value6IsTrueEv
__ZNK2v85Value7IsFalseEv
__ZNK2v85Value8IsStringEv
__ZN2v87Boolean3NewEPNS_7IsolateEb
__ZN2v86Object16GetInternalFieldEi
__ZN2v87Context10GetIsolateEv
__ZN2v86String14NewFromOneByteEPNS_7IsolateEPKhNS_13NewStringTypeEi
__ZNK2v86String10Utf8LengthEPNS_7IsolateE
__ZNK2v86String10IsExternalEv
__ZNK2v86String17IsExternalOneByteEv
__ZNK2v86String17IsExternalTwoByteEv
__ZNK2v86String9IsOneByteEv
__ZNK2v86String19ContainsOnlyOneByteEv
__ZN2v812api_internal18GlobalizeReferenceEPNS_8internal7IsolateEm
__ZN2v812api_internal13DisposeGlobalEPm
__ZNK2v88Function7GetNameEv
__ZNK2v85Value10IsFunctionEv
__ZN2v812api_internal17FromJustIsNothingEv
_uv_accept
_uv_async_init
_uv_async_send
_uv_available_parallelism
_uv_backend_fd
_uv_backend_timeout
_uv_barrier_destroy
_uv_barrier_init
_uv_barrier_wait
_uv_buf_init
_uv_cancel
_uv_chdir
_uv_check_init
_uv_check_start
_uv_check_stop
_uv_clock_gettime
_uv_close
_uv_cond_broadcast
_uv_cond_destroy
_uv_cond_init
_uv_cond_signal
_uv_cond_timedwait
_uv_cond_wait
_uv_cpu_info
_uv_cpumask_size
_uv_cwd
_uv_default_loop
_uv_disable_stdio_inheritance
_uv_dlclose
_uv_dlerror
_uv_dlopen
_uv_dlsym
_uv_err_name
_uv_err_name_r
_uv_exepath
_uv_fileno
_uv_free_cpu_info
_uv_free_interface_addresses
_uv_freeaddrinfo
_uv_fs_access
_uv_fs_chmod
_uv_fs_chown
_uv_fs_close
_uv_fs_closedir
_uv_fs_copyfile
_uv_fs_event_getpath
_uv_fs_event_init
_uv_fs_event_start
_uv_fs_event_stop
_uv_fs_fchmod
_uv_fs_fchown
_uv_fs_fdatasync
_uv_fs_fstat
_uv_fs_fsync
_uv_fs_ftruncate
_uv_fs_futime
_uv_fs_get_path
_uv_fs_get_ptr
_uv_fs_get_result
_uv_fs_get_statbuf
_uv_fs_get_system_error
_uv_fs_get_type
_uv_fs_lchown
_uv_fs_link
_uv_fs_lstat
_uv_fs_lutime
_uv_fs_mkdir
_uv_fs_mkdtemp
_uv_fs_mkstemp
_uv_fs_open
_uv_fs_opendir
_uv_fs_poll_getpath
_uv_fs_poll_init
_uv_fs_poll_start
_uv_fs_poll_stop
_uv_fs_read
_uv_fs_readdir
_uv_fs_readlink
_uv_fs_realpath
_uv_fs_rename
_uv_fs_req_cleanup
_uv_fs_rmdir
_uv_fs_scandir
_uv_fs_scandir_next
_uv_fs_sendfile
_uv_fs_stat
_uv_fs_statfs
_uv_fs_symlink
_uv_fs_unlink
_uv_fs_utime
_uv_fs_write
_uv_get_available_memory
_uv_get_constrained_memory
_uv_get_free_memory
_uv_get_osfhandle
_uv_get_process_title
_uv_get_total_memory
_uv_getaddrinfo
_uv_getnameinfo
_uv_getrusage
_uv_getrusage_thread
_uv_gettimeofday
_uv_guess_handle
_uv_handle_get_data
_uv_handle_get_loop
_uv_handle_get_type
_uv_handle_set_data
_uv_handle_size
_uv_handle_type_name
_uv_has_ref
_uv_hrtime
_uv_idle_init
_uv_idle_start
_uv_idle_stop
_uv_if_indextoiid
_uv_if_indextoname
_uv_inet_ntop
_uv_inet_pton
_uv_interface_addresses
_uv_ip_name
_uv_ip4_addr
_uv_ip4_name
_uv_ip6_addr
_uv_ip6_name
_uv_is_active
_uv_is_closing
_uv_is_readable
_uv_is_writable
_uv_key_create
_uv_key_delete
_uv_key_get
_uv_key_set
_uv_kill
_uv_library_shutdown
_uv_listen
_uv_loadavg
_uv_loop_alive
_uv_loop_close
_uv_loop_configure
_uv_loop_delete
_uv_loop_fork
_uv_loop_get_data
_uv_loop_init
_uv_loop_new
_uv_loop_set_data
_uv_loop_size
_uv_metrics_idle_time
_uv_metrics_info
_uv_mutex_destroy
_uv_mutex_init
_uv_mutex_init_recursive
_uv_mutex_lock
_uv_mutex_trylock
_uv_mutex_unlock
_uv_now
_uv_once
_uv_open_osfhandle
_uv_os_environ
_uv_os_free_environ
_uv_os_free_group
_uv_os_free_passwd
_uv_os_get_group
_uv_os_get_passwd
_uv_os_get_passwd2
_uv_os_getenv
_uv_os_gethostname
_uv_os_getpid
_uv_os_getppid
_dumpBtjsTrace
_uv_os_getpriority
_uv_os_homedir
_uv_os_setenv
_uv_os_setpriority
_uv_os_tmpdir
_uv_os_uname
_uv_os_unsetenv
_uv_pipe
_uv_pipe_bind
_uv_pipe_bind2
_uv_pipe_chmod
_uv_pipe_connect
_uv_pipe_connect2
_uv_pipe_getpeername
_uv_pipe_getsockname
_uv_pipe_init
_uv_pipe_open
_uv_pipe_pending_count
_uv_pipe_pending_instances
_uv_pipe_pending_type
_uv_poll_init
_uv_poll_init_socket
_uv_poll_start
_uv_poll_stop
_uv_prepare_init
_uv_prepare_start
_uv_prepare_stop
_uv_print_active_handles
_uv_print_all_handles
_uv_process_get_pid
_uv_process_kill
_uv_queue_work
_uv_random
_uv_read_start
_uv_read_stop
_uv_recv_buffer_size
_uv_ref
_uv_replace_allocator
_uv_req_get_data
_uv_req_get_type
_uv_req_set_data
_uv_req_size
_uv_req_type_name
_uv_resident_set_memory
_uv_run
_uv_rwlock_destroy
_uv_rwlock_init
_uv_rwlock_rdlock
_uv_rwlock_rdunlock
_uv_rwlock_tryrdlock
_uv_rwlock_trywrlock
_uv_rwlock_wrlock
_uv_rwlock_wrunlock
_uv_sem_destroy
_uv_sem_init
_uv_sem_post
_uv_sem_trywait
_uv_sem_wait
_uv_send_buffer_size
_uv_set_process_title
_uv_setup_args
_uv_shutdown
_uv_signal_init
_uv_signal_start
_uv_signal_start_oneshot
_uv_signal_stop
_uv_sleep
_uv_socketpair
_uv_spawn
_uv_stop
_uv_stream_get_write_queue_size
_uv_stream_set_blocking
_uv_strerror
_uv_strerror_r
_uv_tcp_bind
_uv_tcp_close_reset
_uv_tcp_connect
_uv_tcp_getpeername
_uv_tcp_getsockname
_uv_tcp_init
_uv_tcp_init_ex
_uv_tcp_keepalive
_uv_tcp_nodelay
_uv_tcp_open
_uv_tcp_simultaneous_accepts
_uv_thread_create
_uv_thread_create_ex
_uv_thread_detach
_uv_thread_equal
_uv_thread_getaffinity
_uv_thread_getcpu
_uv_thread_getname
_uv_thread_getpriority
_uv_thread_join
_uv_thread_self
_uv_thread_setaffinity
_uv_thread_setname
_uv_thread_setpriority
_uv_timer_again
_uv_timer_get_due_in
_uv_timer_get_repeat
_uv_timer_init
_uv_timer_set_repeat
_uv_timer_start
_uv_timer_stop
_uv_translate_sys_error
_uv_try_write
_uv_try_write2
_uv_tty_get_vterm_state
_uv_tty_get_winsize
_uv_tty_init
_uv_tty_reset_mode
_uv_tty_set_mode
_uv_tty_set_vterm_state
_uv_udp_bind
_uv_udp_connect
_uv_udp_get_send_queue_count
_uv_udp_get_send_queue_size
_uv_udp_getpeername
_uv_udp_getsockname
_uv_udp_init
_uv_udp_init_ex
_uv_udp_open
_uv_udp_recv_start
_uv_udp_recv_stop
_uv_udp_send
_uv_udp_set_broadcast
_uv_udp_set_membership
_uv_udp_set_multicast_interface
_uv_udp_set_multicast_loop
_uv_udp_set_multicast_ttl
_uv_udp_set_source_membership
_uv_udp_set_ttl
_uv_udp_try_send
_uv_udp_try_send2
_uv_udp_using_recvmmsg
_uv_unref
_uv_update_time
_uv_uptime
_uv_utf16_length_as_wtf8
_uv_utf16_to_wtf8
_uv_version
_uv_version_string
_uv_walk
_uv_write
_uv_write2
_uv_wtf8_length_as_utf16
_uv_wtf8_to_utf16

View File

@@ -0,0 +1,18 @@
#include <node_api.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
typedef pid_t uv_pid_t;
uv_pid_t uv_os_getpid();
napi_value Init(napi_env env, napi_value exports) {
uv_pid_t pid = uv_os_getpid();
printf("%d\n", pid);
return NULL;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

File diff suppressed because it is too large Load Diff

92
test/napi/uv_stub.test.ts Normal file
View File

@@ -0,0 +1,92 @@
import { beforeAll, describe, expect, afterEach, test } from "bun:test";
import path from "node:path";
import { bunEnv, bunExe, makeTree, tempDirWithFiles, isWindows } from "harness";
import source from "./uv-stub-stuff/plugin.c";
import goodSource from "./uv-stub-stuff/good_plugin.c";
import { symbols, test_skipped } from "../../src/bun.js/bindings/libuv/generate_uv_posix_stubs_constants";
const symbols_to_test = symbols.filter(s => !test_skipped.includes(s));
// We use libuv on Windows
describe.if(!isWindows)("uv stubs", () => {
const cwd = process.cwd();
let tempdir: string = "";
let outdir: string = "";
beforeAll(async () => {
const files = {
"plugin.c": await Bun.file(source).text(),
"good_plugin.c": await Bun.file(goodSource).text(),
"package.json": JSON.stringify({
"name": "fake-plugin",
"module": "index.ts",
"type": "module",
"devDependencies": {
"@types/bun": "latest",
},
"peerDependencies": {
"typescript": "^5.0.0",
},
"scripts": {
"build:napi": "node-gyp configure && node-gyp build",
},
"dependencies": {
"node-gyp": "10.2.0",
},
}),
"index.ts": `const symbol = process.argv[2]; const foo = require("./build/Release/xXx123_foo_counter_321xXx.node"); foo.callUVFunc(symbol)`,
"nocrash.ts": `const foo = require("./build/Release/good_plugin.node");console.log('HI!')`,
"binding.gyp": `{
"targets": [
{
"target_name": "xXx123_foo_counter_321xXx",
"sources": [ "plugin.c" ],
"include_dirs": [ ".", "./libuv" ],
"cflags": ["-fPIC"],
"ldflags": ["-Wl,--export-dynamic"]
},
{
"target_name": "good_plugin",
"sources": [ "good_plugin.c" ],
"include_dirs": [ ".", "./libuv" ],
"cflags": ["-fPIC"],
"ldflags": ["-Wl,--export-dynamic"]
}
]
}
`,
};
tempdir = tempDirWithFiles("native-plugins", files);
await makeTree(tempdir, files);
outdir = path.join(tempdir, "dist");
process.chdir(tempdir);
const libuvDir = path.join(__dirname, "../../src/bun.js/bindings/libuv");
await Bun.$`cp -R ${libuvDir} ${path.join(tempdir, "libuv")}`;
await Bun.$`${bunExe()} i && ${bunExe()} build:napi`.env(bunEnv).cwd(tempdir);
console.log("tempdir:", tempdir);
});
afterEach(async () => {
process.chdir(cwd);
});
for (const symbol of symbols_to_test) {
test(`should crash when calling unsupported uv functions: ${symbol}`, async () => {
console.log("GO:", symbol);
const { stderr } = await Bun.$`${bunExe()} run index.ts ${symbol}`.cwd(tempdir).throws(false).quiet();
const stderrStr = stderr.toString();
expect(stderrStr).toContain("Bun encountered a crash when running a NAPI module that tried to call");
expect(stderrStr).toContain(symbol);
});
}
test("should not crash when calling supported uv functions", async () => {
const { stdout, exitCode } = await Bun.$`${bunExe()} run nocrash.ts`.cwd(tempdir).throws(false).quiet();
expect(exitCode).toBe(0);
expect(stdout.toString()).toContain("HI!");
});
});