Skip to content

Commit dcdca21

Browse files
committed
Implemented valhalla value classes.
1 parent 4247597 commit dcdca21

Some content is hidden

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

46 files changed

+412
-17
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ trait BCodeSkelBuilder extends BCodeHelpers {
415415
)
416416
cnode.fields.add(jfield)
417417
emitAnnotations(jfield, f.annotations)
418+
419+
if(f.denot.info.isValhallaValueClassType)
420+
cnode.visitLoadableDescriptors(jfield.desc)
418421
}
419422

420423
} // end of method addClassFields()

compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I, val frontendAcce
304304
.addFlagIf(sym.isStaticMember, ACC_STATIC)
305305
.addFlagIf(sym.is(Bridge), ACC_BRIDGE | ACC_SYNTHETIC)
306306
.addFlagIf(sym.is(Artifact), ACC_SYNTHETIC)
307-
.addFlagIf(sym.isClass && !sym.isInterface, ACC_SUPER)
307+
.addFlagIf(sym.isClass && !sym.isInterface && !sym.isValhallaValueClass, ACC_SUPER)
308308
.addFlagIf(sym.isAllOf(JavaEnum), ACC_ENUM)
309309
.addFlagIf(sym.is(JavaVarargs), ACC_VARARGS)
310310
.addFlagIf(sym.is(Synchronized), ACC_SYNCHRONIZED)
@@ -319,5 +319,6 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I, val frontendAcce
319319
.addFlagIf(sym.hasAnnotation(TransientAttr), ACC_TRANSIENT)
320320
.addFlagIf(sym.hasAnnotation(VolatileAttr), ACC_VOLATILE)
321321
.addFlagIf(!sym.is(Mutable), ACC_FINAL)
322+
.addFlagIf(sym.denot.owner.isValhallaValueClass, ACC_STRICT)
322323
}
323324
}

compiler/src/dotty/tools/backend/jvm/BackendUtils.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class BackendUtils(val postProcessor: PostProcessor) {
1919
import bTypes.*
2020
import coreBTypes.jliLambdaMetaFactoryAltMetafactoryHandle
2121

22-
lazy val classfileVersion: Int = BackendUtils.classfileVersionMap(compilerSettings.target.toInt)
22+
lazy val classfileVersion: Int = if compilerSettings.experimental then (69 + (65535 << 16)) else BackendUtils.classfileVersionMap(compilerSettings.target.toInt)
2323

2424
lazy val extraProc: Int = {
2525
import GenBCodeOps.addFlagIf

compiler/src/dotty/tools/backend/jvm/PostProcessorFrontendAccess.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ object PostProcessorFrontendAccess {
5252
sealed trait CompilerSettings {
5353
def debug: Boolean
5454
def target: String // javaOutputVersion
55+
def experimental: Boolean
5556

5657
def dumpClassesDirectory: Option[String]
5758
def outputDirectory: AbstractFile
@@ -120,6 +121,8 @@ object PostProcessorFrontendAccess {
120121
release
121122
case (None, None) => "8" // least supported version by default
122123

124+
override val experimental = s.YvalueClasses.value
125+
123126
override val debug: Boolean = ctx.debug
124127
override val dumpClassesDirectory: Option[String] = s.Xdumpclasses.valueSetByUser
125128
override val outputDirectory: AbstractFile = s.outputDir.value

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,10 @@ object desugar {
703703
def isEnumCase = mods.isEnumCase
704704
def isNonEnumCase = !isEnumCase && (isCaseClass || isCaseObject)
705705
val isValueClass = parents.nonEmpty && isAnyVal(parents.head)
706+
val isValhallaVC = isValueClass && mods.annotations.exists{ annot => annot match
707+
case Apply(Select(New(Ident(annotName)), _), _) => annotName eq tpnme.valhalla
708+
case _ => false
709+
}
706710
// This is not watertight, but `extends AnyVal` will be replaced by `inline` later.
707711
val caseClassInScala2Library = isCaseClass && Feature.shouldBehaveAsScala2
708712

@@ -1028,7 +1032,7 @@ object desugar {
10281032
}
10291033
else if (companionMembers.nonEmpty || companionDerived.nonEmpty || isEnum)
10301034
companionDefs(anyRef, companionMembers)
1031-
else if isValueClass && !isObject then
1035+
else if isValueClass && !isObject && !isValhallaVC then
10321036
companionDefs(anyRef, Nil)
10331037
else Nil
10341038

compiler/src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
552552
def wrapArrayMethodName(elemtp: Type)(using Context): TermName = {
553553
val elemCls = elemtp.classSymbol
554554
if (elemCls.isPrimitiveValueClass) nme.wrapXArray(elemCls.name)
555-
else if (elemCls.derivesFrom(defn.ObjectClass) && !elemCls.isNotRuntimeClass) nme.wrapRefArray
555+
else if ((elemCls.derivesFrom(defn.ObjectClass) || elemCls.isValhallaValueClass) && !elemCls.isNotRuntimeClass) nme.wrapRefArray
556556
else nme.genericWrapArray
557557
}
558558

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ private sealed trait YSettings:
474474
val YccLog: Setting[Boolean] = BooleanSetting(ForkSetting, "Ycc-log", "Used in conjunction with captureChecking language import, print tracing and debug info")
475475
val YccVerbose: Setting[Boolean] = BooleanSetting(ForkSetting, "Ycc-verbose", "Print root capabilities with more details")
476476
val YccPrintSetup: Setting[Boolean] = BooleanSetting(ForkSetting, "Ycc-print-setup", "Used in conjunction with captureChecking language import, print trees after cc.Setup phase")
477+
val YvalueClasses: Setting[Boolean] = BooleanSetting(ForkSetting, "Yvalue-classes", "value classes")
477478

478479
/** Area-specific debug output */
479480
val YexplainLowlevel: Setting[Boolean] = BooleanSetting(ForkSetting, "Yexplain-lowlevel", "When explaining type errors, show types at a lower level.")

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,7 @@ class Definitions {
11131113
@tu lazy val PublicInBinaryAnnot: ClassSymbol = requiredClass("scala.annotation.publicInBinary")
11141114
@tu lazy val WitnessNamesAnnot: ClassSymbol = requiredClass("scala.annotation.internal.WitnessNames")
11151115
@tu lazy val StableNullAnnot: ClassSymbol = requiredClass("scala.annotation.stableNull")
1116+
@tu lazy val ValhallaAnnot: ClassSymbol = requiredClass("scala.annotation.valhalla")
11161117

11171118
@tu lazy val JavaRepeatableAnnot: ClassSymbol = requiredClass("java.lang.annotation.Repeatable")
11181119

compiler/src/dotty/tools/dotc/core/ImplicitNullInterop.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ object ImplicitNullInterop:
115115
case tp: TypeRef =>
116116
// We don't modify value types because they're non-nullable even in Java.
117117
val isValueOrSpecialClass =
118-
tp.symbol.isValueClass
118+
(tp.symbol.isValueClass && !tp.symbol.isValhallaValueClass)
119119
|| tp.isRef(defn.NullClass)
120120
|| tp.isRef(defn.NothingClass)
121121
|| tp.isRef(defn.UnitClass)

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ object StdNames {
664664
val valueOf : N = "valueOf"
665665
val fromOrdinal: N = "fromOrdinal"
666666
val values: N = "values"
667+
val valhalla: N = "valhalla"
667668
val view_ : N = "view"
668669
val varargGetter : N = "varargGetter"
669670
val wait_ : N = "wait"

0 commit comments

Comments
 (0)