mirror of
https://github.com/denoland/deno.git
synced 2024-12-11 18:17:48 -05:00
chore(ext/ffi): remove dependency on stdint.h (#15294)
This commit is contained in:
parent
3893ce848c
commit
c416553a6b
3 changed files with 63 additions and 36 deletions
|
@ -56,7 +56,7 @@ fn native_to_c(ty: &NativeType) -> &'static str {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn codegen(sym: &crate::Symbol) -> String {
|
pub(crate) fn codegen(sym: &crate::Symbol) -> String {
|
||||||
let mut c = String::from("#include <stdint.h>\n");
|
let mut c = String::from(include_str!("prelude.h"));
|
||||||
let ret = native_to_c(&sym.result_type);
|
let ret = native_to_c(&sym.result_type);
|
||||||
|
|
||||||
// extern <return_type> func(
|
// extern <return_type> func(
|
||||||
|
@ -130,75 +130,72 @@ mod tests {
|
||||||
super::codegen(&sym)
|
super::codegen(&sym)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const PRELUDE: &str = include_str!("prelude.h");
|
||||||
|
fn assert_codegen(expected: String, actual: &str) {
|
||||||
|
assert_eq!(expected, format!("{PRELUDE}\n{}", actual))
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_gen_trampoline() {
|
fn test_gen_trampoline() {
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![], NativeType::Void),
|
codegen(vec![], NativeType::Void),
|
||||||
"#include <stdint.h>\n\n\
|
"extern void func();\n\n\
|
||||||
extern void func();\n\n\
|
|
||||||
void func_trampoline(void* recv) {\
|
void func_trampoline(void* recv) {\
|
||||||
\n return func();\n\
|
\n return func();\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::U32, NativeType::U32], NativeType::U32),
|
codegen(vec![NativeType::U32, NativeType::U32], NativeType::U32),
|
||||||
"#include <stdint.h>\n\n\
|
"extern uint32_t func(uint32_t p0, uint32_t p1);\n\n\
|
||||||
extern uint32_t func(uint32_t p0, uint32_t p1);\n\n\
|
|
||||||
uint32_t func_trampoline(void* recv, uint32_t p0, uint32_t p1) {\
|
uint32_t func_trampoline(void* recv, uint32_t p0, uint32_t p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::I32, NativeType::I32], NativeType::I32),
|
codegen(vec![NativeType::I32, NativeType::I32], NativeType::I32),
|
||||||
"#include <stdint.h>\n\n\
|
"extern int32_t func(int32_t p0, int32_t p1);\n\n\
|
||||||
extern int32_t func(int32_t p0, int32_t p1);\n\n\
|
|
||||||
int32_t func_trampoline(void* recv, int32_t p0, int32_t p1) {\
|
int32_t func_trampoline(void* recv, int32_t p0, int32_t p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::F32, NativeType::F32], NativeType::F32),
|
codegen(vec![NativeType::F32, NativeType::F32], NativeType::F32),
|
||||||
"#include <stdint.h>\n\n\
|
"extern float func(float p0, float p1);\n\n\
|
||||||
extern float func(float p0, float p1);\n\n\
|
|
||||||
float func_trampoline(void* recv, float p0, float p1) {\
|
float func_trampoline(void* recv, float p0, float p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::F64, NativeType::F64], NativeType::F64),
|
codegen(vec![NativeType::F64, NativeType::F64], NativeType::F64),
|
||||||
"#include <stdint.h>\n\n\
|
"extern double func(double p0, double p1);\n\n\
|
||||||
extern double func(double p0, double p1);\n\n\
|
|
||||||
double func_trampoline(void* recv, double p0, double p1) {\
|
double func_trampoline(void* recv, double p0, double p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_gen_trampoline_implicit_cast() {
|
fn test_gen_trampoline_implicit_cast() {
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::I8, NativeType::U8], NativeType::I8),
|
codegen(vec![NativeType::I8, NativeType::U8], NativeType::I8),
|
||||||
"#include <stdint.h>\n\n\
|
"extern int8_t func(int8_t p0, uint8_t p1);\n\n\
|
||||||
extern int8_t func(int8_t p0, uint8_t p1);\n\n\
|
|
||||||
int8_t func_trampoline(void* recv, int32_t p0, uint32_t p1) {\
|
int8_t func_trampoline(void* recv, int32_t p0, uint32_t p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::ISize, NativeType::U64], NativeType::Void),
|
codegen(vec![NativeType::ISize, NativeType::U64], NativeType::Void),
|
||||||
"#include <stdint.h>\n\n\
|
"extern void func(intptr_t p0, uint64_t p1);\n\n\
|
||||||
extern void func(intptr_t p0, uint64_t p1);\n\n\
|
|
||||||
void func_trampoline(void* recv, intptr_t p0, uint64_t p1) {\
|
void func_trampoline(void* recv, intptr_t p0, uint64_t p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_codegen(
|
||||||
codegen(vec![NativeType::USize, NativeType::USize], NativeType::U32),
|
codegen(vec![NativeType::USize, NativeType::USize], NativeType::U32),
|
||||||
"#include <stdint.h>\n\n\
|
"extern uint32_t func(uintptr_t p0, uintptr_t p1);\n\n\
|
||||||
extern uint32_t func(uintptr_t p0, uintptr_t p1);\n\n\
|
|
||||||
uint32_t func_trampoline(void* recv, uintptr_t p0, uintptr_t p1) {\
|
uint32_t func_trampoline(void* recv, uintptr_t p0, uintptr_t p1) {\
|
||||||
\n return func(p0, p1);\n\
|
\n return func(p0, p1);\n\
|
||||||
}\n\n"
|
}\n\n",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,13 +10,11 @@ use deno_core::futures::channel::mpsc;
|
||||||
use deno_core::futures::Future;
|
use deno_core::futures::Future;
|
||||||
use deno_core::include_js_files;
|
use deno_core::include_js_files;
|
||||||
use deno_core::op;
|
use deno_core::op;
|
||||||
use deno_core::v8::fast_api;
|
|
||||||
use std::sync::mpsc::sync_channel;
|
|
||||||
|
|
||||||
use deno_core::serde_json::json;
|
use deno_core::serde_json::json;
|
||||||
use deno_core::serde_json::Value;
|
use deno_core::serde_json::Value;
|
||||||
use deno_core::serde_v8;
|
use deno_core::serde_v8;
|
||||||
use deno_core::v8;
|
use deno_core::v8;
|
||||||
|
use deno_core::v8::fast_api;
|
||||||
use deno_core::Extension;
|
use deno_core::Extension;
|
||||||
use deno_core::OpState;
|
use deno_core::OpState;
|
||||||
use deno_core::Resource;
|
use deno_core::Resource;
|
||||||
|
@ -33,17 +31,30 @@ use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ffi::c_void;
|
use std::ffi::c_void;
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
|
use std::mem::size_of;
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
|
use std::os::raw::c_short;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::sync::mpsc::sync_channel;
|
||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
mod jit_trampoline;
|
mod jit_trampoline;
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
mod tcc;
|
mod tcc;
|
||||||
|
|
||||||
|
#[cfg(not(target_pointer_width = "64"))]
|
||||||
|
compile_error!("platform not supported");
|
||||||
|
|
||||||
|
// Assert assumptions made in `prelude.h`
|
||||||
|
const _: () = {
|
||||||
|
assert!(size_of::<c_char>() == 1);
|
||||||
|
assert!(size_of::<c_short>() == 2);
|
||||||
|
assert!(size_of::<*const ()>() == 8);
|
||||||
|
};
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
static LOCAL_ISOLATE_POINTER: RefCell<*const v8::Isolate> = RefCell::new(ptr::null());
|
static LOCAL_ISOLATE_POINTER: RefCell<*const v8::Isolate> = RefCell::new(ptr::null());
|
||||||
}
|
}
|
||||||
|
|
19
ext/ffi/prelude.h
Normal file
19
ext/ffi/prelude.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
/* Exact integral types. */
|
||||||
|
|
||||||
|
/* Signed. */
|
||||||
|
typedef signed char int8_t;
|
||||||
|
typedef short int int16_t;
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef long int int64_t;
|
||||||
|
|
||||||
|
/* Unsigned. */
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef unsigned short int uint16_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef unsigned long int uint64_t;
|
||||||
|
|
||||||
|
/* Types for `void *' pointers. */
|
||||||
|
typedef long int intptr_t;
|
||||||
|
typedef unsigned long int uintptr_t;
|
Loading…
Reference in a new issue