diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-03-11 18:35:28 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-03-11 20:03:11 +0100 |
commit | 34faa0d073a8613deebffe7605fd8a5e9a93afbc (patch) | |
tree | 03a178e79a764f3b56459f008b8bf00f813541ec /test/files/neg/t6601 | |
parent | 1b6297f642877dcc7edcd704a5d3cf99a12e54b8 (diff) | |
download | scala-34faa0d073a8613deebffe7605fd8a5e9a93afbc.tar.gz scala-34faa0d073a8613deebffe7605fd8a5e9a93afbc.tar.bz2 scala-34faa0d073a8613deebffe7605fd8a5e9a93afbc.zip |
SI-6601 Close access loophole for value class constructors
ExtensionMethods marks private constructors of value classes as
notPRIVATE before pickling. When the pickler reads the flags of this
symbol, the anti-shift mechanism folds this into the regular PRIVATE
flag, so the class is pickled as though it was public all along. A
seprately compiled client can then call this constructor.
To remedy this, we must:
- pickle `rawFlags`, rather than `flags`. This is symmetric with
unpickling, which sets `rawFlags` with the value it reads.
- Add `notPRIVATE` to the flagset `PickledFlags`.
We cannot make this change in a minor version, as the pickler
and unpickler must agree on `PickledFlags`.
I believe that this won't change the size of pickled flags
for the majority of symbols (ie, those without the notPRIVATE flag)
due to the variable length encoding in `writeLongNat`.
This also improves the situation for SI-6608. Reflection and
scalap (and, by extension, IntelliJ), no longer will see
as public methods that have had their access widened in
SuperAccessors (which is done selectively to support inlining
under separate compilation.)
Diffstat (limited to 'test/files/neg/t6601')
-rw-r--r-- | test/files/neg/t6601/AccessPrivateConstructor_2.scala | 3 | ||||
-rw-r--r-- | test/files/neg/t6601/PrivateConstructor_1.scala | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/test/files/neg/t6601/AccessPrivateConstructor_2.scala b/test/files/neg/t6601/AccessPrivateConstructor_2.scala new file mode 100644 index 0000000000..816bc10d79 --- /dev/null +++ b/test/files/neg/t6601/AccessPrivateConstructor_2.scala @@ -0,0 +1,3 @@ +class AccessPrivateConstructor { + new PrivateConstructor("") // Scalac should forbid accessing to the private constructor! +} diff --git a/test/files/neg/t6601/PrivateConstructor_1.scala b/test/files/neg/t6601/PrivateConstructor_1.scala new file mode 100644 index 0000000000..f09d7ad068 --- /dev/null +++ b/test/files/neg/t6601/PrivateConstructor_1.scala @@ -0,0 +1 @@ +class PrivateConstructor private(val s: String) extends AnyVal |