Skip to content

Commit

Permalink
fix: Multiple runtime fixes/improvments (#3766)
Browse files Browse the repository at this point in the history
* Fix order of runttime.Array.copy check for len=0
* Use java.lang.StringBuilder instead of collection.mutable.StringBuilder whenever possible
* Remove Mac version check in time_nano.c and time.c
  • Loading branch information
WojciechMazur committed Feb 16, 2024
1 parent 5a61c67 commit e3ef76f
Show file tree
Hide file tree
Showing 29 changed files with 73 additions and 53 deletions.
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/io/BufferedReader.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package java.io

import java.{lang => jl}
import java.util.Spliterators
import java.util.function.Consumer
import java.util.stream.{Stream, StreamSupport}
Expand Down Expand Up @@ -74,7 +75,7 @@ class BufferedReader(in: Reader, sz: Int) extends Reader {
def readLine(): String = {
ensureOpen()

val sb = new java.lang.StringBuilder(80)
val sb = new jl.StringBuilder(80)

while (prepareRead() && buf(pos) != '\n' && buf(pos) != '\r') {
sb.append(buf(pos))
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/io/DataInputStream.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package java.io

import java.nio.ByteBuffer
import java.{lang => jl}

import scala.annotation.tailrec

Expand Down Expand Up @@ -124,7 +125,7 @@ class DataInputStream(in: InputStream)
var v = in.read()
if (v == -1) null
else {
val builder = new StringBuilder
val builder = new jl.StringBuilder
var c = v.toChar
while (v != -1 && c != '\n' && c != '\r') {
builder.append(c)
Expand Down
6 changes: 5 additions & 1 deletion javalib/src/main/scala/java/io/File.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package java.io

import java.{lang => jl}
import java.net.URI
import java.nio.charset.StandardCharsets
import java.nio.file.{FileSystems, Path}
Expand Down Expand Up @@ -616,7 +617,10 @@ class File(_path: String) extends Serializable with Comparable[File] {
new URI(
"file",
null,
new StringBuilder(path.length + 1).append('/').append(path).toString,
new jl.StringBuilder(path.length + 1)
.append('/')
.append(path)
.toString,
null,
null
)
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/lang/Double.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import scalanative.runtime.Intrinsics

import java.lang.IEEE754Helpers.parseIEEE754
import java.lang.constant.{Constable, ConstantDesc}
import java.{lang => jl}

final class Double(val _value: scala.Double)
extends Number
Expand Down Expand Up @@ -241,7 +242,7 @@ object Double {
if (negative) "-0x0.0p0"
else "0x0.0p0"
} else {
val hexString = new java.lang.StringBuilder(24)
val hexString = new jl.StringBuilder(24)

if (negative) {
hexString.append("-0x")
Expand Down
9 changes: 5 additions & 4 deletions javalib/src/main/scala/java/lang/String.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import java.nio.charset._
import java.util.Objects
import java.util.ScalaOps._
import java.lang.constant.{Constable, ConstantDesc}
import java.{lang => jl}
import scala.annotation.{switch, tailrec}
import _String.{string2_string, _string2string}

Expand Down Expand Up @@ -656,7 +657,7 @@ final class _String()

if (ts.isEmpty()) {
val buffer =
new java.lang.StringBuilder(count + (rs.length() * (count + 1)))
new jl.StringBuilder(count + (rs.length() * (count + 1)))
buffer.append(rs)

var i = 0
Expand All @@ -669,7 +670,7 @@ final class _String()
return buffer.toString
}

val buffer = new java.lang.StringBuilder(count + rs.length)
val buffer = new jl.StringBuilder(count + rs.length)
val tl = target.length()
var tail = 0
while ({
Expand Down Expand Up @@ -1035,7 +1036,7 @@ for (cp <- 0 to Character.MAX_CODE_POINT) {

private def toCase(convert: Int => Int): _String = {
if (count == 0) return this
val buf = new java.lang.StringBuilder(count)
val buf = new jl.StringBuilder(count)
var i = offset
while (i < offset + count) {
val high = value(i)
Expand Down Expand Up @@ -1090,7 +1091,7 @@ for (cp <- 0 to Character.MAX_CODE_POINT) {
val replacement = replacementAtIndex(i)
if (replacement != null) {
if (prep == null) {
prep = new java.lang.StringBuilder(len * 2)
prep = new jl.StringBuilder(len * 2)
}
prep.append(this.substring(startOfSegment, i))
prep.append(replacement)
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/net/Inet6Address.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import scalanative.unsafe._
import scalanative.unsigned._

import java.{util => ju}
import java.{lang => jl}

import scala.scalanative.posix.net.`if`._
import scala.scalanative.posix.stddef
Expand Down Expand Up @@ -182,7 +183,7 @@ object Inet6Address {
* The math need not be exact, the buffer will grow if we guess wrong.
*/

val buffer = new StringBuilder(64)
val buffer = new jl.StringBuilder(64)
var isFirst = true

// IPv6 binary addresses are defined as 16 bytes, so loop count is known.
Expand Down
7 changes: 4 additions & 3 deletions javalib/src/main/scala/java/net/URIEncoderDecoder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package java.net

import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets
import java.{lang => jl}

// ScalaNative specific
private[net] object URIEncoderDecoder {
Expand Down Expand Up @@ -56,7 +57,7 @@ private[net] object URIEncoderDecoder {
}

def quoteIllegal(s: String, legal: String): String = {
val buf: StringBuilder = new StringBuilder()
val buf = new jl.StringBuilder()
for (i <- 0 until s.length) {
val ch: Char = s.charAt(i)
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
Expand All @@ -78,7 +79,7 @@ private[net] object URIEncoderDecoder {
}

def encodeOthers(s: String): String = {
val buf: StringBuilder = new StringBuilder()
val buf = new jl.StringBuilder()
for (i <- 0 until s.length) {
val ch: Char = s.charAt(i)
if (ch <= 127) {
Expand All @@ -96,7 +97,7 @@ private[net] object URIEncoderDecoder {
}

def decode(s: String): String = {
val result: StringBuilder = new StringBuilder()
val result = new jl.StringBuilder()
val out: ByteArrayOutputStream = new ByteArrayOutputStream()
var i: Int = 0
while (i < s.length) {
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/net/URLEncoder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package java.net
// Ported from Harmony

import scala.annotation.tailrec
import java.{lang => jl}

object URLEncoder {
private val digits = "0123456789ABCDEF".toCharArray
Expand All @@ -13,7 +14,7 @@ object URLEncoder {
}
// check for UnsupportedEncodingException
"".getBytes(enc)
val buf = new java.lang.StringBuilder(s.length + 16)
val buf = new jl.StringBuilder(s.length + 16)
var start = -1
@tailrec
def loop(i: Int): Unit = {
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/nio/channels/FileChannel.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import java.nio.{ByteBuffer, MappedByteBuffer}
import java.nio.channels.spi.AbstractInterruptibleChannel
import java.nio.file._
import java.nio.file.attribute.FileAttribute
import java.{lang => jl}

import java.util.{HashSet, Set}

Expand Down Expand Up @@ -105,7 +106,7 @@ object FileChannel {
}
}

val mode = new StringBuilder("r")
val mode = new jl.StringBuilder("r")
if (writing) mode.append("w")

if (!Files.exists(path, Array.empty)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package java.nio.file.attribute

import java.util.{HashSet, Set}
import java.{lang => jl}

object PosixFilePermissions {
def asFileAttribute(
Expand Down Expand Up @@ -29,7 +30,7 @@ object PosixFilePermissions {

def toString(perms: Set[PosixFilePermission]): String = {
import PosixFilePermission._
val builder = new StringBuilder
val builder = new jl.StringBuilder
if (perms.contains(OWNER_READ)) builder.append('r')
else builder.append('-')
if (perms.contains(OWNER_WRITE)) builder.append('w')
Expand Down
7 changes: 4 additions & 3 deletions javalib/src/main/scala/java/util/AbstractMap.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package java.util

import scala.annotation.tailrec
import java.{lang => jl}

import ScalaOps._

Expand Down Expand Up @@ -60,7 +61,7 @@ object AbstractMap {
* java.lang.StringBuilder for Scala Native
*/
override def toString(): String =
new java.lang.StringBuilder()
new jl.StringBuilder()
.append(getKey().asInstanceOf[Object])
.append("=")
.append(getValue().asInstanceOf[Object])
Expand Down Expand Up @@ -91,7 +92,7 @@ object AbstractMap {
* java.lang.StringBuilder for Scala Native
*/
override def toString(): String =
new java.lang.StringBuilder()
new jl.StringBuilder()
.append(getKey().asInstanceOf[Object])
.append("=")
.append(getValue().asInstanceOf[Object])
Expand Down Expand Up @@ -204,7 +205,7 @@ abstract class AbstractMap[K, V] protected () extends java.util.Map[K, V] {
* java.lang.StringBuilder for Scala Native
*/
override def toString(): String = {
val sb = new java.lang.StringBuilder("{")
val sb = new jl.StringBuilder("{")
var first = true
val iter = entrySet().iterator()
while (iter.hasNext()) {
Expand Down
4 changes: 3 additions & 1 deletion javalib/src/main/scala/java/util/ScalaOps.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

package java.util

import java.{lang => jl}

/** Make some Scala collection APIs available on Java collections. */
private[java] object ScalaOps {

Expand Down Expand Up @@ -156,7 +158,7 @@ private[java] object ScalaOps {
* java.lang.StringBuilder for Scala Native
*/
@inline def mkString(start: String, sep: String, end: String): String = {
val sb = new java.lang.StringBuilder(start)
val sb = new jl.StringBuilder(start)
var first = true
while (__self.hasNext()) {
if (first)
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/util/StringJoiner.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Extensively re-written for Scala Native.

package java.util
import java.{lang => jl}

final class StringJoiner private (
delimiter: String,
Expand All @@ -27,7 +28,7 @@ final class StringJoiner private (
* Add an arbitrary guestimate > default 16 excess capacity.
*/
private val builder =
new java.lang.StringBuilder(prefixLength + 40 + suffix.length())
new jl.StringBuilder(prefixLength + 40 + suffix.length())

/* The custom value to return if empty, set by `setEmptyValue` (nullable).
*/
Expand Down
3 changes: 2 additions & 1 deletion javalib/src/main/scala/java/util/Vector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package java.util

import java.io._
import java.util._
import java.{lang => jl}

@SerialVersionUID(-2767605614048989439L)
object Vector {
Expand Down Expand Up @@ -426,7 +427,7 @@ class Vector[E <: AnyRef](
override def toString: String = synchronized {
if (elementCount == 0) return "[]"
val length = elementCount - 1
val buffer = new java.lang.StringBuilder(elementCount * 16)
val buffer = new jl.StringBuilder(elementCount * 16)
buffer.append('[')
for (i <- 0 until length) {
if (elementData(i) eq this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package java.util.concurrent

import java.io.Serializable
import java.{lang => jl}
import java.util
import java.util._
import java.util.NoSuchElementException
Expand Down Expand Up @@ -1470,7 +1471,7 @@ object ConcurrentHashMap {
}

override final def toString(): String = {
val sb = new java.lang.StringBuilder()
val sb = new jl.StringBuilder()
sb.append('[')
val it = iterator()
var break = false
Expand Down Expand Up @@ -4073,7 +4074,7 @@ class ConcurrentHashMap[K <: AnyRef, V <: AnyRef]()
if ({ t = table; t } == null) 0
else t.length
val it = new Traverser[K, V](t, f, 0, f)
val sb = new java.lang.StringBuilder
val sb = new jl.StringBuilder
sb.append('{')
var p: Node[K, V] = null
var break = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package scala.scalanative.nio.fs.unix

import java.io.IOException
import java.lang.Iterable
import java.lang.StringBuilder
import java.{lang => jl}
import java.nio.file.{
FileStore,
FileSystem,
Expand Down Expand Up @@ -41,7 +41,7 @@ class UnixFileSystem(
override def getPath(first: String, more: Array[String]): Path = {
if (more.length == 0) new UnixPath(this, first)
else {
val sb = new StringBuilder(first)
val sb = new jl.StringBuilder(first)
more.foreach { element =>
if (element.length > 0) {
if (sb.length() > 0) sb.append('/')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package scala.scalanative.nio.fs.windows

import java.lang.Iterable
import java.lang.StringBuilder
import java.{lang => jl}
import java.nio.charset.StandardCharsets
import java.nio.file.{
FileStore,
Expand Down Expand Up @@ -34,7 +35,7 @@ class WindowsFileSystem(fsProvider: WindowsFileSystemProvider)
if (more.length == 0) WindowsPathParser(first)(this)
else {
val sep = getSeparator()
val sb = new StringBuilder(first)
val sb = new jl.StringBuilder(first)
more.foreach { element =>
if (element.length > 0) {
if (sb.length() > 0) sb.append(sep)
Expand Down
5 changes: 0 additions & 5 deletions nativelib/src/main/resources/scala-native/time_nano.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@
#include "win_freq.h"
#else
#include <time.h>
#if defined(__APPLE__)
#if (__MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12)
#error "macOS version must be 10.12 or greater"
#endif
#endif // defined(__APPLE__)
#endif // defined(_WIN32)

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package scala.scalanative.reflect

import scala.collection.mutable
import java.{lang => jl}

final class LoadableModuleClass private[reflect] (
val runtimeClass: Class[_],
Expand Down Expand Up @@ -113,7 +114,7 @@ final class InvokableConstructor private[reflect] (
}

override def toString: String = {
val builder = new mutable.StringBuilder("InvokableContructor")
val builder = new jl.StringBuilder("InvokableContructor")
builder.append("(")
for (tpe <- parameterTypes) {
builder.append(tpe.getName)
Expand Down

0 comments on commit e3ef76f

Please sign in to comment.