From 865e8f076a562919448d6651f29a4068363799ee Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 5 Sep 2017 18:37:30 +0200 Subject: [PATCH] Fix initialization vulnerability in Scanner When bootstrapping with -Yno-inline, Tokens failied to initialize because the length `maxToken` in `tokenString` was still 0. Changing a `val` to a `def` fixes that. This is a nice demonstration that the initialization rules are non-intuitive - we get bitten by them ourselves! --- compiler/src/dotty/tools/dotc/parsing/JavaTokens.scala | 2 +- compiler/src/dotty/tools/dotc/parsing/Tokens.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/parsing/JavaTokens.scala b/compiler/src/dotty/tools/dotc/parsing/JavaTokens.scala index 9530e0516196..5412481f07bf 100644 --- a/compiler/src/dotty/tools/dotc/parsing/JavaTokens.scala +++ b/compiler/src/dotty/tools/dotc/parsing/JavaTokens.scala @@ -6,7 +6,7 @@ import collection.immutable.BitSet object JavaTokens extends TokensCommon { final val minToken = EMPTY - final val maxToken = DOUBLE + final def maxToken = DOUBLE final val javaOnlyKeywords = tokenRange(INSTANCEOF, ASSERT) final val sharedKeywords = BitSet( IF, FOR, ELSE, THIS, NULL, NEW, SUPER, ABSTRACT, FINAL, PRIVATE, PROTECTED, diff --git a/compiler/src/dotty/tools/dotc/parsing/Tokens.scala b/compiler/src/dotty/tools/dotc/parsing/Tokens.scala index 770b826fd9f2..ae447a22c7b1 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Tokens.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Tokens.scala @@ -6,7 +6,7 @@ import collection.immutable.BitSet import core.Decorators._ abstract class TokensCommon { - val maxToken: Int + def maxToken: Int type Token = Int type TokenSet = BitSet @@ -145,7 +145,7 @@ abstract class TokensCommon { object Tokens extends TokensCommon { final val minToken = EMPTY - final val maxToken = XMLSTART + final def maxToken = XMLSTART final val INTERPOLATIONID = 10; enter(INTERPOLATIONID, "string interpolator") final val SYMBOLLIT = 11; enter(SYMBOLLIT, "symbol literal") // TODO: deprecate