mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-25 23:12:19 +00:00
Check radix in parseInt and use constant offsets
This commit is contained in:
parent
002fba3067
commit
d3f22637ed
@ -348,23 +348,23 @@ const enum CharCode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function parseInt(str: String, radix: i32 = 0): i64 {
|
export function parseInt(str: String, radix: i32 = 0): i64 {
|
||||||
var len = str.length;
|
var len: i32 = str.length;
|
||||||
var ptr = changetype<usize>(str) + HEAD;
|
|
||||||
if (!len)
|
if (!len)
|
||||||
return 0; // (NaN)
|
return 0; // (NaN)
|
||||||
var code = <i32>load<u16>(ptr);
|
var ptr = changetype<usize>(str) /* + HEAD -> offset */;
|
||||||
|
var code = <i32>load<u16>(ptr, HEAD);
|
||||||
|
|
||||||
// determine sign
|
// determine sign
|
||||||
var sign: i64;
|
var sign: i64;
|
||||||
if (code == CharCode.MINUS) {
|
if (code == CharCode.MINUS) {
|
||||||
if (!--len)
|
if (!--len)
|
||||||
return 0; // (NaN)
|
return 0; // (NaN)
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2, HEAD);
|
||||||
sign = -1;
|
sign = -1;
|
||||||
} else if (code == CharCode.PLUS) {
|
} else if (code == CharCode.PLUS) {
|
||||||
if (!--len)
|
if (!--len)
|
||||||
return 0; // (NaN)
|
return 0; // (NaN)
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2, HEAD);
|
||||||
sign = 1;
|
sign = 1;
|
||||||
} else
|
} else
|
||||||
sign = 1;
|
sign = 1;
|
||||||
@ -372,7 +372,7 @@ export function parseInt(str: String, radix: i32 = 0): i64 {
|
|||||||
// determine radix
|
// determine radix
|
||||||
if (!radix) {
|
if (!radix) {
|
||||||
if (code == CharCode._0 && len > 2) {
|
if (code == CharCode._0 && len > 2) {
|
||||||
switch (<i32>load<u16>(ptr + 2)) {
|
switch (<i32>load<u16>(ptr + 2, HEAD)) {
|
||||||
|
|
||||||
case CharCode.B:
|
case CharCode.B:
|
||||||
case CharCode.b:
|
case CharCode.b:
|
||||||
@ -396,12 +396,13 @@ export function parseInt(str: String, radix: i32 = 0): i64 {
|
|||||||
radix = 10;
|
radix = 10;
|
||||||
}
|
}
|
||||||
} else radix = 10;
|
} else radix = 10;
|
||||||
}
|
} else if (radix < 2 || radix > 36)
|
||||||
|
return 0; // (NaN)
|
||||||
|
|
||||||
// calculate value
|
// calculate value
|
||||||
var num: i64 = 0;
|
var num: i64 = 0;
|
||||||
while (len--) {
|
while (len--) {
|
||||||
code = <i32>load<u16>(ptr);
|
code = <i32>load<u16>(ptr, HEAD);
|
||||||
if (code >= CharCode._0 && code <= CharCode._9)
|
if (code >= CharCode._0 && code <= CharCode._9)
|
||||||
code -= CharCode._0;
|
code -= CharCode._0;
|
||||||
else if (code >= CharCode.A && code <= CharCode.Z)
|
else if (code >= CharCode.A && code <= CharCode.Z)
|
||||||
|
@ -375,15 +375,9 @@
|
|||||||
(local $3 i32)
|
(local $3 i32)
|
||||||
(local $4 i64)
|
(local $4 i64)
|
||||||
(local $5 i64)
|
(local $5 i64)
|
||||||
(set_local $3
|
|
||||||
(i32.add
|
|
||||||
(get_local $0)
|
|
||||||
(i32.const 4)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(if
|
(if
|
||||||
(i32.eqz
|
(i32.eqz
|
||||||
(tee_local $0
|
(tee_local $3
|
||||||
(i32.load
|
(i32.load
|
||||||
(get_local $0)
|
(get_local $0)
|
||||||
)
|
)
|
||||||
@ -397,8 +391,8 @@
|
|||||||
(if (result i64)
|
(if (result i64)
|
||||||
(i32.eq
|
(i32.eq
|
||||||
(tee_local $2
|
(tee_local $2
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(i32.const 45)
|
(i32.const 45)
|
||||||
@ -406,9 +400,9 @@
|
|||||||
(block (result i64)
|
(block (result i64)
|
||||||
(if
|
(if
|
||||||
(i32.eqz
|
(i32.eqz
|
||||||
(tee_local $0
|
(tee_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -418,10 +412,10 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $2
|
(set_local $2
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(tee_local $3
|
(tee_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -437,9 +431,9 @@
|
|||||||
(block (result i64)
|
(block (result i64)
|
||||||
(if
|
(if
|
||||||
(i32.eqz
|
(i32.eqz
|
||||||
(tee_local $0
|
(tee_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -449,10 +443,10 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $2
|
(set_local $2
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(tee_local $3
|
(tee_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -465,15 +459,35 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(if
|
(if
|
||||||
(i32.eqz
|
(get_local $1)
|
||||||
(get_local $1)
|
(if
|
||||||
|
(i32.and
|
||||||
|
(select
|
||||||
|
(i32.lt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 2)
|
||||||
|
)
|
||||||
|
(i32.gt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 36)
|
||||||
|
)
|
||||||
|
(i32.lt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 2)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(i32.const 1)
|
||||||
|
)
|
||||||
|
(return
|
||||||
|
(i64.const 0)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
(set_local $1
|
(set_local $1
|
||||||
(if (result i32)
|
(if (result i32)
|
||||||
(i32.and
|
(i32.and
|
||||||
(select
|
(select
|
||||||
(i32.gt_s
|
(i32.gt_s
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
(i32.eq
|
(i32.eq
|
||||||
@ -496,9 +510,9 @@
|
|||||||
(i32.or
|
(i32.or
|
||||||
(i32.eq
|
(i32.eq
|
||||||
(tee_local $2
|
(tee_local $2
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -539,15 +553,15 @@
|
|||||||
(br $case6|0)
|
(br $case6|0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $3
|
(set_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 4)
|
(i32.const 4)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $0
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -555,15 +569,15 @@
|
|||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $3
|
(set_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 4)
|
(i32.const 4)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $0
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -571,15 +585,15 @@
|
|||||||
(i32.const 8)
|
(i32.const 8)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $3
|
(set_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 4)
|
(i32.const 4)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $0
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -596,10 +610,10 @@
|
|||||||
(loop $continue|1
|
(loop $continue|1
|
||||||
(if
|
(if
|
||||||
(block (result i32)
|
(block (result i32)
|
||||||
(set_local $0
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(tee_local $2
|
(tee_local $2
|
||||||
(get_local $0)
|
(get_local $3)
|
||||||
)
|
)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
@ -612,8 +626,8 @@
|
|||||||
(select
|
(select
|
||||||
(i32.le_s
|
(i32.le_s
|
||||||
(tee_local $2
|
(tee_local $2
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(i32.const 57)
|
(i32.const 57)
|
||||||
@ -717,9 +731,9 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $3
|
(set_local $0
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $0)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -504,12 +504,6 @@
|
|||||||
(get_local $0)
|
(get_local $0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $3
|
|
||||||
(i32.add
|
|
||||||
(get_local $0)
|
|
||||||
(i32.const 4)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(if
|
(if
|
||||||
(i32.eqz
|
(i32.eqz
|
||||||
(get_local $2)
|
(get_local $2)
|
||||||
@ -518,8 +512,11 @@
|
|||||||
(i64.const 0)
|
(i64.const 0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(set_local $3
|
||||||
|
(get_local $0)
|
||||||
|
)
|
||||||
(set_local $4
|
(set_local $4
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -544,7 +541,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $4
|
(set_local $4
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(tee_local $3
|
(tee_local $3
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
@ -580,7 +577,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(set_local $4
|
(set_local $4
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(tee_local $3
|
(tee_local $3
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
@ -632,7 +629,7 @@
|
|||||||
(block $case1|0
|
(block $case1|0
|
||||||
(block $case0|0
|
(block $case0|0
|
||||||
(set_local $6
|
(set_local $6
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(i32.add
|
(i32.add
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
(i32.const 2)
|
(i32.const 2)
|
||||||
@ -739,6 +736,31 @@
|
|||||||
(i32.const 10)
|
(i32.const 10)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(if
|
||||||
|
(i32.and
|
||||||
|
(if (result i32)
|
||||||
|
(i32.ne
|
||||||
|
(i32.lt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 2)
|
||||||
|
)
|
||||||
|
(i32.const 0)
|
||||||
|
)
|
||||||
|
(i32.lt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 2)
|
||||||
|
)
|
||||||
|
(i32.gt_s
|
||||||
|
(get_local $1)
|
||||||
|
(i32.const 36)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(i32.const 1)
|
||||||
|
)
|
||||||
|
(return
|
||||||
|
(i64.const 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
(set_local $7
|
(set_local $7
|
||||||
(i64.const 0)
|
(i64.const 0)
|
||||||
@ -761,7 +783,7 @@
|
|||||||
(block
|
(block
|
||||||
(block
|
(block
|
||||||
(set_local $4
|
(set_local $4
|
||||||
(i32.load16_u
|
(i32.load16_u offset=4
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user