Skip to content

Commit 3924aa9

Browse files
committed
Fun fact: Can even implement parseInt/I32/I64 using generics, see #19
1 parent ab5a938 commit 3924aa9

12 files changed

+94
-247
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@
4444
"build": "webpack",
4545
"clean": "node scripts/clean",
4646
"lint": "tslint --project src",
47-
"test:config": "npm run test:config:assembly --scripts-prepend-node-path && npm run test:config:portable --scripts-prepend-node-path && npm run test:config:src --scripts-prepend-node-path",
48-
"test:config:assembly": "tsc --noEmit -p std/assembly --diagnostics --listFiles",
47+
"test:config": "npm run test:config:portable --scripts-prepend-node-path && npm run test:config:src --scripts-prepend-node-path",
4948
"test:config:portable": "tsc --noEmit -p std/portable --diagnostics --listFiles",
5049
"test:config:src": "tsc --noEmit -p src --diagnostics --listFiles",
5150
"test:parser": "node tests/parser",

std/assembly.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ declare function isFinite<T = f32 | f64>(value: T): bool;
193193
declare function assert<T>(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?
194194
/** Parses an integer string to a 64-bit float. */
195195
declare function parseInt(str: string, radix?: i32): f64;
196+
/** Parses an integer string to a 32-bit integer. */
197+
declare function parseI32(str: string, radix?: i32): i32;
196198
/** Parses an integer string to a 64-bit integer. */
197199
declare function parseI64(str: string, radix?: i32): i64;
198200
/** Parses a string to a 64-bit float. */

std/assembly/string.ts

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -351,45 +351,34 @@ const enum CharCode {
351351
}
352352

353353
export function parseInt(str: String, radix: i32 = 0): f64 {
354-
var len: i32 = str.length;
355-
if (!len)
356-
return NaN;
357-
var ptr = changetype<usize>(str) /* + HEAD -> offset */;
358-
var code = <i32>load<u16>(ptr, HEAD);
359-
360-
// pre-check sign
361-
if (code == CharCode.MINUS) {
362-
if (!--len)
363-
return NaN;
364-
} else if (code == CharCode.PLUS) {
365-
if (!--len)
366-
return NaN;
367-
}
368-
369-
// pre-check radix
370-
if (radix && (radix < 2 || radix > 36))
371-
return NaN;
354+
return parse<f64>(str, radix);
355+
}
372356

373-
return <f64>parseI64(str, radix);
357+
export function parseI32(str: String, radix: i32 = 0): i32 {
358+
return parse<i32>(str, radix);
374359
}
375360

376361
export function parseI64(str: String, radix: i32 = 0): i64 {
362+
return parse<i64>(str, radix);
363+
}
364+
365+
function parse<T>(str: String, radix: i32 = 0): T {
377366
var len: i32 = str.length;
378367
if (!len)
379-
return 0; // (NaN)
368+
return <T>NaN;
380369
var ptr = changetype<usize>(str) /* + HEAD -> offset */;
381370
var code = <i32>load<u16>(ptr, HEAD);
382371

383372
// determine sign
384-
var sign: i64;
373+
var sign: T;
385374
if (code == CharCode.MINUS) {
386375
if (!--len)
387-
return 0; // (NaN)
376+
return <T>NaN;
388377
code = <i32>load<u16>(ptr += 2, HEAD);
389378
sign = -1;
390379
} else if (code == CharCode.PLUS) {
391380
if (!--len)
392-
return 0; // (NaN)
381+
return <T>NaN;
393382
code = <i32>load<u16>(ptr += 2, HEAD);
394383
sign = 1;
395384
} else
@@ -423,10 +412,10 @@ export function parseI64(str: String, radix: i32 = 0): i64 {
423412
}
424413
} else radix = 10;
425414
} else if (radix < 2 || radix > 36)
426-
return 0; // (NaN)
415+
return <T>NaN;
427416

