Skip to content

Commit eb5773c

Browse files
committed
Unify TreeHash and Versioned into a single Version
1 parent 714421d commit eb5773c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+633
-409
lines changed

compiler/src/main/scala/org/scalajs/nscplugin/GenJSCode.scala

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import org.scalajs.ir.{Trees => js, Types => jstpe, ClassKind, Hashers, Original
3030
import org.scalajs.ir.Names.{LocalName, FieldName, SimpleMethodName, MethodName, ClassName}
3131
import org.scalajs.ir.OriginalName.NoOriginalName
3232
import org.scalajs.ir.Trees.OptimizerHints
33+
import org.scalajs.ir.Version.Unversioned
3334

3435
import org.scalajs.nscplugin.util.{ScopedVar, VarBox}
3536
import ScopedVar.withScopedVars
@@ -1217,7 +1218,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
12171218

12181219
js.MethodDef(flags, methodIdent, originalName, jsParams, resultType, Some {
12191220
genApplyMethod(genLoadModule(moduleClass), m, jsParams.map(_.ref))
1220-
})(OptimizerHints.empty, None)
1221+
})(OptimizerHints.empty, Unversioned)
12211222
}
12221223
}
12231224

@@ -1314,7 +1315,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
13141315
Nil,
13151316
jstpe.NoType,
13161317
Some(stats))(
1317-
OptimizerHints.empty, None)
1318+
OptimizerHints.empty, Unversioned)
13181319
}
13191320

13201321
private def genRegisterReflectiveInstantiation(sym: Symbol)(
@@ -1496,7 +1497,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
14961497

14971498
val constructorDef = js.JSConstructorDef(
14981499
js.MemberFlags.empty.withNamespace(js.MemberNamespace.Constructor),
1499-
formalArgs, restParam, constructorBody)(OptimizerHints.empty, None)
1500+
formalArgs, restParam, constructorBody)(OptimizerHints.empty, Unversioned)
15001501

15011502
(jsClassCaptures, constructorDef)
15021503
}
@@ -1882,7 +1883,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
18821883
val jsMethodDef = if (isAbstractMethod(dd)) {
18831884
js.MethodDef(js.MemberFlags.empty, methodName, originalName,
18841885
jsParams, toIRType(sym.tpe.resultType), None)(
1885-
OptimizerHints.empty, None)
1886+
OptimizerHints.empty, Unversioned)
18861887
} else {
18871888
val shouldMarkInline = {
18881889
sym.hasAnnotation(InlineAnnotationClass) ||
@@ -1906,7 +1907,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
19061907
js.MethodDef(
19071908
js.MemberFlags.empty.withNamespace(namespace), methodName,
19081909
originalName, jsParams, jstpe.NoType, Some(genStat(dd.rhs)))(
1909-
optimizerHints, None)
1910+
optimizerHints, Unversioned)
19101911
} else {
19111912
val resultIRType = toIRType(sym.tpe.resultType)
19121913
val namespace = {
@@ -2007,7 +2008,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
20072008
val newBody = body.map(
20082009
b => transformer.transform(b, isStat = resultType == jstpe.NoType))
20092010
js.MethodDef(flags, methodName, originalName, newParams, resultType,
2010-
newBody)(methodDef.optimizerHints, None)(methodDef.pos)
2011+
newBody)(methodDef.optimizerHints, Unversioned)(methodDef.pos)
20112012
}
20122013

