mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-17 17:01:37 +00:00
Fix parseInt routines after refactoring (#655)
This commit is contained in:
@ -830,7 +830,7 @@ export class Program extends DiagnosticEmitter {
|
|||||||
if (!name.length) continue; // explicitly disabled
|
if (!name.length) continue; // explicitly disabled
|
||||||
let firstChar = name.charCodeAt(0);
|
let firstChar = name.charCodeAt(0);
|
||||||
if (firstChar >= CharCode._0 && firstChar <= CharCode._9) {
|
if (firstChar >= CharCode._0 && firstChar <= CharCode._9) {
|
||||||
this.registerConstantInteger(alias, Type.i32, i64_new(parseI32(name, 10)));
|
this.registerConstantInteger(alias, Type.i32, i64_new(<i32>parseInt(name, 10)));
|
||||||
} else {
|
} else {
|
||||||
let elementsByName = this.elementsByName;
|
let elementsByName = this.elementsByName;
|
||||||
let element = elementsByName.get(name);
|
let element = elementsByName.get(name);
|
||||||
|
4
std/assembly/index.d.ts
vendored
4
std/assembly/index.d.ts
vendored
@ -158,10 +158,6 @@ declare function isManaged<T>(value?: any): bool;
|
|||||||
declare function assert<T>(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?
|
declare function assert<T>(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?
|
||||||
/** Parses an integer string to a 64-bit float. */
|
/** Parses an integer string to a 64-bit float. */
|
||||||
declare function parseInt(str: string, radix?: i32): f64;
|
declare function parseInt(str: string, radix?: i32): f64;
|
||||||
/** Parses an integer string to a 32-bit integer. */
|
|
||||||
declare function parseI32(str: string, radix?: i32): i32;
|
|
||||||
/** Parses an integer string to a 64-bit integer. */
|
|
||||||
declare function parseI64(str: string, radix?: i32): i64;
|
|
||||||
/** Parses a string to a 64-bit float. */
|
/** Parses a string to a 64-bit float. */
|
||||||
declare function parseFloat(str: string): f64;
|
declare function parseFloat(str: string): f64;
|
||||||
/** Returns the 64-bit floating-point remainder of `x/y`. */
|
/** Returns the 64-bit floating-point remainder of `x/y`. */
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { itoa, dtoa } from "./util/number";
|
import { itoa, dtoa } from "./util/number";
|
||||||
|
import { strtol } from "./util/string";
|
||||||
|
|
||||||
// @ts-ignore: decorator
|
// @ts-ignore: decorator
|
||||||
@builtin @inline
|
@builtin @inline
|
||||||
@ -34,7 +35,7 @@ export abstract class I8 {
|
|||||||
static readonly MAX_VALUE: i8 = i8.MAX_VALUE;
|
static readonly MAX_VALUE: i8 = i8.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): i8 {
|
static parseInt(value: string, radix: i32 = 0): i8 {
|
||||||
return <i8>parseI32(value, radix);
|
return <i8>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: i8): String {
|
toString(this: i8): String {
|
||||||
@ -55,7 +56,7 @@ export abstract class I16 {
|
|||||||
static readonly MAX_VALUE: i16 = i16.MAX_VALUE;
|
static readonly MAX_VALUE: i16 = i16.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): i16 {
|
static parseInt(value: string, radix: i32 = 0): i16 {
|
||||||
return <i16>parseI32(value, radix);
|
return <i16>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: i16): String {
|
toString(this: i16): String {
|
||||||
@ -76,7 +77,7 @@ export abstract class I32 {
|
|||||||
static readonly MAX_VALUE: i32 = i32.MAX_VALUE;
|
static readonly MAX_VALUE: i32 = i32.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): i32 {
|
static parseInt(value: string, radix: i32 = 0): i32 {
|
||||||
return <i32>parseI32(value, radix);
|
return <i32>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: i32): String {
|
toString(this: i32): String {
|
||||||
@ -97,7 +98,7 @@ export abstract class I64 {
|
|||||||
static readonly MAX_VALUE: i64 = i64.MAX_VALUE;
|
static readonly MAX_VALUE: i64 = i64.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): i64 {
|
static parseInt(value: string, radix: i32 = 0): i64 {
|
||||||
return <i64>parseI64(value, radix);
|
return strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: i64): String {
|
toString(this: i64): String {
|
||||||
@ -118,7 +119,7 @@ export abstract class Isize {
|
|||||||
static readonly MAX_VALUE: isize = isize.MAX_VALUE;
|
static readonly MAX_VALUE: isize = isize.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): isize {
|
static parseInt(value: string, radix: i32 = 0): isize {
|
||||||
return <isize>parseI64(value, radix);
|
return <isize>strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: isize): String {
|
toString(this: isize): String {
|
||||||
@ -139,7 +140,7 @@ export abstract class U8 {
|
|||||||
static readonly MAX_VALUE: u8 = u8.MAX_VALUE;
|
static readonly MAX_VALUE: u8 = u8.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): u8 {
|
static parseInt(value: string, radix: i32 = 0): u8 {
|
||||||
return <u8>parseI32(value, radix);
|
return <u8>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: u8): String {
|
toString(this: u8): String {
|
||||||
@ -160,7 +161,7 @@ export abstract class U16 {
|
|||||||
static readonly MAX_VALUE: u16 = u16.MAX_VALUE;
|
static readonly MAX_VALUE: u16 = u16.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): u16 {
|
static parseInt(value: string, radix: i32 = 0): u16 {
|
||||||
return <u16>parseI32(value, radix);
|
return <u16>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: u16): String {
|
toString(this: u16): String {
|
||||||
@ -181,7 +182,7 @@ export abstract class U32 {
|
|||||||
static readonly MAX_VALUE: u32 = u32.MAX_VALUE;
|
static readonly MAX_VALUE: u32 = u32.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): u32 {
|
static parseInt(value: string, radix: i32 = 0): u32 {
|
||||||
return <u32>parseI32(value, radix);
|
return <u32>strtol<i32>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: u32): String {
|
toString(this: u32): String {
|
||||||
@ -202,7 +203,7 @@ export abstract class U64 {
|
|||||||
static readonly MAX_VALUE: u64 = u64.MAX_VALUE;
|
static readonly MAX_VALUE: u64 = u64.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): u64 {
|
static parseInt(value: string, radix: i32 = 0): u64 {
|
||||||
return <u64>parseI64(value, radix);
|
return <u64>strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: u64): String {
|
toString(this: u64): String {
|
||||||
@ -223,7 +224,7 @@ export abstract class Usize {
|
|||||||
static readonly MAX_VALUE: usize = usize.MAX_VALUE;
|
static readonly MAX_VALUE: usize = usize.MAX_VALUE;
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): usize {
|
static parseInt(value: string, radix: i32 = 0): usize {
|
||||||
return <usize>parseI64(value, radix);
|
return <usize>strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(this: usize): String {
|
toString(this: usize): String {
|
||||||
@ -303,7 +304,7 @@ export abstract class F32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): f32 {
|
static parseInt(value: string, radix: i32 = 0): f32 {
|
||||||
return <f32>parseI64(value, radix);
|
return <f32>strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static parseFloat(value: string): f32 {
|
static parseFloat(value: string): f32 {
|
||||||
@ -368,7 +369,7 @@ export abstract class F64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static parseInt(value: string, radix: i32 = 0): f64 {
|
static parseInt(value: string, radix: i32 = 0): f64 {
|
||||||
return <f64>parseI64(value, radix);
|
return <f64>strtol<i64>(value, radix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static parseFloat(value: string): f64 {
|
static parseFloat(value: string): f64 {
|
||||||
|
@ -66,7 +66,8 @@ export function strtol<T>(str: string, radix: i32 = 0): T {
|
|||||||
var code = <i32>load<u16>(ptr);
|
var code = <i32>load<u16>(ptr);
|
||||||
|
|
||||||
// determine sign
|
// determine sign
|
||||||
var sign: T;
|
// @ts-ignore: cast
|
||||||
|
var sign: T = 1;
|
||||||
// trim white spaces
|
// trim white spaces
|
||||||
while (isWhiteSpaceOrLineTerminator(code)) {
|
while (isWhiteSpaceOrLineTerminator(code)) {
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2);
|
||||||
@ -82,11 +83,6 @@ export function strtol<T>(str: string, radix: i32 = 0): T {
|
|||||||
// @ts-ignore: cast
|
// @ts-ignore: cast
|
||||||
if (!--len) return <T>NaN;
|
if (!--len) return <T>NaN;
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2);
|
||||||
// @ts-ignore: type
|
|
||||||
sign = 1;
|
|
||||||
} else {
|
|
||||||
// @ts-ignore: type
|
|
||||||
sign = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine radix
|
// determine radix
|
||||||
@ -133,7 +129,7 @@ export function strtol<T>(str: string, radix: i32 = 0): T {
|
|||||||
} else break;
|
} else break;
|
||||||
if (code >= radix) break;
|
if (code >= radix) break;
|
||||||
// @ts-ignore: type
|
// @ts-ignore: type
|
||||||
num = (num * radix) + code;
|
num = num * radix + code;
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
}
|
}
|
||||||
// @ts-ignore: type
|
// @ts-ignore: type
|
||||||
@ -149,7 +145,7 @@ export function strtod(str: string): f64 {
|
|||||||
var code = <i32>load<u16>(ptr);
|
var code = <i32>load<u16>(ptr);
|
||||||
|
|
||||||
// determine sign
|
// determine sign
|
||||||
var sign: f64;
|
var sign = 1.0;
|
||||||
// trim white spaces
|
// trim white spaces
|
||||||
while (isWhiteSpaceOrLineTerminator(code)) {
|
while (isWhiteSpaceOrLineTerminator(code)) {
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2);
|
||||||
@ -158,22 +154,19 @@ export function strtod(str: string): f64 {
|
|||||||
if (code == CharCode.MINUS) {
|
if (code == CharCode.MINUS) {
|
||||||
if (!--len) return NaN;
|
if (!--len) return NaN;
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2);
|
||||||
sign = -1;
|
sign = -1.0;
|
||||||
} else if (code == CharCode.PLUS) {
|
} else if (code == CharCode.PLUS) {
|
||||||
if (!--len) return NaN;
|
if (!--len) return NaN;
|
||||||
code = <i32>load<u16>(ptr += 2);
|
code = <i32>load<u16>(ptr += 2);
|
||||||
sign = 1;
|
|
||||||
} else {
|
|
||||||
sign = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate value
|
// calculate value
|
||||||
var num: f64 = 0;
|
var num = 0.0;
|
||||||
while (len--) {
|
while (len--) {
|
||||||
code = <i32>load<u16>(ptr);
|
code = <i32>load<u16>(ptr);
|
||||||
if (code == CharCode.DOT) {
|
if (code == CharCode.DOT) {
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
let fac: f64 = 0.1; // precision :(
|
let fac = 0.1; // precision :(
|
||||||
while (len--) {
|
while (len--) {
|
||||||
code = <i32>load<u16>(ptr);
|
code = <i32>load<u16>(ptr);
|
||||||
if (code == CharCode.E || code == CharCode.e) {
|
if (code == CharCode.E || code == CharCode.e) {
|
||||||
@ -189,7 +182,7 @@ export function strtod(str: string): f64 {
|
|||||||
}
|
}
|
||||||
code -= CharCode._0;
|
code -= CharCode._0;
|
||||||
if (<u32>code >= 10) break;
|
if (<u32>code >= 10) break;
|
||||||
num = (num * 10) + code;
|
num = num * 10 + code;
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
}
|
}
|
||||||
return sign * num;
|
return sign * num;
|
||||||
|
2
std/portable/index.d.ts
vendored
2
std/portable/index.d.ts
vendored
@ -120,8 +120,6 @@ declare function isConstant(expression: any): bool;
|
|||||||
declare function assert<T>(isTrueish: T | null, message?: string): T;
|
declare function assert<T>(isTrueish: T | null, message?: string): T;
|
||||||
/** Parses an integer string to a 64-bit float. */
|
/** Parses an integer string to a 64-bit float. */
|
||||||
declare function parseInt(str: string, radix?: i32): f64;
|
declare function parseInt(str: string, radix?: i32): f64;
|
||||||
/** Parses an integer string to a 32-bit integer. */
|
|
||||||
declare function parseI32(str: string, radix?: i32): i32;
|
|
||||||
/** Parses a floating point string to a 64-bit float. */
|
/** Parses a floating point string to a 64-bit float. */
|
||||||
declare function parseFloat(str: string): f64;
|
declare function parseFloat(str: string): f64;
|
||||||
/** Returns the 64-bit floating-point remainder of `x/y`. */
|
/** Returns the 64-bit floating-point remainder of `x/y`. */
|
||||||
|
@ -188,10 +188,6 @@ globalScope["changetype"] = function changetype(value) {
|
|||||||
return value;
|
return value;
|
||||||
};
|
};
|
||||||
|
|
||||||
globalScope["parseI32"] = function parseI32(str, radix) {
|
|
||||||
return parseInt(str, undefined) | 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
String["fromCharCodes"] = function fromCharCodes(arr) {
|
String["fromCharCodes"] = function fromCharCodes(arr) {
|
||||||
return String.fromCharCode.apply(String, arr);
|
return String.fromCharCode.apply(String, arr);
|
||||||
};
|
};
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -79,6 +79,9 @@ assert(parseInt("0x1g") == 1); // not valid
|
|||||||
assert(parseInt(" \t\n1") == 1);
|
assert(parseInt(" \t\n1") == 1);
|
||||||
assert(parseInt(" \t\n0x02") == 2);
|
assert(parseInt(" \t\n0x02") == 2);
|
||||||
|
|
||||||
|
assert(I32.parseInt("0x7FFFFFFF") == I32.MAX_VALUE);
|
||||||
|
assert(I64.parseInt("0x7FFFFFFFFFFFFFFF") == I64.MAX_VALUE);
|
||||||
|
|
||||||
assert(parseFloat("0") == 0);
|
assert(parseFloat("0") == 0);
|
||||||
assert(parseFloat("1") == 1);
|
assert(parseFloat("1") == 1);
|
||||||
assert(parseFloat("0.1") == 0.1);
|
assert(parseFloat("0.1") == 0.1);
|
||||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user