diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6936990 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +**/*.rs.bk +Cargo.lock diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ba22e3f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "duktape"] + path = duktape + url = https://github.com/svaarala/duktape-releases.git diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3f26d05 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "dukbind" +version = "0.1.0" +authors = ["envis10n "] +edition = "2018" +build = "build.rs" + +[dependencies] + +[build-dependencies] +cc = "*" +bindgen = "*" \ No newline at end of file diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..1b4e6d4 --- /dev/null +++ b/build.rs @@ -0,0 +1,22 @@ +extern crate bindgen; +extern crate cc; + +use std::env; +use std::path::PathBuf; + +fn main() { + cc::Build::new() + .file("duktape/src/duktape.c") + .include("duktape/src") + .compile("duktape"); + + let bindings = bindgen::Builder::default() + .header("duktape/src/duktape.h") + .generate() + .expect("Unable to generate bindings"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("duktape_bindings.rs")) + .expect("Couldn't write bindings!"); +} \ No newline at end of file diff --git a/duktape b/duktape new file mode 160000 index 0000000..6a17dc0 --- /dev/null +++ b/duktape @@ -0,0 +1 @@ +Subproject commit 6a17dc066fb4d2ffa33d593f0cc4ada18885fde7 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..3106cfd --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,50 @@ +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] + +include!(concat!(env!("OUT_DIR"), "/duktape_bindings.rs")); + +pub mod glue { + use super::*; + extern "C" { + /// A wrapper around duk_push_error_object, which relies on varargs in + /// the original API. + /// NOTE: Pulled from duktape crate duktape_sys/src/glue.rs + pub fn duk_push_error_object_string( + ctx: *mut duk_context, err_code: duk_errcode_t, + filename: *const i8, line: duk_int_t, + message: *const i8) -> duk_idx_t; + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_eval() { + use std::ptr::null_mut; + use super::*; + unsafe { + // Pulled from duktape crate duktape_sys/src/lib.rs | Modified to compile. + // Create a heap. + let ctx = duk_create_heap(None, None, None, null_mut(), None); + + // Run a short code snippet. + let code = "2+3"; + let filename = "input"; + duk_push_lstring(ctx, filename.as_ptr() as *const i8, + filename.len() as duk_size_t); + let result = duk_eval_raw(ctx, code.as_ptr() as *const i8, + code.len() as duk_size_t, + DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | + DUK_COMPILE_SAFE) as u32; + assert_eq!(DUK_EXEC_SUCCESS, result); + + // Get the result and make sure it's correct. + assert_eq!(1, duk_is_number(ctx, -1)); + assert_eq!(5.0, duk_get_number(ctx, -1)); + duk_pop(ctx); + + duk_destroy_heap(ctx); + } + } +}