Skip to content

Commit e3aabcb

Browse files
authored
Merge pull request #1398 from RReverser/is-like-none
Consistently expose `is_like_none`
2 parents 72672ff + a5f5c7a commit e3aabcb

File tree

2 files changed

+11
-21
lines changed

2 files changed

+11
-21
lines changed

crates/cli-support/src/js/js2rust.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
248248
}
249249

250250
if optional {
251+
self.cx.expose_is_like_none();
252+
251253
if arg.is_wasm_native() {
252-
self.cx.expose_is_like_none();
253254
self.js_arguments
254255
.push((name.clone(), "number | undefined".to_string()));
255256

@@ -272,7 +273,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
272273
}
273274

274275
if arg.is_abi_as_u32() {
275-
self.cx.expose_is_like_none();
276276
self.js_arguments
277277
.push((name.clone(), "number | undefined".to_string()));
278278

@@ -321,7 +321,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
321321

322322
match *arg {
323323
Descriptor::Boolean => {
324-
self.cx.expose_is_like_none();
325324
self.js_arguments
326325
.push((name.clone(), "boolean | undefined".to_string()));
327326
if self.cx.config.debug {
@@ -337,42 +336,38 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
337336
}
338337
self.rust_arguments
339338
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0} ? 1 : 0", name));
340-
return Ok(self);
341339
}
342340
Descriptor::Char => {
343-
self.cx.expose_is_like_none();
344341
self.js_arguments
345342
.push((name.clone(), "string | undefined".to_string()));
346343
self.rust_arguments
347344
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0)", name));
348-
return Ok(self);
349345
}
350346
Descriptor::Enum { hole } => {
351-
self.cx.expose_is_like_none();
352347
self.js_arguments
353348
.push((name.clone(), "number | undefined".to_string()));
354349
self.rust_arguments
355350
.push(format!("isLikeNone({0}) ? {1} : {0}", name, hole));
356-
return Ok(self);
357351
}
358352
Descriptor::RustStruct(ref s) => {
359353
self.js_arguments
360354
.push((name.clone(), format!("{} | undefined", s)));
361355
self.prelude(&format!("let ptr{} = 0;", i));
362-
self.prelude(&format!("if ({0} !== null && {0} !== undefined) {{", name));
356+
self.prelude(&format!("if (!isLikeNone({0})) {{", name));
363357
self.assert_class(&name, s);
364358
self.assert_not_moved(&name);
365359
self.prelude(&format!("ptr{} = {}.ptr;", i, name));
366360
self.prelude(&format!("{}.ptr = 0;", name));
367361
self.prelude("}");
368362
self.rust_arguments.push(format!("ptr{}", i));
369-
return Ok(self);
370363
}
371364
_ => bail!(
372365
"unsupported optional argument type for calling Rust function from JS: {:?}",
373366
arg
374367
),
375-
};
368+
}
369+
370+
return Ok(self);
376371
}
377372

378373
if let Some(s) = arg.rust_struct() {

crates/cli-support/src/js/rust2js.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,9 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
389389
return Ok(());
390390
}
391391
if optional {
392+
self.cx.expose_is_like_none();
393+
392394
if ty.is_wasm_native() {
393-
self.cx.expose_is_like_none();
394395
self.cx.expose_uint32_memory();
395396
match ty {
396397
Descriptor::I32 => self.cx.expose_int32_memory(),
@@ -425,7 +426,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
425426
}
426427

427428
if ty.is_abi_as_u32() {
428-
self.cx.expose_is_like_none();
429429
self.ret_expr = "
430430
const val = JS;
431431
return isLikeNone(val) ? 0xFFFFFF : val;
@@ -435,7 +435,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
435435
}
436436

437437
if let Some(signed) = ty.get_64() {
438-
self.cx.expose_is_like_none();
439438
self.cx.expose_uint32_memory();
440439
let f = if signed {
441440
self.cx.expose_int64_memory();
@@ -458,39 +457,34 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
458457

459458
match *ty {
460459
Descriptor::Boolean => {
461-
self.cx.expose_is_like_none();
462460
self.ret_expr = "
463461
const val = JS;
464462
return isLikeNone(val) ? 0xFFFFFF : val ? 1 : 0;
465463
"
466464
.to_string();
467-
return Ok(());
468465
}
469466
Descriptor::Char => {
470467
self.ret_expr = "
471468
const val = JS;
472469
return isLikeNone(val) ? 0xFFFFFF : val.codePointAt(0);
473470
"
474471
.to_string();
475-
return Ok(());
476472
}
477473
Descriptor::Enum { hole } => {
478-
self.cx.expose_is_like_none();
479474
self.ret_expr = format!(
480475
"
481476
const val = JS;
482477
return isLikeNone(val) ? {} : val;
483478
",
484479
hole
485480
);
486-
return Ok(());
487481
}
488482
Descriptor::RustStruct(ref class) => {
489483
// Like below, assert the type
490484
self.ret_expr = format!(
491485
"\
492486
const val = JS;
493-
if (val === undefined || val === null)
487+
if (isLikeNone(val))
494488
return 0;
495489
if (!(val instanceof {0})) {{
496490
throw new Error('expected value of type {0}');
@@ -501,13 +495,14 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
501495
",
502496
class
503497
);
504-
return Ok(());
505498
}
506499
_ => bail!(
507500
"unsupported optional return type for calling JS function from Rust: {:?}",
508501
ty
509502
),
510503
};
504+
505+
return Ok(());
511506
}
512507
if ty.is_number() {
513508
self.ret_expr = "return JS;".to_string();

0 commit comments

Comments
 (0)