Skip to content

Commit 256b000

Browse files
remove newClassSymbol tastyVersion default argument
1 parent 62dce94 commit 256b000

File tree

17 files changed

+137
-106
lines changed

17 files changed

+137
-106
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import collection.{immutable, mutable}
1515
import util.{Property, SourceFile}
1616
import NameKinds.{TempResultName, OuterSelectName}
1717
import typer.ConstFold
18+
import dotty.tools.tasty.TastyFormat
1819

1920
import scala.annotation.tailrec
2021
import scala.collection.mutable.ListBuffer
@@ -386,7 +387,8 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
386387
if (head.isRef(defn.AnyClass)) defn.AnyRefType :: parents else head :: parents
387388
}
388389
else parents
389-
val cls = newNormalizedClassSymbol(owner, tpnme.ANON_CLASS, Synthetic | Final, parents1, coord = coord)
390+
val cls = newNormalizedClassSymbol(owner, tpnme.ANON_CLASS, Synthetic | Final, parents1, coord = coord,
391+
initTastyVersion = TastyFormat.currentTastyVersion)
390392
val constr = newConstructor(cls, Synthetic, Nil, Nil).entered
391393
val cdef = ClassDef(cls, DefDef(constr), body(cls))
392394
Block(cdef :: Nil, New(cls.typeRef, Nil))

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ class Definitions {
5050
newSymbol(owner, name, flags | Permanent, info)
5151

5252
private def newPermanentClassSymbol(owner: Symbol, name: TypeName, flags: FlagSet, infoFn: ClassSymbol => Type) =
53-
newClassSymbol(owner, name, flags | Permanent | NoInits | Open, infoFn)
53+
newClassSymbol(owner, name, flags | Permanent | NoInits | Open, infoFn, initTastyVersion = -1)
5454

5555
private def enterCompleteClassSymbol(owner: Symbol, name: TypeName, flags: FlagSet, parents: List[TypeRef]): ClassSymbol =
5656
enterCompleteClassSymbol(owner, name, flags, parents, newScope(owner.nestingLevel + 1))
5757

5858
private def enterCompleteClassSymbol(owner: Symbol, name: TypeName, flags: FlagSet, parents: List[TypeRef], decls: Scope) =
59-
newCompleteClassSymbol(owner, name, flags | Permanent | NoInits | Open, parents, decls).entered
59+
newCompleteClassSymbol(owner, name, flags | Permanent | NoInits | Open, parents, decls, initTastyVersion = -1).entered
6060

6161
private def enterTypeField(cls: ClassSymbol, name: TypeName, flags: FlagSet, scope: MutableScope) =
6262
scope.enter(newPermanentSymbol(cls, name, flags, TypeBounds.empty))
@@ -199,16 +199,16 @@ class Definitions {
199199
}
200200

201201
@tu lazy val RootClass: ClassSymbol = newPackageSymbol(
202-
NoSymbol, nme.ROOT, (root, rootcls) => ctx.base.rootLoader(root)).moduleClass.asClass
202+
NoSymbol, nme.ROOT, (root, rootcls) => ctx.base.rootLoader(root), initTastyVersion = -1).moduleClass.asClass
203203
@tu lazy val RootPackage: TermSymbol = newSymbol(
204204
NoSymbol, nme.ROOTPKG, PackageCreationFlags, TypeRef(NoPrefix, RootClass))
205205

206206
@tu lazy val EmptyPackageVal: TermSymbol = newPackageSymbol(
207-
RootClass, nme.EMPTY_PACKAGE, (emptypkg, emptycls) => ctx.base.rootLoader(emptypkg)).entered
207+
RootClass, nme.EMPTY_PACKAGE, (emptypkg, emptycls) => ctx.base.rootLoader(emptypkg), initTastyVersion = -1).entered
208208
@tu lazy val EmptyPackageClass: ClassSymbol = EmptyPackageVal.moduleClass.asClass
209209

