@@ -502,6 +502,11 @@ impl<'a, 'b> JsBuilder<'a, 'b> {
502
502
self . prelude ( & format ! ( "_assertNonNull({});" , arg) ) ;
503
503
}
504
504
505
+ fn assert_char ( & mut self , arg : & str ) {
506
+ self . cx . expose_assert_char ( ) ;
507
+ self . prelude ( & format ! ( "_assertChar({});" , arg) ) ;
508
+ }
509
+
505
510
fn assert_optional_bigint ( & mut self , arg : & str ) {
506
511
if !self . cx . config . debug {
507
512
return ;
@@ -739,7 +744,11 @@ fn instruction(
739
744
740
745
Instruction :: I32FromStringFirstChar => {
741
746
let val = js. pop ( ) ;
742
- js. push ( format ! ( "{}.codePointAt(0)" , val) ) ;
747
+ let i = js. tmp ( ) ;
748
+ js. prelude ( & format ! ( "const char{i} = {val}.codePointAt(0);" ) ) ;
749
+ let val = format ! ( "char{i}" ) ;
750
+ js. assert_char ( & val) ;
751
+ js. push ( val) ;
743
752
}
744
753
745
754
Instruction :: I32FromExternrefOwned => {
@@ -816,11 +825,18 @@ fn instruction(
816
825
817
826
Instruction :: I32FromOptionChar => {
818
827
let val = js. pop ( ) ;
828
+ let i = js. tmp ( ) ;
819
829
js. cx . expose_is_like_none ( ) ;
820
- js. push ( format ! (
821
- "isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0)" ,
830
+ js. prelude ( & format ! (
831
+ "const char{i} = isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0); " ,
822
832
val
823
833
) ) ;
834
+ let val = format ! ( "char{i}" ) ;
835
+ js. cx . expose_assert_char ( ) ;
836
+ js. prelude ( & format ! (
837
+ "if ({val} !== 0xFFFFFF) {{ _assertChar({val}); }}"
838
+ ) ) ;
839
+ js. push ( val) ;
824
840
}
825
841
826
842
Instruction :: I32FromOptionEnum { hole } => {
0 commit comments