mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-19 03:03:21 +00:00
Move runtime files to C instead of C++
Explicitly have the only C++ portion of the runtime be one file with exception handling. All other runtime files must now live in C and be fully defined in C.
This commit is contained in:
parent
e8bf078802
commit
508b7b996e
48
mk/clean.mk
48
mk/clean.mk
@ -12,13 +12,19 @@
|
||||
# Cleanup
|
||||
######################################################################
|
||||
|
||||
CLEAN_STAGE_RULES = \
|
||||
$(foreach stage, $(STAGES), \
|
||||
$(foreach host, $(CFG_HOST), \
|
||||
CLEAN_STAGE_RULES := \
|
||||
$(foreach stage, $(STAGES), \
|
||||
$(foreach host, $(CFG_HOST), \
|
||||
clean$(stage)_H_$(host) \
|
||||
$(foreach target, $(CFG_TARGET), \
|
||||
$(foreach target, $(CFG_TARGET), \
|
||||
clean$(stage)_T_$(target)_H_$(host))))
|
||||
|
||||
CLEAN_STAGE_RULES := $(CLEAN_STAGE_RULES) \
|
||||
$(foreach host, $(CFG_HOST), clean-generic-H-$(host))
|
||||
|
||||
CLEAN_STAGE_RULES := $(CLEAN_STAGE_RULES) \
|
||||
$(foreach host, $(CFG_TARGET), clean-generic-T-$(host))
|
||||
|
||||
CLEAN_LLVM_RULES = \
|
||||
$(foreach target, $(CFG_HOST), \
|
||||
clean-llvm$(target))
|
||||
@ -33,19 +39,6 @@ clean: clean-misc $(CLEAN_STAGE_RULES)
|
||||
|
||||
clean-misc:
|
||||
@$(call E, cleaning)
|
||||
$(Q)find $(CFG_BUILD)/rustllvm \
|
||||
$(CFG_BUILD)/rt \
|
||||
$(CFG_BUILD)/test \
|
||||
-name '*.[odasS]' -o \
|
||||
-name '*.so' -o \
|
||||
-name '*.dylib' -o \
|
||||
-name '*.dll' -o \
|
||||
-name '*.def' -o \
|
||||
-name '*.bc' \
|
||||
| xargs rm -f
|
||||
$(Q)find $(CFG_BUILD)\
|
||||
-name '*.dSYM' \
|
||||
| xargs rm -Rf
|
||||
$(Q)rm -f $(RUNTIME_OBJS) $(RUNTIME_DEF)
|
||||
$(Q)rm -f $(RUSTLLVM_LIB_OBJS) $(RUSTLLVM_OBJS_OBJS) $(RUSTLLVM_DEF)
|
||||
$(Q)rm -Rf $(DOCS)
|
||||
@ -60,6 +53,27 @@ clean-misc:
|
||||
$(Q)rm -Rf $(foreach sub, index styles files search javascript, \
|
||||
$(wildcard doc/*/$(sub)))
|
||||
|
||||
define CLEAN_GENERIC
|
||||
|
||||
clean-generic-$(2)-$(1):
|
||||
$(Q)find $(1)/rustllvm \
|
||||
$(1)/rt \
|
||||
$(1)/test \
|
||||
-name '*.[odasS]' -o \
|
||||
-name '*.so' -o \
|
||||
-name '*.dylib' -o \
|
||||
-name '*.dll' -o \
|
||||
-name '*.def' -o \
|
||||
-name '*.bc' \
|
||||
| xargs rm -f
|
||||
$(Q)find $(1)\
|
||||
-name '*.dSYM' \
|
||||
| xargs rm -Rf
|
||||
endef
|
||||
|
||||
$(foreach host, $(CFG_HOST), $(eval $(call CLEAN_GENERIC,$(host),H)))
|
||||
$(foreach targ, $(CFG_TARGET), $(eval $(call CLEAN_GENERIC,$(targ),T)))
|
||||
|
||||
define CLEAN_HOST_STAGE_N
|
||||
|
||||
clean$(1)_H_$(2):
|
||||
|
@ -206,7 +206,7 @@ CFG_LIB_GLOB_arm-apple-darwin = lib$(1)-*.dylib
|
||||
CFG_LIB_DSYM_GLOB_arm-apple-darwin = lib$(1)-*.dylib.dSYM
|
||||
CFG_GCCISH_CFLAGS_arm-apple-darwin := -Wall -Werror -g -fPIC $(CFG_IOS_FLAGS)
|
||||
CFG_GCCISH_CXXFLAGS_arm-apple-darwin := -fno-rtti $(CFG_IOS_FLAGS)
|
||||
CFG_GCCISH_LINK_FLAGS_arm-apple-darwin := -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
|
||||
CFG_GCCISH_LINK_FLAGS_arm-apple-darwin := -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
|
||||
CFG_GCCISH_DEF_FLAG_arm-apple-darwin := -Wl,-exported_symbols_list,
|
||||
CFG_GCCISH_PRE_LIB_FLAGS_arm-apple-darwin :=
|
||||
CFG_GCCISH_POST_LIB_FLAGS_arm-apple-darwin :=
|
||||
@ -506,7 +506,7 @@ define CFG_MAKE_TOOLCHAIN
|
||||
-c -o $$(1) $$(2)
|
||||
CFG_LINK_C_$(1) = $$(CC_$(1)) \
|
||||
$$(CFG_GCCISH_LINK_FLAGS) -o $$(1) \
|
||||
$$(CFG_GCCISH_LINK_FLAGS_$(1))) \
|
||||
$$(CFG_GCCISH_LINK_FLAGS_$(1)) \
|
||||
$$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2) \
|
||||
$$(call CFG_INSTALL_NAME_$(1),$$(4))
|
||||
CFG_COMPILE_CXX_$(1) = $$(CXX_$(1)) \
|
||||
|
27
mk/rt.mk
27
mk/rt.mk
@ -90,13 +90,18 @@ endif
|
||||
endif
|
||||
|
||||
RUNTIME_CXXS_$(1)_$(2) := \
|
||||
rt/rust_builtin.cpp \
|
||||
rt/rust_upcall.cpp \
|
||||
rt/miniz.cpp \
|
||||
rt/rust_android_dummy.cpp \
|
||||
rt/rust_test_helpers.cpp
|
||||
rt/rust_cxx_glue.cpp
|
||||
|
||||
RUNTIME_CS_$(1)_$(2) :=
|
||||
RUNTIME_CS_$(1)_$(2) := \
|
||||
rt/rust_builtin.c \
|
||||
rt/rust_upcall.c \
|
||||
rt/miniz.c \
|
||||
rt/rust_android_dummy.c \
|
||||
rt/rust_test_helpers.c
|
||||
|
||||
# stage0 remove this after the next snapshot
|
||||
%.cpp:
|
||||
@touch tmp/foo.o
|
||||
|
||||
RUNTIME_S_$(1)_$(2) := rt/arch/$$(HOST_$(1))/_context.S \
|
||||
rt/arch/$$(HOST_$(1))/record_sp.S
|
||||
@ -114,7 +119,7 @@ ALL_OBJ_FILES += $$(RUNTIME_OBJS_$(1)_$(2))
|
||||
MORESTACK_OBJS_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/arch/$$(HOST_$(1))/morestack.o
|
||||
ALL_OBJ_FILES += $$(MORESTACK_OBJS_$(1)_$(2))
|
||||
|
||||
$$(RT_BUILD_DIR_$(1)_$(2))/%.o: rt/%.cpp $$(MKFILE_DEPS)
|
||||
$$(RT_BUILD_DIR_$(1)_$(2))/rust_cxx_glue.o: rt/rust_cxx_glue.cpp $$(MKFILE_DEPS)
|
||||
@$$(call E, compile: $$@)
|
||||
$$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@, $$(RUNTIME_INCS_$(1)_$(2)) \
|
||||
$$(SNAP_DEFINES) $$(RUNTIME_CXXFLAGS_$(1)_$(2))) $$<
|
||||
@ -241,13 +246,13 @@ endif
|
||||
UV_SUPPORT_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),uv_support)
|
||||
UV_SUPPORT_DIR_$(1) := $$(RT_OUTPUT_DIR_$(1))/uv_support
|
||||
UV_SUPPORT_LIB_$(1) := $$(UV_SUPPORT_DIR_$(1))/$$(UV_SUPPORT_NAME_$(1))
|
||||
UV_SUPPORT_CS_$(1) := rt/rust_uv.cpp
|
||||
UV_SUPPORT_OBJS_$(1) := $$(UV_SUPPORT_CS_$(1):rt/%.cpp=$$(UV_SUPPORT_DIR_$(1))/%.o)
|
||||
UV_SUPPORT_CS_$(1) := rt/rust_uv.c
|
||||
UV_SUPPORT_OBJS_$(1) := $$(UV_SUPPORT_CS_$(1):rt/%.c=$$(UV_SUPPORT_DIR_$(1))/%.o)
|
||||
|
||||
$$(UV_SUPPORT_DIR_$(1))/%.o: rt/%.cpp
|
||||
$$(UV_SUPPORT_DIR_$(1))/%.o: rt/%.c
|
||||
@$$(call E, compile: $$@)
|
||||
@mkdir -p $$(@D)
|
||||
$$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@, \
|
||||
$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, \
|
||||
-I $$(S)src/libuv/include \
|
||||
$$(RUNTIME_CFLAGS_$(1))) $$<
|
||||
|
||||
|
@ -63,6 +63,7 @@ pub unsafe fn init(argc: int, argv: **u8) { realargs::init(argc, argv) }
|
||||
#[cfg(target_os = "android")]
|
||||
#[cfg(target_os = "freebsd")]
|
||||
mod imp {
|
||||
use cast;
|
||||
use libc;
|
||||
use option::{Option, Some, None};
|
||||
use iter::Iterator;
|
||||
|
@ -14,53 +14,53 @@ char **backtrace_symbols(void *const *array, int size) { return 0; }
|
||||
|
||||
void backtrace_symbols_fd (void *const *array, int size, int fd) {}
|
||||
|
||||
extern "C" volatile int* __errno_location() {
|
||||
volatile int* __errno_location() {
|
||||
return &errno;
|
||||
}
|
||||
|
||||
extern "C" float log2f(float f)
|
||||
float log2f(float f)
|
||||
{
|
||||
return logf( f ) / logf( 2 );
|
||||
}
|
||||
|
||||
extern "C" double log2( double n )
|
||||
double log2( double n )
|
||||
{
|
||||
return log( n ) / log( 2 );
|
||||
}
|
||||
|
||||
extern "C" void telldir()
|
||||
void telldir()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void seekdir()
|
||||
void seekdir()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void mkfifo()
|
||||
void mkfifo()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void abs()
|
||||
void abs()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void labs()
|
||||
void labs()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void rand()
|
||||
void rand()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void srand()
|
||||
void srand()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" void atof()
|
||||
void atof()
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" int glob(const char *pattern,
|
||||
int glob(const char *pattern,
|
||||
int flags,
|
||||
int (*errfunc) (const char *epath, int eerrno),
|
||||
glob_t *pglob)
|
||||
@ -68,38 +68,38 @@ extern "C" int glob(const char *pattern,
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" void globfree(glob_t *pglob)
|
||||
void globfree(glob_t *pglob)
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" int pthread_atfork(void (*prefork)(void),
|
||||
int pthread_atfork(void (*prefork)(void),
|
||||
void (*postfork_parent)(void),
|
||||
void (*postfork_child)(void))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int mlockall(int flags)
|
||||
int mlockall(int flags)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int munlockall(void)
|
||||
int munlockall(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int shm_open(const char *name, int oflag, mode_t mode)
|
||||
int shm_open(const char *name, int oflag, mode_t mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int shm_unlink(const char *name)
|
||||
int shm_unlink(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int posix_madvise(void *addr, size_t len, int advice)
|
||||
int posix_madvise(void *addr, size_t len, int advice)
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -58,12 +58,12 @@ timegm(struct tm *tm)
|
||||
#endif
|
||||
|
||||
#if defined(__WIN32__)
|
||||
extern "C" CDECL char**
|
||||
char**
|
||||
rust_env_pairs() {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
extern "C" CDECL char**
|
||||
char**
|
||||
rust_env_pairs() {
|
||||
#if defined(__APPLE__) && !(TARGET_OS_IPHONE)
|
||||
char **environ = *_NSGetEnviron();
|
||||
@ -72,18 +72,18 @@ rust_env_pairs() {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL char*
|
||||
char*
|
||||
#if defined(__WIN32__)
|
||||
rust_list_dir_val(WIN32_FIND_DATA* entry_ptr) {
|
||||
return entry_ptr->cFileName;
|
||||
}
|
||||
#else
|
||||
rust_list_dir_val(dirent* entry_ptr) {
|
||||
rust_list_dir_val(struct dirent* entry_ptr) {
|
||||
return entry_ptr->d_name;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL size_t
|
||||
size_t
|
||||
#if defined(__WIN32__)
|
||||
rust_list_dir_wfd_size() {
|
||||
return sizeof(WIN32_FIND_DATAW);
|
||||
@ -94,7 +94,7 @@ rust_list_dir_wfd_size() {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL void*
|
||||
void*
|
||||
#if defined(__WIN32__)
|
||||
rust_list_dir_wfd_fp_buf(WIN32_FIND_DATAW* wfd) {
|
||||
if(wfd == NULL) {
|
||||
@ -110,7 +110,7 @@ rust_list_dir_wfd_fp_buf(void* wfd) {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_path_is_dir(const char *path) {
|
||||
struct stat buf;
|
||||
if (stat(path, &buf)) {
|
||||
@ -119,7 +119,7 @@ rust_path_is_dir(const char *path) {
|
||||
return S_ISDIR(buf.st_mode);
|
||||
}
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
#if defined(__WIN32__)
|
||||
rust_path_is_dir_u16(const wchar_t *path) {
|
||||
struct _stat buf;
|
||||
@ -137,7 +137,7 @@ rust_path_is_dir_u16(const void *path) {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_path_exists(const char *path) {
|
||||
struct stat buf;
|
||||
if (stat(path, &buf)) {
|
||||
@ -146,7 +146,7 @@ rust_path_exists(const char *path) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
#if defined(__WIN32__)
|
||||
rust_path_exists_u16(const wchar_t *path) {
|
||||
struct _stat buf;
|
||||
@ -162,12 +162,12 @@ rust_path_exists_u16(const void *path) {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL FILE* rust_get_stdin() {return stdin;}
|
||||
extern "C" CDECL FILE* rust_get_stdout() {return stdout;}
|
||||
extern "C" CDECL FILE* rust_get_stderr() {return stderr;}
|
||||
FILE* rust_get_stdin() {return stdin;}
|
||||
FILE* rust_get_stdout() {return stdout;}
|
||||
FILE* rust_get_stderr() {return stderr;}
|
||||
|
||||
#if defined(__WIN32__)
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_get_time(int64_t *sec, int32_t *nsec) {
|
||||
FILETIME fileTime;
|
||||
GetSystemTimeAsFileTime(&fileTime);
|
||||
@ -186,7 +186,7 @@ rust_get_time(int64_t *sec, int32_t *nsec) {
|
||||
*nsec = (ns_since_1970 % 1000000) * 1000;
|
||||
}
|
||||
#else
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_get_time(int64_t *sec, int32_t *nsec) {
|
||||
#ifdef __APPLE__
|
||||
struct timeval tv;
|
||||
@ -194,7 +194,7 @@ rust_get_time(int64_t *sec, int32_t *nsec) {
|
||||
*sec = tv.tv_sec;
|
||||
*nsec = tv.tv_usec * 1000;
|
||||
#else
|
||||
timespec ts;
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
*sec = ts.tv_sec;
|
||||
*nsec = ts.tv_nsec;
|
||||
@ -204,7 +204,7 @@ rust_get_time(int64_t *sec, int32_t *nsec) {
|
||||
|
||||
const int64_t ns_per_s = 1000000000LL;
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_precise_time_ns(uint64_t *ns) {
|
||||
|
||||
#ifdef __APPLE__
|
||||
@ -227,23 +227,22 @@ rust_precise_time_ns(uint64_t *ns) {
|
||||
assert(query_result);
|
||||
*ns = (uint64_t)((ticks.QuadPart * ns_per_s) / ticks_per_s.QuadPart);
|
||||
#else
|
||||
timespec ts;
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
*ns = (uint64_t)(ts.tv_sec * ns_per_s + ts.tv_nsec);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct
|
||||
rust_vec
|
||||
typedef struct
|
||||
{
|
||||
size_t fill; // in bytes; if zero, heapified
|
||||
size_t alloc; // in bytes
|
||||
uint8_t data[0];
|
||||
};
|
||||
} rust_vec;
|
||||
|
||||
typedef rust_vec rust_str;
|
||||
|
||||
struct rust_tm {
|
||||
typedef struct {
|
||||
int32_t tm_sec;
|
||||
int32_t tm_min;
|
||||
int32_t tm_hour;
|
||||
@ -256,10 +255,10 @@ struct rust_tm {
|
||||
int32_t tm_gmtoff;
|
||||
rust_str *tm_zone;
|
||||
int32_t tm_nsec;
|
||||
};
|
||||
} rust_tm;
|
||||
|
||||
void rust_tm_to_tm(rust_tm* in_tm, tm* out_tm) {
|
||||
memset(out_tm, 0, sizeof(tm));
|
||||
void rust_tm_to_tm(rust_tm* in_tm, struct tm* out_tm) {
|
||||
memset(out_tm, 0, sizeof(struct tm));
|
||||
out_tm->tm_sec = in_tm->tm_sec;
|
||||
out_tm->tm_min = in_tm->tm_min;
|
||||
out_tm->tm_hour = in_tm->tm_hour;
|
||||
@ -271,7 +270,7 @@ void rust_tm_to_tm(rust_tm* in_tm, tm* out_tm) {
|
||||
out_tm->tm_isdst = in_tm->tm_isdst;
|
||||
}
|
||||
|
||||
void tm_to_rust_tm(tm* in_tm, rust_tm* out_tm, int32_t gmtoff,
|
||||
void tm_to_rust_tm(struct tm* in_tm, rust_tm* out_tm, int32_t gmtoff,
|
||||
const char *zone, int32_t nsec) {
|
||||
out_tm->tm_sec = in_tm->tm_sec;
|
||||
out_tm->tm_min = in_tm->tm_min;
|
||||
@ -300,13 +299,13 @@ void tm_to_rust_tm(tm* in_tm, rust_tm* out_tm, int32_t gmtoff,
|
||||
#define LOCALTIME(clock, result) localtime_s((result), (clock))
|
||||
#define TIMEGM(result) _mkgmtime64(result)
|
||||
#else
|
||||
struct tm* GMTIME(const time_t *clock, tm *result) {
|
||||
struct tm* GMTIME(const time_t *clock, struct tm *result) {
|
||||
struct tm* t = gmtime(clock);
|
||||
if (t == NULL || result == NULL) { return NULL; }
|
||||
*result = *t;
|
||||
return result;
|
||||
}
|
||||
struct tm* LOCALTIME(const time_t *clock, tm *result) {
|
||||
struct tm* LOCALTIME(const time_t *clock, struct tm *result) {
|
||||
struct tm* t = localtime(clock);
|
||||
if (t == NULL || result == NULL) { return NULL; }
|
||||
*result = *t;
|
||||
@ -321,23 +320,23 @@ struct tm* LOCALTIME(const time_t *clock, tm *result) {
|
||||
#define TIMEGM(result) timegm(result)
|
||||
#endif
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_tzset() {
|
||||
TZSET();
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_gmtime(int64_t sec, int32_t nsec, rust_tm *timeptr) {
|
||||
tm tm;
|
||||
struct tm tm;
|
||||
time_t s = sec;
|
||||
GMTIME(&s, &tm);
|
||||
|
||||
tm_to_rust_tm(&tm, timeptr, 0, "UTC", nsec);
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_localtime(int64_t sec, int32_t nsec, rust_tm *timeptr) {
|
||||
tm tm;
|
||||
struct tm tm;
|
||||
time_t s = sec;
|
||||
LOCALTIME(&s, &tm);
|
||||
|
||||
@ -365,16 +364,16 @@ rust_localtime(int64_t sec, int32_t nsec, rust_tm *timeptr) {
|
||||
tm_to_rust_tm(&tm, timeptr, gmtoff, zone, nsec);
|
||||
}
|
||||
|
||||
extern "C" CDECL int64_t
|
||||
int64_t
|
||||
rust_timegm(rust_tm* timeptr) {
|
||||
tm t;
|
||||
struct tm t;
|
||||
rust_tm_to_tm(timeptr, &t);
|
||||
return TIMEGM(&t);
|
||||
}
|
||||
|
||||
extern "C" CDECL int64_t
|
||||
int64_t
|
||||
rust_mktime(rust_tm* timeptr) {
|
||||
tm t;
|
||||
struct tm t;
|
||||
rust_tm_to_tm(timeptr, &t);
|
||||
return mktime(&t);
|
||||
}
|
||||
@ -383,47 +382,29 @@ rust_mktime(rust_tm* timeptr) {
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
extern "C" DIR*
|
||||
DIR*
|
||||
rust_opendir(char *dirname) {
|
||||
return opendir(dirname);
|
||||
}
|
||||
|
||||
extern "C" dirent*
|
||||
struct dirent*
|
||||
rust_readdir(DIR *dirp) {
|
||||
return readdir(dirp);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_opendir() {
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_readdir() {
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
typedef void *(rust_try_fn)(void*, void*);
|
||||
|
||||
extern "C" CDECL uintptr_t
|
||||
rust_try(rust_try_fn f, void *fptr, void *env) {
|
||||
try {
|
||||
f(fptr, env);
|
||||
} catch (uintptr_t token) {
|
||||
assert(token != 0);
|
||||
return token;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
rust_begin_unwind(uintptr_t token) {
|
||||
throw token;
|
||||
}
|
||||
|
||||
extern "C" CDECL uintptr_t
|
||||
uintptr_t
|
||||
rust_running_on_valgrind() {
|
||||
return RUNNING_ON_VALGRIND;
|
||||
}
|
||||
@ -470,24 +451,24 @@ get_num_cpus() {
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" CDECL uintptr_t
|
||||
uintptr_t
|
||||
rust_get_num_cpus() {
|
||||
return get_num_cpus();
|
||||
}
|
||||
|
||||
extern "C" CDECL unsigned int
|
||||
unsigned int
|
||||
rust_valgrind_stack_register(void *start, void *end) {
|
||||
return VALGRIND_STACK_REGISTER(start, end);
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_valgrind_stack_deregister(unsigned int id) {
|
||||
VALGRIND_STACK_DEREGISTER(id);
|
||||
}
|
||||
|
||||
#if defined(__WIN32__)
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_unset_sigprocmask() {
|
||||
// empty stub for windows to keep linker happy
|
||||
}
|
||||
@ -497,7 +478,7 @@ rust_unset_sigprocmask() {
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_unset_sigprocmask() {
|
||||
// this can't be safely converted to rust code because the
|
||||
// representation of sigset_t is platform-dependent
|
||||
@ -526,7 +507,7 @@ win32_require(LPCTSTR fn, BOOL ok) {
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_acquire(HCRYPTPROV* phProv) {
|
||||
win32_require
|
||||
(_T("CryptAcquireContext"),
|
||||
@ -536,12 +517,12 @@ rust_win32_rand_acquire(HCRYPTPROV* phProv) {
|
||||
CRYPT_VERIFYCONTEXT|CRYPT_SILENT));
|
||||
|
||||
}
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_gen(HCRYPTPROV hProv, DWORD dwLen, BYTE* pbBuffer) {
|
||||
win32_require
|
||||
(_T("CryptGenRandom"), CryptGenRandom(hProv, dwLen, pbBuffer));
|
||||
}
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_release(HCRYPTPROV hProv) {
|
||||
win32_require
|
||||
(_T("CryptReleaseContext"), CryptReleaseContext(hProv, 0));
|
||||
@ -552,15 +533,15 @@ rust_win32_rand_release(HCRYPTPROV hProv) {
|
||||
// these symbols are listed in rustrt.def.in, so they need to exist; but they
|
||||
// should never be called.
|
||||
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_acquire() {
|
||||
abort();
|
||||
}
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_gen() {
|
||||
abort();
|
||||
}
|
||||
extern "C" CDECL void
|
||||
void
|
||||
rust_win32_rand_release() {
|
||||
abort();
|
||||
}
|
||||
@ -569,20 +550,20 @@ rust_win32_rand_release() {
|
||||
|
||||
#if defined(__WIN32__)
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_crit_section_size() { return sizeof(CRITICAL_SECTION); }
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_pthread_mutex_t_size() { return 0; }
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_pthread_cond_t_size() { return 0; }
|
||||
|
||||
#else
|
||||
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_crit_section_size() { return 0; }
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_pthread_mutex_t_size() { return sizeof(pthread_mutex_t); }
|
||||
extern "C" CDECL int
|
||||
int
|
||||
rust_pthread_cond_t_size() { return sizeof(pthread_cond_t); }
|
||||
|
||||
#endif
|
31
src/rt/rust_cxx_glue.cpp
Normal file
31
src/rt/rust_cxx_glue.cpp
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
/* Foreign builtins which require C++ */
|
||||
|
||||
#include "rust_globals.h"
|
||||
|
||||
typedef void *(rust_try_fn)(void*, void*);
|
||||
|
||||
extern "C" CDECL uintptr_t
|
||||
rust_try(rust_try_fn f, void *fptr, void *env) {
|
||||
try {
|
||||
f(fptr, env);
|
||||
} catch (uintptr_t token) {
|
||||
assert(token != 0);
|
||||
return token;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
rust_begin_unwind(uintptr_t token) {
|
||||
throw token;
|
||||
}
|
@ -39,6 +39,10 @@
|
||||
#define __STDC_FORMAT_MACROS 1
|
||||
#endif
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
||||
#define ERROR 0
|
||||
|
||||
#include <stdlib.h>
|
||||
@ -62,11 +66,15 @@
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#include <wincrypt.h>
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
#elif defined(__GNUC__)
|
||||
#include <unistd.h>
|
||||
#include <dlfcn.h>
|
||||
|
@ -14,41 +14,41 @@
|
||||
|
||||
// These functions are used in the unit tests for C ABI calls.
|
||||
|
||||
extern "C" CDECL uint32_t
|
||||
uint32_t
|
||||
rust_dbg_extern_identity_u32(uint32_t u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
extern "C" CDECL uint64_t
|
||||
uint64_t
|
||||
rust_dbg_extern_identity_u64(uint64_t u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
extern "C" CDECL double
|
||||
double
|
||||
rust_dbg_extern_identity_double(double u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
extern "C" CDECL char
|
||||
char
|
||||
rust_dbg_extern_identity_u8(char u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
typedef void *(*dbg_callback)(void*);
|
||||
|
||||
extern "C" CDECL void *
|
||||
void *
|
||||
rust_dbg_call(dbg_callback cb, void *data) {
|
||||
return cb(data);
|
||||
}
|
||||
|
||||
extern "C" CDECL void rust_dbg_do_nothing() { }
|
||||
void rust_dbg_do_nothing() { }
|
||||
|
||||
struct TwoU8s {
|
||||
uint8_t one;
|
||||
uint8_t two;
|
||||
};
|
||||
|
||||
extern "C" CDECL TwoU8s
|
||||
struct TwoU8s
|
||||
rust_dbg_extern_return_TwoU8s() {
|
||||
struct TwoU8s s;
|
||||
s.one = 10;
|
||||
@ -56,8 +56,8 @@ rust_dbg_extern_return_TwoU8s() {
|
||||
return s;
|
||||
}
|
||||
|
||||
extern "C" CDECL TwoU8s
|
||||
rust_dbg_extern_identity_TwoU8s(TwoU8s u) {
|
||||
struct TwoU8s
|
||||
rust_dbg_extern_identity_TwoU8s(struct TwoU8s u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
@ -66,7 +66,7 @@ struct TwoU16s {
|
||||
uint16_t two;
|
||||
};
|
||||
|
||||
extern "C" CDECL TwoU16s
|
||||
struct TwoU16s
|
||||
rust_dbg_extern_return_TwoU16s() {
|
||||
struct TwoU16s s;
|
||||
s.one = 10;
|
||||
@ -74,8 +74,8 @@ rust_dbg_extern_return_TwoU16s() {
|
||||
return s;
|
||||
}
|
||||
|
||||
extern "C" CDECL TwoU16s
|
||||
rust_dbg_extern_identity_TwoU16s(TwoU16s u) {
|
||||
struct TwoU16s
|
||||
rust_dbg_extern_identity_TwoU16s(struct TwoU16s u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ struct TwoU32s {
|
||||
uint32_t two;
|
||||
};
|
||||
|
||||
extern "C" CDECL TwoU32s
|
||||
struct TwoU32s
|
||||
rust_dbg_extern_return_TwoU32s() {
|
||||
struct TwoU32s s;
|
||||
s.one = 10;
|
||||
@ -92,8 +92,8 @@ rust_dbg_extern_return_TwoU32s() {
|
||||
return s;
|
||||
}
|
||||
|
||||
extern "C" CDECL TwoU32s
|
||||
rust_dbg_extern_identity_TwoU32s(TwoU32s u) {
|
||||
struct TwoU32s
|
||||
rust_dbg_extern_identity_TwoU32s(struct TwoU32s u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ struct TwoU64s {
|
||||
uint64_t two;
|
||||
};
|
||||
|
||||
extern "C" CDECL TwoU64s
|
||||
struct TwoU64s
|
||||
rust_dbg_extern_return_TwoU64s() {
|
||||
struct TwoU64s s;
|
||||
s.one = 10;
|
||||
@ -110,8 +110,8 @@ rust_dbg_extern_return_TwoU64s() {
|
||||
return s;
|
||||
}
|
||||
|
||||
extern "C" CDECL TwoU64s
|
||||
rust_dbg_extern_identity_TwoU64s(TwoU64s u) {
|
||||
struct TwoU64s
|
||||
rust_dbg_extern_identity_TwoU64s(struct TwoU64s u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
@ -120,12 +120,12 @@ struct TwoDoubles {
|
||||
double two;
|
||||
};
|
||||
|
||||
extern "C" CDECL TwoDoubles
|
||||
rust_dbg_extern_identity_TwoDoubles(TwoDoubles u) {
|
||||
struct TwoDoubles
|
||||
rust_dbg_extern_identity_TwoDoubles(struct TwoDoubles u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
extern "C" CDECL intptr_t
|
||||
intptr_t
|
||||
rust_get_test_int() {
|
||||
return 1;
|
||||
}
|
||||
@ -149,29 +149,29 @@ struct floats {
|
||||
double c;
|
||||
};
|
||||
|
||||
extern "C" quad
|
||||
rust_dbg_abi_1(quad q) {
|
||||
quad qq = { q.c + 1,
|
||||
q.d - 1,
|
||||
q.a + 1,
|
||||
q.b - 1 };
|
||||
struct quad
|
||||
rust_dbg_abi_1(struct quad q) {
|
||||
struct quad qq = { q.c + 1,
|
||||
q.d - 1,
|
||||
q.a + 1,
|
||||
q.b - 1 };
|
||||
return qq;
|
||||
}
|
||||
|
||||
extern "C" floats
|
||||
rust_dbg_abi_2(floats f) {
|
||||
floats ff = { f.c + 1.0,
|
||||
0xff,
|
||||
f.a - 1.0 };
|
||||
struct floats
|
||||
rust_dbg_abi_2(struct floats f) {
|
||||
struct floats ff = { f.c + 1.0,
|
||||
0xff,
|
||||
f.a - 1.0 };
|
||||
return ff;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
int
|
||||
rust_dbg_static_mut;
|
||||
|
||||
int rust_dbg_static_mut = 3;
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_dbg_static_mut_check_four() {
|
||||
assert(rust_dbg_static_mut == 4);
|
||||
}
|
@ -35,24 +35,24 @@ struct _Unwind_Exception;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
extern "C" _Unwind_Reason_Code
|
||||
_Unwind_Reason_Code
|
||||
PERSONALITY_FUNC(int version,
|
||||
_Unwind_Action actions,
|
||||
uint64_t exception_class,
|
||||
_Unwind_Exception *ue_header,
|
||||
_Unwind_Context *context);
|
||||
struct _Unwind_Exception *ue_header,
|
||||
struct _Unwind_Context *context);
|
||||
|
||||
struct s_rust_personality_args {
|
||||
_Unwind_Reason_Code retval;
|
||||
int version;
|
||||
_Unwind_Action actions;
|
||||
uint64_t exception_class;
|
||||
_Unwind_Exception *ue_header;
|
||||
_Unwind_Context *context;
|
||||
struct _Unwind_Exception *ue_header;
|
||||
struct _Unwind_Context *context;
|
||||
};
|
||||
|
||||
extern "C" void
|
||||
upcall_s_rust_personality(s_rust_personality_args *args) {
|
||||
void
|
||||
upcall_s_rust_personality(struct s_rust_personality_args *args) {
|
||||
args->retval = PERSONALITY_FUNC(args->version,
|
||||
args->actions,
|
||||
args->exception_class,
|
||||
@ -65,15 +65,15 @@ upcall_s_rust_personality(s_rust_personality_args *args) {
|
||||
out what to do with each landing pad. Just a stack-switching
|
||||
wrapper around the C++ personality function.
|
||||
*/
|
||||
extern "C" _Unwind_Reason_Code
|
||||
_Unwind_Reason_Code
|
||||
upcall_rust_personality(int version,
|
||||
_Unwind_Action actions,
|
||||
uint64_t exception_class,
|
||||
_Unwind_Exception *ue_header,
|
||||
_Unwind_Context *context) {
|
||||
s_rust_personality_args args = {(_Unwind_Reason_Code)0,
|
||||
version, actions, exception_class,
|
||||
ue_header, context};
|
||||
struct _Unwind_Exception *ue_header,
|
||||
struct _Unwind_Context *context) {
|
||||
struct s_rust_personality_args args = {(_Unwind_Reason_Code)0,
|
||||
version, actions, exception_class,
|
||||
ue_header, context};
|
||||
upcall_s_rust_personality(&args);
|
||||
return args.retval;
|
||||
}
|
||||
@ -82,7 +82,7 @@ upcall_rust_personality(int version,
|
||||
// correct limit into TLS.
|
||||
// NB: This must run on the Rust stack because it
|
||||
// needs to acquire the value of the stack pointer
|
||||
extern "C" CDECL void
|
||||
void
|
||||
upcall_reset_stack_limit() {
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
#include "rust_globals.h"
|
||||
|
||||
extern "C" void*
|
||||
void*
|
||||
rust_uv_loop_new() {
|
||||
// XXX libuv doesn't always ignore SIGPIPE even though we don't need it.
|
||||
#ifndef __WIN32__
|
||||
@ -31,67 +31,67 @@ rust_uv_loop_new() {
|
||||
return (void*)uv_loop_new();
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_uv_loop_set_data(uv_loop_t* loop, void* data) {
|
||||
loop->data = data;
|
||||
}
|
||||
|
||||
extern "C" uv_udp_t*
|
||||
uv_udp_t*
|
||||
rust_uv_get_udp_handle_from_send_req(uv_udp_send_t* send_req) {
|
||||
return send_req->handle;
|
||||
}
|
||||
|
||||
extern "C" uv_stream_t*
|
||||
uv_stream_t*
|
||||
rust_uv_get_stream_handle_from_connect_req(uv_connect_t* connect) {
|
||||
return connect->handle;
|
||||
}
|
||||
extern "C" uv_stream_t*
|
||||
uv_stream_t*
|
||||
rust_uv_get_stream_handle_from_write_req(uv_write_t* write_req) {
|
||||
return write_req->handle;
|
||||
}
|
||||
|
||||
extern "C" uv_loop_t*
|
||||
uv_loop_t*
|
||||
rust_uv_get_loop_for_uv_handle(uv_handle_t* handle) {
|
||||
return handle->loop;
|
||||
}
|
||||
|
||||
extern "C" void*
|
||||
void*
|
||||
rust_uv_get_data_for_uv_loop(uv_loop_t* loop) {
|
||||
return loop->data;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_uv_set_data_for_uv_loop(uv_loop_t* loop,
|
||||
void* data) {
|
||||
loop->data = data;
|
||||
}
|
||||
|
||||
extern "C" void*
|
||||
void*
|
||||
rust_uv_get_data_for_uv_handle(uv_handle_t* handle) {
|
||||
return handle->data;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_uv_set_data_for_uv_handle(uv_handle_t* handle, void* data) {
|
||||
handle->data = data;
|
||||
}
|
||||
|
||||
extern "C" void*
|
||||
void*
|
||||
rust_uv_get_data_for_req(uv_req_t* req) {
|
||||
return req->data;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_uv_set_data_for_req(uv_req_t* req, void* data) {
|
||||
req->data = data;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
int
|
||||
rust_sockaddr_size() {
|
||||
return sizeof(struct sockaddr_storage);
|
||||
}
|
||||
|
||||
extern "C" struct sockaddr*
|
||||
struct sockaddr*
|
||||
rust_malloc_ip4_addr(char *name, int port) {
|
||||
struct sockaddr_in *addr = (struct sockaddr_in*) calloc(1, rust_sockaddr_size());
|
||||
assert(addr != NULL);
|
||||
@ -101,7 +101,7 @@ rust_malloc_ip4_addr(char *name, int port) {
|
||||
return (struct sockaddr*) addr;
|
||||
}
|
||||
|
||||
extern "C" struct sockaddr*
|
||||
struct sockaddr*
|
||||
rust_malloc_ip6_addr(char *name, int port) {
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6*) calloc(1, rust_sockaddr_size());
|
||||
assert(addr != NULL);
|
||||
@ -111,58 +111,58 @@ rust_malloc_ip6_addr(char *name, int port) {
|
||||
return (struct sockaddr*) addr;
|
||||
}
|
||||
|
||||
extern "C" unsigned int
|
||||
unsigned int
|
||||
rust_ip4_port(struct sockaddr_in* src) {
|
||||
return ntohs(src->sin_port);
|
||||
}
|
||||
extern "C" unsigned int
|
||||
unsigned int
|
||||
rust_ip6_port(struct sockaddr_in6* src) {
|
||||
return ntohs(src->sin6_port);
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
rust_is_ipv4_sockaddr(sockaddr* addr) {
|
||||
int
|
||||
rust_is_ipv4_sockaddr(struct sockaddr* addr) {
|
||||
return addr->sa_family == AF_INET;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
rust_is_ipv6_sockaddr(sockaddr* addr) {
|
||||
int
|
||||
rust_is_ipv6_sockaddr(struct sockaddr* addr) {
|
||||
return addr->sa_family == AF_INET6;
|
||||
}
|
||||
|
||||
extern "C" uintptr_t
|
||||
uintptr_t
|
||||
rust_uv_handle_type_max() {
|
||||
return UV_HANDLE_TYPE_MAX;
|
||||
}
|
||||
|
||||
extern "C" uintptr_t
|
||||
uintptr_t
|
||||
rust_uv_req_type_max() {
|
||||
return UV_REQ_TYPE_MAX;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
int
|
||||
rust_uv_get_result_from_fs_req(uv_fs_t* req) {
|
||||
return req->result;
|
||||
}
|
||||
extern "C" const char*
|
||||
const char*
|
||||
rust_uv_get_path_from_fs_req(uv_fs_t* req) {
|
||||
return req->path;
|
||||
}
|
||||
extern "C" void*
|
||||
void*
|
||||
rust_uv_get_ptr_from_fs_req(uv_fs_t* req) {
|
||||
return req->ptr;
|
||||
}
|
||||
extern "C" uv_loop_t*
|
||||
uv_loop_t*
|
||||
rust_uv_get_loop_from_fs_req(uv_fs_t* req) {
|
||||
return req->loop;
|
||||
}
|
||||
|
||||
extern "C" uv_loop_t*
|
||||
uv_loop_t*
|
||||
rust_uv_get_loop_from_getaddrinfo_req(uv_getaddrinfo_t* req) {
|
||||
return req->loop;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_uv_populate_uv_stat(uv_fs_t* req_in, uv_stat_t* stat_out) {
|
||||
stat_out->st_dev = req_in->statbuf.st_dev;
|
||||
stat_out->st_mode = req_in->statbuf.st_mode;
|
||||
@ -186,27 +186,27 @@ rust_uv_populate_uv_stat(uv_fs_t* req_in, uv_stat_t* stat_out) {
|
||||
stat_out->st_birthtim.tv_nsec = req_in->statbuf.st_birthtim.tv_nsec;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_set_stdio_container_flags(uv_stdio_container_t *c, int flags) {
|
||||
c->flags = (uv_stdio_flags) flags;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_set_stdio_container_fd(uv_stdio_container_t *c, int fd) {
|
||||
c->data.fd = fd;
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
void
|
||||
rust_set_stdio_container_stream(uv_stdio_container_t *c, uv_stream_t *stream) {
|
||||
c->data.stream = stream;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
int
|
||||
rust_uv_process_pid(uv_process_t* p) {
|
||||
return p->pid;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
int
|
||||
rust_uv_guess_handle(int fd) {
|
||||
return uv_guess_handle(fd);
|
||||
}
|
Loading…
Reference in New Issue
Block a user