210210
/** A package in which we can place all methods and types that are interpreted specially by the compiler */
211-
@tu lazy val OpsPackageVal: TermSymbol = newCompletePackageSymbol(RootClass, nme.OPS_PACKAGE).entered
211+
@tu lazy val OpsPackageVal: TermSymbol = newCompletePackageSymbol(RootClass, nme.OPS_PACKAGE, initTastyVersion = -1).entered
212212
@tu lazy val OpsPackageClass: ClassSymbol = OpsPackageVal.moduleClass.asClass
213213

214214
@tu lazy val ScalaPackageVal: TermSymbol = requiredPackage(nme.scala)
@@ -446,7 +446,7 @@ class Definitions {
446446
Any_toString, Any_##, Any_getClass, Any_isInstanceOf, Any_typeTest, Object_eq, Object_ne)
447447

448448
@tu lazy val AnyKindClass: ClassSymbol = {
449-
val cls = newCompleteClassSymbol(ScalaPackageClass, tpnme.AnyKind, AbstractFinal | Permanent, Nil, newScope(0))
449+
val cls = newCompleteClassSymbol(ScalaPackageClass, tpnme.AnyKind, AbstractFinal | Permanent, Nil, newScope(0), initTastyVersion = -1)
450450
if (!ctx.settings.YnoKindPolymorphism.value)
451451
// Enable kind-polymorphism by exposing scala.AnyKind
452452
cls.entered
@@ -1377,7 +1377,8 @@ class Definitions {
13771377
),
13781378
privateWithin = patch.privateWithin,
13791379
coord = denot.symbol.coord,
1380-
assocFile = denot.symbol.associatedFile
1380+
assocFile = denot.symbol.associatedFile,
1381+
initTastyVersion = denot.tastyVersion
13811382
)
13821383

13831384
def makeNonClassSymbol(patch: Symbol) =

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,7 @@ object Denotations {
13571357
*/
13581358
def missingHook(owner: Symbol, name: Name)(using Context): Symbol =
13591359
if (owner.is(Package) && name.isTermName)
1360-
newCompletePackageSymbol(owner, name.asTermName).entered
1360+
newCompletePackageSymbol(owner, name.asTermName, initTastyVersion = -1).entered // AR
13611361
else
13621362
NoSymbol
13631363

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ object NamerOps:
138138
ConstructorCompanionFlags, ConstructorCompanionFlags,
139139
constructorCompanionCompleter(cls),
140140
coord = cls.coord,
141-
assocFile = cls.assocFile)
141+
assocFile = cls.assocFile,
142+
initTastyVersion = cls.classDenot.tastyVersion)
142143
companion.moduleClass.registerCompanion(cls)
143144
cls.registerCompanion(companion.moduleClass)
144145
companion

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,8 +1935,8 @@ object SymDenotations {
19351935
def hasTastyVersion: Boolean = myTastyVersion != -1
19361936

19371937
def tastyVersion: Long =
1938-
println("sym id of " + name + " is " + symbol.id)
1939-
println("checking hasTastyVersion " + name + " " + hasTastyVersion + " " + System.identityHashCode(this))
1938+
// println("sym id of " + name + " is " + symbol.id)
1939+
// println("checking hasTastyVersion " + name + " " + hasTastyVersion + " " + System.identityHashCode(this))
19401940
require(hasTastyVersion, s"tasty version of $name not set")
19411941
myTastyVersion
19421942

@@ -2661,7 +2661,6 @@ object SymDenotations {
26612661
initTastyVersion: Long = -1)(using Context): SymDenotation = {
26622662
val result =
26632663
if (symbol.isClass)
2664-
try println(s"${symbol.name} isClass") catch case _ => ()
26652664
if (initFlags.is(Package)) new PackageClassDenotation(symbol, owner, name, initFlags, initInfo, initPrivateWithin, initTastyVersion)
26662665
else new ClassDenotation(symbol, owner, name, initFlags, initInfo, initPrivateWithin, initTastyVersion)
26672666
else new SymDenotation(symbol, owner, name, initFlags, initInfo, initPrivateWithin)

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ object SymbolLoaders {
5151
def enterClass(
5252
owner: Symbol, name: PreName, completer: SymbolLoader,
5353
flags: FlagSet = EmptyFlags, scope: Scope = EmptyScope)(using Context): Symbol = {
54-
val cls = newClassSymbol(owner, name.toTypeName.unmangleClassName.decode, flags, completer, assocFile = completer.sourceFileOrNull)
54+
val cls = newClassSymbol(owner, name.toTypeName.unmangleClassName.decode, flags, completer, assocFile = completer.sourceFileOrNull, initTastyVersion = -1)
5555
enterNew(owner, cls, completer, scope)
5656
}
5757

@@ -63,7 +63,7 @@ object SymbolLoaders {
6363
val module = newModuleSymbol(
6464
owner, name.toTermName.decode, modFlags, clsFlags,
6565
(module, _) => completer.proxy.withDecls(newScope).withSourceModule(module),
66-
assocFile = completer.sourceFileOrNull)
66+
assocFile = completer.sourceFileOrNull, initTastyVersion = -1)
6767
enterNew(owner, module, completer, scope)
6868
enterNew(owner, module.moduleClass, completer, scope)
6969
}
@@ -94,7 +94,7 @@ object SymbolLoaders {
9494
em"""$owner contains object and package with same name: $pname
9595
|one of them needs to be removed from classpath""")
9696
newModuleSymbol(owner, pname, PackageCreationFlags, PackageCreationFlags,
97-
completer).entered
97+
completer, initTastyVersion = -1).entered
9898
}
9999

