1
+ use failure:: Error ;
2
+
1
3
use super :: { indent, Context } ;
2
4
use descriptor:: { Descriptor , Function } ;
3
5
@@ -59,12 +61,12 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
59
61
60
62
/// Generates all bindings necessary for the signature in `Function`,
61
63
/// creating necessary argument conversions and return value processing.
62
- pub fn process ( & mut self , function : & Function ) -> & mut Self {
64
+ pub fn process ( & mut self , function : & Function ) -> Result < & mut Self , Error > {
63
65
for arg in function. arguments . iter ( ) {
64
- self . argument ( arg) ;
66
+ self . argument ( arg) ? ;
65
67
}
66
- self . ret ( & function. ret ) ;
67
- self
68
+ self . ret ( & function. ret ) ? ;
69
+ Ok ( self )
68
70
}
69
71
70
72
/// Flag this shim as a method call into Rust, so the first Rust argument
@@ -100,16 +102,16 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
100
102
self
101
103
}
102
104
103
- pub fn argument ( & mut self , arg : & Descriptor ) -> & mut Self {
105
+ pub fn argument ( & mut self , arg : & Descriptor ) -> Result < & mut Self , Error > {
104
106
let i = self . arg_idx ;
105
107
self . arg_idx += 1 ;
106
108
let name = format ! ( "arg{}" , i) ;
107
109
108
110
if let Some ( kind) = arg. vector_kind ( ) {
109
111
self . js_arguments . push ( ( name. clone ( ) , kind. js_ty ( ) . to_string ( ) ) ) ;
110
112
111
- let func = self . cx . pass_to_wasm_function ( kind) ;
112
- self . cx . expose_set_global_argument ( ) ;
113
+ let func = self . cx . pass_to_wasm_function ( kind) ? ;
114
+ self . cx . expose_set_global_argument ( ) ? ;
113
115
let global_idx = self . global_idx ( ) ;
114
116
self . prelude ( & format ! ( "\
115
117
const [ptr{i}, len{i}] = {func}({arg});\n \
@@ -119,10 +121,10 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
119
121
self . finally ( & format ! ( "\
120
122
wasm.__wbindgen_free(ptr{i}, len{i} * {size});\n \
121
123
", i = i, size = kind. size( ) ) ) ;
122
- self . cx . require_internal_export ( "__wbindgen_free" ) ;
124
+ self . cx . require_internal_export ( "__wbindgen_free" ) ? ;
123
125
}
124
126
self . rust_arguments . push ( format ! ( "ptr{}" , i) ) ;
125
- return self
127
+ return Ok ( self )
126
128
}
127
129
128
130
if let Some ( s) = arg. rust_struct ( ) {
@@ -144,7 +146,7 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
144
146
", i = i, arg = name) ) ;
145
147
self . rust_arguments . push ( format ! ( "ptr{}" , i) ) ;
146
148
}
147
- return self
149
+ return Ok ( self )
148
150
}
149
151
150
152
if arg. is_number ( ) {
@@ -156,15 +158,15 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
156
158
}
157
159
158
160
self . rust_arguments . push ( name) ;
159
- return self
161
+ return Ok ( self )
160
162
}
161
163
162
164
if arg. is_ref_anyref ( ) {
163
165
self . js_arguments . push ( ( name. clone ( ) , "any" . to_string ( ) ) ) ;
164
166
self . cx . expose_borrowed_objects ( ) ;
165
167
self . finally ( "stack.pop();" ) ;
166
168
self . rust_arguments . push ( format ! ( "addBorrowedObject({})" , name) ) ;
167
- return self
169
+ return Ok ( self )
168
170
}
169
171
170
172
match * arg {
@@ -184,58 +186,58 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
184
186
self . rust_arguments . push ( format ! ( "addHeapObject({})" , name) ) ;
185
187
}
186
188
_ => {
187
- panic ! ( "unsupported argument to rust function {:?}" , arg)
189
+ bail ! ( "unsupported argument to rust function {:?}" , arg)
188
190
}
189
191
}
190
- self
192
+ Ok ( self )
191
193
}
192
194
193
- pub fn ret ( & mut self , ret : & Option < Descriptor > ) -> & mut Self {
195
+ pub fn ret ( & mut self , ret : & Option < Descriptor > ) -> Result < & mut Self , Error > {
194
196
let ty = match * ret {
195
197
Some ( ref t) => t,
196
198
None => {
197
199
self . ret_ty = "void" . to_string ( ) ;
198
200
self . ret_expr = format ! ( "return RET;" ) ;
199
- return self
201
+ return Ok ( self )
200
202
}
201
203
} ;
202
204
203
205
if ty. is_ref_anyref ( ) {
204
206
self . ret_ty = "any" . to_string ( ) ;
205
207
self . cx . expose_get_object ( ) ;
206
208
self . ret_expr = format ! ( "return getObject(RET);" ) ;
207
- return self
209
+ return Ok ( self )
208
210
}
209
211
210
212
if ty. is_by_ref ( ) {
211
- panic ! ( "cannot return references from Rust to JS yet" )
213
+ bail ! ( "cannot return references from Rust to JS yet" )
212
214
}
213
215
214
216
if let Some ( ty) = ty. vector_kind ( ) {
215
217
self . ret_ty = ty. js_ty ( ) . to_string ( ) ;
216
218
let f = self . cx . expose_get_vector_from_wasm ( ty) ;
217
- self . cx . expose_get_global_argument ( ) ;
218
- self . cx . require_internal_export ( "__wbindgen_free" ) ;
219
+ self . cx . expose_get_global_argument ( ) ? ;
220
+ self . cx . require_internal_export ( "__wbindgen_free" ) ? ;
219
221
self . ret_expr = format ! ( "\
220
222
const ret = RET;\n \
221
223
const len = getGlobalArgument(0);\n \
222
224
const realRet = {}(ret, len);\n \
223
225
wasm.__wbindgen_free(ret, len * {});\n \
224
226
return realRet;\n \
225
227
", f, ty. size( ) ) ;
226
- return self
228
+ return Ok ( self )
227
229
}
228
230
229
231
if let Some ( name) = ty. rust_struct ( ) {
230
232
self . ret_ty = name. to_string ( ) ;
231
233
self . ret_expr = format ! ( "return {name}.__construct(RET);" , name = name) ;
232
- return self
234
+ return Ok ( self )
233
235
}
234
236
235
237
if ty. is_number ( ) {
236
238
self . ret_ty = "number" . to_string ( ) ;
237
239
self . ret_expr = format ! ( "return RET;" ) ;
238
- return self
240
+ return Ok ( self )
239
241
}
240
242
241
243
match * ty {
@@ -248,9 +250,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
248
250
self . cx . expose_take_object ( ) ;
249
251
self . ret_expr = format ! ( "return takeObject(RET);" ) ;
250
252
}
251
- _ => panic ! ( "unsupported return from Rust to JS {:?}" , ty) ,
253
+ _ => bail ! ( "unsupported return from Rust to JS {:?}" , ty) ,
252
254
}
253
- self
255
+ Ok ( self )
254
256
}
255
257
256
258
/// Generate the actual function.
0 commit comments