Skip to content

Commit a3dcd5d

Browse files
authored
fix: Fix parseInt result for some mixed integers (#2193)
1 parent f79b82e commit a3dcd5d

File tree

11 files changed

+78021
-3724
lines changed

11 files changed

+78021
-3724
lines changed

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

std/assembly/util/string.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,7 @@ export function strtol<T>(str: string, radix: i32 = 0): T {
738738
// calculate value
739739
// @ts-ignore: type
740740
var num: T = 0;
741+
var initial = len - 1;
741742
while (len--) {
742743
code = <u32>load<u16>(ptr);
743744
if (code - CharCode._0 < 10) {
@@ -748,7 +749,7 @@ export function strtol<T>(str: string, radix: i32 = 0): T {
748749
code -= CharCode.a - 10;
749750
}
750751
if (code >= <u32>radix) {
751-
if (!num) {
752+
if (initial == len) {
752753
if (isFloat<T>()) {
753754
// @ts-ignore: cast
754755
return <T>NaN;

tests/compiler/std/date.debug.wat

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4021,6 +4021,7 @@
40214021
(local $5 i32)
40224022
(local $6 i32)
40234023
(local $7 i32)
4024+
(local $8 i32)
40244025
local.get $0
40254026
call $~lib/string/String#get:length
40264027
local.set $2
@@ -4228,6 +4229,10 @@
42284229
end
42294230
i32.const 0
42304231
local.set $7
4232+
local.get $2
4233+
i32.const 1
4234+
i32.sub
4235+
local.set $8
42314236
block $while-break|2
42324237
loop $while-continue|2
42334238
local.get $2
@@ -4289,8 +4294,9 @@
42894294
local.get $1
42904295
i32.ge_u
42914296
if
4292-
local.get $7
4293-
i32.eqz
4297+
local.get $8
4298+
local.get $2
4299+
i32.eq
42944300
if
42954301
i32.const 0
42964302
drop

tests/compiler/std/date.optimized.wat

Lines changed: 9789 additions & 0 deletions
Large diffs are not rendered by default.

tests/compiler/std/date.release.wat

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2828,20 +2828,21 @@
28282828
(local $3 i32)
28292829
(local $4 i32)
28302830
(local $5 i32)
2831+
(local $6 i32)
28312832
local.get $0
28322833
i32.const 20
28332834
i32.sub
28342835
i32.load offset=16
28352836
i32.const 1
28362837
i32.shr_u
2837-
local.tee $2
2838+
local.tee $1
28382839
i32.eqz
28392840
if
28402841
i32.const 0
28412842
return
28422843
end
28432844
local.get $0
2844-
local.tee $1
2845+
local.tee $2
28452846
i32.load16_u
28462847
local.set $0
28472848
loop $while-continue|0
@@ -2908,21 +2909,21 @@
29082909
i32.const 0
29092910
end
29102911
if
2911-
local.get $1
2912+
local.get $2
29122913
i32.const 2
29132914
i32.add
2914-
local.tee $1
2915+
local.tee $2
29152916
i32.load16_u
29162917
local.set $0
2917-
local.get $2
2918+
local.get $1
29182919
i32.const 1
29192920
i32.sub
2920-
local.set $2
2921+
local.set $1
29212922
br $while-continue|0
29222923
end
29232924
end
29242925
i32.const 1
2925-
local.set $5
2926+
local.set $4
29262927
local.get $0
29272928
i32.const 43
29282929
i32.eq
@@ -2931,10 +2932,10 @@
29312932
i32.eq
29322933
i32.or
29332934
if (result i32)
2934-
local.get $2
2935+
local.get $1
29352936
i32.const 1
29362937
i32.sub
2937-
local.tee $2
2938+
local.tee $1
29382939
i32.eqz
29392940
if
29402941
i32.const 0
@@ -2946,26 +2947,26 @@
29462947
i32.const 45
29472948
i32.eq
29482949
select
2949-
local.set $5
2950-
local.get $1
2950+
local.set $4
2951+
local.get $2
29512952
i32.const 2
29522953
i32.add
2953-
local.tee $1
2954+
local.tee $2
29542955
i32.load16_u
29552956
else
29562957
local.get $0
29572958
end
29582959
i32.const 48
29592960
i32.eq
2960-
local.get $2
2961+
local.get $1
29612962
i32.const 2
29622963
i32.gt_s
29632964
i32.and
29642965
if
29652966
block $break|1
29662967
block $case2|1
29672968
block $case1|1
2968-
local.get $1
2969+
local.get $2
29692970
i32.load16_u offset=2
29702971
i32.const 32
29712972
i32.or
@@ -2983,38 +2984,38 @@
29832984
br_if $case2|1
29842985
br $break|1
29852986
end
2986-
local.get $1
2987+
local.get $2
29872988
i32.const 4
29882989
i32.add
2989-
local.set $1
2990-
local.get $2
2990+
local.set $2
2991+
local.get $1
29912992
i32.const 2
29922993
i32.sub
2993-
local.set $2
2994+
local.set $1
29942995
i32.const 2
29952996
local.set $3
29962997
br $break|1
29972998
end
2998-
local.get $1
2999+
local.get $2
29993000
i32.const 4
30003001
i32.add
3001-
local.set $1
3002-
local.get $2
3002+
local.set $2
3003+
local.get $1
30033004
i32.const 2
30043005
i32.sub
3005-
local.set $2
3006+
local.set $1
30063007
i32.const 8
30073008
local.set $3
30083009
br $break|1
30093010
end
3010-
local.get $1
3011+
local.get $2
30113012
i32.const 4
30123013
i32.add
3013-
local.set $1
3014-
local.get $2
3014+
local.set $2
3015+
local.get $1
30153016
i32.const 2
30163017
i32.sub
3017-
local.set $2
3018+
local.set $1
30183019
i32.const 16
30193020
local.set $3
30203021
end
@@ -3024,16 +3025,20 @@
30243025
local.get $3
30253026
select
30263027
local.set $3
3028+
local.get $1
3029+
i32.const 1
3030+
i32.sub
3031+
local.set $6
30273032
loop $while-continue|2
30283033
block $while-break|2
3029-
local.get $2
3034+
local.get $1
30303035
local.tee $0
30313036
i32.const 1
30323037
i32.sub
3033-
local.set $2
3038+
local.set $1
30343039
local.get $0
30353040
if
3036-
local.get $1
3041+
local.get $2
30373042
i32.load16_u
30383043
local.tee $0
30393044
i32.const 48
@@ -3071,8 +3076,9 @@
30713076
local.get $3
30723077
i32.ge_u
30733078
if
3074-
local.get $4
3075-
i32.eqz
3079+
local.get $1
3080+
local.get $6
3081+
i32.eq
30763082
if
30773083
i32.const 0
30783084
return
@@ -3081,14 +3087,14 @@
30813087
end
30823088
local.get $0
30833089
local.get $3
3084-
local.get $4
3090+
local.get $5
30853091
i32.mul
30863092
i32.add
3087-
local.set $4
3088-
local.get $1
3093+
local.set $5
3094+
local.get $2
30893095
i32.const 2
30903096
i32.add
3091-
local.set $1
3097+
local.set $2
30923098
br $while-continue|2
30933099
end
30943100
end

0 commit comments

Comments
 (0)