Skip to content

Commit 90c5f64

Browse files
committed
Scala.js: Fix references to fields in other compilation units.
1 parent b9792c3 commit 90c5f64

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

compiler/src/dotty/tools/backend/sjs/JSEncoding.scala

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package dotty.tools.backend.sjs
22

3+
import scala.annotation.tailrec
4+
35
import scala.collection.mutable
46

57
import dotty.tools.FatalError
68

79
import dotty.tools.dotc.core._
10+
import Decorators._
811
import Periods._
912
import SymDenotations._
1013
import Contexts._
14+
import Flags._
1115
import Types._
1216
import Symbols._
1317
import Denotations._
@@ -103,11 +107,17 @@ object JSEncoding {
103107
js.Ident(localNames.localSymbolName(sym), Some(sym.unexpandedName.decoded))
104108
}
105109

110+
private[this] var allRefClassesCache: Set[Symbol] = _
106111
private def allRefClasses(implicit ctx: Context): Set[Symbol] = {
107-
//TODO
108-
/*(Set(ObjectRefClass, VolatileObjectRefClass) ++
109-
refClass.values ++ volatileRefClass.values)*/
110-
Set()
112+
if (allRefClassesCache == null) {
113+
val baseNames = List("Object", "Boolean", "Character", "Byte", "Short",
114+
"Int", "Long", "Float", "Double")
115+
val fullNames = baseNames.flatMap { base =>
116+
List(s"scala.runtime.${base}Ref", s"scala.runtime.Volatile${base}Ref")
117+
}
118+
allRefClassesCache = fullNames.map(name => ctx.requiredClass(name)).toSet
119+
}
120+
allRefClassesCache
111121
}
112122

113123
def encodeFieldSym(sym: Symbol)(
@@ -120,14 +130,19 @@ object JSEncoding {
120130
if (name0.charAt(name0.length()-1) != ' ') name0
121131
else name0.substring(0, name0.length()-1)
122132

133+
@tailrec
134+
def superClassCount(sym: Symbol, acc: Int): Int =
135+
if (sym == defn.ObjectClass) acc
136+
else superClassCount(sym.asClass.superClass, acc + 1)
137+
123138
/* We have to special-case fields of Ref types (IntRef, ObjectRef, etc.)
124139
* because they are emitted as private by our .scala source files, but
125140
* they are considered public at use site since their symbols come from
126141
* Java-emitted .class files.
127142
*/
128143
val idSuffix =
129144
if (sym.is(Flags.Private) || allRefClasses.contains(sym.owner))
130-
sym.owner.asClass.baseClasses.size.toString
145+
superClassCount(sym.owner, 0).toString
131146
else
132147
"f"
133148

project/Build.scala

+1
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,7 @@ object Build {
948948
(
949949
(dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** "IntTest.scala").get
950950
++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "IntegerTest.scala").get
951+
++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "ObjectTest.scala").get
951952
++ (dir / "shared/src/test/require-jdk8/org/scalajs/testsuite/javalib/util" ** "Base64Test.scala").get
952953
++ (dir / "shared/src/test/scala/org/scalajs/testsuite/utils" ** "*.scala").get
953954
)

0 commit comments

Comments
 (0)