20132014
/** Patches the type of selected param defs in a [[js.MethodDef]].
@@ -2043,7 +2044,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
20432044
val newBody = body.map(
20442045
b => transformer.transform(b, isStat = resultType == jstpe.NoType))
20452046
js.MethodDef(flags, methodName, originalName, newParams, resultType,
2046-
newBody)(methodDef.optimizerHints, None)(methodDef.pos)
2047+
newBody)(methodDef.optimizerHints, Unversioned)(methodDef.pos)
20472048
}
20482049

20492050
/** Generates the JSNativeMemberDef of a JS native method. */
@@ -2155,7 +2156,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
21552156
}
21562157
js.MethodDef(flags, methodName, originalName, jsParams, resultIRType,
21572158
Some(body))(
2158-
optimizerHints, None)
2159+
optimizerHints, Unversioned)
21592160
} else {
21602161
assert(!namespace.isStatic, tree.pos)
21612162

@@ -2173,7 +2174,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
21732174

21742175
js.MethodDef(flags, methodName, originalName,
21752176
thisParamDef :: jsParams, resultIRType, Some(genBody()))(
2176-
optimizerHints, None)
2177+
optimizerHints, Unversioned)
21772178
}
21782179
}
21792180
}
@@ -6248,7 +6249,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
62486249
ir.Names.ObjectClass,
62496250
js.MethodIdent(ir.Names.NoArgConstructorName),
62506251
Nil)(jstpe.NoType)))))(
6251-
js.OptimizerHints.empty, None)
6252+
js.OptimizerHints.empty, Unversioned)
62526253
}
62536254

62546255
// Compute the set of method symbols that we need to implement
@@ -6302,7 +6303,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
63026303
js.MethodDef(js.MemberFlags.empty, encodeMethodSym(sam),
63036304
originalNameOfMethod(sam), jsParams, resultType,
63046305
Some(body))(
6305-
js.OptimizerHints.empty, None)
6306+
js.OptimizerHints.empty, Unversioned)
63066307
}
63076308

63086309
// The class definition
@@ -6397,7 +6398,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
63976398
NoOriginalName,
63986399
paramDefs,
63996400
jstpe.AnyType,
6400-
Some(body))(OptimizerHints.empty, None)
6401+
Some(body))(OptimizerHints.empty, Unversioned)
64016402
}
64026403
}
64036404

compiler/src/main/scala/org/scalajs/nscplugin/GenJSExports.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.scalajs.ir.{Trees => js, Types => jstpe}
2424
import org.scalajs.ir.Names.LocalName
2525
import org.scalajs.ir.OriginalName.NoOriginalName
2626
import org.scalajs.ir.Trees.OptimizerHints
27+
import org.scalajs.ir.Version.Unversioned
2728

2829
import org.scalajs.nscplugin.util.ScopedVar
2930
import ScopedVar.withScopedVars
@@ -264,7 +265,7 @@ trait GenJSExports[G <: Global with Singleton] extends SubComponent {
264265
reporter.error(alts.head.pos,
265266
s"Conflicting properties and methods for ${classSym.fullName}::$name.")
266267
implicit val pos = alts.head.pos
267-
js.JSPropertyDef(js.MemberFlags.empty, genExpr(name), None, None)(None)
268+
js.JSPropertyDef(js.MemberFlags.empty, genExpr(name), None, None)(Unversioned)
268269
} else {
269270
genMemberExportOrDispatcher(name, isProp, alts, static = false)
270271
}
@@ -317,7 +318,7 @@ trait GenJSExports[G <: Global with Singleton] extends SubComponent {
317318
}
318319
}
319320

320-
js.JSPropertyDef(flags, genExpr(jsName), getterBody, setterArgAndBody)(None)
321+
js.JSPropertyDef(flags, genExpr(jsName), getterBody, setterArgAndBody)(Unversioned)
321322
}
322323

