From c36c85fa4f1de048ed9b27f96b1aa2c6f0766e8e Mon Sep 17 00:00:00 2001 From: Graham Kelly Date: Thu, 18 Jul 2024 13:17:58 -0400 Subject: [PATCH] new stuff --- Cargo.lock | 69 ++++++++++++++++++++++++++++---- Cargo.toml | 4 +- buffer.pit | 5 +++ pit-basic/Cargo.toml | 7 ++++ pit-basic/build.sh | 3 ++ pit-basic/src/buffer.rs | 1 + pit-basic/src/lib.rs | 26 ++++++++++++ pit-core/src/lib.rs | 28 ++++++------- pit-patch/Cargo.toml | 2 + pit-patch/src/canon.rs | 34 ++++++++++++++++ pit-rust-generator/Cargo.toml | 14 +++++++ pit-rust-generator/src/main.rs | 25 ++++++++++++ pit-rust-guest/src/lib.rs | 72 +++++++++++++++++----------------- pit-rust-host/src/lib.rs | 2 +- 14 files changed, 229 insertions(+), 63 deletions(-) create mode 100644 buffer.pit create mode 100644 pit-basic/Cargo.toml create mode 100644 pit-basic/build.sh create mode 100644 pit-basic/src/buffer.rs create mode 100644 pit-basic/src/lib.rs create mode 100644 pit-rust-generator/Cargo.toml create mode 100644 pit-rust-generator/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 5144e45..089f324 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -245,7 +245,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.66", + "syn 2.0.71", ] [[package]] @@ -293,6 +293,26 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "externref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b078507c9badc1c2304de402f373950b30ef80b793096cd2a8c0312c8c676cad" +dependencies = [ + "externref-macro", +] + +[[package]] +name = "externref-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77107325d07454a4de518e92b1e061ded5af8aa32d52edb1fde60c813d1eff1b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -483,6 +503,13 @@ dependencies = [ "ruzstd", ] +[[package]] +name = "pit-basic" +version = "0.1.0" +dependencies = [ + "externref", +] + [[package]] name = "pit-core" version = "0.1.0" @@ -498,12 +525,28 @@ name = "pit-patch" version = "0.1.0" dependencies = [ "anyhow", + "hex", "nom", "pit-core", "portal-pc-waffle", + "sha3", "waffle-ast", ] +[[package]] +name = "pit-rust-generator" +version = "0.1.0" +dependencies = [ + "anyhow", + "nom", + "pit-core", + "pit-rust-guest", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "pit-rust-guest" version = "0.1.0" @@ -514,7 +557,7 @@ dependencies = [ "quasiquote", "quote", "sha3", - "syn 2.0.66", + "syn 2.0.71", ] [[package]] @@ -526,7 +569,7 @@ dependencies = [ "proc-macro2", "quasiquote", "quote", - "syn 2.0.66", + "syn 2.0.71", ] [[package]] @@ -559,6 +602,16 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.71", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -585,9 +638,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -669,7 +722,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.71", ] [[package]] @@ -817,9 +870,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 6a07888..0011e5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] -members=["pit-core", "pit-patch", "pit-rust-guest", "pit-rust-host", "pit-rust-host-lib"] +members=[ "pit-basic","pit-core", "pit-patch", "pit-rust-generator", "pit-rust-guest", "pit-rust-host", "pit-rust-host-lib"] resolver="2" [workspace.dependencies] portal-pc-waffle = {git="https://github.com/portal-co/waffle-.git",branch="pr/changes2"} -waffle-ast = {git="https://github.com/portal-co/more_waffle.git",branch="master"} \ No newline at end of file +waffle-ast = {git="https://github.com/portal-co/more_waffle.git",branch="master"} diff --git a/buffer.pit b/buffer.pit new file mode 100644 index 0000000..0db50f2 --- /dev/null +++ b/buffer.pit @@ -0,0 +1,5 @@ +{ + read8(I32) -> (I32); + write8(I32,I32) -> (); + size() -> (I32) +} \ No newline at end of file diff --git a/pit-basic/Cargo.toml b/pit-basic/Cargo.toml new file mode 100644 index 0000000..4db5d3e --- /dev/null +++ b/pit-basic/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "pit-basic" +version = "0.1.0" +edition = "2021" + +[dependencies] +externref = "0.2.0" diff --git a/pit-basic/build.sh b/pit-basic/build.sh new file mode 100644 index 0000000..de9a0b2 --- /dev/null +++ b/pit-basic/build.sh @@ -0,0 +1,3 @@ +set -e +cd $(dirname $0) +cargo run -p pit-rust-generator ../buffer.pit src/buffer.rs \ No newline at end of file diff --git a/pit-basic/src/buffer.rs b/pit-basic/src/buffer.rs new file mode 100644 index 0000000..5a5a8a0 --- /dev/null +++ b/pit-basic/src/buffer.rs @@ -0,0 +1 @@ +pub trait R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 { fn read8 (& self , p0 : u32) -> (u32) ; fn size (& self) -> (u32) ; fn write8 (& self , p0 : u32 , p1 : u32) -> () ; } const _ : () = { # [link_section = ".pit-types"] static SECTION_CONTENT : [u8 ; 60usize] = [123u8 , 114u8 , 101u8 , 97u8 , 100u8 , 56u8 , 40u8 , 73u8 , 51u8 , 50u8 , 41u8 , 32u8 , 45u8 , 62u8 , 32u8 , 40u8 , 73u8 , 51u8 , 50u8 , 41u8 , 59u8 , 115u8 , 105u8 , 122u8 , 101u8 , 40u8 , 41u8 , 32u8 , 45u8 , 62u8 , 32u8 , 40u8 , 73u8 , 51u8 , 50u8 , 41u8 , 59u8 , 119u8 , 114u8 , 105u8 , 116u8 , 101u8 , 56u8 , 40u8 , 73u8 , 51u8 , 50u8 , 44u8 , 73u8 , 51u8 , 50u8 , 41u8 , 32u8 , 45u8 , 62u8 , 32u8 , 40u8 , 41u8 , 125u8 , 0u8] ; impl R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 for :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >> { fn read8 (& self , p0 : u32) -> (u32) { # [:: externref :: externref (crate = ":: externref")] # [link (wasm_import_module = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5")] extern "C" { # [link (wasm_import_name = "read8")] fn go (this : & :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >> , p0 : u32) -> (u32) ; } return unsafe { go (self ,p0) } ; } fn size (& self) -> (u32) { # [:: externref :: externref (crate = ":: externref")] # [link (wasm_import_module = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5")] extern "C" { # [link (wasm_import_name = "size")] fn go (this : & :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >>) -> (u32) ; } return unsafe { go (self ,) } ; } fn write8 (& self , p0 : u32 , p1 : u32) -> () { # [:: externref :: externref (crate = ":: externref")] # [link (wasm_import_module = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5")] extern "C" { # [link (wasm_import_name = "write8")] fn go (this : & :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >> , p0 : u32 , p1 : u32) -> () ; } return unsafe { go (self ,p0 , p1) } ; } } # [:: externref :: externref (crate = ":: externref")] # [export_name = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5/~8afbd04c549e07db517e034114e4b8ff8c76ce748f2e2d6e29fcaf48051eaf3e.drop"] extern "C" fn _drop (a : * mut Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >) { unsafe { Box :: from_raw (a) } ; } # [:: externref :: externref (crate = ":: externref")] # [export_name = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5/~8afbd04c549e07db517e034114e4b8ff8c76ce748f2e2d6e29fcaf48051eaf3e/read8"] extern "C" fn read8 (id : * mut Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 > , p0 : u32) -> (u32) { return unsafe { & mut * id } .read8 (p0) ; } # [:: externref :: externref (crate = ":: externref")] # [export_name = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5/~8afbd04c549e07db517e034114e4b8ff8c76ce748f2e2d6e29fcaf48051eaf3e/size"] extern "C" fn size (id : * mut Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >) -> (u32) { return unsafe { & mut * id } .size () ; } # [:: externref :: externref (crate = ":: externref")] # [export_name = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5/~8afbd04c549e07db517e034114e4b8ff8c76ce748f2e2d6e29fcaf48051eaf3e/write8"] extern "C" fn write8 (id : * mut Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 > , p0 : u32 , p1 : u32) -> () { return unsafe { & mut * id } .write8 (p0 , p1) ; } } ; mod R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5_utils { use super :: R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 ; # [:: externref :: externref (crate = ":: externref")] # [link (wasm_import_module = "pit/867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5")] extern "C" { # [link (wasm_import_name = "~8afbd04c549e07db517e034114e4b8ff8c76ce748f2e2d6e29fcaf48051eaf3e")] fn _push (a : * mut Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >) -> :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >>; } pub fn push (a : Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >) -> :: externref :: Resource < Box < dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 >> { return unsafe { _push (Box :: into_raw (Box :: new (a))) } } } \ No newline at end of file diff --git a/pit-basic/src/lib.rs b/pit-basic/src/lib.rs new file mode 100644 index 0000000..2841d2f --- /dev/null +++ b/pit-basic/src/lib.rs @@ -0,0 +1,26 @@ +use std::{ + ops::{Deref, DerefMut}, + sync::Mutex, +}; + +include!("buffer.rs"); +impl + DerefMut> + R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5 for Mutex +{ + fn read8(&self, p0: u32) -> (u32) { + return self.lock().unwrap()[p0 as usize].into(); + } + + fn write8(&self, p0: u32, p1: u32) -> () { + self.lock().unwrap()[p0 as usize] = (p1 & 0xff) as u8; + } + + fn size(&self) -> (u32) { + return self.lock().unwrap().len().try_into().unwrap(); + } +} +pub fn slice( + x: &dyn R867207405fe87fda620c2d7a5485e8e5e274636a898a166fb674448b4391ffc5, +) -> impl Iterator + '_ { + return (0..x.size()).map(|a| (x.read8(a) & 0xff) as u8); +} diff --git a/pit-core/src/lib.rs b/pit-core/src/lib.rs index 9a61528..50bddd2 100644 --- a/pit-core/src/lib.rs +++ b/pit-core/src/lib.rs @@ -1,11 +1,6 @@ use derive_more::Display; use nom::{ - bytes::complete::{is_not, tag, take, take_while_m_n}, - character::complete::{alpha1, char, multispace0}, - combinator::opt, - multi::{many0, separated_list0}, - sequence::{delimited, tuple}, - IResult, + bytes::complete::{is_not, tag, take, take_while_m_n}, character::complete::{alpha1, alphanumeric1, char, multispace0}, combinator::opt, error::Error, multi::{many0, separated_list0}, sequence::{delimited, tuple}, IResult }; use sha3::{Digest, Sha3_256}; use std::{collections::BTreeMap, fmt::Display}; @@ -52,10 +47,10 @@ pub enum Arg { // Func(Sig), } pub fn parse_arg(a: &str) -> IResult<&str, Arg> { - let (_, a) = multispace0(a)?; - let (b, c) = take(1usize)(a)?; - match c { - "R" => { + let (a,_) = multispace0(a)?; + // let (c,b) = take(1usize)(a)?; + match a.strip_prefix("R") { + Some(b) => { // if let Some(a) = b.strip_prefix("this"){ // let (a, k) = opt(tag("n"))(a)?; // return Ok(( @@ -82,14 +77,14 @@ pub fn parse_arg(a: &str) -> IResult<&str, Arg> { // let (a, x) = parse_sig(a)?; // return Ok((a, Arg::Func(x))); // } - _ => { - let (c, a) = take(3usize)(a)?; + None => { + let (a,c) = take(3usize)(a)?; match c { "I32" => return Ok((a, Arg::I32)), "I64" => return Ok((a, Arg::I64)), "F32" => return Ok((a, Arg::F32)), "F64" => return Ok((a, Arg::F64)), - _ => {} + _ => return Err(nom::Err::Error(Error::new(a, nom::error::ErrorKind::Tag))) } } } @@ -121,19 +116,20 @@ pub struct Interface { } impl Display for Interface { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{{")?; + write!(f, "{}","{")?; for (i, (a, b)) in self.methods.iter().enumerate() { if i != 0 { write!(f, ";")?; } write!(f, "{}{}", a, b)?; } - return write!(f, "}}"); + return write!(f, "{}","}"); } } pub fn parse_interface(a: &str) -> IResult<&str, Interface> { pub fn go(a: &str) -> IResult<&str, Interface> { - let (a, s) = separated_list0(char(';'), tuple((multispace0, alpha1, parse_sig)))(a)?; + let (a, s) = separated_list0(char(';'), tuple((multispace0, alphanumeric1, parse_sig)))(a)?; + let (a,_) = multispace0(a)?; return Ok(( a, Interface { diff --git a/pit-patch/Cargo.toml b/pit-patch/Cargo.toml index 1b89a92..c3a64b6 100644 --- a/pit-patch/Cargo.toml +++ b/pit-patch/Cargo.toml @@ -7,7 +7,9 @@ edition = "2021" [dependencies] anyhow = "1.0.86" +hex = "0.4.3" nom = "7.1.3" pit-core = { version = "0.1.0", path = "../pit-core" } portal-pc-waffle.workspace = true +sha3 = "0.10.8" waffle-ast.workspace = true diff --git a/pit-patch/src/canon.rs b/pit-patch/src/canon.rs index a3c5b54..b20861b 100644 --- a/pit-patch/src/canon.rs +++ b/pit-patch/src/canon.rs @@ -1,6 +1,7 @@ use std::{collections::BTreeMap, iter::once, mem::take}; use anyhow::Context; +use sha3::{Digest, Sha3_256}; use waffle::{ entity::EntityRef, util::new_sig, BlockTarget, Export, ExportKind, Func, FuncDecl, FunctionBody, Import, ImportKind, Module, Operator, SignatureData, Type, @@ -162,3 +163,36 @@ pub fn canon(m: &mut Module, rid: &str, target: &str) -> anyhow::Result<()> { } Ok(()) } +pub fn jigger(m: &mut Module) -> anyhow::Result<()>{ + let mut s = Sha3_256::default(); + s.update(&m.to_wasm_bytes()?); + let s = s.finalize(); + for i in m.imports.iter_mut(){ + if !i.module.starts_with("pit/"){ + continue; + } + if let Some(a) = i.name.strip_prefix("~"){ + let a = format!("{a}-{s:?}"); + let mut s = Sha3_256::default(); + s.update(a.as_bytes()); + let s = s.finalize(); + let s = hex::encode(s); + i.name = format!("~{s}"); + } + } + for x in m.exports.iter_mut(){ + if let Some(a) = x.name.strip_prefix("pit/"){ + if let Some((b,a)) = a.split_once("/~"){ + if let Some((a,c)) = a.split_once("/"){ + let a = format!("{a}-{s:?}"); + let mut s = Sha3_256::default(); + s.update(a.as_bytes()); + let s = s.finalize(); + let s = hex::encode(s); + x.name = format!("pit/{b}/~{s}/{c}"); + } + } + } + } + Ok(()) +} \ No newline at end of file diff --git a/pit-rust-generator/Cargo.toml b/pit-rust-generator/Cargo.toml new file mode 100644 index 0000000..eb8d0e4 --- /dev/null +++ b/pit-rust-generator/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pit-rust-generator" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +nom = "7.1.3" +pit-core = { version = "0.1.0", path = "../pit-core" } +pit-rust-guest = { version = "0.1.0", path = "../pit-rust-guest" } +prettyplease = "0.2.20" +proc-macro2 = "1.0.86" +quote = "1.0.36" +syn = "2.0.71" diff --git a/pit-rust-generator/src/main.rs b/pit-rust-generator/src/main.rs new file mode 100644 index 0000000..87eef37 --- /dev/null +++ b/pit-rust-generator/src/main.rs @@ -0,0 +1,25 @@ +use anyhow::{anyhow, Context}; +use pit_rust_guest::Opts; +use quote::quote; +fn main() -> anyhow::Result<()>{ + let mut a = std::env::args(); + a.next(); + let src = a.next().context("in getting the src")?; + let src = std::fs::read_to_string(src)?; + let (_,src) = pit_core::parse_interface(&src).map_err(|e|anyhow!("invalid interface: {e}"))?; + let mut x = Opts{ + root: quote!{ + + }, + salt: std::env::var("PIT_SALT").unwrap_or(format!("")).into_bytes(), + }; + + let v = pit_rust_guest::render(&x, &src); + // let v = prettyplease::unparse(&syn::parse_file(&v.to_string())?); + let Some(dst) = a.next() else{ + println!("{v}"); + return Ok(()); + }; + std::fs::write(dst, v.to_string())?; + Ok(()) +} diff --git a/pit-rust-guest/src/lib.rs b/pit-rust-guest/src/lib.rs index 0f29fd1..97535b6 100644 --- a/pit-rust-guest/src/lib.rs +++ b/pit-rust-guest/src/lib.rs @@ -18,30 +18,30 @@ pub fn render(opts: &Opts, i: &Interface) -> TokenStream{ ha.write(&opts.salt); let ha = hex::encode(ha.finalize()); let id2 = format_ident!("R{}",i.rid_str()); - let internal = format_ident!("{id}_utils"); + let internal = format_ident!("R{id}_utils"); let methods = i.methods.iter().map(|(a,b)|quasiquote! { - fn #{format_ident!("{a}")}#{render_sig(root,i,b,"e! {&self})} + fn #{format_ident!("{a}")}#{render_sig(root,i,b,"e! {&self})}; }); let impl_dyns = i.methods.iter().map(|(a,b)|quasiquote! { fn #{format_ident!("{a}")}#{render_sig(root,i,b,"e! {&self})}{ #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] - #[wasm_import_module = #{format!("pit/{}",i.rid_str())}] + #[link(wasm_import_module = #{format!("pit/{}",i.rid_str())})] extern "C"{ - #[wasm_import_name = #a] - fn go #{render_sig(root, i,b, "e! {&#root::externref::Resource>})} - }; - return go(self,#{ + #[link(wasm_import_name = #a)] + fn go #{render_sig(root, i,b, "e! {this: &#root::externref::Resource>})}; + } + return unsafe{go(self,#{ let params = b.params.iter().enumerate().map(|(a,_)|format_ident!("p{a}")); quote! { #(#params),* } - }); + })}; } }); let chains2 = i.methods.iter().map(|(a,b)|quasiquote! { #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] #[export_name = #{format!("pit/{id}/~{ha}/{a}")}] - fn #{format_ident!("{a}")}#{render_sig(root,i,b,"e! {id: *mut Box})}{ + extern "C" fn #{format_ident!("{a}")}#{render_sig(root,i,b,"e! {id: *mut Box})}{ return unsafe{&mut *id}.#{format_ident!("{a}")}(#{ let params = b.params.iter().enumerate().map(|(a,_)|format_ident!("p{a}")); quote! { @@ -50,45 +50,45 @@ pub fn render(opts: &Opts, i: &Interface) -> TokenStream{ }); } }); + let sb = i.to_string(); + let sc = sb.as_bytes().iter().cloned().chain(once(0u8)).collect::>(); quasiquote!{ pub trait #id2{ #(#methods)* } - mod #internal{ const _: () = { #[link_section = ".pit-types"] - static SECTION_CONTENT: [u8; _] = #{ - let b = i.to_string(); - let c = b.as_bytes().iter().cloned().chain(once(0u8)); + static SECTION_CONTENT: [u8; #{sc.len()}] = #{ quote!{ - [#(#c),*] + [#(#sc),*] } }; + impl #id2 for #root::externref::Resource>{ + #(#impl_dyns)* + } + #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] + #[export_name = #{format!("pit/{id}/~{ha}.drop")}] + extern "C" fn _drop(a: *mut Box){ + unsafe{ + Box::from_raw(a) + }; + } + #(#chains2)* }; - use super::#id2; - impl #id2 for #root::externref::Resource>{ - #(#impl_dyns),* - } - #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] - #[export_name = #{format!("pit/{id}/~{ha}.drop")}] - fn _drop(a: *mut Box){ - unsafe{ - Box::from_raw(a) + mod #internal{ + use super::#id2; + #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] + #[link(wasm_import_module = #{format!("pit/{}",i.rid_str())})] + extern "C"{ + #[link(wasm_import_name = #{format!("~{ha}")})] + fn _push(a: *mut Box) -> #root::externref::Resource>; + } + pub fn push(a: Box) -> #root::externref::Resource>{ + return unsafe{ + _push(Box::into_raw(Box::new(a))) + } } } - #(#chains2);* - #[#root::externref::externref(crate = #{quote! {#root::externref}.to_string()})] - #[wasm_import_module = #{format!("pit/{}",i.rid_str())}] - extern "C"{ - #[wasm_import_name = #{format!("~{ha}")}] - fn _push(a: *mut Box) -> #root::externref::Resource>; - } - pub fn push(a: Box) -> #root::externref::Resource>{ - return unsafe{ - _push(Box::into_raw(Box::new(a))) - } - } - } } } pub fn render_sig(root: &TokenStream,base: &Interface, s: &Sig, self_: &TokenStream) -> TokenStream{ diff --git a/pit-rust-host/src/lib.rs b/pit-rust-host/src/lib.rs index 291eb6c..41e506d 100644 --- a/pit-rust-host/src/lib.rs +++ b/pit-rust-host/src/lib.rs @@ -25,7 +25,7 @@ pub fn render(root: &TokenStream, i: &Interface) -> TokenStream { fn #{format_ident!("{a}")}#{render_sig(root,b,"e! {&self})}{ let Some(#root::wasm_runtime_layer::Export::Func(f)) = self.instance.get_export(unsafe{ &*::std::cell::UnsafeCell::raw_get(self.ctx) - },#{format!("pit/{}/{}",i.rid_str(),a)}) else{ + },#{format_ident!("pit/{}/{}",i.rid_str(),a)}) else{ panic!("invalid func") }; let args = vec![#(#init),*];