@@ -7,6 +7,43 @@ macro_rules! dyon_macro_items { ($($x:item)+) => ($($x)+) }
7
7
/// This macro is used by some other Dyon macros.
8
8
#[ macro_export]
9
9
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) => { } ;
10
47
( $rt: ident $arg: ident : $t: ty) => {
11
48
let $arg: $t = $rt. pop( ) ?;
12
49
} ;
@@ -22,26 +59,102 @@ macro_rules! dyon_fn_pop {
22
59
/// For example, see "examples/functions.rs".
23
60
#[ macro_export]
24
61
macro_rules! dyon_fn {
25
- ( fn $name: ident ( ) -> $rt: ty $b: block) => {
62
+ ( fn $name: ident ( ) -> # $rt: ty $b: block) => {
26
63
#[ allow( non_snake_case) ]
27
64
pub fn $name( _rt: & mut $crate:: Runtime ) -> Result <$crate:: Variable , String > {
65
+ use std:: sync:: { Arc , Mutex } ;
66
+
28
67
fn inner( ) -> $rt {
29
68
$b
30
69
}
31
70
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
+ }
33
117
}
34
118
} ;
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) => {
36
120
dyon_macro_items!{
37
121
#[ allow( non_snake_case) ]
38
122
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 {
40
124
$b
41
125
}
42
126
127
+ dyon_fn_pop!( # rt $rust_arg: $rust_t) ;
43
128
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) ,* ) ) )
45
158
}
46
159
}
47
160
} ;
@@ -56,6 +169,50 @@ macro_rules! dyon_fn {
56
169
Ok ( ( ) )
57
170
}
58
171
} ;
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
+ } ;
59
216
( fn $name: ident ( $( $arg: tt : $t: ty) ,+) $b: block) => {
60
217
dyon_macro_items!{
61
218
#[ allow( non_snake_case) ]
0 commit comments