100100
/** Enter class and module with given `name` into scope of `owner`
@@ -390,11 +390,11 @@ abstract class SymbolLoader extends LazyType { self =>
390390
if (rootDenot.is(ModuleClass))
391391
newClassSymbol(
392392
rootDenot.owner, rootDenot.name.stripModuleClassSuffix.asTypeName, Synthetic,
393-
_ => NoType).classDenot
393+
_ => NoType, initTastyVersion = -1).classDenot
394394
else
395395
newModuleSymbol(
396396
rootDenot.owner, rootDenot.name.toTermName, Synthetic, Synthetic,
397-
(module, _) => NoLoader().withDecls(newScope).withSourceModule(module))
397+
(module, _) => NoLoader().withDecls(newScope).withSourceModule(module), initTastyVersion = -1)
398398
.moduleClass.denot.asClass
399399
}
400400
if (rootDenot.is(ModuleClass)) (linkedDenot, rootDenot)

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

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,39 @@ package dotty.tools
22
package dotc
33
package core
44

5-
import Periods._
6-
import Names._
7-
import Scopes._
8-
import Flags._
9-
import Decorators._
10-
import Contexts._
11-
import Phases._
12-
import SymDenotations._
13-
import Denotations._
14-
import printing.Texts._
5+
import Periods.*
6+
import Names.*
7+
import Scopes.*
8+
import Flags.*
9+
import Decorators.*
10+
import Contexts.*
11+
import Phases.*
12+
import SymDenotations.*
13+
import Denotations.*
14+
import printing.Texts.*
1515
import printing.Printer
16-
import Types._
17-
import util.Spans._
18-
import DenotTransformers._
19-
import StdNames._
20-
import NameOps._
21-
import transform.SymUtils._
16+
import Types.*
17+
import util.Spans.*
18+
import DenotTransformers.*
19+
import StdNames.*
20+
import NameOps.*
21+
import transform.SymUtils.*
2222
import NameKinds.LazyImplicitName
2323
import ast.tpd
24-
import tpd.{Tree, TreeProvider, TreeOps}
24+
import tpd.{Tree, TreeOps, TreeProvider}
2525
import ast.TreeTypeMap
2626
import Constants.Constant
2727
import Variances.Variance
2828
import reporting.Message
29+
2930
import collection.mutable
3031
import io.AbstractFile
31-
import util.{SourceFile, NoSource, Property, SourcePosition, SrcPos, EqHashMap}
32+
import util.{EqHashMap, NoSource, Property, SourceFile, SourcePosition, SrcPos}
33+
3234
import scala.annotation.internal.sharable
3335
import config.Printers.typr
3436
import dotty.tools.dotc.classpath.FileUtils.isScalaBinary
37+
import dotty.tools.tasty.TastyFormat
3538

3639
object Symbols {
3740

@@ -369,7 +372,7 @@ object Symbols {
369372
val d = denot.asClass.tastyVersion
370373
newClassSymbol(owner, name.asTypeName, flags, _ => info, privateWithin, coord1, associatedFile1, initTastyVersion = d)
371374
else
372-
newSymbol(owner, name, flags, info, privateWithin, coord1, initTastyVersion = -1) // AR
375+
newSymbol(owner, name, flags, info, privateWithin, coord1)
373376
}
374377

375378
// -------- Printing --------------------------------------------------------
@@ -519,10 +522,9 @@ object Symbols {
519522
info: Type,
520523
privateWithin: Symbol = NoSymbol,
521524
coord: Coord = NoCoord,
522-
nestingLevel: Int = ctx.nestingLevel,
523-
initTastyVersion: Long): Symbol { type ThisName = N } = {
525+
nestingLevel: Int = ctx.nestingLevel): Symbol { type ThisName = N } = {
524526
val sym = new Symbol(coord, ctx.base.nextSymId, nestingLevel).asInstanceOf[Symbol { type ThisName = N }]
525-
val denot = SymDenotation(sym, owner, name, flags, info, privateWithin, initTastyVersion)
527+
val denot = SymDenotation(sym, owner, name, flags, info, privateWithin)
526528
sym.denot = denot
527529
sym
528530
}
@@ -587,7 +589,8 @@ object Symbols {
587589
}
588590

589591
def newRefinedClassSymbol(coord: Coord = NoCoord)(using Context): ClassSymbol =
590-
newCompleteClassSymbol(ctx.owner, tpnme.REFINE_CLASS, NonMember, parents = Nil, newScope, coord = coord)
592+
newCompleteClassSymbol(ctx.owner, tpnme.REFINE_CLASS, NonMember, parents = Nil, newScope, coord = coord,
593+
initTastyVersion = TastyFormat.currentTastyVersion)
591594

592595
/** Create a module symbol with associated module class
593596
* from its non-info fields and a function producing the info
@@ -608,7 +611,7 @@ object Symbols {
608611
val modclsFlags = clsFlags | ModuleClassCreationFlags
609612
val modclsName = name.toTypeName.adjustIfModuleClass(modclsFlags)
610613
val module = newSymbol(
611-
owner, name, modFlags | ModuleValCreationFlags, NoCompleter, privateWithin, coord, initTastyVersion = initTastyVersion)
614+
owner, name, modFlags | ModuleValCreationFlags, NoCompleter, privateWithin, coord)
612615
val modcls = newClassSymbol(
613616
owner, modclsName, modclsFlags, infoFn(module, _), privateWithin, coord, assocFile, initTastyVersion)
614617
module.info =
@@ -673,8 +676,9 @@ object Symbols {
673676
def newPackageSymbol(
674677
owner: Symbol,
675678
name: TermName,
676-
infoFn: (TermSymbol, ClassSymbol) => LazyType)(using Context): TermSymbol =
677-
newModuleSymbol(owner, name, PackageCreationFlags, PackageCreationFlags, infoFn)
679+
infoFn: (TermSymbol, ClassSymbol) => LazyType,
680+
initTastyVersion: Long)(using Context): TermSymbol =
681+
newModuleSymbol(owner, name, PackageCreationFlags, PackageCreationFlags, infoFn, initTastyVersion = initTastyVersion)
678682
/** Create a package symbol with associated package class
679683
* from its non-info fields its member scope.
680684
*/
@@ -683,11 +687,12 @@ object Symbols {
683687
name: TermName,
684688
modFlags: FlagSet = EmptyFlags,
685689
clsFlags: FlagSet = EmptyFlags,
686-
decls: Scope = newScope(0))(using Context): TermSymbol =
690+
decls: Scope = newScope(0),
691+
initTastyVersion: Long)(using Context): TermSymbol =
687692
newCompleteModuleSymbol(
688693
owner, name,
689694
modFlags | PackageCreationFlags, clsFlags | PackageCreationFlags,
690-
Nil, decls)
695+
Nil, decls, initTastyVersion = initTastyVersion)
691696

