From 8dfe510883f33de329e3235fb3780e63ff845df5 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 4 Mar 2021 01:32:02 +0100 Subject: [PATCH] avoid compiler crash when evaluating const expressions fails due to things like integer out of bounds --- .../src/prog8/optimizer/ConstExprEvaluator.kt | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/compiler/src/prog8/optimizer/ConstExprEvaluator.kt b/compiler/src/prog8/optimizer/ConstExprEvaluator.kt index c9d43b776..8ed3e6b52 100644 --- a/compiler/src/prog8/optimizer/ConstExprEvaluator.kt +++ b/compiler/src/prog8/optimizer/ConstExprEvaluator.kt @@ -9,28 +9,32 @@ import kotlin.math.pow class ConstExprEvaluator { fun evaluate(left: NumericLiteralValue, operator: String, right: NumericLiteralValue): Expression { - return when(operator) { - "+" -> plus(left, right) - "-" -> minus(left, right) - "*" -> multiply(left, right) - "/" -> divide(left, right) - "%" -> remainder(left, right) - "**" -> power(left, right) - "&" -> bitwiseand(left, right) - "|" -> bitwiseor(left, right) - "^" -> bitwisexor(left, right) - "and" -> logicaland(left, right) - "or" -> logicalor(left, right) - "xor" -> logicalxor(left, right) - "<" -> NumericLiteralValue.fromBoolean(left < right, left.position) - ">" -> NumericLiteralValue.fromBoolean(left > right, left.position) - "<=" -> NumericLiteralValue.fromBoolean(left <= right, left.position) - ">=" -> NumericLiteralValue.fromBoolean(left >= right, left.position) - "==" -> NumericLiteralValue.fromBoolean(left == right, left.position) - "!=" -> NumericLiteralValue.fromBoolean(left != right, left.position) - "<<" -> shiftedleft(left, right) - ">>" -> shiftedright(left, right) - else -> throw FatalAstException("const evaluation for invalid operator $operator") + try { + return when(operator) { + "+" -> plus(left, right) + "-" -> minus(left, right) + "*" -> multiply(left, right) + "/" -> divide(left, right) + "%" -> remainder(left, right) + "**" -> power(left, right) + "&" -> bitwiseand(left, right) + "|" -> bitwiseor(left, right) + "^" -> bitwisexor(left, right) + "and" -> logicaland(left, right) + "or" -> logicalor(left, right) + "xor" -> logicalxor(left, right) + "<" -> NumericLiteralValue.fromBoolean(left < right, left.position) + ">" -> NumericLiteralValue.fromBoolean(left > right, left.position) + "<=" -> NumericLiteralValue.fromBoolean(left <= right, left.position) + ">=" -> NumericLiteralValue.fromBoolean(left >= right, left.position) + "==" -> NumericLiteralValue.fromBoolean(left == right, left.position) + "!=" -> NumericLiteralValue.fromBoolean(left != right, left.position) + "<<" -> shiftedleft(left, right) + ">>" -> shiftedright(left, right) + else -> throw FatalAstException("const evaluation for invalid operator $operator") + } + } catch (ax: FatalAstException) { + throw ExpressionError(ax.message, left.position) } }