Skip to content

Commit 68b7837

Browse files
authored
Merge pull request #662 from bvssvni/master
Added shorthand syntax for Rust objects in macros
2 parents de5f0ce + 15c1d2e commit 68b7837

File tree

2 files changed

+203
-13
lines changed

2 files changed

+203
-13
lines changed

examples/functions.rs

+41-8
Original file line numberDiff line numberDiff line change
@@ -81,20 +81,53 @@ dyon_fn!{fn origo() -> PhysicalState {
8181
}}
8282

8383
// Create a custom Rust object.
84-
dyon_fn!{fn custom_object() -> RustObject {
85-
use std::sync::{Arc, Mutex};
84+
dyon_fn!{fn custom_object() -> #i32 {42}}
8685

87-
let val: i32 = 42;
88-
Arc::new(Mutex::new(val)) as RustObject
86+
// Print out the content of a custom Rust object.
87+
dyon_fn!{fn print_custom_object(a: #i32) {
88+
println!("Custom value is {}", a);
8989
}}
9090

91-
// Print out the content of a custom Rust object.
92-
dyon_fn!{fn print_custom_object(obj: RustObject) {
93-
let a_guard = obj.lock().unwrap();
94-
let a = a_guard.downcast_ref::<i32>().unwrap();
91+
// Macro example.
92+
dyon_fn!{fn foo1(a: #i32, _b: f64) {
9593
println!("Custom value is {}", a);
9694
}}
9795

96+
// Macro example.
97+
dyon_fn!{fn foo2(a: #i32, b: f64) -> f64 {
98+
a as f64 + b
99+
}}
100+
101+
// Macro example.
102+
dyon_fn!{fn foo3(a: #&i32, b: f64) -> f64 {
103+
*a as f64 + b
104+
}}
105+
106+
// Macro example.
107+
dyon_fn!{fn foo4(a: #&i32, b: #&i32) -> #i32 {
108+
a + b
109+
}}
110+
111+
// Macro example.
112+
dyon_fn!{fn foo5(a: #&i32, b: f64) -> #f64 {
113+
*a as f64 + b
114+
}}
115+
116+
// Macro example.
117+
dyon_fn!{fn foo6(a: f64) -> #i32 {
118+
a as i32
119+
}}
120+
121+
// Macro example.
122+
dyon_fn!{fn foo7(a: #&i32) -> f64 {
123+
*a as f64
124+
}}
125+
126+
// Macro example.
127+
dyon_fn!{fn foo8(a: #&mut f64, b: f64) {
128+
*a = b
129+
}}
130+
98131
dyon_fn!{fn id() -> Mat4 {
99132
[
100133
[1.0, 0.0, 0.0, 0.0],

src/macros.rs

+162-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,43 @@ macro_rules! dyon_macro_items { ($($x:item)+) => ($($x)+) }
77
/// This macro is used by some other Dyon macros.
88
#[macro_export]
99
macro_rules! dyon_fn_pop {
10+
(#&mut $rt:ident) => {};
11+
(#&mut $rt:ident $arg:ident : $t:ty) => {
12+
let $arg: RustObject = $rt.pop()?;
13+
let mut $arg = $arg.lock().unwrap();
14+
let $arg = $arg.downcast_mut::<$t>().unwrap();
15+
};
16+
(#&mut $rt:ident $arg:ident : $t:ty, $($args:tt : $ts:ty),+) => {
17+
dyon_fn_pop!(#&mut $rt $($args: $ts),+);
18+
let $arg: RustObject = $rt.pop()?;
19+
let mut $arg = $arg.lock().unwrap();
20+
let $arg = $arg.downcast_mut::<$t>().unwrap();
21+
};
22+
(#& $rt:ident) => {};
23+
(#& $rt:ident $arg:ident : $t:ty) => {
24+
let $arg: RustObject = $rt.pop()?;
25+
let $arg = $arg.lock().unwrap();
26+
let $arg = $arg.downcast_ref::<$t>().unwrap();
27+
};
28+
(#& $rt:ident $arg:ident : $t:ty, $($args:tt : $ts:ty),+) => {
29+
dyon_fn_pop!(#& $rt $($args: $ts),+);
30+
let $arg: RustObject = $rt.pop()?;
31+
let $arg = $arg.lock().unwrap();
32+
let $arg = $arg.downcast_ref::<$t>().unwrap();
33+
};
34+
(# $rt:ident) => {};
35+
(# $rt:ident $arg:ident : $t:ty) => {
36+
let $arg: RustObject = $rt.pop()?;
37+
let $arg = $arg.lock().unwrap();
38+
let $arg = *$arg.downcast_ref::<$t>().unwrap();
39+
};
40+
(# $rt:ident $arg:ident : $t:ty, $($args:tt : $ts:ty),+) => {
41+
dyon_fn_pop!(# $rt $($args: $ts),+);
42+
let $arg: RustObject = $rt.pop()?;
43+
let $arg = $arg.lock().unwrap();
44+
let $arg = *$arg.downcast_ref::<$t>().unwrap();
45+
};
46+
($rt:ident) => {};
1047
($rt:ident $arg:ident : $t:ty) => {
1148
let $arg: $t = $rt.pop()?;
1249
};
@@ -22,26 +59,102 @@ macro_rules! dyon_fn_pop {
2259
/// For example, see "examples/functions.rs".
2360
#[macro_export]
2461
macro_rules! dyon_fn {
25-
(fn $name:ident () -> $rt:ty $b:block) => {
62+
(fn $name:ident () -> # $rt:ty $b:block) => {
2663
#[allow(non_snake_case)]
2764
pub fn $name(_rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
65+
use std::sync::{Arc, Mutex};
66+
2867
fn inner() -> $rt {
2968
$b
3069
}
3170

32-
Ok($crate::embed::PushVariable::push_var(&inner()))
71+
Ok($crate::Variable::RustObject(Arc::new(Mutex::new(inner())) as RustObject))
72+
}
73+
};
74+
(fn $name:ident ($($rust_arg:tt : #&$rust_t:ty),+) -> # $rt:ty $b:block) => {
75+
dyon_macro_items!{
76+
#[allow(non_snake_case)]
77+
pub fn $name(rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
78+
use std::sync::{Arc, Mutex};
79+
80+
fn inner($($rust_arg: &$rust_t),+) -> $rt {
81+
$b
82+
}
83+
84+
dyon_fn_pop!(#& rt $($rust_arg: $rust_t),+);
85+
Ok($crate::Variable::RustObject(Arc::new(Mutex::new(inner($($rust_arg),+)))))
86+
}
87+
}
88+
};
89+
(fn $name:ident ($rust_arg:tt : #&$rust_t:ty, $($arg:tt : $t:ty),+) -> # $rt:ty $b:block) => {
90+
dyon_macro_items!{
91+
#[allow(non_snake_case)]
92+
pub fn $name(rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
93+
use std::sync::{Arc, Mutex};
94+
95+
fn inner($rust_arg: &$rust_t, $($arg: $t),+) -> $rt {
96+
$b
97+
}
98+
99+
dyon_fn_pop!(#& rt $rust_arg: $rust_t);
100+
dyon_fn_pop!(rt $($arg: $t),+);
101+
Ok($crate::Variable::RustObject(Arc::new(Mutex::new(inner($rust_arg, $($arg),+)))))
102+
}
103+
}
104+
};
105+
(fn $name:ident ($rust_arg:tt : #&$rust_t:ty $(, $arg:tt : $t:ty),*) -> $rt:ty $b:block) => {
106+
dyon_macro_items!{
107+
#[allow(non_snake_case)]
108+
pub fn $name(rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
109+
fn inner($rust_arg: &$rust_t $(, $arg: $t),*) -> $rt {
110+
$b
111+
}
112+
113+
dyon_fn_pop!(#& rt $rust_arg: $rust_t);
114+
dyon_fn_pop!(rt $($arg: $t),*);
115+
Ok($crate::embed::PushVariable::push_var(&inner($rust_arg, $($arg),*)))
116+
}
33117
}
34118
};
35-
(fn $name:ident ($($arg:tt : $t:ty),+) -> $rt:ty $b:block) => {
119+
(fn $name:ident ($rust_arg:tt : #$rust_t:ty, $($arg:tt : $t:ty),+) -> $rt:ty $b:block) => {
36120
dyon_macro_items!{
37121
#[allow(non_snake_case)]
38122
pub fn $name(rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
39-
fn inner($($arg: $t),+) -> $rt {
123+
fn inner($rust_arg: $rust_t, $($arg: $t),+) -> $rt {
40124
$b
41125
}
42126

127+
dyon_fn_pop!(# rt $rust_arg: $rust_t);
43128
dyon_fn_pop!(rt $($arg: $t),+);
44-
Ok($crate::embed::PushVariable::push_var(&inner($($arg),+)))
129+
Ok($crate::embed::PushVariable::push_var(&inner($rust_arg, $($arg),+)))
130+
}
131+
}
132+
};
133+
(fn $name:ident ($($arg:tt : $t:ty),*) -> # $rt:ty $b:block) => {
134+
dyon_macro_items!{
135+
#[allow(non_snake_case)]
136+
pub fn $name(rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
137+
use std::sync::{Arc, Mutex};
138+
139+
fn inner($($arg: $t),*) -> $rt {
140+
$b
141+
}
142+
143+
dyon_fn_pop!(rt $($arg: $t),*);
144+
Ok($crate::Variable::RustObject(Arc::new(Mutex::new(inner($($arg),*)))))
145+
}
146+
}
147+
};
148+
(fn $name:ident ($($arg:tt : $t:ty),*) -> $rt:ty $b:block) => {
149+
dyon_macro_items!{
150+
#[allow(non_snake_case)]
151+
pub fn $name(_rt: &mut $crate::Runtime) -> Result<$crate::Variable, String> {
152+
fn inner($($arg: $t),*) -> $rt {
153+
$b
154+
}
155+
156+
dyon_fn_pop!(_rt $($arg: $t),*);
157+
Ok($crate::embed::PushVariable::push_var(&inner($($arg),*)))
45158
}
46159
}
47160
};
@@ -56,6 +169,50 @@ macro_rules! dyon_fn {
56169
Ok(())
57170
}
58171
};
172+
(fn $name:ident ($($arg:tt : #$t:ty),+) $b:block) => {
173+
dyon_macro_items!{
174+
#[allow(non_snake_case)]
175+
pub fn $name(rt: &mut $crate::Runtime) -> Result<(), String> {
176+
fn inner($($arg: $t),+) {
177+
$b
178+
}
179+
180+
dyon_fn_pop!(# rt $($arg: $t),+);
181+
inner($($arg),+);
182+
Ok(())
183+
}
184+
}
185+
};
186+
(fn $name:ident ($rust_arg:tt : #&mut $rust_ty:ty , $($arg:tt : $t:ty),*) $b:block) => {
187+
dyon_macro_items!{
188+
#[allow(non_snake_case)]
189+
pub fn $name(rt: &mut $crate::Runtime) -> Result<(), String> {
190+
fn inner($rust_arg: &mut $rust_ty, $($arg: $t),*) {
191+
$b
192+
}
193+
194+
dyon_fn_pop!(#&mut rt $rust_arg: $rust_ty);
195+
dyon_fn_pop!(rt $($arg: $t),*);
196+
inner($rust_arg, $($arg),+);
197+
Ok(())
198+
}
199+
}
200+
};
201+
(fn $name:ident ($rust_arg:tt : # $rust_ty:ty , $($arg:tt : $t:ty),*) $b:block) => {
202+
dyon_macro_items!{
203+
#[allow(non_snake_case)]
204+
pub fn $name(rt: &mut $crate::Runtime) -> Result<(), String> {
205+
fn inner($rust_arg: $rust_ty, $($arg: $t),*) {
206+
$b
207+
}
208+
209+
dyon_fn_pop!(# rt $rust_arg: $rust_ty);
210+
dyon_fn_pop!(rt $($arg: $t),*);
211+
inner($rust_arg, $($arg),+);
212+
Ok(())
213+
}
214+
}
215+
};
59216
(fn $name:ident ($($arg:tt : $t:ty),+) $b:block) => {
60217
dyon_macro_items!{
61218
#[allow(non_snake_case)]

0 commit comments

Comments
 (0)