Skip to content

Commit 10295a2

Browse files
authored
Fixed the Val() global function to always return Float if no radix parameter is passed (#474)
* Fixed the `Val()` global function to always return `Float` if no `radix` parameter is passed * Added missed semi-colons
1 parent 9aa61f0 commit 10295a2

File tree

7 files changed

+47
-45
lines changed

7 files changed

+47
-45
lines changed

src/core/brsTypes/Float.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Double } from "./Double";
77
import { Int64 } from "./Int64";
88
import { RoFloat } from "./components/RoFloat";
99
import Long from "long";
10+
import { vsprintf } from "sprintf-js";
1011

1112
/**
1213
* Number of significant digits represented in an IEEE 32-bit floating point number.
@@ -213,7 +214,7 @@ export class Float implements Numeric, Comparable, Boxable {
213214
}
214215

215216
toString(parent?: BrsType): string {
216-
return this.value.toPrecision();
217+
return vsprintf("%g", [this.value]);
217218
}
218219

219220
box() {

src/core/stdlib/String.ts

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const UCase = new Callable("UCase", {
1616
args: [new StdlibArgument("s", ValueKind.String)],
1717
returns: ValueKind.String,
1818
},
19-
impl: (interpreter: Interpreter, s: BrsString) => new BrsString(s.value.toUpperCase()),
19+
impl: (_: Interpreter, s: BrsString) => new BrsString(s.value.toUpperCase()),
2020
});
2121

2222
/** Converts the string to all lowercase. */
@@ -25,7 +25,7 @@ export const LCase = new Callable("LCase", {
2525
args: [new StdlibArgument("s", ValueKind.String)],
2626
returns: ValueKind.String,
2727
},
28-
impl: (interpreter: Interpreter, s: BrsString) => new BrsString(s.value.toLowerCase()),
28+
impl: (_: Interpreter, s: BrsString) => new BrsString(s.value.toLowerCase()),
2929
});
3030

