summaryrefslogtreecommitdiff
path: root/plugin/src/main
diff options
context:
space:
mode:
authormergify[bot]2022-02-03 04:23:48 +0000
committerGitHub2022-02-03 04:23:48 +0000
commit8776e58ff91cd88562b957d7a09322ec16610b81 (patch)
tree6b7468e62aeaa99abfc6d95597c72c292f461b2b /plugin/src/main
parent6048c973f0c1c6e80a7a9e8ef6cec71ef0695e68 (diff)
Tweak Bundle._elementsImpl (#2390) (#2392)
* Change type of Bundle._elementsImpl to Iterable It was previously SeqMap (ListMap on Scala 2.12). This change gives us more freedom to optimize the implementation without breaking binary compatibility. It is scala.collection.Iterable because it is perfectly fine to return mutable collections (like Arrays) since the only use is to Iterate on them. * Disallow users implementing Bundle._elementsImpl Currently, it would result in a runtime linkage error. This turns it into a compile-time error. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit 1b05a14ad6d5784f3b91ab510dc1095423c23ea8) Co-authored-by: Jack Koenig <koenig@sifive.com>
Diffstat (limited to 'plugin/src/main')
-rw-r--r--plugin/src/main/scala/chisel3/internal/plugin/BundleComponent.scala19
1 files changed, 11 insertions, 8 deletions
diff --git a/plugin/src/main/scala/chisel3/internal/plugin/BundleComponent.scala b/plugin/src/main/scala/chisel3/internal/plugin/BundleComponent.scala
index e92bbb23..d768175d 100644
--- a/plugin/src/main/scala/chisel3/internal/plugin/BundleComponent.scala
+++ b/plugin/src/main/scala/chisel3/internal/plugin/BundleComponent.scala
@@ -41,12 +41,12 @@ private[plugin] class BundleComponent(val global: Global, arguments: ChiselPlugi
def inferType(t: Tree): Type = localTyper.typed(t, nsc.Mode.TYPEmode).tpe
- val bundleTpe: Type = inferType(tq"chisel3.Bundle")
- val dataTpe: Type = inferType(tq"chisel3.Data")
- val ignoreSeqTpe: Type = inferType(tq"chisel3.IgnoreSeqInBundle")
- val seqOfDataTpe: Type = inferType(tq"scala.collection.Seq[chisel3.Data]")
- val someOfDataTpe: Type = inferType(tq"scala.Option[chisel3.Data]")
- val seqMapTpe: Type = inferType(tq"scala.collection.immutable.SeqMap[String,Any]")
+ val bundleTpe: Type = inferType(tq"chisel3.Bundle")
+ val dataTpe: Type = inferType(tq"chisel3.Data")
+ val ignoreSeqTpe: Type = inferType(tq"chisel3.IgnoreSeqInBundle")
+ val seqOfDataTpe: Type = inferType(tq"scala.collection.Seq[chisel3.Data]")
+ val someOfDataTpe: Type = inferType(tq"scala.Option[chisel3.Data]")
+ val itStringAnyTpe: Type = inferType(tq"scala.collection.Iterable[(String,Any)]")
// Not cached because it should only be run once per class (thus once per Type)
def isBundle(sym: Symbol): Boolean = { sym.tpe <:< bundleTpe }
@@ -95,6 +95,9 @@ private[plugin] class BundleComponent(val global: Global, arguments: ChiselPlugi
case d: DefDef if isNullaryMethodNamed("_cloneTypeImpl", d) =>
val msg = "Users cannot override _cloneTypeImpl. Let the compiler plugin generate it."
global.globalError(d.pos, msg)
+ case d: DefDef if isNullaryMethodNamed("_elementsImpl", d) =>
+ val msg = "Users cannot override _elementsImpl. Let the compiler plugin generate it."
+ global.globalError(d.pos, msg)
case d: DefDef if isNullaryMethodNamed("_usingPlugin", d) =>
val msg = "Users cannot override _usingPlugin, it is for the compiler plugin's use only."
global.globalError(d.pos, msg)
@@ -220,10 +223,10 @@ private[plugin] class BundleComponent(val global: Global, arguments: ChiselPlugi
val elementsImplSym =
bundle.symbol.newMethod(TermName("_elementsImpl"), bundle.symbol.pos.focus, Flag.OVERRIDE | Flag.PROTECTED)
elementsImplSym.resetFlag(Flags.METHOD)
- elementsImplSym.setInfo(NullaryMethodType(seqMapTpe))
+ elementsImplSym.setInfo(NullaryMethodType(itStringAnyTpe))
val elementsImpl = localTyper.typed(
- DefDef(elementsImplSym, q"scala.collection.immutable.SeqMap.apply[String, Any](..$elementArgs)")
+ DefDef(elementsImplSym, q"scala.collection.immutable.Vector.apply[(String, Any)](..$elementArgs)")
)
Some(elementsImpl)