692697
/** Define a new symbol associated with a Bind or pattern wildcard and, by default, make it gadt narrowable. */
693698
def newPatternBoundSymbol(
@@ -712,9 +717,9 @@ object Symbols {
712717
//if (base.settings.debug.value) throw new Error()
713718
val stub = name match {
714719
case name: TermName =>
715-
newModuleSymbol(normalizedOwner, name, EmptyFlags, EmptyFlags, stubCompleter, assocFile = file)
720+
newModuleSymbol(normalizedOwner, name, EmptyFlags, EmptyFlags, stubCompleter, assocFile = file, initTastyVersion = -1)
716721
case name: TypeName =>
717-
newClassSymbol(normalizedOwner, name, EmptyFlags, stubCompleter, assocFile = file)
722+
newClassSymbol(normalizedOwner, name, EmptyFlags, stubCompleter, assocFile = file, initTastyVersion = -1)
718723
}
719724
stub
720725
}
@@ -801,7 +806,7 @@ object Symbols {
801806
def newErrorSymbol(owner: Symbol, name: Name, msg: Message)(using Context): Symbol = {
802807
val errType = ErrorType(msg)
803808
newSymbol(owner, name, SyntheticArtifact,
804-
if (name.isTypeName) TypeAlias(errType) else errType, initTastyVersion = -1)
809+
if (name.isTypeName) TypeAlias(errType) else errType)
805810
}
806811

807812
/** Map given symbols, subjecting their attributes to the mappings

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class TreeUnpickler(reader: TastyReader,
6161
import TreeUnpickler._
6262
import tpd._
6363

64+
val tastyVersion = (header.majorVersion.toLong << (28 * 2)) | (header.minorVersion.toLong << 28) | header.experimentalVersion.toLong // AR
65+
6466
/** A map from addresses of definition entries to the symbols they define */
6567
private val symAtAddr = new mutable.HashMap[Addr, Symbol]
6668

@@ -615,7 +617,6 @@ class TreeUnpickler(reader: TastyReader,
615617
def adjustIfModule(completer: LazyType) =
616618
if (flags.is(Module)) adjustModuleCompleter(completer, name) else completer
617619
val coord = coordAt(start)
618-
val tastyVersion = (header.majorVersion.toLong << (28 * 2)) | (header.minorVersion.toLong << 28) | header.experimentalVersion.toLong
619620
val sym =
620621
roots.find(root => (root.owner eq ctx.owner) && root.name == name) match {
621622
case Some(rootd) =>
@@ -633,7 +634,7 @@ class TreeUnpickler(reader: TastyReader,
633634
if (isClass)
634635
newClassSymbol(ctx.owner, name.asTypeName, flags, completer, privateWithin, coord, initTastyVersion = tastyVersion)
635636
else
636-
newSymbol(ctx.owner, name, flags, completer, privateWithin, coord, initTastyVersion = tastyVersion)
637+
newSymbol(ctx.owner, name, flags, completer, privateWithin, coord)
637638
}
638639
val annotOwner =
639640
if sym.owner.isClass then newLocalDummy(sym.owner) else sym.owner
@@ -1441,6 +1442,7 @@ class TreeUnpickler(reader: TastyReader,
14411442
else unapply
14421443
case REFINEDtpt =>
14431444
val refineCls = symAtAddr.getOrElse(start,
1445+
// newRefinedClassSymbol(coordAt(start)), tastyVersion).asClass // RM?
14441446
newRefinedClassSymbol(coordAt(start))).asClass
14451447
registerSym(start, refineCls)
14461448
typeAtAddr(start) = refineCls.typeRef

compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,10 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
567567
.suchThat(_.is(Module)).symbol)
568568
else unpickler
569569
}
570+
// TODO leave at -1, instead should check is not scala2 before trying to use
571+
// newClassSymbol(owner, name.asTypeName, flags, completer, privateWithin, coord = start, initTastyVersion = -1)
570572
newClassSymbol(owner, name.asTypeName, flags, completer, privateWithin, coord = start, initTastyVersion = 0)
571-
// newClassSymbol(owner, name.asTypeName, flags, completer, privateWithin, coord = start)
573+
// newClassSymbol(owner, name.asTypeName, flags, completer, privateWithin, coord = start) // NOTE original version
572574
}
573575
case VALsym =>
574576
newSymbol(owner, name.asTermName, flags, localMemberUnpickler, privateWithin, coord = start)
@@ -580,7 +582,7 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
580582
new LocalUnpickler().withModuleClass(
581583
owner.info.decls.lookup(name.moduleClassName)
582584
.suchThat(_.is(Module)).symbol)
583-
, privateWithin, coord = start, initTastyVersion = 0)
585+
, privateWithin, coord = start)
584586
case _ =>
585587
errorBadSignature("bad symbol tag: " + tag)
586588
})