428417
// calculate value
429-
var num: i64 = 0;
418+
var num: T = 0;
430419
while (len--) {
431420
code = <i32>load<u16>(ptr, HEAD);
432421
if (code >= CharCode._0 && code <= CharCode._9)

std/portable.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ declare function changetype<T>(value: any): T;
135135
declare function assert<T>(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?
136136
/** Parses an integer string to a 64-bit float. */
137137
declare function parseInt(str: string, radix?: i32): f64;
138+
/** Parses an integer string to a 32-bit integer. */
139+
declare function parseI32(str: string, radix?: i32): i32;
138140
/** Parses a floating point string to a 64-bit float. */
139141
declare function parseFloat(str: string): f64;
140142

std/portable.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,7 @@ globalScope["changetype"] = function changetype(value) { return value; }
9898

9999
String["fromCharCodes"] = function fromCharCodes(arr) { return String.fromCharCode.apply(String, arr); }
100100
String["fromCodePoints"] = function fromCodePoints(arr) { return String.fromCodePoint.apply(String, arr); }
101+
102+
globalScope["parseI32"] = function parseI32(str, radix) {
103+
return parseInt(str) | 0;
104+
};

tests/compiler/std/array.wast

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4077,8 +4077,11 @@
40774077
ENUM: std:string/CharCode
40784078
FUNCTION_PROTOTYPE: std:string/parseInt
40794079
FUNCTION_PROTOTYPE: parseInt
4080+
FUNCTION_PROTOTYPE: std:string/parseI32
4081+
FUNCTION_PROTOTYPE: parseI32
40804082
FUNCTION_PROTOTYPE: std:string/parseI64
40814083
FUNCTION_PROTOTYPE: parseI64
4084+
FUNCTION_PROTOTYPE: std:string/parse
40824085
FUNCTION_PROTOTYPE: std:string/parseFloat
40834086
FUNCTION_PROTOTYPE: parseFloat
40844087
GLOBAL: std/array/arr
@@ -4118,6 +4121,8 @@
41184121
CLASS_PROTOTYPE: String
41194122
FUNCTION_PROTOTYPE: parseInt
41204123
FUNCTION_PROTOTYPE: std:string/parseInt
4124+
FUNCTION_PROTOTYPE: parseI32
4125+
FUNCTION_PROTOTYPE: std:string/parseI32
41214126
FUNCTION_PROTOTYPE: parseI64
41224127
FUNCTION_PROTOTYPE: std:string/parseI64
41234128
FUNCTION_PROTOTYPE: parseFloat

tests/compiler/std/carray.wast

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,11 @@
284284
ENUM: std:string/CharCode
285285
FUNCTION_PROTOTYPE: std:string/parseInt
286286
FUNCTION_PROTOTYPE: parseInt
287+
FUNCTION_PROTOTYPE: std:string/parseI32
288+
FUNCTION_PROTOTYPE: parseI32
287289
FUNCTION_PROTOTYPE: std:string/parseI64
288290
FUNCTION_PROTOTYPE: parseI64
291+
FUNCTION_PROTOTYPE: std:string/parse
289292
FUNCTION_PROTOTYPE: std:string/parseFloat
290293
FUNCTION_PROTOTYPE: parseFloat
291294
GLOBAL: std/carray/arr
@@ -314,6 +317,8 @@
314317
CLASS_PROTOTYPE: String
315318
FUNCTION_PROTOTYPE: parseInt
316319
FUNCTION_PROTOTYPE: std:string/parseInt
320+
FUNCTION_PROTOTYPE: parseI32
321+
FUNCTION_PROTOTYPE: std:string/parseI32
317322
FUNCTION_PROTOTYPE: parseI64
318323
FUNCTION_PROTOTYPE: std:string/parseI64
319324
FUNCTION_PROTOTYPE: parseFloat

tests/compiler/std/heap.wast

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,8 +2893,11 @@
28932893
ENUM: std:string/CharCode
28942894
FUNCTION_PROTOTYPE: std:string/parseInt
28952895
FUNCTION_PROTOTYPE: parseInt
2896+
FUNCTION_PROTOTYPE: std:string/parseI32
2897+
FUNCTION_PROTOTYPE: parseI32
28962898
FUNCTION_PROTOTYPE: std:string/parseI64
28972899
FUNCTION_PROTOTYPE: parseI64
2900+
FUNCTION_PROTOTYPE: std:string/parse
28982901
FUNCTION_PROTOTYPE: std:string/parseFloat
28992902
FUNCTION_PROTOTYPE: parseFloat
29002903
GLOBAL: std/heap/size
@@ -2936,6 +2939,8 @@
29362939
CLASS_PROTOTYPE: String
29372940
FUNCTION_PROTOTYPE: parseInt
29382941
FUNCTION_PROTOTYPE: std:string/parseInt
2942+
FUNCTION_PROTOTYPE: parseI32
2943+
FUNCTION_PROTOTYPE: std:string/parseI32
29392944
FUNCTION_PROTOTYPE: parseI64
29402945
FUNCTION_PROTOTYPE: std:string/parseI64
29412946
FUNCTION_PROTOTYPE: parseFloat

tests/compiler/std/new.wast

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,11 @@
234234
ENUM: std:string/CharCode
235235
FUNCTION_PROTOTYPE: std:string/parseInt
236236
FUNCTION_PROTOTYPE: parseInt
237+
FUNCTION_PROTOTYPE: std:string/parseI32
238+
FUNCTION_PROTOTYPE: parseI32
237239
FUNCTION_PROTOTYPE: std:string/parseI64
238240
FUNCTION_PROTOTYPE: parseI64
241+
FUNCTION_PROTOTYPE: std:string/parse
239242
FUNCTION_PROTOTYPE: std:string/parseFloat
240243
FUNCTION_PROTOTYPE: parseFloat
241244
CLASS_PROTOTYPE: std/new/AClass
@@ -276,6 +279,8 @@
276279
CLASS_PROTOTYPE: String
277280
FUNCTION_PROTOTYPE: parseInt
278281
FUNCTION_PROTOTYPE: std:string/parseInt
282+
FUNCTION_PROTOTYPE: parseI32
283+
FUNCTION_PROTOTYPE: std:string/parseI32
279284
FUNCTION_PROTOTYPE: parseI64
280285
FUNCTION_PROTOTYPE: std:string/parseI64
281286
FUNCTION_PROTOTYPE: parseFloat

tests/compiler/std/set.wast

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,8 +2802,11 @@
28022802
ENUM: std:string/CharCode
28032803
FUNCTION_PROTOTYPE: std:string/parseInt
28042804
FUNCTION_PROTOTYPE: parseInt
2805+
FUNCTION_PROTOTYPE: std:string/parseI32
2806+
FUNCTION_PROTOTYPE: parseI32
28052807
FUNCTION_PROTOTYPE: std:string/parseI64
28062808
FUNCTION_PROTOTYPE: parseI64
2809+
FUNCTION_PROTOTYPE: std:string/parse
28072810
FUNCTION_PROTOTYPE: std:string/parseFloat
28082811
FUNCTION_PROTOTYPE: parseFloat
28092812
GLOBAL: std/set/set
@@ -2842,6 +2845,8 @@
28422845
CLASS_PROTOTYPE: String
28432846
FUNCTION_PROTOTYPE: parseInt
28442847
FUNCTION_PROTOTYPE: std:string/parseInt
2848+
FUNCTION_PROTOTYPE: parseI32
2849+
FUNCTION_PROTOTYPE: std:string/parseI32
28452850
FUNCTION_PROTOTYPE: parseI64
28462851
FUNCTION_PROTOTYPE: std:string/parseI64
28472852
FUNCTION_PROTOTYPE: parseFloat

0 commit comments

Comments
 (0)