323324
/** generates the exporter function (i.e. exporter for non-properties) for
@@ -352,7 +353,7 @@ trait GenJSExports[G <: Global with Singleton] extends SubComponent {
352353
genOverloadDispatch(jsName, overloads, jstpe.AnyType)
353354

354355
js.JSMethodDef(flags, genExpr(jsName), formalArgs, restParam, body)(
355-
OptimizerHints.empty, None)
356+
OptimizerHints.empty, Unversioned)
356357
}
357358

358359
def genOverloadDispatch(jsName: JSName, alts: List[Exported], tpe: jstpe.Type)(

ir/shared/src/main/scala/org/scalajs/ir/Hashers.scala

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
package org.scalajs.ir
1414

1515
import java.io.{DataOutputStream, OutputStream}
16-
import java.util.Arrays
1716

1817
import Names._
1918
import Trees._
@@ -23,8 +22,9 @@ import Tags._
2322
object Hashers {
2423

2524
def hashMethodDef(methodDef: MethodDef): MethodDef = {
26-
if (methodDef.hash.isDefined) methodDef
27-
else {
25+
if (methodDef.version.isHash) {
26+
methodDef
27+
} else {
2828
val hasher = new TreeHasher()
2929
val MethodDef(flags, name, originalName, args, resultType, body) = methodDef
3030

@@ -40,12 +40,12 @@ object Hashers {
4040
val hash = hasher.finalizeHash()
4141

4242
MethodDef(flags, name, originalName, args, resultType, body)(
43-
methodDef.optimizerHints, Some(hash))(methodDef.pos)
43+
methodDef.optimizerHints, hash)(methodDef.pos)
4444
}
4545
}
4646

4747
def hashJSConstructorDef(ctorDef: JSConstructorDef): JSConstructorDef = {
48-
if (ctorDef.hash.isDefined) {
48+
if (ctorDef.version.isHash) {
4949
ctorDef
5050
} else {
5151
val hasher = new TreeHasher()
@@ -62,13 +62,14 @@ object Hashers {
6262
val hash = hasher.finalizeHash()
6363

6464
JSConstructorDef(flags, params, restParam, body)(
65-
ctorDef.optimizerHints, Some(hash))(ctorDef.pos)
65+
ctorDef.optimizerHints, hash)(ctorDef.pos)
6666
}
6767
}
6868

6969
def hashJSMethodDef(methodDef: JSMethodDef): JSMethodDef = {
70-
if (methodDef.hash.isDefined) methodDef
71-
else {
70+
if (methodDef.version.isHash) {
71+
methodDef
72+
} else {
7273
val hasher = new TreeHasher()
7374
val JSMethodDef(flags, name, params, restParam, body) = methodDef
7475

@@ -83,13 +84,14 @@ object Hashers {
8384
val hash = hasher.finalizeHash()
8485

8586
JSMethodDef(flags, name, params, restParam, body)(
86-
methodDef.optimizerHints, Some(hash))(methodDef.pos)
87+
methodDef.optimizerHints, hash)(methodDef.pos)
8788
}
8889
}
8990

9091
def hashJSPropertyDef(propDef: JSPropertyDef): JSPropertyDef = {
91-
if (propDef.hash.isDefined) propDef
92-
else {
92+
if (propDef.version.isHash) {
93+
propDef
94+
} else {
9395
val hasher = new TreeHasher()
9496
val JSPropertyDef(flags, name, getterBody, setterArgAndBody) = propDef
9597

@@ -104,7 +106,7 @@ object Hashers {
104106

105107
val hash = hasher.finalizeHash()
106108

107-
JSPropertyDef(flags, name, getterBody, setterArgAndBody)(Some(hash))(propDef.pos)
109+
JSPropertyDef(flags, name, getterBody, setterArgAndBody)(hash)(propDef.pos)
108110
}
109111
}
110112

@@ -127,22 +129,6 @@ object Hashers {
127129
optimizerHints)
128130
}
129131

130-
def hashesEqual(x: TreeHash, y: TreeHash): Boolean =
131-
Arrays.equals(x.hash, y.hash)
132-
133-
def hashAsVersion(hash: TreeHash): String = {
134-
// 2 chars per byte, 20 bytes in a hash
135-
val size = 2 * 20
136-
val builder = new StringBuilder(size)
137-
138-
def hexDigit(digit: Int): Char = Character.forDigit(digit, 16)
139-
140-
for (b <- hash.hash)
141-
builder.append(hexDigit((b >> 4) & 0x0f)).append(hexDigit(b & 0x0f))
142-
143-
builder.toString
144-
}
145-
146132
private final class TreeHasher {
147133
private[this] val digestBuilder = new SHA1.DigestBuilder
148134

@@ -159,8 +145,8 @@ object Hashers {
159145
})
160146
}
161147

162-
def finalizeHash(): TreeHash =
163-
new TreeHash(digestBuilder.finalizeDigest())
148+
def finalizeHash(): Version =
149+
Version.fromHash(digestBuilder.finalizeDigest())
164150

165151
def mixParamDef(paramDef: ParamDef): Unit = {
166152
mixPos(paramDef.pos)

ir/shared/src/main/scala/org/scalajs/ir/Serializers.scala

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import Position._
2626
import Trees._
2727
import Types._
2828
import Tags._
29+
import Version.Unversioned
2930

3031
import Utils.JumpBackByteArrayOutputStream
3132

@@ -646,7 +647,7 @@ object Serializers {
646647
val MethodDef(flags, name, originalName, args, resultType, body) = methodDef
647648

648649
writeByte(TagMethodDef)
649-
writeOptHash(methodDef.hash)
650+
writeOptHash(methodDef.version)
650651

651652
// Prepare for back-jump and write dummy length
652653
bufferUnderlying.markJump()
@@ -667,7 +668,7 @@ object Serializers {
667668
val JSConstructorDef(flags, args, restParam, body) = ctorDef
668669

669670
writeByte(TagJSConstructorDef)
670-
writeOptHash(ctorDef.hash)
671+
writeOptHash(ctorDef.version)
671672

672673
// Prepare for back-jump and write dummy length
673674
bufferUnderlying.markJump()
@@ -691,7 +692,7 @@ object Serializers {
691692
val JSMethodDef(flags, name, args, restParam, body) = methodDef
692693

693694
writeByte(TagJSMethodDef)
694-
writeOptHash(methodDef.hash)
695+
writeOptHash(methodDef.version)
695696

696697
// Prepare for back-jump and write dummy length
697698
bufferUnderlying.markJump()
@@ -711,7 +712,7 @@ object Serializers {
711712
val JSPropertyDef(flags, name, getter, setterArgAndBody) = propDef
712713

713714
writeByte(TagJSPropertyDef)
714-
writeOptHash(propDef.hash)
715+
writeOptHash(propDef.version)
715716

716717
// Prepare for back-jump and write dummy length
717718
bufferUnderlying.markJump()
@@ -979,10 +980,11 @@ object Serializers {
979980
}
980981
}
981982

982-
def writeOptHash(optHash: Option[TreeHash]): Unit = {
983-
buffer.writeBoolean(optHash.isDefined)
984-
for (hash <- optHash)
985-
buffer.write(hash.hash)
983+
def writeOptHash(version: Version): Unit = {
984+
val isHash = version.isHash
985+
buffer.writeBoolean(isHash)
986+
if (isHash)
987+
version.writeHash(buffer)
986988
}
987989

988990
def writeString(s: String): Unit =
@@ -1414,7 +1416,7 @@ object Serializers {
14141416
val newFlags = flags.withNamespace(MemberNamespace.Constructor)
14151417
val newBody = JSConstructorBody(beforeSuper, superCall, afterSuper)(body.pos)
14161418
val ctorDef = JSConstructorDef(newFlags, args, restParam, newBody)(
1417-
methodDef.optimizerHints, None)(methodDef.pos)
1419+
methodDef.optimizerHints, Unversioned)(methodDef.pos)
14181420
Hashers.hashJSConstructorDef(ctorDef)
14191421

14201422
case _ =>
@@ -1609,9 +1611,9 @@ object Serializers {
16091611
OptimizerHints.fromBits(readInt()), optHash)
16101612

16111613
case TagJSPropertyDef =>
1612-
val optHash = {
1614+
val optHash: Version = {
16131615
if (hacks.use12) {
1614-
None
1616+
Unversioned
16151617
} else {
16161618
val optHash = readOptHash()
16171619
// read and discard the length
@@ -1889,13 +1891,13 @@ object Serializers {
18891891
}
18901892
}
18911893

1892-
def readOptHash(): Option[TreeHash] = {
1894+
def readOptHash(): Version = {
18931895
if (readBoolean()) {
18941896
val hash = new Array[Byte](20)
18951897
buf.get(hash)
1896-
Some(new TreeHash(hash))
1898+
Version.fromHash(hash)
18971899
} else {
1898-
None
1900+
Unversioned
18991901
}
19001902
}
19011903

0 commit comments

Comments
 (0)