compiler/src/dotty/tools/dotc/transform/SymUtils.scala

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,12 @@ object SymUtils:
110110

111111
/** Is a case class for which mirrors support access to default arguments.
112112
*/
113-
def mirrorSupportsDefaultArguments(using Context): Boolean = self.isClass && {
114-
val d = self.asClass.classDenot
115-
// TastyFormat.isVersionCompatible(28, 4, 1, d.tastyMajorVersion, d.tastyMinorVersion, d.tastyExperimentalVersion)
116-
d.tastyMajorVersion == 28 && d.tastyMinorVersion >= 4
117-
}
113+
def mirrorSupportsDefaultArguments(using Context): Boolean =
114+
!self.is(JavaDefined) && !self.is(Scala2x) && self.isClass && {
115+
val d = self.asClass.classDenot
116+
// TastyFormat.isVersionCompatible(28, 4, 1, d.tastyMajorVersion, d.tastyMinorVersion, d.tastyExperimentalVersion)
117+
d.tastyMajorVersion == 28 && d.tastyMinorVersion >= 4
118+
}
118119

119120
/** Is this an old style implicit conversion?
120121
* @param directOnly only consider explicitly written methods

compiler/src/dotty/tools/dotc/transform/sjs/JUnitBootstrappers.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Symbols._
1414
import StdNames._
1515
import Types._
1616
import Decorators.em
17+
import dotty.tools.tasty.TastyFormat
1718

1819
import dotty.tools.dotc.transform.MegaPhase._
1920

@@ -156,7 +157,8 @@ class JUnitBootstrappers extends MiniPhase {
156157
val moduleSym = newCompleteModuleSymbol(owner, bootstrapperName,
157158
Synthetic, Synthetic,
158159
List(defn.ObjectType, junitdefn.BootstrapperType), newScope,
159-
coord = testClass.span, assocFile = testClass.assocFile).entered
160+
coord = testClass.span, assocFile = testClass.assocFile,
161+
initTastyVersion = TastyFormat.currentTastyVersion).entered
160162
val classSym = moduleSym.moduleClass.asClass
161163

162164
val constr = genConstructor(classSym)

0 commit comments

Comments
 (0)