8000 Merge pull request #33 from scala-wasm/parse-int · sjrd/scala-js@54d5b1e · GitHub
[go: up one dir, main page]

Skip to content

Commit 54d5b1e

Browse files
authored
Merge pull request scala-js#33 from scala-wasm/parse-int
Integer.parseInt without JS asInt
2 parents 45bf440 + e9a2430 commit 54d5b1e

File tree

2 files changed

+50
-30
lines changed

2 files changed

+50
-30
lines changed

examples/test-suite-wasi/src/main/scala/test-suites-wasi/JavalibLangTest.scala

Lines changed: 10 additions & 12 deletions
249
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,13 @@ object JavalibLangTest {
224224
compareToInteger()
225225
compareTo()
226226

227-
// TODO: JSBinaryOp 8: asInt (number2dynamic)
228-
// parseString()
229-
// parseStringInvalidThrows()
230-
// parseUnsignedInt()
231-
// parseUnsignedIntInvalidThrows()
232-
// parseStringBase16()
233-
// decodeStringBase8()
234-
// decodeStringInvalidThrows()
227+
parseString()
228+
parseStringInvalidThrows()
229+
parseUnsignedInt()
230+
parseUnsignedIntInvalidThrows()
231+
parseStringBase16()
232+
decodeStringBase8()
233+
decodeStringInvalidThrows()
235234

236235
highestOneBit()
237236
lowestOneBit()
@@ -243,10 +242,9 @@ object JavalibLangTest {
243242
// TODO: JSMethodApply toString (enableJSNumberOps)
244243
// toStringRadix()
245244

246-
// TODO: JSMethodApply (asInt)
247-
// parseUnsignedIntRadix()
248-
// parseUnsignedIntRadixInvalidThrows()
-
// parseUnsignedIntBase16()
245+
parseUnsignedIntRadix()
246+
parseUnsignedIntRadixInvalidThrows()
247+
parseUnsignedIntBase16()
250248

251249
// JSBinaryOp 13 Utils.scala toUint
252250
// compareUnsigned()

javalib/src/main/scala/java/lang/Integer.scala

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,31 +97,53 @@ object Integer {
9797
val firstChar = s.charAt(0)
9898
val negative = signed && firstChar == '-'
9999

100-
val maxAbsValue: scala.Double = {
101-
if (!signed) 0xffffffffL.toDouble
102-
else if (negative) 0x80000000L.toDouble
103-
else 0x7fffffffL.toDouble
104-
}
105-
106100
var i = if (negative || firstChar == '+') 1 else 0
107101

108102
// We need at least one digit
109103
if (i >= s.length)
110104
fail()
111105

112-
var result: scala.Double = 0.0
113-
while (i != len) {
114-
val digit = Character.digitWithValidRadix(s.charAt(i), radix)
115-
result = result * radix + digit
116-
if (digit == -1 || result > maxAbsValue)
117-
fail()
118-
i += 1
119-
}
106+
if (LinkingInfo.targetPureWasm) {
107+
val maxAbsValue: scala.Long = {
108+
if (!signed) 0xffffffffL
109+
else if (negative) 0x80000000L
110+
else 0x7fffffffL
111+
}
112+
113+
var result: scala.Long = 0L
114+
while (i != len) {
115+
val digit = Character.digitWithValidRadix(s.charAt(i), radix)
116+
result = result * radix + digit
117+
if (digit == -1 || result > maxAbsValue)
118+
fail()
119+
i += 1
120+
}
120121

121-
if (negative)
122-
asInt(-result)
123-
else
124-
asInt(result)
122+
if (negative)
123+
-result.toInt
124+
else
125+
result.toInt
126+
} else {
127+
val maxAbsValue: scala.Double = {
128+
if (!signed) 0xffffffffL.toDouble
129+
else if (negative) 0x80000000L.toDouble
130+
else 0x7fffffffL.toDouble
131+
}
132+
133+
var result: scala.Double = 0.0
134+
while (i != len) {
135+
val digit = Character.digitWithValidRadix(s.charAt(i), radix)
136+
result = result * radix + digit
137+
if (digit == -1 || result > maxAbsValue)
138+
fail()
139+
i += 1
140+
}
141+
142+
if (negative)
143+
asInt(-result)
144+
else
145+
asInt(result)
146+
}
125147
}
126148

127149
@inline def toString(i: scala.Int): String = "" + i

0 commit comments

Comments
 (0)
0