diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a230d0bb4..b3a10ec33 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -147,9 +147,9 @@ The constant evaluator is used as an optimizer to prevent some statically known The constant evaluator supports a large subset of Tact and handles, for instance, constants defined in terms of other constants, built-in and user-defined functions, logical and arithmetic operations. -The main logic of the constant evaluator can be found in the file [src/interpreter.ts](./src/interpreter.ts). +The main logic of the constant evaluator can be found in the file [src/optimizer/interpreter.ts](./src/optimizer/interpreter.ts). -You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](./src/test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [](./src/test/e2e-emulated/constants.spec.ts). +You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](./src/test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [src/test/e2e-emulated/constants.spec.ts](./src/test/e2e-emulated/constants.spec.ts). The negative tests for constant evaluation are contained in the Tact files prefixed with `const-eval` in the [src/test/compilation-failed/contracts](./src/test/compilation-failed/contracts) folder. diff --git a/src/abi/global.ts b/src/abi/global.ts index 7691c326a..130e894e5 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -18,7 +18,7 @@ import { ensureSimplifiedString, ensureString, interpretEscapeSequences, -} from "../interpreter"; +} from "../optimizer/interpreter"; import { isLiteral } from "../grammar/ast"; export const GlobalFunctions: Map = new Map([ diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index 61a159220..2a21d894a 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -42,7 +42,7 @@ import { import { ops } from "./ops"; import { writeCastedExpression } from "./writeFunction"; import { isLvalue } from "../../types/resolveStatements"; -import { evalConstantExpression } from "../../constEval"; +import { evalConstantExpression } from "../../optimizer/constEval"; import { getAstUtil } from "../../optimizer/util"; function isNull(wCtx: WriterContext, expr: AstExpression): boolean { diff --git a/src/node.ts b/src/node.ts index 1af679d9c..68850d62c 100644 --- a/src/node.ts +++ b/src/node.ts @@ -143,6 +143,6 @@ export async function run(args: { export { createNodeFileSystem } from "./vfs/createNodeFileSystem"; -export { parseAndEvalExpression } from "./interpreter"; +export { parseAndEvalExpression } from "./optimizer/interpreter"; export { showValue } from "./types/types"; diff --git a/src/optimizer/associative.ts b/src/optimizer/associative.ts index bb8da62dd..7009a2ca6 100644 --- a/src/optimizer/associative.ts +++ b/src/optimizer/associative.ts @@ -8,7 +8,7 @@ import { AstOpBinary, isLiteral, } from "../grammar/ast"; -import * as iM from "../interpreter"; +import * as iM from "./interpreter"; import { ExpressionTransformer, Rule } from "./types"; import { abs, diff --git a/src/constEval.ts b/src/optimizer/constEval.ts similarity index 95% rename from src/constEval.ts rename to src/optimizer/constEval.ts index 332d7d0d5..3c305b42d 100644 --- a/src/constEval.ts +++ b/src/optimizer/constEval.ts @@ -1,15 +1,18 @@ -import { CompilerContext } from "./context"; +import { CompilerContext } from "../context"; import { AstBinaryOperation, AstExpression, AstUnaryOperation, isLiteral, AstLiteral, -} from "./grammar/ast"; -import { TactConstEvalError, throwInternalCompilerError } from "./error/errors"; -import { AstUtil } from "./optimizer/util"; -import { ExpressionTransformer } from "./optimizer/types"; -import { StandardOptimizer } from "./optimizer/standardOptimizer"; +} from "../grammar/ast"; +import { + TactConstEvalError, + throwInternalCompilerError, +} from "../error/errors"; +import { AstUtil } from "./util"; +import { ExpressionTransformer } from "./types"; +import { StandardOptimizer } from "./standardOptimizer"; import { Interpreter, InterpreterConfig, @@ -18,7 +21,7 @@ import { evalUnaryOp, throwNonFatalErrorConstEval, } from "./interpreter"; -import { SrcInfo } from "./grammar"; +import { SrcInfo } from "../grammar"; // Utility Exception class to interrupt the execution // of functions that cannot evaluate a tree fully into a value. diff --git a/src/interpreter.ts b/src/optimizer/interpreter.ts similarity index 99% rename from src/interpreter.ts rename to src/optimizer/interpreter.ts index 7b1573445..88b57981b 100644 --- a/src/interpreter.ts +++ b/src/optimizer/interpreter.ts @@ -2,14 +2,14 @@ import { Address, beginCell, BitString, Cell, toNano } from "@ton/core"; import { paddedBufferToBits } from "@ton/core/dist/boc/utils/paddedBits"; import * as crc32 from "crc-32"; import { evalConstantExpression } from "./constEval"; -import { CompilerContext } from "./context"; +import { CompilerContext } from "../context"; import { TactCompilationError, TactConstEvalError, idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "./error/errors"; +} from "../error/errors"; import { AstAddress, AstBinaryOperation, @@ -64,20 +64,20 @@ import { getAstFactory, idText, isSelfId, -} from "./grammar/ast"; -import { AstUtil, divFloor, getAstUtil, modFloor } from "./optimizer/util"; +} from "../grammar/ast"; +import { AstUtil, divFloor, getAstUtil, modFloor } from "./util"; import { getStaticConstant, getStaticFunction, getType, hasStaticConstant, hasStaticFunction, -} from "./types/resolveDescriptors"; -import { getExpType } from "./types/resolveExpression"; -import { TypeRef, showValue } from "./types/types"; +} from "../types/resolveDescriptors"; +import { getExpType } from "../types/resolveExpression"; +import { TypeRef, showValue } from "../types/types"; import { sha256_sync } from "@ton/crypto"; -import { defaultParser, getParser, Parser } from "./grammar/grammar"; -import { dummySrcInfo, SrcInfo } from "./grammar"; +import { defaultParser, getParser, Parser } from "../grammar/grammar"; +import { dummySrcInfo, SrcInfo } from "../grammar"; // TVM integers are signed 257-bit integers const minTvmInt: bigint = -(2n ** 256n); diff --git a/src/optimizer/test/partial-eval.spec.ts b/src/optimizer/test/partial-eval.spec.ts index c31650e23..c888e508a 100644 --- a/src/optimizer/test/partial-eval.spec.ts +++ b/src/optimizer/test/partial-eval.spec.ts @@ -6,11 +6,11 @@ import { isLiteral, } from "../../grammar/ast"; import { AstUtil, getAstUtil } from "../util"; -import { getOptimizer } from "../../constEval"; +import { getOptimizer } from "../constEval"; import { CompilerContext } from "../../context"; import { ExpressionTransformer, Rule } from "../types"; import { AssociativeRule3 } from "../associative"; -import { evalBinaryOp, evalUnaryOp } from "../../interpreter"; +import { evalBinaryOp, evalUnaryOp } from "../interpreter"; import { getParser } from "../../grammar"; import { defaultParser } from "../../grammar/grammar"; import { throwInternalCompilerError } from "../../error/errors"; diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 42b422719..54fc1ff5d 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -44,7 +44,7 @@ import { getRawAST } from "../grammar/store"; import { cloneNode } from "../grammar/clone"; import { crc16 } from "../utils/crc16"; import { isSubsetOf } from "../utils/isSubsetOf"; -import { evalConstantExpression } from "../constEval"; +import { evalConstantExpression } from "../optimizer/constEval"; import { intMapKeyFormats, intMapValFormats, diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index 1b7807924..b7621141c 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -2,14 +2,14 @@ import { sha256_sync } from "@ton/crypto"; import { CompilerContext, createContextStore } from "../context"; import { AstNode, FactoryAst, isRequire } from "../grammar/ast"; import { traverse } from "../grammar/iterators"; -import { evalConstantExpression } from "../constEval"; +import { evalConstantExpression } from "../optimizer/constEval"; import { throwInternalCompilerError } from "../error/errors"; import { getAllStaticFunctions, getAllTypes, getAllStaticConstants, } from "./resolveDescriptors"; -import { ensureSimplifiedString } from "../interpreter"; +import { ensureSimplifiedString } from "../optimizer/interpreter"; import { AstUtil, getAstUtil } from "../optimizer/util"; type Exception = { value: string; id: number }; diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index dfabdd63c..f02a134b4 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -19,8 +19,8 @@ import { AstNumber, AstReceiver, FactoryAst } from "../grammar/ast"; import { commentPseudoOpcode } from "../generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; import { dummySrcInfo } from "../grammar"; -import { ensureInt } from "../interpreter"; -import { evalConstantExpression } from "../constEval"; +import { ensureInt } from "../optimizer/interpreter"; +import { evalConstantExpression } from "../optimizer/constEval"; import { getAstUtil } from "../optimizer/util"; export function resolveSignatures(ctx: CompilerContext, Ast: FactoryAst) { diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index ccb923265..a23e5db8d 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -28,8 +28,8 @@ import { } from "./resolveDescriptors"; import { getExpType, resolveExpression } from "./resolveExpression"; import { FunctionDescription, printTypeRef, TypeRef } from "./types"; -import { evalConstantExpression } from "../constEval"; -import { ensureInt } from "../interpreter"; +import { evalConstantExpression } from "../optimizer/constEval"; +import { ensureInt } from "../optimizer/interpreter"; import { crc16 } from "../utils/crc16"; import { SrcInfo } from "../grammar"; import { AstUtil, getAstUtil } from "../optimizer/util";