3131
/**
@@ -37,7 +37,7 @@ export const Asc = new Callable("Asc", {
3737
args: [new StdlibArgument("letter", ValueKind.String)],
3838
returns: ValueKind.String,
3939
},
40-
impl: (interpreter: Interpreter, str: BrsString) => new Int32(str.value.charCodeAt(0) || 0),
40+
impl: (_: Interpreter, str: BrsString) => new Int32(str.value.charCodeAt(0) || 0),
4141
});
4242

4343
/**
@@ -51,7 +51,7 @@ export const Chr = new Callable("Chr", {
5151
args: [new StdlibArgument("ch", ValueKind.Int32)],
5252
returns: ValueKind.String,
5353
},
54-
impl: (interpreter: Interpreter, ch: Int32) => {
54+
impl: (_: Interpreter, ch: Int32) => {
5555
const num = ch.getValue();
5656
if (num <= 0) return new BrsString("");
5757
else return new BrsString(String.fromCharCode(num));
@@ -66,8 +66,7 @@ export const Left = new Callable("Left", {
6666
args: [new StdlibArgument("s", ValueKind.String), new StdlibArgument("n", ValueKind.Int32)],
6767
returns: ValueKind.String,
6868
},
69-
impl: (interpreter: Interpreter, s: BrsString, n: Int32) =>
70-
new BrsString(s.value.slice(0, n.getValue())),
69+
impl: (_: Interpreter, s: BrsString, n: Int32) => new BrsString(s.value.slice(0, n.getValue())),
7170
});
7271

7372
/**
@@ -78,7 +77,7 @@ export const Right = new Callable("Right", {
7877
args: [new StdlibArgument("s", ValueKind.String), new StdlibArgument("n", ValueKind.Int32)],
7978
returns: ValueKind.String,
8079
},
81-
impl: (interpreter: Interpreter, s: BrsString, n: Int32) => {
80+
impl: (_: Interpreter, s: BrsString, n: Int32) => {
8281
if (n.getValue() <= 0) return new BrsString("");
8382
return new BrsString(s.value.slice(-n.getValue()));
8483
},
@@ -96,7 +95,7 @@ export const Instr = new Callable("Instr", {
9695
],
9796
returns: ValueKind.String,
9897
},
99-
impl: (interpreter: Interpreter, start: Int32, str: BrsString, search: BrsString) =>
98+
impl: (_: Interpreter, start: Int32, str: BrsString, search: BrsString) =>
10099
new Int32(str.value.indexOf(search.value, start.getValue() - 1) + 1),
101100
});
102101

@@ -108,7 +107,7 @@ export const Len = new Callable("Len", {
108107
args: [new StdlibArgument("s", ValueKind.String)],
109108
returns: ValueKind.Int32,
110109
},
111-
impl: (interpreter: Interpreter, s: BrsString) => new Int32(s.value.length),
110+
impl: (_: Interpreter, s: BrsString) => new Int32(s.value.length),
112111
});
113112

114113
/**
@@ -124,7 +123,7 @@ export const Mid = new Callable(
124123
],
125124
returns: ValueKind.String,
126125
},
127-
impl: (interpreter: Interpreter, s: BrsString, p: Int32): BrsString => {
126+
impl: (_: Interpreter, s: BrsString, p: Int32): BrsString => {
128127
let start = p.getValue() - 1;
129128
return new BrsString(s.value.substring(start));
130129
},
@@ -138,7 +137,7 @@ export const Mid = new Callable(
138137
],
139138
returns: ValueKind.String,
140139
},
141-
impl: (interpreter: Interpreter, s: BrsString, p: Int32, n: Int32): BrsString => {
140+
impl: (_: Interpreter, s: BrsString, p: Int32, n: Int32): BrsString => {
142141
let start = p.getValue() - 1;
143142
return new BrsString(s.value.substring(start, start + n.getValue()));
144143
},
@@ -153,7 +152,7 @@ export const Str = new Callable("Str", {
153152
args: [new StdlibArgument("value", ValueKind.Float)],
154153
returns: ValueKind.String,
155154
},
156-
impl: (interpreter: Interpreter, value: Float): BrsString => {
155+
impl: (_: Interpreter, value: Float): BrsString => {
157156
const floatValue = value.getValue();
158157
const prefix = floatValue >= 0.0 ? " " : "";
159158
return new BrsString(prefix + String(floatValue));
@@ -171,7 +170,7 @@ export const StrI = new Callable("StrI", {
171170
],
172171
returns: ValueKind.String,
173172
},
174-
impl: (interpreter: Interpreter, value: Int32, brsRadix: Int32): BrsString => {
173+
impl: (_: Interpreter, value: Int32, brsRadix: Int32): BrsString => {
175174
let radix = brsRadix.getValue();
176175
if (radix < 2 || radix > 36) {
177176
return new BrsString("");
@@ -196,7 +195,7 @@ export const STRING = new Callable("String", {
196195
],
197196
returns: ValueKind.String,
198197
},
199-
impl: (interpreter: Interpreter, n: Int32, str: BrsString): BrsString => {
198+
impl: (_: Interpreter, n: Int32, str: BrsString): BrsString => {
200199
return new BrsString(str.value.repeat(n.getValue()));
201200
},
202201
});
@@ -209,7 +208,7 @@ export const StringI = new Callable("StringI", {
209208
args: [new StdlibArgument("n", ValueKind.Int32), new StdlibArgument("ch", ValueKind.Int32)],
210209
returns: ValueKind.String,
211210
},
212-
impl: (interpreter: Interpreter, n: Int32, ch: Int32): BrsString => {
211+
impl: (_: Interpreter, n: Int32, ch: Int32): BrsString => {
213212
return new BrsString(String.fromCharCode(ch.getValue()).repeat(n.getValue()));
214213
},
215214
});
@@ -230,7 +229,7 @@ export const Substitute = new Callable("Substitute", {
230229
returns: ValueKind.String,
231230
},
232231
impl: (
233-
interpreter: Interpreter,
232+
_: Interpreter,
234233
str: BrsString,
235234
arg0: BrsString,
236235
arg1: BrsString,
@@ -257,21 +256,21 @@ export const Val = new Callable("Val", {
257256
],
258257
returns: ValueKind.Dynamic,
259258
},
260-
impl: (interpreter: Interpreter, s: BrsString, brsRadix: Int32 | BrsInvalid): BrsNumber => {
259+
impl: (_: Interpreter, s: BrsString, brsRadix: Int32 | BrsInvalid): BrsNumber => {
261260
const isFloat = s.value.includes(".");
262-
263-
let retNumber = 0;
264261
if (isFloat || brsRadix instanceof BrsInvalid) {
265-
retNumber = Number(s.value);
262+
const retNumber = Number(s.value);
263+
if (Number.isNaN(retNumber)) {
264+
return new Float(0);
265+
}
266+
return new Float(retNumber);
266267
} else {
267-
retNumber = parseInt(s.value, brsRadix.getValue());
268+
const retNumber = parseInt(s.value, brsRadix.getValue());
269+
if (Number.isNaN(retNumber)) {
270+
return new Int32(0);
271+
}
272+
return new Int32(retNumber);
268273
}
269-
270-
if (Number.isNaN(retNumber)) {
271-
return new Int32(0);
272-
}
273-
274-
return isFloat ? new Float(retNumber) : new Int32(retNumber);
275274
},
276275
});
277276

@@ -283,7 +282,7 @@ export const StrToI = new Callable("StrToI", {
283282
args: [new StdlibArgument("s", ValueKind.String)],
284283
returns: ValueKind.Int32,
285284
},
286-
impl: (interpreter: Interpreter, s: BrsString): BrsNumber => {
285+
impl: (_: Interpreter, s: BrsString): BrsNumber => {
287286
let integerValue = parseInt(s.value);
288287

289288
if (Number.isNaN(integerValue)) {

test/e2e/StdLib.test.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,20 @@ describe("end to end standard libary", () => {
6161
" 252",
6262
"abababab",
6363
"!!!!!!!!",
64+
" 1.23457e+12",
6465
]);
6566
});
6667

6768
test("stdlib/math.brs", async () => {
6869
await execute([resourceFile("stdlib", "math.brs")], outputStreams);
6970

7071
expect(allArgs(outputStreams.stdout.write).map((arg) => arg.trimEnd())).toEqual([
71-
" 22.19795",
72+
" 22.1979",
7273
" 2.85647",
73-
" 3.342155",
74-
" 0.4636476",
75-
" 0.7073883",
76-
" 0.9999997",
74+
" 3.34215",
75+
" 0.463648",
76+
" 0.707388",
77+
" 1",
7778
" 0.999204",
7879
" 3.5",
7980
" 17",

test/e2e/Syntax.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ describe("end to end syntax", () => {
8181
" 10", // boxed operations
8282
" 4",
8383
" 21",
84-
" 2.333333",
84+
" 2.33333",
8585
"Integer",
8686
"roInt",
8787
"roFloat",
@@ -131,13 +131,13 @@ describe("end to end syntax", () => {
131131
await execute([resourceFile("to-str-with-format.brs")], outputStreams);
132132

133133
expect(allArgs(outputStreams.stdout.write).map((arg) => arg.trimEnd())).toEqual([
134-
"float1 = 10000.45", // RBI 10000.5
135-
"float2 = 10000.46", // RBI 10000.5
134+
"float1 = 10000.5",
135+
"float2 = 10000.5",
136136
"float3 = 10000.45678",
137137
"float3.toStr() = 10000.5",
138138
"0.123 = 0.123",
139139
"0.123.toStr() = 0.123",
140-
"123.4567 = 123.4567", // RBI 123.457
140+
"123.4567 = 123.457",
141141
"123.4567.toStr() = 123.457",
142142
"double = 10000.46", // RBI 10000.45703125
143143
"double.toStr() = 10000.5",

test/e2e/TypeChecking.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe("function argument type checking", () => {
121121
"longinteger& = 13",
122122
"assigning RHS of type 'longinteger' with value: 2147483647119",
123123
"integer% = -881",
124-
"float! = 2147484000000",
124+
"float! = 2.14748e+12",
125125
"double# = 2147483647119",
126126
"longinteger& = 2147483647119",
127127
]);

test/e2e/resources/stdlib/strings.brs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ print Substitute("{0} and {1}", "Mary", "Bob")
2323
print StrToI("252")
2424
print String(4, "ab") ' abababab
2525
print StringI(8, 33) ' !!!!!!!!
26+
print Val("1234567890123")' 1.23457e+12

test/stdlib/String.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,17 +304,17 @@ describe("global string functions", () => {
304304
});
305305

306306
it("returns zero if the string is not a number", () => {
307-
expect(Val.call(interpreter, new BrsString(""))).toEqual(new Int32(0));
307+
expect(Val.call(interpreter, new BrsString(""))).toEqual(new Float(0));
308308

309-
expect(Val.call(interpreter, new BrsString("Not a Number"))).toEqual(new Int32(0));
309+
expect(Val.call(interpreter, new BrsString("Not a Number"))).toEqual(new Float(0));
310310

311-
expect(Val.call(interpreter, new BrsString("10+2"))).toEqual(new Int32(0));
311+
expect(Val.call(interpreter, new BrsString("10+2"))).toEqual(new Float(0));
312312
});
313313

314-
it("returns an integer from a string", () => {
315-
expect(Val.call(interpreter, new BrsString("65535"))).toEqual(new Int32(65535));
314+
it("returns a float from a string", () => {
315+
expect(Val.call(interpreter, new BrsString("65535"))).toEqual(new Float(65535));
316316

317-
expect(Val.call(interpreter, new BrsString("0xFA"))).toEqual(new Int32(250));
317+
expect(Val.call(interpreter, new BrsString("0xFA"))).toEqual(new Float(250));
318318
});
319319

320320
it("returns an integer from a string and radix", () => {

0 commit comments

Comments
 (0)