Skip to content

Commit d6d056c

Browse files
Add math-related intrinsics/functions for JsValues (#2629)
* Allow accessing JS math operators from Rust Useful for dealing with JS `BigInt`s * Add `typeof` and `in` methods/intrinsics * Add comparison operators * Remove Object.is intrinsic * Make conversion into f64 faillible * Add `#[inline]`s * Fix methods to make them take references * cargo fmt * Add BigInt to js-sys (no constructor yet) * Remove useless import * Fix UI tests * Add BigInt constructor * Allow catching `to_string` method for BigInt * Fix tests again * Add inlines * Rework PartialEq impl * Implement FromStr for BigInt * Add more inlines * Update formatting * Add more trait impls and feature for integration with `rust-num` * Add `PartialOrd` and `Ord` impls for more types * Cargo fmt * Remove `num-traits` from `wasm-bindgen`, integrate `js-sys` with `rust-num` further * Update Cargo.toml * Update Rust version for CI (to allow proc-macro2 to build again) * Fix link in Markdown * Remove all `rust-num` code from `js-sys`
1 parent 965b88c commit d6d056c

File tree

6 files changed

+1176
-13
lines changed

6 files changed

+1176
-13
lines changed

azure-pipelines.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
steps:
9494
- template: ci/azure-install-rust.yml
9595
parameters:
96-
toolchain: nightly-2021-05-09
96+
toolchain: nightly-2021-09-02
9797
- template: ci/azure-install-node.yml
9898
- script: cargo test --target wasm32-unknown-unknown --features nightly --test wasm
9999

@@ -210,7 +210,7 @@ jobs:
210210
steps:
211211
- template: ci/azure-install-rust.yml
212212
parameters:
213-
toolchain: nightly-2021-05-09
213+
toolchain: nightly-2021-09-02
214214
- script: rustup component add rust-src
215215
displayName: "install rust-src"
216216
- script: |

crates/cli-support/src/intrinsic.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ intrinsics! {
8585
#[symbol = "__wbindgen_jsval_eq"]
8686
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
8787
JsvalEq,
88+
#[symbol = "__wbindgen_jsval_loose_eq"]
89+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
90+
JsvalLooseEq,
8891
#[symbol = "__wbindgen_is_function"]
8992
#[signature = fn(ref_externref()) -> Boolean]
9093
IsFunction,
@@ -103,9 +106,81 @@ intrinsics! {
103106
#[symbol = "__wbindgen_is_string"]
104107
#[signature = fn(ref_externref()) -> Boolean]
105108
IsString,
109+
#[symbol = "__wbindgen_is_bigint"]
110+
#[signature = fn(ref_externref()) -> Boolean]
111+
IsBigInt,
112+
#[symbol = "__wbindgen_typeof"]
113+
#[signature = fn(ref_externref()) -> Externref]
114+
Typeof,
115+
#[symbol = "__wbindgen_in"]
116+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
117+
In,
106118
#[symbol = "__wbindgen_is_falsy"]
107119
#[signature = fn(ref_externref()) -> Boolean]
108120
IsFalsy,
121+
#[symbol = "__wbindgen_as_number"]
122+
#[signature = fn(ref_externref()) -> F64]
123+
AsNumber,
124+
#[symbol = "__wbindgen_try_into_number"]
125+
#[signature = fn(ref_externref()) -> Externref]
126+
TryIntoNumber,
127+
#[symbol = "__wbindgen_neg"]
128+
#[signature = fn(ref_externref()) -> Externref]
129+
Neg,
130+
#[symbol = "__wbindgen_bit_and"]
131+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
132+
BitAnd,
133+
#[symbol = "__wbindgen_bit_or"]
134+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
135+
BitOr,
136+
#[symbol = "__wbindgen_bit_xor"]
137+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
138+
BitXor,
139+
#[symbol = "__wbindgen_bit_not"]
140+
#[signature = fn(ref_externref()) -> Externref]
141+
BitNot,
142+
#[symbol = "__wbindgen_shl"]
143+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
144+
Shl,
145+
#[symbol = "__wbindgen_shr"]
146+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
147+
Shr,
148+
#[symbol = "__wbindgen_unsigned_shr"]
149+
#[signature = fn(ref_externref(), ref_externref()) -> U32]
150+
UnsignedShr,
151+
#[symbol = "__wbindgen_add"]
152+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
153+
Add,
154+
#[symbol = "__wbindgen_sub"]
155+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
156+
Sub,
157+
#[symbol = "__wbindgen_div"]
158+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
159+
Div,
160+
#[symbol = "__wbindgen_checked_div"]
161+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
162+
CheckedDiv,
163+
#[symbol = "__wbindgen_mul"]
164+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
165+
Mul,
166+
#[symbol = "__wbindgen_rem"]
167+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
168+
Rem,
169+
#[symbol = "__wbindgen_pow"]
170+
#[signature = fn(ref_externref(), ref_externref()) -> Externref]
171+
Pow,
172+
#[symbol = "__wbindgen_lt"]
173+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
174+
LT,
175+
#[symbol = "__wbindgen_le"]
176+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
177+
LE,
178+
#[symbol = "__wbindgen_ge"]
179+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
180+
GE,
181+
#[symbol = "__wbindgen_gt"]
182+
#[signature = fn(ref_externref(), ref_externref()) -> Boolean]
183+
GT,
109184
#[symbol = "__wbindgen_object_clone_ref"]
110185
#[signature = fn(ref_externref()) -> Externref]
111186
ObjectCloneRef,
@@ -118,6 +193,9 @@ intrinsics! {
118193
#[symbol = "__wbindgen_number_new"]
119194
#[signature = fn(F64) -> Externref]
120195
NumberNew,
196+
#[symbol = "__wbindgen_bigint_new"]
197+
#[signature = fn(ref_string()) -> Externref]
198+
BigIntNew,
121199
#[symbol = "__wbindgen_string_new"]
122200
#[signature = fn(ref_string()) -> Externref]
123201
StringNew,

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

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,6 +2907,11 @@ impl<'a> Context<'a> {
29072907
format!("{} === {}", args[0], args[1])
29082908
}
29092909

2910+
Intrinsic::JsvalLooseEq => {
2911+
assert_eq!(args.len(), 2);
2912+
format!("{} == {}", args[0], args[1])
2913+
}
2914+
29102915
Intrinsic::IsFunction => {
29112916
assert_eq!(args.len(), 1);
29122917
format!("typeof({}) === 'function'", args[0])
@@ -2938,11 +2943,131 @@ impl<'a> Context<'a> {
29382943
format!("typeof({}) === 'string'", args[0])
29392944
}
29402945

2946+
Intrinsic::IsBigInt => {
2947+
assert_eq!(args.len(), 1);
2948+
format!("typeof({}) === 'bigint'", args[0])
2949+
}
2950+
2951+
Intrinsic::Typeof => {
2952+
assert_eq!(args.len(), 1);
2953+
format!("typeof {}", args[0])
2954+
}
2955+
2956+
Intrinsic::In => {
2957+
assert_eq!(args.len(), 2);
2958+
format!("{} in {}", args[0], args[1])
2959+
}
2960+
29412961
Intrinsic::IsFalsy => {
29422962
assert_eq!(args.len(), 1);
29432963
format!("!{}", args[0])
29442964
}
29452965

2966+
Intrinsic::AsNumber => {
2967+
assert_eq!(args.len(), 1);
2968+
format!("+{}", args[0])
2969+
}
2970+
2971+
Intrinsic::TryIntoNumber => {
2972+
assert_eq!(args.len(), 1);
2973+
format!("try {{ +{} }} catch(e) {{ e }}", args[0])
2974+
}
2975+
2976+
Intrinsic::Neg => {
2977+
assert_eq!(args.len(), 1);
2978+
format!("-{}", args[0])
2979+
}
2980+
2981+
Intrinsic::BitAnd => {
2982+
assert_eq!(args.len(), 2);
2983+
format!("{} & {}", args[0], args[1])
2984+
}
2985+
2986+
Intrinsic::BitOr => {
2987+
assert_eq!(args.len(), 2);
2988+
format!("{} | {}", args[0], args[1])
2989+
}
2990+
2991+
Intrinsic::BitXor => {
2992+
assert_eq!(args.len(), 2);
2993+
format!("{} ^ {}", args[0], args[1])
2994+
}
2995+
2996+
Intrinsic::BitNot => {
2997+
assert_eq!(args.len(), 1);
2998+
format!("~{}", args[0])
2999+
}
3000+
3001+
Intrinsic::Shl => {
3002+
assert_eq!(args.len(), 2);
3003+
format!("{} << {}", args[0], args[1])
3004+
}
3005+
3006+
Intrinsic::Shr => {
3007+
assert_eq!(args.len(), 2);
3008+
format!("{} >> {}", args[0], args[1])
3009+
}
3010+
3011+
Intrinsic::UnsignedShr => {
3012+
assert_eq!(args.len(), 2);
3013+
format!("{} >>> {}", args[0], args[1])
3014+
}
3015+
3016+
Intrinsic::Add => {
3017+
assert_eq!(args.len(), 2);
3018+
format!("{} + {}", args[0], args[1])
3019+
}
3020+
3021+
Intrinsic::Sub => {
3022+
assert_eq!(args.len(), 2);
3023+
format!("{} - {}", args[0], args[1])
3024+
}
3025+
3026+
Intrinsic::Div => {
3027+
assert_eq!(args.len(), 2);
3028+
format!("{} / {}", args[0], args[1])
3029+
}
3030+
3031+
Intrinsic::CheckedDiv => {
3032+
assert_eq!(args.len(), 2);
3033+
format!("try {{ {} / {} }} catch (e) {{ if (e instanceof RangeError) {{ e }} else {{ throw e }} }}", args[0], args[1])
3034+
}
3035+
3036+
Intrinsic::Mul => {
3037+
assert_eq!(args.len(), 2);
3038+
format!("{} * {}", args[0], args[1])
3039+
}
3040+
3041+
Intrinsic::Rem => {
3042+
assert_eq!(args.len(), 2);
3043+
format!("{} % {}", args[0], args[1])
3044+
}
3045+
3046+
Intrinsic::Pow => {
3047+
assert_eq!(args.len(), 2);
3048+
format!("{} ** {}", args[0], args[1])
3049+
}
3050+
3051+
Intrinsic::LT => {
3052+
assert_eq!(args.len(), 2);
3053+
format!("{} < {}", args[0], args[1])
3054+
}
3055+
3056+
Intrinsic::LE => {
3057+
assert_eq!(args.len(), 2);
3058+
format!("{} <= {}", args[0], args[1])
3059+
}
3060+
3061+
Intrinsic::GE => {
3062+
assert_eq!(args.len(), 2);
3063+
format!("{} >= {}", args[0], args[1])
3064+
}
3065+
3066+
Intrinsic::GT => {
3067+
assert_eq!(args.len(), 2);
3068+
format!("{} > {}", args[0], args[1])
3069+
}
3070+
29463071
Intrinsic::ObjectCloneRef => {
29473072
assert_eq!(args.len(), 1);
29483073
args[0].clone()
@@ -2968,6 +3093,11 @@ impl<'a> Context<'a> {
29683093
args[0].clone()
29693094
}
29703095

3096+
Intrinsic::BigIntNew => {
3097+
assert_eq!(args.len(), 1);
3098+
format!("BigInt({})", args[0])
3099+
}
3100+
29713101
Intrinsic::StringNew => {
29723102
assert_eq!(args.len(), 1);
29733103
args[0].clone()

0 commit comments

Comments
 (0)