From 6ffe57046c3fe525ebdbbc1cc2858d5c528ce200 Mon Sep 17 00:00:00 2001 From: Ara Adkins Date: Thu, 11 Feb 2021 14:03:16 +0000 Subject: [PATCH 1/5] Migrate to GraalVM 21.0 --- .github/workflows/legal-review.yml | 4 +- .github/workflows/release.yml | 2 +- .github/workflows/scala.yml | 368 ++++++++-------- build.sbt | 6 +- .../std-lib/Base/src/Error/Extensions.enso | 8 + docs/CONTRIBUTING.md | 26 ++ .../enso/polyglot/ModuleManagementTest.scala | 2 +- .../java/org/enso/interpreter/Language.java | 11 +- .../epb/node/ContextRewrapExceptionNode.java | 46 ++ .../interpreter/epb/node/ForeignEvalNode.java | 4 +- .../epb/runtime/GuardedTruffleContext.java | 20 +- .../epb/runtime/PolyglotExceptionProxy.java | 57 +++ .../epb/runtime/PolyglotProxy.java | 401 +++++++++++++++--- .../instrument/RuntimeServerInstrument.java | 4 +- .../callable/IndirectInvokeCallableNode.java | 9 +- .../node/callable/InvokeCallableNode.java | 9 +- .../builtin/error/CatchErrorNode.java | 1 - .../builtin/error/RecoverPanicNode.java | 16 +- .../builtin/error/ThrowErrorNode.java | 2 +- .../interop/generic/GetArraySizeNode.java | 5 +- .../builtin/mutable/ComparatorNode.java | 2 +- .../expression/builtin/mutable/CopyNode.java | 3 +- .../expression/builtin/mutable/SortNode.java | 2 +- .../builtin/number/bigInteger/AddNode.java | 9 +- .../builtin/number/bigInteger/BitAndNode.java | 16 +- .../builtin/number/bigInteger/BitNotNode.java | 9 +- .../builtin/number/bigInteger/BitOrNode.java | 16 +- .../number/bigInteger/BitShiftNode.java | 17 +- .../number/bigInteger/BitShiftRightNode.java | 16 +- .../builtin/number/bigInteger/BitXorNode.java | 16 +- .../number/bigInteger/CompareToNode.java | 2 +- .../builtin/number/bigInteger/DivNode.java | 10 +- .../builtin/number/bigInteger/DivideNode.java | 9 +- .../number/bigInteger/GreaterNode.java | 9 +- .../number/bigInteger/GreaterOrEqualNode.java | 9 +- .../builtin/number/bigInteger/LessNode.java | 9 +- .../number/bigInteger/LessOrEqualNode.java | 9 +- .../builtin/number/bigInteger/ModNode.java | 10 +- .../number/bigInteger/MultiplyNode.java | 9 +- .../builtin/number/bigInteger/PowNode.java | 9 +- .../number/bigInteger/SubtractNode.java | 9 +- .../builtin/number/decimal/AddNode.java | 9 +- .../builtin/number/decimal/CompareToNode.java | 2 +- .../builtin/number/decimal/DivideNode.java | 9 +- .../builtin/number/decimal/GreaterNode.java | 9 +- .../number/decimal/GreaterOrEqualNode.java | 9 +- .../builtin/number/decimal/LessNode.java | 9 +- .../number/decimal/LessOrEqualNode.java | 9 +- .../builtin/number/decimal/MultiplyNode.java | 9 +- .../builtin/number/decimal/PowNode.java | 9 +- .../builtin/number/decimal/SubtractNode.java | 9 +- .../builtin/number/smallInteger/AddNode.java | 9 +- .../number/smallInteger/BitAndNode.java | 16 +- .../number/smallInteger/BitNotNode.java | 9 +- .../number/smallInteger/BitOrNode.java | 16 +- .../number/smallInteger/BitShiftNode.java | 17 +- .../smallInteger/BitShiftRightNode.java | 19 +- .../number/smallInteger/BitXorNode.java | 16 +- .../number/smallInteger/CompareToNode.java | 2 +- .../builtin/number/smallInteger/DivNode.java | 10 +- .../number/smallInteger/DivideNode.java | 9 +- .../number/smallInteger/GreaterNode.java | 9 +- .../smallInteger/GreaterOrEqualNode.java | 9 +- .../builtin/number/smallInteger/LessNode.java | 9 +- .../number/smallInteger/LessOrEqualNode.java | 9 +- .../builtin/number/smallInteger/ModNode.java | 10 +- .../number/smallInteger/MultiplyNode.java | 9 +- .../builtin/number/smallInteger/PowNode.java | 12 +- .../number/smallInteger/SubtractNode.java | 9 +- .../builtin/state/GetStateNode.java | 6 +- .../builtin/state/PutStateNode.java | 4 +- .../builtin/text/util/ExpectStringNode.java | 12 +- .../builtin/text/util/ExpectTextNode.java | 16 +- .../expression/constant/EnsoProjectNode.java | 2 +- .../interpreter/runtime/builtin/Builtins.java | 58 ++- .../interpreter/runtime/builtin/Error.java | 48 ++- .../interpreter/runtime/builtin/Resource.java | 9 +- .../runtime/error/ArityException.java | 18 - .../runtime/error/DataflowError.java | 32 +- .../error/DuplicateArgumentNameException.java | 14 - .../error/InvalidArgumentNameException.java | 23 - .../error/MethodDoesNotExistException.java | 30 -- .../error/ModuleDoesNotExistException.java | 26 -- .../runtime/error/NotInvokableException.java | 30 -- .../runtime/error/PanicException.java | 83 ++-- .../runtime/error/PanicSentinel.java | 43 +- .../error/RedefinedMethodException.java | 15 +- .../interpreter/runtime/error/TypeError.java | 30 -- .../error/UnsaturatedCallException.java | 19 - .../error/VariableDoesNotExistException.java | 27 -- .../error/VariableRedefinitionException.java | 29 -- .../runtime/scope/TopLevelScope.java | 90 +++- .../interpreter/runtime/type/Constants.java | 7 +- .../enso/interpreter/runtime/type/Types.java | 10 + .../interpreter/service/ExecutionService.java | 39 ++ .../scala/org/enso/compiler/Compiler.scala | 16 +- .../enso/compiler/codegen/IrToTruffle.scala | 9 +- .../CompilationAbortedException.scala | 7 +- .../instrument/execution/ErrorResolver.scala | 53 +-- .../job/ProgramExecutionSupport.scala | 22 +- .../instrument/ExpressionErrorsTest.scala | 2 +- .../test/instrument/RuntimeServerTest.scala | 6 +- .../enso/interpreter/dsl/MethodProcessor.java | 65 +-- project/build.properties | 3 +- test/Tests/src/Data/Numbers_Spec.enso | 2 +- test/Tests/src/Data/Time/Time_Spec.enso | 2 +- test/Tests/src/Semantic/Error_Spec.enso | 4 + test/Tests/src/Semantic/Js_Interop_Spec.enso | 25 ++ 108 files changed, 1540 insertions(+), 879 deletions(-) create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/epb/node/ContextRewrapExceptionNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotExceptionProxy.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ArityException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DuplicateArgumentNameException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/InvalidArgumentNameException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/MethodDoesNotExistException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ModuleDoesNotExistException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/NotInvokableException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/TypeError.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/UnsaturatedCallException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableDoesNotExistException.java delete mode 100644 engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableRedefinitionException.java diff --git a/.github/workflows/legal-review.yml b/.github/workflows/legal-review.yml index 9023572d68dc..0f4ecfa8c10c 100644 --- a/.github/workflows/legal-review.yml +++ b/.github/workflows/legal-review.yml @@ -8,11 +8,11 @@ on: env: # Please ensure that this is in sync with graalVersion in build.sbt - graalVersion: 20.2.0 + graalVersion: 21.0.0.2 # Please ensure that this is in sync with javaVersion in build.sbt javaVersion: 11 # Please ensure that this is in sync with project/build.properties - sbtVersion: 1.3.13 + sbtVersion: 1.4.1 # Please ensure that this is in sync with rustVersion in build.sbt rustToolchain: nightly-2019-11-04 excludedPaths: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b64641e04d9..481ba8477c9a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: env: # Please ensure that this is in sync with graalVersion in build.sbt - graalVersion: 20.2.0 + graalVersion: 21.0.0.2 # Please ensure that this is in sync with javaVersion in build.sbt javaVersion: 11 # Please ensure that this is in sync with project/build.properties diff --git a/.github/workflows/scala.yml b/.github/workflows/scala.yml index 11e214eaf9a6..55e60b9bb1eb 100644 --- a/.github/workflows/scala.yml +++ b/.github/workflows/scala.yml @@ -8,24 +8,13 @@ on: env: # Please ensure that this is in sync with graalVersion in build.sbt - graalVersion: 20.2.0 + graalVersion: 21.0.0.2 # Please ensure that this is in sync with javaVersion in build.sbt javaVersion: 11 # Please ensure that this is in sync with project/build.properties - sbtVersion: 1.4.1 + sbtVersion: 1.4.7 # Please ensure that this is in sync with rustVersion in build.sbt rustToolchain: nightly-2019-11-04 - excludedPaths: | - .github/PULL_REQUEST_TEMPLATE.md - .github/CODEOWNERS - .github/ISSUE_TEMPLATE/* - /doc/* - .gitignore - .scalafmt.conf - CODE_OF_CONDUCT.md - CONTRIBUTING.md - LICENSE - README.md jobs: test_and_publish: @@ -40,8 +29,8 @@ jobs: - uses: actions/checkout@v2 - name: Enable Developer Command Prompt (Windows) uses: ilammy/msvc-dev-cmd@v1.5.0 - - name: Setup Go - uses: actions/setup-go@v2 +# - name: Setup Go +# uses: actions/setup-go@v2 - name: Disable TCP/UDP Offloading (macOS) if: runner.os == 'macOS' shell: bash @@ -58,11 +47,11 @@ jobs: run: > Disable-NetAdapterChecksumOffload -Name * -TcpIPv4 -UdpIPv4 -TcpIPv6 -UdpIPv6 - - name: Install Rust - uses: actions-rs/toolchain@v1.0.6 - with: - toolchain: ${{ env.rustToolchain }} - override: true +# - name: Install Rust +# uses: actions-rs/toolchain@v1.0.6 +# with: +# toolchain: ${{ env.rustToolchain }} +# override: true - name: Setup conda uses: s-weigand/setup-conda@v1.0.5 with: @@ -106,56 +95,79 @@ jobs: - name: Bootstrap Enso project run: | sleep 1 - sbt --no-colors bootstrap + sbtn --no-colors bootstrap - name: Build Enso run: | sleep 1 - sbt --no-colors compile + sbtn --no-colors compile - # Tests - - name: Setup Tests on Windows - if: runner.os == 'Windows' + # Debugging + - name: Print JVM Version + run: | + java --version + - name: Print Instruments File shell: bash run: | - echo "CI_TEST_TIMEFACTOR=2" >> $GITHUB_ENV - echo "CI_TEST_FLAKY_ENABLE=true" >> $GITHUB_ENV + cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; + for file in `ls .`; do echo $file; cat $file; done + cd ../../../../../../../; + + # Tests +# - name: Setup Tests on Windows +# if: runner.os == 'Windows' +# shell: bash +# run: | +# echo "CI_TEST_TIMEFACTOR=2" >> $GITHUB_ENV +# echo "CI_TEST_FLAKY_ENABLE=true" >> $GITHUB_ENV - name: Build the Launcher shell: bash run: | sleep 1 - sbt --no-colors launcher/buildNativeImage + sbtn --no-colors launcher/buildNativeImage + - name: Print Instruments File + shell: bash + run: | + cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; + for file in `ls .`; do echo $file; cat $file; done + cd ../../../../../../../; - name: Build the Runner & Runtime Uberjars run: | sleep 1 - sbt --no-colors engine-runner/assembly + sbtn --no-colors engine-runner/assembly + - name: Print Instruments File + shell: bash + run: | + cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; + for file in `ls .`; do echo $file; cat $file; done + cd ../../../../../../../; - name: Test Enso run: | sleep 1 - sbt --no-colors "set Global / parallelExecution := false; test" - - name: Check Runtime Benchmark Compilation - run: | - sleep 1 - sbt --no-colors runtime/Benchmark/compile - - name: Check Language Server Benchmark Compilation - run: | - sleep 1 - sbt --no-colors language-server/Benchmark/compile - - name: Check Searcher Benchmark Compilation - run: | - sleep 1 - sbt --no-colors searcher/Benchmark/compile + sbtn --no-colors "set Global / parallelExecution := false; test" +# - name: Check Runtime Benchmark Compilation +# run: | +# sleep 1 +# sbt --no-colors runtime/Benchmark/compile +# - name: Check Language Server Benchmark Compilation +# run: | +# sleep 1 +# sbt --no-colors language-server/Benchmark/compile +# - name: Check Searcher Benchmark Compilation +# run: | +# sleep 1 +# sbt --no-colors searcher/Benchmark/compile # Build Distribution - - name: Build the Project Manager Native Image - run: | - sleep 1 - sbt --no-colors project-manager/buildNativeImage - - name: Build the Parser JS Bundle +# - name: Build the Project Manager Native Image +# run: | +# sleep 1 +# sbt --no-colors project-manager/buildNativeImage +# - name: Build the Parser JS Bundle # The builds are run on 3 platforms, but Flatbuffer schemas are platform # agnostic, so they just need to be uploaded from one of the runners. - if: runner.os == 'Linux' - run: sbt -no-colors syntaxJS/fullOptJS +# if: runner.os == 'Linux' +# run: sbt -no-colors syntaxJS/fullOptJS # Prepare distributions # The version used in filenames is based on the version of the launcher. @@ -163,32 +175,32 @@ jobs: # can be used interchangeably like this. If in the future the versions # become independent, this may require updating to use proper versions # for each component. - - name: Prepare Distribution Version (Unix) - if: runner.os != 'Windows' - shell: bash - run: | - DIST_VERSION=$(./enso version --json --only-launcher | jq -r '.version') - echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV - - - name: Prepare Distribution Version (Windows) - if: runner.os == 'Windows' - shell: bash - run: | - DIST_VERSION=$(./enso.exe version --json --only-launcher | jq -r '.version') - echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV +# - name: Prepare Distribution Version (Unix) +# if: runner.os != 'Windows' +# shell: bash +# run: | +# DIST_VERSION=$(./enso version --json --only-launcher | jq -r '.version') +# echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV +# +# - name: Prepare Distribution Version (Windows) +# if: runner.os == 'Windows' +# shell: bash +# run: | +# DIST_VERSION=$(./enso.exe version --json --only-launcher | jq -r '.version') +# echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV # Currently the only architecture supported by Github runners is amd64 - - name: Prepare Distribution Environment - shell: bash - run: > - DIST_OS=$(echo ${{ runner.os }} | awk '{print tolower($0)}') bash - tools/ci/prepare-distribution-env.sh +# - name: Prepare Distribution Environment +# shell: bash +# run: > +# DIST_OS=$(echo ${{ runner.os }} | awk '{print tolower($0)}') bash +# tools/ci/prepare-distribution-env.sh - - name: Prepare Launcher Distribution - shell: bash - run: | - sleep 1 - sbt buildLauncherDistribution +# - name: Prepare Launcher Distribution +# shell: bash +# run: | +# sleep 1 +# sbt buildLauncherDistribution # The way artifacts are uploaded currently does not preserve the # executable bits for Unix. However putting artifacts into a ZIP would @@ -197,118 +209,118 @@ jobs: # So the following line has been removed from this step, as it does # nothing useful: # chmod +x $ENGINE_DIST_DIR/bin/enso - - name: Prepare Engine Distribution - shell: bash - run: | - sleep 1 - sbt buildEngineDistribution - - - name: Prepare Project Manager Distribution - shell: bash - run: | - sleep 1 - sbt buildProjectManagerDistribution +# - name: Prepare Engine Distribution +# shell: bash +# run: | +# sleep 1 +# sbt buildEngineDistribution +# +# - name: Prepare Project Manager Distribution +# shell: bash +# run: | +# sleep 1 +# sbt buildProjectManagerDistribution # Test Distribution - - name: Prepare Engine Test Environment - shell: bash - run: | - go get -v github.com/ahmetb/go-httpbin/cmd/httpbin - $(go env GOPATH)/bin/httpbin -host :8080 & - - - name: Test Engine Distribution (Unix) - shell: bash - if: runner.os != 'Windows' - run: | - $ENGINE_DIST_DIR/bin/enso --run test/Tests - $ENGINE_DIST_DIR/bin/enso --run test/Table_Tests - $ENGINE_DIST_DIR/bin/enso --run test/Geo_Tests - - - name: Test Engine Distribution (Windows) - shell: bash - if: runner.os == 'Windows' - run: | - $ENGINE_DIST_DIR/bin/enso.bat --run test/Tests - $ENGINE_DIST_DIR/bin/enso.bat --run test/Table_Tests - $ENGINE_DIST_DIR/bin/enso.bat --run test/Geo_Tests +# - name: Prepare Engine Test Environment +# shell: bash +# run: | +# go get -v github.com/ahmetb/go-httpbin/cmd/httpbin +# $(go env GOPATH)/bin/httpbin -host :8080 & +# +# - name: Test Engine Distribution (Unix) +# shell: bash +# if: runner.os != 'Windows' +# run: | +# $ENGINE_DIST_DIR/bin/enso --run test/Tests +# $ENGINE_DIST_DIR/bin/enso --run test/Table_Tests +# $ENGINE_DIST_DIR/bin/enso --run test/Geo_Tests +# +# - name: Test Engine Distribution (Windows) +# shell: bash +# if: runner.os == 'Windows' +# run: | +# $ENGINE_DIST_DIR/bin/enso.bat --run test/Tests +# $ENGINE_DIST_DIR/bin/enso.bat --run test/Table_Tests +# $ENGINE_DIST_DIR/bin/enso.bat --run test/Geo_Tests # Publish - - name: Publish the Engine Distribution Artifact - uses: actions/upload-artifact@v2 - with: - name: ${{ env.ENGINE_DIST_NAME }} - path: ${{ env.ENGINE_DIST_ROOT }} - - name: Publish the Launcher - uses: actions/upload-artifact@v2 - with: - name: ${{ env.LAUNCHER_DIST_NAME }} - path: ${{ env.LAUNCHER_DIST_ROOT }} - - name: Publish the Project Manager - uses: actions/upload-artifact@v2 - with: - name: ${{ env.PROJECTMANAGER_DIST_NAME }} - path: ${{ env.PROJECTMANAGER_DIST_ROOT }} +# - name: Publish the Engine Distribution Artifact +# uses: actions/upload-artifact@v2 +# with: +# name: ${{ env.ENGINE_DIST_NAME }} +# path: ${{ env.ENGINE_DIST_ROOT }} +# - name: Publish the Launcher +# uses: actions/upload-artifact@v2 +# with: +# name: ${{ env.LAUNCHER_DIST_NAME }} +# path: ${{ env.LAUNCHER_DIST_ROOT }} +# - name: Publish the Project Manager +# uses: actions/upload-artifact@v2 +# with: +# name: ${{ env.PROJECTMANAGER_DIST_NAME }} +# path: ${{ env.PROJECTMANAGER_DIST_ROOT }} - - name: Prepare the FlatBuffers Schemas for Upload +# - name: Prepare the FlatBuffers Schemas for Upload # The builds are run on 3 platforms, but Flatbuffer schemas are platform # agnostic, so they just need to be uploaded from one of the runners. - if: runner.os == 'Linux' - run: | - mkdir fbs-upload - cp -r "engine/language-server/src/main/schema" fbs-upload/fbs-schema/ - zip -r -m -ll "fbs-upload/fbs-schema.zip" "fbs-upload/fbs-schema/" - - name: Publish the FlatBuffers Schemas - if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 - with: - name: Engine Protocol FlatBuffers Schemas - path: ./fbs-upload/fbs-schema.zip - - name: Prepare Parser JS Bundle for Upload - if: runner.os == 'Linux' - run: | - mkdir parser-upload - cp ./target/scala-parser.js parser-upload - - name: Publish the Parser JS Bundle - if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 - with: - name: Parser JS Bundle - path: ./target/scala-parser.js - - name: Publish the Manifest - if: runner.os == 'Linux' - uses: actions/upload-artifact@v2 - with: - name: manifest - path: ${{ env.ENGINE_DIST_DIR }}/manifest.yaml +# if: runner.os == 'Linux' +# run: | +# mkdir fbs-upload +# cp -r "engine/language-server/src/main/schema" fbs-upload/fbs-schema/ +# zip -r -m -ll "fbs-upload/fbs-schema.zip" "fbs-upload/fbs-schema/" +# - name: Publish the FlatBuffers Schemas +# if: runner.os == 'Linux' +# uses: actions/upload-artifact@v2 +# with: +# name: Engine Protocol FlatBuffers Schemas +# path: ./fbs-upload/fbs-schema.zip +# - name: Prepare Parser JS Bundle for Upload +# if: runner.os == 'Linux' +# run: | +# mkdir parser-upload +# cp ./target/scala-parser.js parser-upload +# - name: Publish the Parser JS Bundle +# if: runner.os == 'Linux' +# uses: actions/upload-artifact@v2 +# with: +# name: Parser JS Bundle +# path: ./target/scala-parser.js +# - name: Publish the Manifest +# if: runner.os == 'Linux' +# uses: actions/upload-artifact@v2 +# with: +# name: manifest +# path: ${{ env.ENGINE_DIST_DIR }}/manifest.yaml # Publish FlatBuffer Schemas and Parser Bundle to S3 - - name: Prepare AWS Session - shell: bash - if: runner.os == 'Linux' - run: | - aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 - ${{ secrets.ARTEFACT_S3_ACCESS_KEY_ID }} - ${{ secrets.ARTEFACT_S3_SECRET_ACCESS_KEY }} - us-west-2 - text - EOF - - name: Upload Parser JS Bundle to S3 - shell: bash - if: runner.os == 'Linux' - run: | - aws s3 sync ./parser-upload s3://packages-luna/parser-js/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete - - name: Upload FlatBuffers Schemas to S3 - shell: bash - if: runner.os == 'Linux' - run: | - aws s3 sync ./fbs-upload s3://packages-luna/fbs-schema/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete - - name: Teardown AWS Session - shell: bash - if: runner.os == 'Linux' - run: | - aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 - null - null - null - text - EOF +# - name: Prepare AWS Session +# shell: bash +# if: runner.os == 'Linux' +# run: | +# aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 +# ${{ secrets.ARTEFACT_S3_ACCESS_KEY_ID }} +# ${{ secrets.ARTEFACT_S3_SECRET_ACCESS_KEY }} +# us-west-2 +# text +# EOF +# - name: Upload Parser JS Bundle to S3 +# shell: bash +# if: runner.os == 'Linux' +# run: | +# aws s3 sync ./parser-upload s3://packages-luna/parser-js/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete +# - name: Upload FlatBuffers Schemas to S3 +# shell: bash +# if: runner.os == 'Linux' +# run: | +# aws s3 sync ./fbs-upload s3://packages-luna/fbs-schema/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete +# - name: Teardown AWS Session +# shell: bash +# if: runner.os == 'Linux' +# run: | +# aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 +# null +# null +# null +# text +# EOF diff --git a/build.sbt b/build.sbt index 031741785331..72e38207ccf4 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,3 @@ -import java.io.File - import org.enso.build.BenchTasks._ import org.enso.build.WithDebugCommand import sbt.Keys.{libraryDependencies, scalacOptions} @@ -7,13 +5,15 @@ import sbt.addCompilerPlugin import sbtassembly.AssemblyPlugin.defaultUniversalScript import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType} +import java.io.File + // ============================================================================ // === Global Configuration =================================================== // ============================================================================ val scalacVersion = "2.13.3" val rustVersion = "1.40.0-nightly (b520af6fd 2019-11-03)" -val graalVersion = "20.2.0" +val graalVersion = "21.0.0.2" val javaVersion = "11" val ensoVersion = "0.2.4-SNAPSHOT" // Note [Engine And Launcher Version] diff --git a/distribution/std-lib/Base/src/Error/Extensions.enso b/distribution/std-lib/Base/src/Error/Extensions.enso index ec61324189ee..03ad84c96807 100644 --- a/distribution/std-lib/Base/src/Error/Extensions.enso +++ b/distribution/std-lib/Base/src/Error/Extensions.enso @@ -26,6 +26,14 @@ unimplemented message="" = Panic.throw (Unimplemented_Error message) Error.catch : (Error -> Any) -> Any Error.catch (handler = x->x) = this.catch_primitive handler +## Returns a display representation of the dataflow error on which it is called. + + > Example + Displaying a dataflow error. + (Error.throw "oops!").to_display +Error.to_display : Text +Error.to_display = this.catch .to_display + ## Takes any value, and if it is a dataflow error, throws it as a Panic. Otherwise, returns the original value unchanged. Panic.rethrow : (Any ! Any) -> Any diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index dc9a4cc9296c..d06670b757dd 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -410,6 +410,32 @@ getting the project into a working state in IntelliJ. Java Format for formatting Java code. For more information see the relevant [Style Guides](style-guide/README.md). +Depending on the version of GraalVM with which you are working, you may be +required to add the following flags to the per-module overrides for IntelliJ's +java compiler in order for it to not show spurious errors. This is because some +versions of GraalVM export their own closed version of `com.oracle.truffle.api` +that IntelliJ picks up preferentially to the version we use for development. You +can find these options in +`Preferences -> Build, Execution, Deployment -> Compiler -> Java Compiler`. + +``` +--add-exports org.graalvm.truffle/com.oracle.truffle.api=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.debug=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.dsl=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.exception=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.frame=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.instrumentation=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.interop=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.io=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.library=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.memory=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.nodes=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.object=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.profiles=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.source=ALL-UNNAMED +--add-exports org.graalvm.truffle/com.oracle.truffle.api.utilities=ALL-UNNAMED +``` + However, as mentioned in the [Troubleshooting](#troubleshooting) section below, the forked nature of execution in the SBT shell means that we can't trivially make use of the IntelliJ debugger. In order to get debugging working, you will diff --git a/engine/polyglot-api/src/test/scala/org/enso/polyglot/ModuleManagementTest.scala b/engine/polyglot-api/src/test/scala/org/enso/polyglot/ModuleManagementTest.scala index 5f59643ee041..12c83f93a608 100644 --- a/engine/polyglot-api/src/test/scala/org/enso/polyglot/ModuleManagementTest.scala +++ b/engine/polyglot-api/src/test/scala/org/enso/polyglot/ModuleManagementTest.scala @@ -176,6 +176,6 @@ class ModuleManagementTest extends AnyFlatSpec with Matchers { ) val exception = the[PolyglotException] thrownBy mod2.getAssociatedConstructor - exception.getMessage shouldEqual "Module Test.Main does not exist." + exception.getMessage shouldEqual "org.enso.interpreter.runtime.error.PanicException: Module_Does_Not_Exist Test.Main" } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/Language.java b/engine/runtime/src/main/java/org/enso/interpreter/Language.java index d779a43db332..11515e8fd597 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/Language.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/Language.java @@ -4,6 +4,7 @@ import com.oracle.truffle.api.debug.DebuggerTags; import com.oracle.truffle.api.instrumentation.ProvidedTags; import com.oracle.truffle.api.instrumentation.StandardTags; +import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.nodes.RootNode; import java.util.Collections; @@ -108,14 +109,14 @@ protected OptionDescriptors getOptionDescriptors() { } /** - * Returns the top scope of the requested context. + * Returns the top scope of the requested contenxt. * - * @param context the context holding the top scope. - * @return a singleton collection containing the context's top scope. + * @param context the context holding the top scope + * @return the language's top scope */ @Override - protected Iterable findTopScopes(Context context) { - return Collections.singleton(context.getTopScope().getScope()); + protected Object getScope(Context context) { + return context.getTopScope(); } /** @return a reference to the execution instrument */ diff --git a/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ContextRewrapExceptionNode.java b/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ContextRewrapExceptionNode.java new file mode 100644 index 000000000000..f821ff25abcc --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ContextRewrapExceptionNode.java @@ -0,0 +1,46 @@ +package org.enso.interpreter.epb.node; + +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ReportPolymorphism; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.epb.runtime.GuardedTruffleContext; +import org.enso.interpreter.epb.runtime.PolyglotExceptionProxy; +import org.enso.interpreter.epb.runtime.PolyglotProxy; + +@GenerateUncached +@ReportPolymorphism +public abstract class ContextRewrapExceptionNode extends Node { + /** + * Wraps a value originating from {@code origin} into a value valid in {@code target}. This method + * is allowed to use interop library on {@code value} and therefore must be called with {@code + * origin} entered. + * + * @param value the value to wrap + * @param origin the context the value originates in (and is currently entered) + * @param target the context in which the value will be accessed in the future + * @return a context-switch-safe wrapper for the value + */ + public abstract AbstractTruffleException execute( + AbstractTruffleException value, GuardedTruffleContext origin, GuardedTruffleContext target); + + @Specialization(guards = "proxy.getOrigin() == target") + AbstractTruffleException doUnwrapProxy( + PolyglotExceptionProxy proxy, GuardedTruffleContext origin, GuardedTruffleContext target) { + return proxy.getOriginal(); + } + + @Specialization(guards = "proxy.getTarget() == target") + AbstractTruffleException doAlreadyProxied( + PolyglotExceptionProxy proxy, GuardedTruffleContext origin, GuardedTruffleContext target) { + return proxy; + } + + @Fallback + AbstractTruffleException doWrapProxy( + AbstractTruffleException o, GuardedTruffleContext origin, GuardedTruffleContext target) { + return new PolyglotExceptionProxy(o, origin, target); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ForeignEvalNode.java b/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ForeignEvalNode.java index 215221354515..c390bc942414 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ForeignEvalNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/epb/node/ForeignEvalNode.java @@ -72,7 +72,7 @@ private void parseJs(ContextReference ctxRef) { EpbContext context = ctxRef.get(); GuardedTruffleContext outer = context.getCurrentContext(); GuardedTruffleContext inner = context.getInnerContext(); - Object p = inner.enter(); + Object p = inner.enter(this); try { String args = Arrays.stream(argNames).skip(1).collect(Collectors.joining(",")); String wrappedSrc = @@ -86,7 +86,7 @@ private void parseJs(ContextReference ctxRef) { Object fn = rewrapNode.execute(ct.call(), inner, outer); foreign = insert(JsForeignNodeGen.create(argNames.length, fn)); } finally { - inner.leave(p); + inner.leave(this, p); } } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/GuardedTruffleContext.java b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/GuardedTruffleContext.java index 3237f0ce6c3e..1748a402b28b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/GuardedTruffleContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/GuardedTruffleContext.java @@ -2,6 +2,7 @@ import com.oracle.truffle.api.TruffleContext; +import com.oracle.truffle.api.nodes.Node; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -30,28 +31,31 @@ public GuardedTruffleContext(TruffleContext context, boolean isSingleThreaded) { * will block indefinitely until the context becomes available. * *

Any code following a call to this method should be executed in a try/finally block, with - * {@link #leave(Object)} being called in the finally block. It is crucial that this context is - * always left as soon as guest code execution finishes. + * {@link #leave(Node, Object)} being called in the finally block. It is crucial that this context + * is always left as soon as guest code execution finishes. * *

The token returned from this method may not be stored or used for any purpose other than * leaving the context. * - * @return a context restoration token that must be passed to {@link #leave(Object)} + * @param node the node to enter this context for + * @return a context restoration token that must be passed to {@link #leave(Node, Object)} */ - public Object enter() { + public Object enter(Node node) { if (lock != null) { lock.lock(); } - return context.enter(); + return context.enter(node); } /** * Leaves the context and unlocks it if this wrapper is GILed. * - * @param prev the token obtained from the call to {@link #enter()} + * @param node the node to leave this context for (this must correspond to the same node used in + * the call that provided the {@code prev} token + * @param prev the token obtained from the call to {@link #enter(Node)} */ - public void leave(Object prev) { - context.leave(prev); + public void leave(Node node, Object prev) { + context.leave(node, prev); if (lock != null) { lock.unlock(); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotExceptionProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotExceptionProxy.java new file mode 100644 index 000000000000..fbf7c1a5fe90 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotExceptionProxy.java @@ -0,0 +1,57 @@ +package org.enso.interpreter.epb.runtime; + +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; + +/** + * A wrapper for exceptions that cross the polyglot boundary. + * + *

It is responsible for proxying messages across the polyglot boundary specifically for the case + * of exceptions. Without this, exceptions (as non-linear control flow) would bubble up into Enso + * without their context. This would allow them to be caught, but Enso would have no means of + * executing code on the guest-language exception. Instead, we wrap the exception into this proxy, + * which holds onto the foreign exception, as well as the two contexts necessary for mediating calls + * between Enso and the foreign language. + * + *

This is _separate_ to the {@link PolyglotProxy} as we did not want to make that proxy into an + * {@link AbstractTruffleException}. This means that we have more control over when foreign objects + * are represented as exceptions. + */ +@ExportLibrary(value = InteropLibrary.class, delegateTo = "delegate") +public class PolyglotExceptionProxy extends AbstractTruffleException { + final PolyglotProxy delegate; + final AbstractTruffleException original; + + public PolyglotExceptionProxy( + AbstractTruffleException prototype, + GuardedTruffleContext origin, + GuardedTruffleContext target) { + super(prototype); + this.original = prototype; + this.delegate = new PolyglotProxy(prototype, origin, target); + } + + @ExportMessage + boolean isException() { + return true; + } + + @ExportMessage + RuntimeException throwException() { + throw this; + } + + public AbstractTruffleException getOriginal() { + return original; + } + + public GuardedTruffleContext getOrigin() { + return delegate.getOrigin(); + } + + public GuardedTruffleContext getTarget() { + return delegate.getTarget(); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotProxy.java b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotProxy.java index 659a30304401..6b2c990983f5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotProxy.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/epb/runtime/PolyglotProxy.java @@ -1,10 +1,20 @@ package org.enso.interpreter.epb.runtime; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.interop.*; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.ArityException; +import com.oracle.truffle.api.interop.ExceptionType; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.InvalidArrayIndexException; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.profiles.BranchProfile; +import org.enso.interpreter.epb.node.ContextRewrapExceptionNode; import org.enso.interpreter.epb.node.ContextRewrapNode; /** @@ -47,22 +57,50 @@ public GuardedTruffleContext getTarget() { } @ExportMessage - public boolean isNull(@CachedLibrary("this.delegate") InteropLibrary nulls) { - Object p = origin.enter(); + public boolean isNull( + @CachedLibrary("this.delegate") InteropLibrary nulls, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return nulls.isNull(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public boolean hasMembers(@CachedLibrary("this.delegate") InteropLibrary members) { - Object p = origin.enter(); + public boolean hasMembers( + @CachedLibrary("this.delegate") InteropLibrary members, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return members.hasMembers(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @@ -70,25 +108,52 @@ public boolean hasMembers(@CachedLibrary("this.delegate") InteropLibrary members public Object getMembers( boolean includeInternal, @CachedLibrary("this.delegate") InteropLibrary members, - @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode) + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws UnsupportedMessageException { - Object p = origin.enter(); + Object p = origin.enter(node); try { return contextRewrapNode.execute( members.getMembers(this.delegate, includeInternal), origin, target); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage public boolean isMemberInvocable( - String member, @CachedLibrary("this.delegate") InteropLibrary members) { - Object p = origin.enter(); + String member, + @CachedLibrary("this.delegate") InteropLibrary members, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return members.isMemberInvocable(this.delegate, member); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @@ -97,30 +162,57 @@ public Object invokeMember( String member, Object[] arguments, @CachedLibrary("this.delegate") InteropLibrary members, - @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode) + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode, + @Cached @Cached.Exclusive BranchProfile profile) throws ArityException, UnknownIdentifierException, UnsupportedMessageException, UnsupportedTypeException { Object[] wrappedArgs = new Object[arguments.length]; for (int i = 0; i < arguments.length; i++) { wrappedArgs[i] = contextRewrapNode.execute(arguments[i], target, origin); } - Object p = origin.enter(); + Object p = origin.enter(node); try { return contextRewrapNode.execute( members.invokeMember(this.delegate, member, wrappedArgs), origin, target); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage public boolean isMemberReadable( - String member, @CachedLibrary("this.delegate") InteropLibrary members) { - Object p = origin.enter(); + String member, + @CachedLibrary("this.delegate") InteropLibrary members, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return members.isMemberReadable(this.delegate, member); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @@ -128,23 +220,50 @@ public boolean isMemberReadable( public Object readMember( String member, @CachedLibrary("this.delegate") InteropLibrary members, - @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode) + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws UnknownIdentifierException, UnsupportedMessageException { - Object p = origin.enter(); + Object p = origin.enter(node); try { return contextRewrapNode.execute(members.readMember(this.delegate, member), origin, target); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public boolean isExecutable(@CachedLibrary("this.delegate") InteropLibrary functions) { - Object p = origin.enter(); + public boolean isExecutable( + @CachedLibrary("this.delegate") InteropLibrary functions, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return functions.isExecutable(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @@ -152,50 +271,105 @@ public boolean isExecutable(@CachedLibrary("this.delegate") InteropLibrary funct public Object execute( Object[] arguments, @CachedLibrary("this.delegate") InteropLibrary functions, - @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode) + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws UnsupportedMessageException, ArityException, UnsupportedTypeException { Object[] wrappedArgs = new Object[arguments.length]; for (int i = 0; i < arguments.length; i++) { wrappedArgs[i] = contextRewrapNode.execute(arguments[i], target, origin); } - Object p = origin.enter(); + Object p = origin.enter(node); try { return contextRewrapNode.execute( functions.execute(this.delegate, wrappedArgs), origin, target); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public boolean hasArrayElements(@CachedLibrary("this.delegate") InteropLibrary arrays) { - Object p = origin.enter(); + public boolean hasArrayElements( + @CachedLibrary("this.delegate") InteropLibrary arrays, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return arrays.hasArrayElements(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public long getArraySize(@CachedLibrary("this.delegate") InteropLibrary arrays) + public long getArraySize( + @CachedLibrary("this.delegate") InteropLibrary arrays, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws UnsupportedMessageException { - Object p = origin.enter(); + Object p = origin.enter(node); try { return arrays.getArraySize(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage public boolean isArrayElementReadable( - long idx, @CachedLibrary("this.delegate") InteropLibrary arrays) { - Object p = origin.enter(); + long idx, + @CachedLibrary("this.delegate") InteropLibrary arrays, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return arrays.isArrayElementReadable(this.delegate, idx); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @@ -203,46 +377,175 @@ public boolean isArrayElementReadable( public Object readArrayElement( long index, @CachedLibrary("this.delegate") InteropLibrary arrays, - @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode) + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapNode contextRewrapNode, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws InvalidArrayIndexException, UnsupportedMessageException { - Object p = origin.enter(); + Object p = origin.enter(node); try { return contextRewrapNode.execute( arrays.readArrayElement(this.delegate, index), origin, target); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public boolean isString(@CachedLibrary("this.delegate") InteropLibrary strings) { - Object p = origin.enter(); + public boolean isString( + @CachedLibrary("this.delegate") InteropLibrary strings, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return strings.isString(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage - public String asString(@CachedLibrary("this.delegate") InteropLibrary strings) + public String asString( + @CachedLibrary("this.delegate") InteropLibrary strings, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) throws UnsupportedMessageException { - Object p = origin.enter(); + Object p = origin.enter(node); try { return strings.asString(this.delegate); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } } finally { - origin.leave(p); + origin.leave(node, p); } } @ExportMessage public Object toDisplayString( - boolean allowSideEffects, @CachedLibrary("this.delegate") InteropLibrary displays) { - Object p = origin.enter(); + boolean allowSideEffects, + @CachedLibrary("this.delegate") InteropLibrary displays, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode, + @Cached @Cached.Exclusive BranchProfile profile) { + Object p = origin.enter(node); try { return displays.toDisplayString(this.delegate, allowSideEffects); + } catch (Throwable e) { + profile.enter(); + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } + } finally { + origin.leave(node, p); + } + } + + @ExportMessage + boolean isException( + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary("this.delegate") InteropLibrary errors) { + Object p = origin.enter(node); + try { + return errors.isException(delegate); + } finally { + origin.leave(node, p); + } + } + + @ExportMessage + RuntimeException throwException( + @CachedLibrary("this.delegate") InteropLibrary delegate, + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary(limit = "5") InteropLibrary errors, + @Cached @Cached.Exclusive ContextRewrapExceptionNode contextRewrapExceptionNode) + throws UnsupportedMessageException { + Object p = origin.enter(node); + try { + throw delegate.throwException(delegate); + } catch (Throwable e) { + if (errors.isException(e)) { + // `isException` means this must be AbstractTruffleException + //noinspection ConstantConditions + throw contextRewrapExceptionNode.execute((AbstractTruffleException) e, origin, target); + } else { + throw e; + } + } finally { + origin.leave(node, p); + } + } + + @ExportMessage + ExceptionType getExceptionType( + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary("this.delegate") InteropLibrary errors) + throws UnsupportedMessageException { + Object p = origin.enter(node); + try { + return errors.getExceptionType(delegate); + } finally { + origin.leave(node, p); + } + } + + @ExportMessage + int getExceptionExitStatus( + @CachedLibrary("this") InteropLibrary node, + @CachedLibrary("this.delegate") InteropLibrary errors) + throws UnsupportedMessageException { + Object p = origin.enter(node); + try { + return errors.getExceptionExitStatus(delegate); + } finally { + origin.leave(node, p); + } + } + + @ExportMessage + boolean isExceptionIncompleteSource( + @CachedLibrary("this.delegate") InteropLibrary errors, + @CachedLibrary("this") InteropLibrary node) + throws UnsupportedMessageException { + Object p = origin.enter(node); + try { + return errors.isExceptionIncompleteSource(delegate); } finally { - origin.leave(p); + origin.leave(node, p); } } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/instrument/RuntimeServerInstrument.java b/engine/runtime/src/main/java/org/enso/interpreter/instrument/RuntimeServerInstrument.java index 4f0fc686a51b..ad0b5dfcce7f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/instrument/RuntimeServerInstrument.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/instrument/RuntimeServerInstrument.java @@ -60,12 +60,12 @@ public void onLanguageContextCreated(TruffleContext context, LanguageInfo langua @Override public void onLanguageContextInitialized(TruffleContext context, LanguageInfo language) { if (language.getId().equals(org.enso.polyglot.LanguageInfo.ID)) { - Object token = context.enter(); + Object token = context.enter(null); ExecutionService service; try { service = instrument.env.lookup(language, ExecutionService.class); } finally { - context.leave(token); + context.leave(null, token); } instrument.initializeExecutionService(service, context); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/IndirectInvokeCallableNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/IndirectInvokeCallableNode.java index 5e029c2a4508..928c03961e6e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/IndirectInvokeCallableNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/IndirectInvokeCallableNode.java @@ -6,15 +6,18 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.node.BaseNode; import org.enso.interpreter.node.callable.dispatch.IndirectInvokeFunctionNode; import org.enso.interpreter.node.callable.thunk.ThunkExecutorNode; +import org.enso.interpreter.runtime.Context; import org.enso.interpreter.runtime.callable.UnresolvedSymbol; import org.enso.interpreter.runtime.callable.argument.CallArgumentInfo; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.callable.function.Function; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.NotInvokableException; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.error.PanicSentinel; import org.enso.interpreter.runtime.state.Stateful; @@ -169,6 +172,8 @@ public Stateful invokeGeneric( InvokeCallableNode.DefaultsExecutionMode defaultsExecutionMode, InvokeCallableNode.ArgumentsExecutionMode argumentsExecutionMode, BaseNode.TailStatus isTail) { - throw new NotInvokableException(callable, this); + Context ctx = lookupContextReference(Language.class).get(); + Atom error = ctx.getBuiltins().error().makeNotInvokableError(callable); + throw new PanicException(error, this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/InvokeCallableNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/InvokeCallableNode.java index a5cf28e7ec71..0293934ee9d8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/InvokeCallableNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/InvokeCallableNode.java @@ -10,16 +10,19 @@ import java.util.UUID; import java.util.concurrent.locks.Lock; import org.enso.interpreter.Constants; +import org.enso.interpreter.Language; import org.enso.interpreter.node.BaseNode; import org.enso.interpreter.node.callable.dispatch.InvokeFunctionNode; import org.enso.interpreter.node.callable.thunk.ThunkExecutorNode; +import org.enso.interpreter.runtime.Context; import org.enso.interpreter.runtime.callable.UnresolvedSymbol; import org.enso.interpreter.runtime.callable.argument.CallArgumentInfo; import org.enso.interpreter.runtime.callable.argument.Thunk; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.callable.function.Function; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.NotInvokableException; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.error.PanicSentinel; import org.enso.interpreter.runtime.state.Stateful; @@ -187,7 +190,9 @@ public Stateful invokeDynamicSymbol( @Fallback public Stateful invokeGeneric( Object callable, VirtualFrame callerFrame, Object state, Object[] arguments) { - throw new NotInvokableException(callable, this); + Context ctx = lookupContextReference(Language.class).get(); + Atom error = ctx.getBuiltins().error().makeNotInvokableError(callable); + throw new PanicException(error, this); } /** diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/CatchErrorNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/CatchErrorNode.java index a15ba45845cc..f953b69f7839 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/CatchErrorNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/CatchErrorNode.java @@ -2,7 +2,6 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ConditionProfile; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.dsl.MonadicState; import org.enso.interpreter.node.BaseNode; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/RecoverPanicNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/RecoverPanicNode.java index 8a2663d5bac9..0c0d88e288a2 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/RecoverPanicNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/RecoverPanicNode.java @@ -1,9 +1,12 @@ package org.enso.interpreter.node.expression.builtin.error; -import com.oracle.truffle.api.TruffleException; import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.BranchProfile; +import com.oracle.truffle.api.profiles.ConditionProfile; import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.dsl.MonadicState; @@ -21,6 +24,7 @@ description = "Executes an action and converts any Panic thrown by it into an Error") public abstract class RecoverPanicNode extends Node { private @Child ThunkExecutorNode thunkExecutorNode = ThunkExecutorNode.build(); + private final BranchProfile unknownExceptionProfile = BranchProfile.create(); static RecoverPanicNode build() { return RecoverPanicNodeGen.create(); @@ -33,20 +37,20 @@ Stateful doExecute( @MonadicState Object state, Object _this, Object action, + @CachedLibrary(limit = "5") InteropLibrary exceptions, @CachedContext(Language.class) Context ctx) { try { return thunkExecutorNode.executeThunk(action, state, BaseNode.TailStatus.NOT_TAIL); } catch (PanicException e) { - return new Stateful( - state, DataflowError.withTrace(e.getExceptionObject(), this, e.getStackTrace())); + return new Stateful(state, DataflowError.withTrace(e.getPayload(), this, e.getStackTrace())); } catch (Throwable e) { - if (ctx.getEnvironment().isHostException(e)) { - Object cause = ((TruffleException) e).getExceptionObject(); + if (exceptions.isException(e)) { return new Stateful( state, DataflowError.withTrace( - ctx.getBuiltins().error().makePolyglotError(cause), this, e.getStackTrace())); + ctx.getBuiltins().error().makePolyglotError(e), this, e.getStackTrace())); } + unknownExceptionProfile.enter(); throw e; } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/ThrowErrorNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/ThrowErrorNode.java index 2069bea69938..ceb31ee535a2 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/ThrowErrorNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/ThrowErrorNode.java @@ -10,6 +10,6 @@ description = "Returns a new value error with given payload.") public class ThrowErrorNode extends Node { public Object execute(Object _this, Object payload) { - return DataflowError.withDefaultTrace(payload, this); + return DataflowError.withoutTrace(payload, this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/interop/generic/GetArraySizeNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/interop/generic/GetArraySizeNode.java index 032cd3b39742..f14e93c7f290 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/interop/generic/GetArraySizeNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/interop/generic/GetArraySizeNode.java @@ -1,6 +1,7 @@ package org.enso.interpreter.node.expression.builtin.interop.generic; -import com.oracle.truffle.api.interop.*; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.BranchProfile; import org.enso.interpreter.Constants; @@ -25,7 +26,7 @@ long execute(Object _this, Object array) { err.enter(); Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); throw new PanicException( - builtins.error().makeTypeError(builtins.mutable().array(), array), this); + builtins.error().makeTypeError(builtins.mutable().array(), array, "array"), this); } } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/ComparatorNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/ComparatorNode.java index 9f9a0ca038a0..1e823c491057 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/ComparatorNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/ComparatorNode.java @@ -60,7 +60,7 @@ int execute( CompilerDirectives.transferToInterpreter(); var ordering = ctxRef.get().getBuiltins().ordering().ordering(); throw new PanicException( - ctxRef.get().getBuiltins().error().makeTypeError(ordering, result.getValue()), this); + ctxRef.get().getBuiltins().error().makeTypeError(ordering, atom, "comparator"), this); } } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/CopyNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/CopyNode.java index 38c1d497375c..4043300acf11 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/CopyNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/CopyNode.java @@ -1,6 +1,5 @@ package org.enso.interpreter.node.expression.builtin.mutable; -import com.oracle.truffle.api.TruffleLanguage.ContextReference; import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; @@ -68,6 +67,6 @@ Object doOther( Object _this, Object src, long source_index, Array dest, long dest_index, long count) { Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); throw new PanicException( - builtins.error().makeTypeError(builtins.mutable().array().newInstance(), src), this); + builtins.error().makeTypeError(builtins.mutable().array().newInstance(), src, "src"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/SortNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/SortNode.java index 9567fc986b3f..710556a7f9cf 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/SortNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/mutable/SortNode.java @@ -116,7 +116,7 @@ private int convertResult(Object res) { resultProfile.enter(); var ordering = ctxRef.get().getBuiltins().ordering().ordering(); throw new PanicException( - ctxRef.get().getBuiltins().error().makeTypeError(ordering, res), outerThis); + ctxRef.get().getBuiltins().error().makeTypeError(ordering, res, "result"), outerThis); } } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/AddNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/AddNode.java index 6fab3c212592..23014bd43d85 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/AddNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/AddNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "+", description = "Big integer addition.") @@ -36,6 +39,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.+", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitAndNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitAndNode.java index d3be31f23b24..cc3b018b8ce6 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitAndNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitAndNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.bigInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "bit_and", description = "Bitwise and.") @@ -31,12 +35,16 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_and", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_and", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitNotNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitNotNode.java index a0fa9011cbb6..4378345688eb 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitNotNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitNotNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "bit_not", description = "Bitwise negation.") @@ -22,6 +25,8 @@ EnsoBigInteger doLong(EnsoBigInteger _this) { @Fallback Object doOther(Object _this) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_not", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitOrNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitOrNode.java index ddb486bf3fb0..0786600e8f5a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitOrNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitOrNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.bigInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "bit_or", description = "Bitwise or.") @@ -31,12 +35,16 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_or", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_or", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftNode.java index 6b6db91ea9f4..0bd71528fbc6 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftNode.java @@ -12,9 +12,10 @@ import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @ImportStatic(BigIntegerOps.class) @@ -45,7 +46,7 @@ Object doBigIntShiftLeftExplicit( if (fitsInIntProfileLeftShift.profile(BigIntegerOps.fitsInInt(that))) { return doBigIntShiftLeft(_this, that); } else { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getShiftAmountTooLargeError(), this); } } @@ -73,18 +74,22 @@ Object doBigIntThat( return BigIntegerOps.nonNegative(_this.getValue()) ? 0L : -1L; } else { // Note [Well-Formed BigIntegers] - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getShiftAmountTooLargeError(), this); } } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_shift_l", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_shift_l", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftRightNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftRightNode.java index a42c53699e43..e5b7192024ff 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftRightNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitShiftRightNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.bigInteger; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "bit_shift_r", description = "Bitwise right-shift.") @@ -33,12 +37,16 @@ Object doBigInteger( } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_shift_r", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class)Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_shift_r", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitXorNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitXorNode.java index 52ab2b198ccb..42b754156b91 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitXorNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/BitXorNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.bigInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "bit_xor", description = "Bitwise exclusive or.") @@ -31,12 +35,16 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_xor", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_xor", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/CompareToNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/CompareToNode.java index b31bea53b901..ea1999fc82f5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/CompareToNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/CompareToNode.java @@ -61,7 +61,7 @@ Atom doOther( @CachedContext(Language.class) ContextReference ctxRef) { CompilerDirectives.transferToInterpreter(); var number = ctxRef.get().getBuiltins().number().getNumber().newInstance(); - var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number); + var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number, "that"); throw new PanicException(typeError, this); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivNode.java index 88d322426ec0..4b8d0f04b542 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivNode.java @@ -10,8 +10,10 @@ import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "div", description = "Big integer integral division.") @@ -32,7 +34,7 @@ Object doLong( try { return toEnsoNumberNode.execute(BigIntegerOps.divide(_this.getValue(), that)); } catch (ArithmeticException e) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getDivideByZeroError(), this); } } @@ -45,6 +47,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.div", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivideNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivideNode.java index 61d9116a93b7..c734cca018bb 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivideNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/DivideNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "/", description = "Big integer division.") @@ -33,6 +36,8 @@ static DivideNode build() { @Fallback double doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer./", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterNode.java index 095aa7c21f3e..4e32d6555421 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = ">", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback boolean doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.>", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterOrEqualNode.java index 3209ad055f6b..f9f45abfb52e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/GreaterOrEqualNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = ">=", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback boolean doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.>=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessNode.java index efd8af68fd21..a1249c6fad61 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "<", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback boolean doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.<", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessOrEqualNode.java index b40f7a8f70b9..21fe20fb5e5a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/LessOrEqualNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "<=", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback boolean doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.<=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/ModNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/ModNode.java index 7535d9ae326f..f8753b893a82 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/ModNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/ModNode.java @@ -10,8 +10,10 @@ import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "%", description = "Big integer modulo division.") @@ -32,7 +34,7 @@ Object doLong( try { return toEnsoNumberNode.execute(BigIntegerOps.modulo(_this.getValue(), that)); } catch (ArithmeticException e) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getDivideByZeroError(), this); } } @@ -45,6 +47,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.%", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/MultiplyNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/MultiplyNode.java index f9b05d929398..0187bc224240 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/MultiplyNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/MultiplyNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "*", description = "Big integer multiplication.") @@ -36,6 +39,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.*", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/PowNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/PowNode.java index 9d19c3a0b3b6..189de7c5900f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/PowNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/PowNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "^", description = "Big integer exponentiation.") @@ -49,6 +52,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.^", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/SubtractNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/SubtractNode.java index 5edae0d1883b..34692ba458de 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/SubtractNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/bigInteger/SubtractNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Big_Integer", name = "-", description = "Big integer subtraction.") @@ -36,6 +39,8 @@ Object doBigInteger(EnsoBigInteger _this, EnsoBigInteger that) { @Fallback Object doOther(EnsoBigInteger _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.-", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/AddNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/AddNode.java index dfbede92ae9e..042afbf9c58d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/AddNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/AddNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "+", description = "Addition of numbers.") @@ -33,6 +36,8 @@ static AddNode build() { @Fallback double doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.+", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/CompareToNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/CompareToNode.java index a13d65a9ef25..603107522b33 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/CompareToNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/CompareToNode.java @@ -68,7 +68,7 @@ Atom doOther( double _this, Object that, @CachedContext(Language.class) ContextReference ctxRef) { CompilerDirectives.transferToInterpreter(); var number = ctxRef.get().getBuiltins().number().getNumber().newInstance(); - var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number); + var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number, "that"); throw new PanicException(typeError, this); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/DivideNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/DivideNode.java index d6ed686ad661..b02eb31e1927 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/DivideNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/DivideNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "/", description = "Division of numbers.") @@ -33,6 +36,8 @@ static DivideNode build() { @Fallback double doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal./", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterNode.java index 5df4f5c27f99..b9c50a6f4c72 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = ">", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(double _this, EnsoBigInteger that) { @Fallback boolean doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.>", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterOrEqualNode.java index 1d1e0e13061e..fea1dbef29de 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/GreaterOrEqualNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = ">=", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(double _this, EnsoBigInteger that) { @Fallback boolean doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.>=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessNode.java index 1e07296f438d..38ebfecebdd5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "<", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(double _this, EnsoBigInteger that) { @Fallback boolean doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.<", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessOrEqualNode.java index 81cc1f55ead6..6d2e539db0a8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/LessOrEqualNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "<=", description = "Comparison of numbers.") @@ -34,6 +37,8 @@ boolean doBigInteger(double _this, EnsoBigInteger that) { @Fallback boolean doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.<=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/MultiplyNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/MultiplyNode.java index 652fba144a3c..423eb2bbc580 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/MultiplyNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/MultiplyNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "*", description = "Multiplication of numbers.") @@ -33,6 +36,8 @@ static MultiplyNode build() { @Fallback double doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.*", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/PowNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/PowNode.java index 60ddef0a6b30..4b7ad43d33bb 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/PowNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/PowNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "^", description = "Exponentiation of numbers.") @@ -33,6 +36,8 @@ static PowNode build() { @Fallback double doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.^", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/SubtractNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/SubtractNode.java index 764224c7bb08..868acdb74e35 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/SubtractNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/decimal/SubtractNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Decimal", name = "-", description = "Subtraction of numbers.") @@ -33,6 +36,8 @@ static SubtractNode build() { @Fallback double doOther(double _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Decimal.-", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/AddNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/AddNode.java index 93618b4ce363..34b9e0fae655 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/AddNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/AddNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "+", description = "Addition of numbers.") @@ -41,6 +44,8 @@ Object doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.+", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitAndNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitAndNode.java index e22236efd537..596713c2fe3b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitAndNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitAndNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.smallInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "bit_and", description = "Bitwise and.") @@ -31,12 +35,16 @@ Object doBigInteger(long _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_and", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_and", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitNotNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitNotNode.java index 3fb7a5fc0682..f97f9379398e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitNotNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitNotNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; @BuiltinMethod(type = "Small_Integer", name = "bit_not", description = "Bitwise negation.") public abstract class BitNotNode extends Node { @@ -21,6 +24,8 @@ long doLong(long _this) { @Fallback Object doOther(Object _this) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_not", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitOrNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitOrNode.java index ad061609f6e6..9a7b929c80b9 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitOrNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitOrNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.smallInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "bit_or", description = "Bitwise or.") @@ -31,12 +35,16 @@ Object doBigInteger(long _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_or", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_or", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftNode.java index b0a77d5aa40d..065495124d21 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftNode.java @@ -12,9 +12,10 @@ import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @ImportStatic(BigIntegerOps.class) @@ -47,7 +48,7 @@ Object doLongShiftLeftExplicit( } else if (positiveFitsInInt.profile(BigIntegerOps.fitsInInt(that))) { return toEnsoNumberNode.execute(BigIntegerOps.bitShiftLeft(_this, (int) that)); } else { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getShiftAmountTooLargeError(), this); } } @@ -79,7 +80,7 @@ Object doBigInteger( return _this >= 0 ? 0L : -1L; } else { // Note [Well-Formed BigIntegers] - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getShiftAmountTooLargeError(), this); } } @@ -91,13 +92,17 @@ Object doBigInteger( */ @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_shift", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_shift", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } boolean hasFreeBitsLeftShift(long number, long shift) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftRightNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftRightNode.java index 9d369e500937..00042db2f034 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftRightNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitShiftRightNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.smallInteger; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "bit_shift_r", description = "Bitwise right-shift.") @@ -19,8 +23,7 @@ static BitShiftRightNode build() { } @Specialization - Object doBigInteger( - long _this, long that, @Cached("build()") BitShiftNode bitShiftNode) { + Object doBigInteger(long _this, long that, @Cached("build()") BitShiftNode bitShiftNode) { return bitShiftNode.execute(_this, -1L * that); } @@ -31,12 +34,16 @@ Object doBigInteger( } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_shift_r", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_shift_r", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitXorNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitXorNode.java index b807918a8aff..b4927c24cb4d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitXorNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/BitXorNode.java @@ -1,13 +1,17 @@ package org.enso.interpreter.node.expression.builtin.number.smallInteger; +import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; +import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; import org.enso.interpreter.runtime.callable.atom.Atom; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "bit_xor", description = "Bitwise exclusive or.") @@ -31,12 +35,16 @@ Object doBigInteger(long _this, EnsoBigInteger that) { } @Specialization - Object doAtomThis(Atom _this, Object that) { - throw new TypeError("Unexpected type provided for `this` in Integer.bit_xor", this); + Object doAtomThis(Atom _this, Object that, @CachedContext(Language.class) Context ctx) { + Builtins builtins = ctx.getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, _this, "this"), this); } @Fallback Object doOther(Object _this, Object that) { - throw new TypeError("Unexpected type provided for `that` in Integer.bit_xor", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/CompareToNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/CompareToNode.java index bad4eeff3b11..45218602c162 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/CompareToNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/CompareToNode.java @@ -71,7 +71,7 @@ Atom doOther( long _this, Object that, @CachedContext(Language.class) ContextReference ctxRef) { CompilerDirectives.transferToInterpreter(); var number = ctxRef.get().getBuiltins().number().getNumber().newInstance(); - var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number); + var typeError = ctxRef.get().getBuiltins().error().makeTypeError(that, number, "that"); throw new PanicException(typeError, this); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivNode.java index 8ad2f2d193df..c1df2ea571aa 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivNode.java @@ -8,8 +8,10 @@ import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "div", description = "Division of numbers.") @@ -26,7 +28,7 @@ Object doLong( try { return _this / that; } catch (ArithmeticException e) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getDivideByZeroError(), this); } } @@ -39,6 +41,8 @@ Object doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.div", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivideNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivideNode.java index b299777bb343..794cfeed08dc 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivideNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/DivideNode.java @@ -3,9 +3,12 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "/", description = "Division of numbers.") @@ -33,6 +36,8 @@ static DivideNode build() { @Fallback double doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer./", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterNode.java index 9ae88e6688ea..0168b5e8f923 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = ">", description = "Comparison of numbers.") @@ -33,6 +36,8 @@ boolean doBigInteger(long _this, EnsoBigInteger that) { @Fallback boolean doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.>", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterOrEqualNode.java index d20b11453694..9a7af9cc61f3 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/GreaterOrEqualNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = ">=", description = "Comparison of numbers.") @@ -33,6 +36,8 @@ boolean doBigInteger(long _this, EnsoBigInteger that) { @Fallback boolean doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.>=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessNode.java index 8f38b84dc350..a31ce127e97b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "<", description = "Comparison of numbers.") @@ -33,6 +36,8 @@ boolean doBigInteger(long _this, EnsoBigInteger that) { @Fallback boolean doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.<", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessOrEqualNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessOrEqualNode.java index ddf1892c4f4a..fb70e417a6fe 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessOrEqualNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/LessOrEqualNode.java @@ -3,8 +3,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "<=", description = "Comparison of numbers.") @@ -33,6 +36,8 @@ boolean doBigInteger(long _this, EnsoBigInteger that) { @Fallback boolean doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.<=", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/ModNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/ModNode.java index 31639ab817ee..5fa47fb9797b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/ModNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/ModNode.java @@ -8,8 +8,10 @@ import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.runtime.Context; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.error.DataflowError; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "%", description = "Modulo division of numbers.") @@ -26,7 +28,7 @@ Object doLong( try { return _this % that; } catch (ArithmeticException e) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().getDivideByZeroError(), this); } } @@ -39,6 +41,8 @@ long doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.%", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom integer = builtins.number().getInteger().newInstance(); + throw new PanicException(builtins.error().makeTypeError(integer, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/MultiplyNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/MultiplyNode.java index d40b369415c8..199a328573c8 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/MultiplyNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/MultiplyNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "*", description = "Multiplication of numbers.") @@ -41,6 +44,8 @@ Object doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.*", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/PowNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/PowNode.java index 98ccf6b7348c..b8c89d7bd0ee 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/PowNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/PowNode.java @@ -3,13 +3,15 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import java.math.BigInteger; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; -import java.math.BigInteger; - @BuiltinMethod(type = "Small_Integer", name = "^", description = "Exponentation of numbers.") public abstract class PowNode extends Node { private @Child ToEnsoNumberNode toEnsoNumberNode = ToEnsoNumberNode.build(); @@ -71,6 +73,8 @@ Object doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.^", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/SubtractNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/SubtractNode.java index 72a74217854d..ee3ef4d1e31a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/SubtractNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/number/smallInteger/SubtractNode.java @@ -3,10 +3,13 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.Language; import org.enso.interpreter.dsl.BuiltinMethod; import org.enso.interpreter.node.expression.builtin.number.utils.BigIntegerOps; import org.enso.interpreter.node.expression.builtin.number.utils.ToEnsoNumberNode; -import org.enso.interpreter.runtime.error.TypeError; +import org.enso.interpreter.runtime.builtin.Builtins; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.number.EnsoBigInteger; @BuiltinMethod(type = "Small_Integer", name = "-", description = "Subtraction of numbers.") @@ -41,6 +44,8 @@ Object doBigInteger(long _this, EnsoBigInteger that) { @Fallback Object doOther(long _this, Object that) { - throw new TypeError("Unexpected type provided for argument `that` in Integer.-", this); + Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); + Atom number = builtins.number().getNumber().newInstance(); + throw new PanicException(builtins.error().makeTypeError(number, that, "that"), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/GetStateNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/GetStateNode.java index a71c2e85a251..1d04ab53c22f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/GetStateNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/GetStateNode.java @@ -54,7 +54,7 @@ Object doMultiUncached( @CachedContext(Language.class) TruffleLanguage.ContextReference ctxRef) { int idx = state.indexOf(key); if (idx == SmallMap.NOT_FOUND) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().uninitializedState().newInstance(key), this); } else { return state.getValues()[idx]; @@ -64,14 +64,14 @@ Object doMultiUncached( @Specialization Object doEmpty( EmptyMap state, Object _this, Object key, @CachedContext(Language.class) Context ctx) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctx.getBuiltins().error().uninitializedState().newInstance(key), this); } @Specialization Object doSingletonError( SingletonMap state, Object _this, Object key, @CachedContext(Language.class) Context ctx) { - return DataflowError.withDefaultTrace( + return DataflowError.withoutTrace( ctx.getBuiltins().error().uninitializedState().newInstance(key), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/PutStateNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/PutStateNode.java index 259ab62ad2d2..1b18396bda0c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/PutStateNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/state/PutStateNode.java @@ -59,7 +59,7 @@ Stateful doMultiUncached( if (index == SmallMap.NOT_FOUND) { return new Stateful( state, - DataflowError.withDefaultTrace( + DataflowError.withoutTrace( ctxRef.get().getBuiltins().error().uninitializedState().newInstance(key), this)); } else { return doExistingMultiCached(state, _this, key, new_state, key, state.getKeys(), index); @@ -75,7 +75,7 @@ Stateful doError( @CachedContext(Language.class) Context ctx) { return new Stateful( state, - DataflowError.withDefaultTrace( + DataflowError.withoutTrace( ctx.getBuiltins().error().uninitializedState().newInstance(key), this)); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectStringNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectStringNode.java index 6467630a96ee..cca105f8487b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectStringNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectStringNode.java @@ -15,7 +15,7 @@ public abstract class ExpectStringNode extends Node { private @Child InteropLibrary library = InteropLibrary.getFactory().createDispatched(10); - public abstract String execute(Object o); + public abstract String execute(Object str); public static ExpectStringNode build() { return ExpectStringNodeGen.create(); @@ -27,17 +27,17 @@ String doText(Text o, @Cached("build()") ToJavaStringNode toJavaStringNode) { } @Specialization - String doString(String o) { - return o; + String doString(String str) { + return str; } @Fallback - String doFallback(Object o) { + String doFallback(Object str) { try { - return library.asString(o); + return library.asString(str); } catch (UnsupportedMessageException e) { Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); - Atom err = builtins.error().makeTypeError(builtins.text().getText(), o); + Atom err = builtins.error().makeTypeError(builtins.text().getText(), str, "str"); throw new PanicException(err, this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectTextNode.java index 8442653c8121..56fb4192f1fa 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/ExpectTextNode.java @@ -16,29 +16,29 @@ public abstract class ExpectTextNode extends Node { private @Child InteropLibrary library = InteropLibrary.getFactory().createDispatched(10); - public abstract Text execute(Object o); + public abstract Text execute(Object str); public static ExpectTextNode build() { return ExpectTextNodeGen.create(); } @Specialization - Text doText(Text o) { - return o; + Text doText(Text str) { + return str; } @Specialization - Text doString(String o) { - return Text.create(o); + Text doString(String str) { + return Text.create(str); } @Fallback - Text doFallback(Object o) { + Text doFallback(Object str) { try { - return Text.create(library.asString(o)); + return Text.create(library.asString(str)); } catch (UnsupportedMessageException e) { Builtins builtins = lookupContextReference(Language.class).get().getBuiltins(); - Atom err = builtins.error().makeTypeError(builtins.text().getText(), o); + Atom err = builtins.error().makeTypeError(builtins.text().getText(), str, "str"); throw new PanicException(err, this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/EnsoProjectNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/EnsoProjectNode.java index bdecf0cb0932..91fd06ce7cb5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/EnsoProjectNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/constant/EnsoProjectNode.java @@ -27,7 +27,7 @@ public EnsoProjectNode( result = context.getBuiltins().getProjectDescription().newInstance(rootPath); } else { result = - DataflowError.withDefaultTrace( + DataflowError.withoutTrace( context.getBuiltins().error().moduleNotInPackageError().newInstance(), this); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java index 1c43c37ee97a..f02f596b141c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java @@ -1,10 +1,9 @@ package org.enso.interpreter.runtime.builtin; +import com.oracle.truffle.api.CompilerDirectives; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Objects; - -import com.oracle.truffle.api.CompilerDirectives; import org.enso.compiler.Passes; import org.enso.compiler.context.FreshNameSupply; import org.enso.compiler.exception.CompilerError; @@ -12,16 +11,18 @@ import org.enso.interpreter.Language; import org.enso.interpreter.node.expression.builtin.debug.DebugBreakpointMethodGen; import org.enso.interpreter.node.expression.builtin.debug.DebugEvalMethodGen; -import org.enso.interpreter.node.expression.builtin.error.CatchErrorMethodGen; import org.enso.interpreter.node.expression.builtin.error.CatchAnyMethodGen; import org.enso.interpreter.node.expression.builtin.error.RecoverPanicMethodGen; -import org.enso.interpreter.node.expression.builtin.error.ThrowErrorMethodGen; import org.enso.interpreter.node.expression.builtin.error.ThrowPanicMethodGen; -import org.enso.interpreter.node.expression.builtin.function.ApplicationOperatorMethodGen; import org.enso.interpreter.node.expression.builtin.function.ExplicitCallFunctionMethodGen; import org.enso.interpreter.node.expression.builtin.interop.java.AddToClassPathMethodGen; import org.enso.interpreter.node.expression.builtin.interop.java.LookupClassMethodGen; -import org.enso.interpreter.node.expression.builtin.io.*; +import org.enso.interpreter.node.expression.builtin.io.GetCwdMethodGen; +import org.enso.interpreter.node.expression.builtin.io.GetFileMethodGen; +import org.enso.interpreter.node.expression.builtin.io.GetUserHomeMethodGen; +import org.enso.interpreter.node.expression.builtin.io.PrintErrMethodGen; +import org.enso.interpreter.node.expression.builtin.io.PrintlnMethodGen; +import org.enso.interpreter.node.expression.builtin.io.ReadlnMethodGen; import org.enso.interpreter.node.expression.builtin.runtime.GCMethodGen; import org.enso.interpreter.node.expression.builtin.runtime.NoInlineMethodGen; import org.enso.interpreter.node.expression.builtin.state.GetStateMethodGen; @@ -33,8 +34,10 @@ import org.enso.interpreter.runtime.Context; import org.enso.interpreter.runtime.Module; import org.enso.interpreter.runtime.callable.argument.ArgumentDefinition; +import org.enso.interpreter.runtime.callable.atom.Atom; import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.scope.ModuleScope; +import org.enso.interpreter.runtime.type.Constants; import org.enso.pkg.QualifiedName; /** Container class for static predefined atoms, methods, and their containing scope. */ @@ -54,6 +57,7 @@ public static class Debug { private final AtomConstructor projectDescription; private final AtomConstructor function; private final AtomConstructor nothing; + private final AtomConstructor panic; private final Bool bool; private final DataflowError dataflowError; @@ -95,6 +99,7 @@ public Builtins(Context context) { nothing = new AtomConstructor("Nothing", scope).initializeFields(); number = new Number(language, scope); ordering = new Ordering(language, scope); + panic = new AtomConstructor("Panic", scope).initializeFields(); polyglot = new Polyglot(language, scope); resource = new Resource(language, scope); system = new System(language, scope); @@ -109,7 +114,6 @@ public Builtins(Context context) { AtomConstructor io = new AtomConstructor("IO", scope).initializeFields(); AtomConstructor primIo = new AtomConstructor("Prim_Io", scope).initializeFields(); AtomConstructor runtime = new AtomConstructor("Runtime", scope).initializeFields(); - AtomConstructor panic = new AtomConstructor("Panic", scope).initializeFields(); AtomConstructor state = new AtomConstructor("State", scope).initializeFields(); AtomConstructor java = new AtomConstructor("Java", scope).initializeFields(); @@ -301,4 +305,44 @@ public ModuleScope getScope() { public Module getModule() { return module; } + + /** + * Convert from type-system type names to atoms. + * + * @param typeName the fully qualified type name as defined in {@link Constants}. + * @return the associated {@link org.enso.interpreter.runtime.callable.atom.Atom} if it exists, + * and {@code null} otherwise + */ + public Atom fromTypeSystem(String typeName) { + switch (typeName) { + case Constants.ANY: + return any.newInstance(); + case Constants.ARRAY: + return mutable.array().newInstance(); + case Constants.BOOLEAN: + return bool.getBool().newInstance(); + case Constants.DECIMAL: + return number.getDecimal().newInstance(); + case Constants.ERROR: + return dataflowError.constructor().newInstance(); + case Constants.FUNCTION: + return function.newInstance(); + case Constants.INTEGER: + return number.getInteger().newInstance(); + case Constants.MANAGED_RESOURCE: + return resource.getManagedResource().newInstance(); + case Constants.NOTHING: + return nothing.newInstance(); + case Constants.NUMBER: + return number.getNumber().newInstance(); + case Constants.PANIC: + return panic.newInstance(); + case Constants.REF: + return mutable.ref().newInstance(); + case Constants.TEXT: + return text.getText().newInstance(); + default: + return null; + } + } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java index b299f31be6d2..3d08bda06a5a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java @@ -23,6 +23,9 @@ public class Error { private final AtomConstructor invalidArrayIndexError; private final AtomConstructor arityError; private final AtomConstructor unsupportedArgumentsError; + private final AtomConstructor moduleDoesNotExistError; + private final AtomConstructor duplicateArgumentNameError; + private final AtomConstructor notInvokableError; private final Atom arithmeticErrorShiftTooBig; private final Atom arithmeticErrorDivideByZero; @@ -45,7 +48,8 @@ public Error(Language language, ModuleScope scope) { new AtomConstructor("Type_Error", scope) .initializeFields( new ArgumentDefinition(0, "expected", ArgumentDefinition.ExecutionMode.EXECUTE), - new ArgumentDefinition(0, "actual", ArgumentDefinition.ExecutionMode.EXECUTE)); + new ArgumentDefinition(1, "actual", ArgumentDefinition.ExecutionMode.EXECUTE), + new ArgumentDefinition(2, "name", ArgumentDefinition.ExecutionMode.EXECUTE)); compileError = new AtomConstructor("Compile_Error", scope) .initializeFields( @@ -80,7 +84,6 @@ public Error(Language language, ModuleScope scope) { .initializeFields( new ArgumentDefinition(0, "array", ArgumentDefinition.ExecutionMode.EXECUTE), new ArgumentDefinition(1, "index", ArgumentDefinition.ExecutionMode.EXECUTE)); - arityError = new AtomConstructor("Arity_Error", scope) .initializeFields( @@ -91,6 +94,18 @@ public Error(Language language, ModuleScope scope) { new AtomConstructor("Unsupported_Argument_Types", scope) .initializeFields( new ArgumentDefinition(0, "arguments", ArgumentDefinition.ExecutionMode.EXECUTE)); + moduleDoesNotExistError = + new AtomConstructor("Module_Does_Not_Exist", scope) + .initializeFields( + new ArgumentDefinition(0, "name", ArgumentDefinition.ExecutionMode.EXECUTE)); + duplicateArgumentNameError = + new AtomConstructor("Duplicate_Argument_Name", scope) + .initializeFields( + new ArgumentDefinition(0, "name", ArgumentDefinition.ExecutionMode.EXECUTE)); + notInvokableError = + new AtomConstructor("Not_Invokable", scope) + .initializeFields( + new ArgumentDefinition(0, "target", ArgumentDefinition.ExecutionMode.EXECUTE)); scope.registerConstructor(syntaxError); scope.registerConstructor(typeError); @@ -153,10 +168,11 @@ public Atom makeNoSuchMethodError(Object target, UnresolvedSymbol symbol) { * * @param expected the expected type * @param actual the actual type + * @param name the name of the variable that is a type error * @return a runtime representation of the error. */ - public Atom makeTypeError(Object expected, Object actual) { - return typeError.newInstance(expected, actual); + public Atom makeTypeError(Object expected, Object actual, String name) { + return typeError.newInstance(expected, actual, name); } /** @@ -215,4 +231,28 @@ public Atom makeArityError(long expected, long actual) { public Atom makeUnsupportedArgumentsError(Object[] args) { return unsupportedArgumentsError.newInstance(new Array(args)); } + + /** + * @param name the name of the module that doesn't exist + * @return a module does not exist error + */ + public Atom makeModuleDoesNotExistError(String name) { + return moduleDoesNotExistError.newInstance(name); + } + + /** + * @param name the name of the duplicated argument + * @return a duplicate argument name error + */ + public Atom makeDuplicateArgumentNameError(String name) { + return duplicateArgumentNameError.newInstance(name); + } + + /** + * @param target the target attempted to be invoked + * @return a not invokable error + */ + public Atom makeNotInvokableError(Object target) { + return notInvokableError.newInstance(target); + } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Resource.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Resource.java index c67d1c22956f..ab4ca5bfaa08 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Resource.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Resource.java @@ -7,6 +7,7 @@ /** Container for builtin Managed_Resource types */ public class Resource { + private final AtomConstructor managedResource; /** * Creates and registers the relevant constructors. @@ -15,8 +16,7 @@ public class Resource { * @param scope the scope to register constructors in. */ public Resource(Language language, ModuleScope scope) { - AtomConstructor managedResource = - new AtomConstructor("Managed_Resource", scope).initializeFields(); + managedResource = new AtomConstructor("Managed_Resource", scope).initializeFields(); scope.registerConstructor(managedResource); AtomConstructor resource = new AtomConstructor("Resource", scope).initializeFields(); scope.registerConstructor(resource); @@ -26,4 +26,9 @@ public Resource(Language language, ModuleScope scope) { scope.registerMethod(managedResource, "take", TakeMethodGen.makeFunction(language)); scope.registerMethod(managedResource, "finalize", FinalizeMethodGen.makeFunction(language)); } + + /** @return the managed resource atom constructor. */ + public AtomConstructor getManagedResource() { + return managedResource; + } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ArityException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ArityException.java deleted file mode 100644 index 6abf70c46cd4..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ArityException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.enso.interpreter.runtime.error; - -/** - * An exception that is thrown whenever a call is made to a {@link - * org.enso.interpreter.runtime.callable.Callable} with the wrong number of arguments. - */ -public class ArityException extends RuntimeException { - - /** - * Creates a new error. - * - * @param expected the expected number of arguments - * @param actual the provided number of arguments - */ - public ArityException(int expected, int actual) { - super("Wrong number of arguments. Expected: " + expected + " but got: " + actual + "."); - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java index ef6e87e6fe7b..70eb67c71fa2 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DataflowError.java @@ -1,25 +1,15 @@ package org.enso.interpreter.runtime.error; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.CachedContext; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.TruffleStackTrace; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.nodes.Node; -import org.enso.interpreter.Language; -import org.enso.interpreter.runtime.Context; -import org.enso.interpreter.runtime.callable.UnresolvedSymbol; -import org.enso.interpreter.runtime.callable.function.Function; import org.enso.interpreter.runtime.library.dispatch.MethodDispatchLibrary; -import javax.xml.crypto.Data; - /** * A runtime object representing an arbitrary, user-created dataflow error. * @@ -28,9 +18,8 @@ */ @ExportLibrary(InteropLibrary.class) @ExportLibrary(MethodDispatchLibrary.class) -public class DataflowError extends RuntimeException implements TruffleObject, TruffleException { +public class DataflowError extends AbstractTruffleException { private final Object payload; - private final Node location; /** * Construct a new dataflow error with the default stack trace. @@ -41,10 +30,8 @@ public class DataflowError extends RuntimeException implements TruffleObject, Tr * @param location the node in which the error was created * @return a new dataflow error */ - public static DataflowError withDefaultTrace(Object payload, Node location) { - var error = new DataflowError(payload, location); - error.fillInStackTrace(); - return error; + public static DataflowError withoutTrace(Object payload, Node location) { + return new DataflowError(payload, location); } /** @@ -65,13 +52,8 @@ public static DataflowError withTrace(Object payload, Node location, StackTraceE } DataflowError(Object payload, Node location) { + super(location); this.payload = payload; - this.location = location; - } - - @Override - public Node getLocation() { - return location; } /** diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DuplicateArgumentNameException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DuplicateArgumentNameException.java deleted file mode 100644 index 48150f7b43ec..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/DuplicateArgumentNameException.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.enso.interpreter.runtime.error; - -/** An exception thrown when a function is defined with duplicate argument names. */ -public class DuplicateArgumentNameException extends RuntimeException { - - /** - * Creates a new error. - * - * @param name the name defined multiple times - */ - public DuplicateArgumentNameException(String name) { - super("A function cannot have multiple arguments called " + name); - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/InvalidArgumentNameException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/InvalidArgumentNameException.java deleted file mode 100644 index 314d3a5b3cb4..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/InvalidArgumentNameException.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import java.util.Set; - -/** - * An error thrown when an argument is provided by name, but doesn't match any of the arguments - * defined on the callable. - */ -public class InvalidArgumentNameException extends RuntimeException { - - /** - * Creates a new error. - * - * @param name the erroneous argument name at the call site - * @param availableNames the argument names defined on the callable - */ - public InvalidArgumentNameException(String name, Set availableNames) { - super( - name - + " is not a valid argument name for a function with arguments: " - + availableNames.stream().reduce("", (l, r) -> l + ", " + r)); - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/MethodDoesNotExistException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/MethodDoesNotExistException.java deleted file mode 100644 index 6f6623891069..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/MethodDoesNotExistException.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** Thrown when a given Object does not implement the requested Enso-level method. */ -public class MethodDoesNotExistException extends RuntimeException implements TruffleException { - private final Node node; - - /** - * Creates the error. - * - * @param target the construct that was attempted to be invoked - * @param node the node where the erroneous invocation took place - */ - public MethodDoesNotExistException(Object target, String name, Node node) { - super("Object " + target + " does not define method " + name + "."); - this.node = node; - } - - /** - * The location where the erroneous invocation took place. - * - * @return the node where the error occurred - */ - @Override - public Node getLocation() { - return node; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ModuleDoesNotExistException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ModuleDoesNotExistException.java deleted file mode 100644 index 09df36f42867..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/ModuleDoesNotExistException.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** Thrown when a module was requested for importing but could not be found. */ -public class ModuleDoesNotExistException extends RuntimeException implements TruffleException { - /** - * Creates a new instance of this error. - * - * @param name the qualified name of the non-existent module - */ - public ModuleDoesNotExistException(String name) { - super("Module " + name + " does not exist."); - } - - /** - * Reports a null location for this exception. - * - * @return null. - */ - @Override - public Node getLocation() { - return null; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/NotInvokableException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/NotInvokableException.java deleted file mode 100644 index 113908ff2619..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/NotInvokableException.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** An exception thrown when execution attempts to invoke something that cannot be invoked. */ -public class NotInvokableException extends RuntimeException implements TruffleException { - private final Node node; - - /** - * Creates the error. - * - * @param target the construct that was attempted to be invoked - * @param node the node where the erroneous invocation took place - */ - public NotInvokableException(Object target, Node node) { - super("Object " + target + " is not invokable."); - this.node = node; - } - - /** - * The location where the erroneous invocation took place. - * - * @return the node where the error occurred - */ - @Override - public Node getLocation() { - return node; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java index e0688a8efacb..d6d747008233 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicException.java @@ -1,12 +1,18 @@ package org.enso.interpreter.runtime.error; -import com.oracle.truffle.api.TruffleException; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.ExceptionType; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.source.SourceSection; /** An exception type for user thrown panic exceptions. */ -public class PanicException extends RuntimeException implements TruffleException { - private final Object payload; - private final Node location; +@ExportLibrary(value = InteropLibrary.class, delegateTo = "payload") +public class PanicException extends AbstractTruffleException { + final Object payload; /** * Creates an instance of this class. @@ -15,41 +21,60 @@ public class PanicException extends RuntimeException implements TruffleException * @param location the node throwing this exception, for use in guest stack traces */ public PanicException(Object payload, Node location) { - super(payload.toString()); + super(location); this.payload = payload; - this.location = location; } /** - * Returns the location where this exception was thrown. + * Returns the payload in the panic. * - * @return the original throw location + * @return the panic payload */ - @Override - public Node getLocation() { - return location; + public Object getPayload() { + return payload; } - /** - * Returns the payload carried by this exception. - * - * @return the payload object - */ @Override - public Object getExceptionObject() { - return payload; + public String getMessage() { + return payload.toString(); } - /** - * Override recommended by the Truffle documentation for better performance. - * - * @see Relevant - * documentation - * @return this exception - */ - @Override - public Throwable fillInStackTrace() { - return this; + @ExportMessage + boolean isException() { + return true; + } + + @ExportMessage + RuntimeException throwException() { + throw this; + } + + @ExportMessage + ExceptionType getExceptionType() { + return ExceptionType.RUNTIME_ERROR; + } + + @ExportMessage + int getExceptionExitStatus() { + return 1; + } + + @ExportMessage + boolean isExceptionIncompleteSource() { + return false; + } + + @ExportMessage + boolean hasSourceLocation() { + return getLocation().getEncapsulatingSourceSection() != null; + } + + @ExportMessage(name = "getSourceLocation") + SourceSection getSourceSection() throws UnsupportedMessageException { + SourceSection loc = getLocation().getEncapsulatingSourceSection(); + if (loc == null) { + throw UnsupportedMessageException.create(); + } + return getLocation().getEncapsulatingSourceSection(); } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicSentinel.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicSentinel.java index ec2acddc247e..da0ab563dbf4 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicSentinel.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/PanicSentinel.java @@ -1,9 +1,13 @@ package org.enso.interpreter.runtime.error; -import com.oracle.truffle.api.TruffleException; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.ExceptionType; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.source.SourceSection; import org.enso.interpreter.runtime.library.dispatch.MethodDispatchLibrary; /** @@ -13,9 +17,8 @@ * not function in textual mode. */ @ExportLibrary(MethodDispatchLibrary.class) -public class PanicSentinel extends RuntimeException implements TruffleException { - private final PanicException panic; - private final Node location; +public class PanicSentinel extends AbstractTruffleException { + final PanicException panic; /** * Create an instance of the panic sentinel, wrapping the provided panic. @@ -24,42 +27,22 @@ public class PanicSentinel extends RuntimeException implements TruffleException * @param location the location from where the sentinel was thrown */ public PanicSentinel(PanicException panic, Node location) { - super(panic.getExceptionObject().toString()); + super(location); this.panic = panic; - this.location = location; } /** - * Returns the location where this exception was thrown. + * Get the underlying panic. * - * @return the original throw location + * @return the underlying panic object */ - @Override - public Node getLocation() { - return location; - } - - /** - * Returns the payload carried by this exception. - * - * @return the payload object - */ - @Override - public Object getExceptionObject() { + public PanicException getPanic() { return panic; } - /** - * Override recommended by the Truffle documentation for better performance. - * - * @see Relevant - * documentation - * @return this exception - */ @Override - public Throwable fillInStackTrace() { - return this; + public String getMessage() { + return panic.getMessage(); } @ExportMessage diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/RedefinedMethodException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/RedefinedMethodException.java index 63bc6524f0fb..895e5a65cfce 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/RedefinedMethodException.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/RedefinedMethodException.java @@ -1,10 +1,9 @@ package org.enso.interpreter.runtime.error; -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.exception.AbstractTruffleException; /** An exception thrown when the program tries to redefine an already-defined method */ -public class RedefinedMethodException extends RuntimeException implements TruffleException { +public class RedefinedMethodException extends AbstractTruffleException { /** * Creates a new error. @@ -15,14 +14,4 @@ public class RedefinedMethodException extends RuntimeException implements Truffl public RedefinedMethodException(String atom, String method) { super("Methods cannot be overloaded, but you have tried to overload " + atom + "." + method); } - - /** - * Gets the location where the exception occurred. - * - * @return the location where the exception occurred - */ - @Override - public Node getLocation() { - return null; - } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/TypeError.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/TypeError.java deleted file mode 100644 index 5c1201e34970..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/TypeError.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** An exception thrown on a type mismatch. */ -public class TypeError extends RuntimeException implements TruffleException { - private final Node node; - - /** - * Creates the error. - * - * @param message an informative error message - * @param node the node where the error occurred - */ - public TypeError(String message, Node node) { - super(message); - this.node = node; - } - - /** - * Gets the location of the error. - * - * @return the node where the error occurred. - */ - @Override - public Node getLocation() { - return node; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/UnsaturatedCallException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/UnsaturatedCallException.java deleted file mode 100644 index 1075ffd34bbc..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/UnsaturatedCallException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import org.enso.interpreter.runtime.callable.argument.ArgumentDefinition; - -/** - * An error thrown when an attempt is made to execute a callable that has not had all of its - * arguments provided. - */ -public class UnsaturatedCallException extends RuntimeException { - - /** - * Creates the error. - * - * @param arg the unapplied argument - */ - public UnsaturatedCallException(ArgumentDefinition arg) { - super("The argument named " + arg.getName() + " has not been applied."); - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableDoesNotExistException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableDoesNotExistException.java deleted file mode 100644 index f2682b9098a4..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableDoesNotExistException.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** An error thrown when the program attempts to read from a variable that has not been defined. */ -public class VariableDoesNotExistException extends RuntimeException implements TruffleException { - - /** - * Creates the error. - * - * @param name the name of the undefined variable - */ - public VariableDoesNotExistException(String name) { - super("Variable " + name + " is not defined."); - } - - /** - * Gets the location of the error. - * - * @return the node where the error occurred. - */ - @Override - public Node getLocation() { - return null; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableRedefinitionException.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableRedefinitionException.java deleted file mode 100644 index f3c296b20255..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/error/VariableRedefinitionException.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.enso.interpreter.runtime.error; - -import com.oracle.truffle.api.TruffleException; -import com.oracle.truffle.api.nodes.Node; - -/** - * An exception thrown when a program attempts to redefine a variable that has already been defined. - */ -public class VariableRedefinitionException extends RuntimeException implements TruffleException { - - /** - * Creates the error. - * - * @param name the name of the already-defined variable - */ - public VariableRedefinitionException(String name) { - super("Variable " + name + " was already defined in this scope."); - } - - /** - * Gets the location of the error. - * - * @return the node where the error occurred. - */ - @Override - public Node getLocation() { - return null; - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/TopLevelScope.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/TopLevelScope.java index 82a4c54be10c..d183088f9e37 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/TopLevelScope.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/scope/TopLevelScope.java @@ -1,13 +1,23 @@ package org.enso.interpreter.runtime.scope; -import com.oracle.truffle.api.Scope; import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.dsl.CachedContext; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.*; +import com.oracle.truffle.api.interop.ArityException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import org.enso.interpreter.Language; import org.enso.interpreter.runtime.Context; import org.enso.interpreter.runtime.Module; @@ -18,16 +28,11 @@ import org.enso.pkg.QualifiedName$; import org.enso.polyglot.MethodNames; -import java.io.File; -import java.util.*; -import java.util.stream.Collectors; - /** Represents the top scope of Enso execution, containing all the importable modules. */ @ExportLibrary(InteropLibrary.class) public class TopLevelScope implements TruffleObject { private final Builtins builtins; private final Map modules; - private final Scope scope = Scope.newBuilder("top_scope", this).build(); /** * Creates a new instance of top scope. @@ -40,15 +45,6 @@ public TopLevelScope(Builtins builtins, Map modules) { this.modules = modules; } - /** - * Returns a polyglot representation of this scope. - * - * @return a polyglot Scope object. - */ - public Scope getScope() { - return scope; - } - /** @return the list of modules in the scope. */ public Collection getModules() { return modules.values(); @@ -224,4 +220,66 @@ boolean isMemberInvocable(String member) { || member.equals(MethodNames.TopScope.REGISTER_MODULE) || member.equals(MethodNames.TopScope.UNREGISTER_MODULE); } + + /** + * Checks if the receiver is a scope object. + * + * @return {@code true} + */ + @ExportMessage + boolean isScope() { + return true; + } + + /** + * Returns true if this scope has an enclosing parent scope, else false. + * + * @return {@code false} + */ + @ExportMessage + boolean hasScopeParent() { + return false; + } + + /** + * Returns the parent scope of this scope, if one exists. + * + * @return {@code null} + * @throws UnsupportedMessageException always, as this scope can never have a parent + */ + @ExportMessage + Object getScopeParent() throws UnsupportedMessageException { + return UnsupportedMessageException.create(); + } + + /** + * Checks if this value is associated with a language. + * + * @return {@code true} + */ + @ExportMessage + final boolean hasLanguage() { + return true; + } + + /** + * Returns the language associated with this scope value. + * + * @return the language with which this value is associated + */ + @ExportMessage + final Class getLanguage() { + return Language.class; + } + + /** + * Converts this scope to a human readable string. + * + * @param allowSideEffects whether or not side effects are allowed + * @return a string representation of this scope + */ + @ExportMessage + final Object toDisplayString(boolean allowSideEffects) { + return "Enso.Top_Scope"; + } } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Constants.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Constants.java index dad436a3234c..264c796d28d0 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Constants.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Constants.java @@ -6,14 +6,17 @@ public class Constants { public static final String ANY = "Builtins.Main.Any"; public static final String ARRAY = "Builtins.Main.Array"; public static final String BOOLEAN = "Builtins.Main.Boolean"; + public static final String DECIMAL = "Builtins.Main.Decimal"; public static final String ERROR = "Builtins.Main.Error"; public static final String FUNCTION = "Builtins.Main.Function"; - public static final String NUMBER = "Builtins.Main.Number"; public static final String INTEGER = "Builtins.Main.Integer"; - public static final String DECIMAL = "Builtins.Main.Decimal"; + public static final String MANAGED_RESOURCE = "Builtins.Main.Managed_Resource"; + public static final String MODULE_SCOPE = "Builtins.Main.Module_Scope"; public static final String NOTHING = "Builtins.Main.Nothing"; + public static final String NUMBER = "Builtins.Main.Number"; public static final String PANIC = "Builtins.Main.Panic"; public static final String REF = "Builtins.Main.Ref"; public static final String TEXT = "Builtins.Main.Text"; public static final String THUNK = "Builtins.Main.Thunk"; + public static final String UNRESOLVED_SYMBOL = "Builtins.Main.Unresolved_Symbol"; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Types.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Types.java index a854661d75a1..c8f9b4656f7c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Types.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/type/Types.java @@ -13,6 +13,7 @@ import org.enso.interpreter.runtime.data.Ref; import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.error.DataflowError; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.error.PanicSentinel; import org.enso.interpreter.runtime.number.EnsoBigInteger; import org.enso.interpreter.runtime.scope.ModuleScope; @@ -43,6 +44,7 @@ ManagedResource.class, ModuleScope.class, Ref.class, + PanicException.class, PanicSentinel.class }) public class Types { @@ -118,10 +120,18 @@ public static String getName(Object value) { return Constants.THUNK; } else if (TypesGen.isDataflowError(value)) { return Constants.ERROR; + } else if (TypesGen.isUnresolvedSymbol(value)) { + return Constants.UNRESOLVED_SYMBOL; + } else if (TypesGen.isManagedResource(value)) { + return Constants.MANAGED_RESOURCE; } else if (TypesGen.isArray(value)) { return Constants.ARRAY; + } else if (TypesGen.isModuleScope(value)) { + return Constants.MODULE_SCOPE; } else if (TypesGen.isRef(value)) { return Constants.REF; + } else if (TypesGen.isPanicException(value)) { + return Constants.PANIC; } else if (TypesGen.isPanicSentinel(value)) { return Constants.PANIC; } else { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java index afc5992b70be..c9c9c7d5005f 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java @@ -1,5 +1,6 @@ package org.enso.interpreter.service; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.instrumentation.EventBinding; import com.oracle.truffle.api.instrumentation.ExecutionEventListener; @@ -272,4 +273,42 @@ public ChangesetBuilder modifyModuleSources(File path, List RuntimeExpression} -import org.enso.interpreter.runtime.Context -import org.enso.interpreter.runtime.error.ModuleDoesNotExistException -import org.enso.interpreter.runtime.Module +import org.enso.interpreter.runtime.{Context, Module} import org.enso.interpreter.runtime.builtin.Builtins +import org.enso.interpreter.runtime.error.PanicException import org.enso.interpreter.runtime.scope.{LocalScope, ModuleScope} import org.enso.polyglot.LanguageInfo import org.enso.syntax.text.Parser.IDMap import org.enso.syntax.text.{AST, Parser} +import java.io.StringReader import scala.jdk.OptionConverters._ /** This class encapsulates the static transformation processes that take place @@ -195,7 +194,14 @@ class Compiler(val context: Context, private val builtins: Builtins) { val module = context.getTopScope .getModule(qualifiedName) .toScala - .getOrElse(throw new ModuleDoesNotExistException(qualifiedName)) + .getOrElse( + throw new PanicException( + context.getBuiltins + .error() + .makeModuleDoesNotExistError(qualifiedName), + null + ) + ) if ( !module.getCompilationStage.isAtLeast( Module.CompilationStage.AFTER_RUNTIME_STUBS diff --git a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala index 038678fbcadc..70727375c76a 100644 --- a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala +++ b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala @@ -1,7 +1,5 @@ package org.enso.compiler.codegen -import java.math.BigInteger - import com.oracle.truffle.api.Truffle import com.oracle.truffle.api.frame.FrameSlot import com.oracle.truffle.api.source.{Source, SourceSection} @@ -65,7 +63,7 @@ import org.enso.interpreter.runtime.callable.function.{ Function => RuntimeFunction } import org.enso.interpreter.runtime.data.text.Text -import org.enso.interpreter.runtime.error.DuplicateArgumentNameException +import org.enso.interpreter.runtime.error.PanicException import org.enso.interpreter.runtime.scope.{ FramePointer, LocalScope, @@ -73,6 +71,7 @@ import org.enso.interpreter.runtime.scope.{ } import org.enso.interpreter.{Constants, Language} +import java.math.BigInteger import scala.collection.mutable import scala.collection.mutable.ArrayBuffer @@ -1053,7 +1052,9 @@ class IrToTruffle( val argName = arg.getName if (seenArgNames contains argName) { - throw new DuplicateArgumentNameException(argName) + val err = + context.getBuiltins.error.makeDuplicateArgumentNameError(argName) + throw new PanicException(err, null) } else seenArgNames.add(argName) slot } diff --git a/engine/runtime/src/main/scala/org/enso/compiler/exception/CompilationAbortedException.scala b/engine/runtime/src/main/scala/org/enso/compiler/exception/CompilationAbortedException.scala index 55e10d3ba8a9..7fa79e90646c 100644 --- a/engine/runtime/src/main/scala/org/enso/compiler/exception/CompilationAbortedException.scala +++ b/engine/runtime/src/main/scala/org/enso/compiler/exception/CompilationAbortedException.scala @@ -1,13 +1,10 @@ package org.enso.compiler.exception -import com.oracle.truffle.api.TruffleException -import com.oracle.truffle.api.nodes.Node +import com.oracle.truffle.api.exception.AbstractTruffleException /** An exception thrown to break out of the compilation flow after reporting * all the encountered errors. */ -class CompilationAbortedException extends Exception with TruffleException { +class CompilationAbortedException extends AbstractTruffleException { override def getMessage: String = "Compilation aborted due to errors." - - override def getLocation: Node = null } diff --git a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/execution/ErrorResolver.scala b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/execution/ErrorResolver.scala index 4923753541cf..056dddd4b196 100644 --- a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/execution/ErrorResolver.scala +++ b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/execution/ErrorResolver.scala @@ -1,14 +1,9 @@ package org.enso.interpreter.instrument.execution -import java.io.File - -import com.oracle.truffle.api.{ - TruffleException, - TruffleStackTrace, - TruffleStackTraceElement -} +import com.oracle.truffle.api.{TruffleStackTrace, TruffleStackTraceElement} import org.enso.polyglot.runtime.Runtime.Api +import java.io.File import scala.jdk.CollectionConverters._ import scala.jdk.OptionConverters.RichOptional @@ -23,12 +18,13 @@ object ErrorResolver { */ def getStackTrace( throwable: Throwable - )(implicit ctx: RuntimeContext): Vector[Api.StackTraceElement] = + )(implicit ctx: RuntimeContext): Vector[Api.StackTraceElement] = { TruffleStackTrace .getStackTrace(throwable) .asScala - .map(toStackElement) + .flatMap(toStackElement) .toVector + } /** Convert from the truffle stack element to the runtime API representation. * @@ -38,32 +34,23 @@ object ErrorResolver { */ private def toStackElement( element: TruffleStackTraceElement - )(implicit ctx: RuntimeContext): Api.StackTraceElement = { - val node = element.getLocation - node.getEncapsulatingSourceSection match { - case null => - Api.StackTraceElement(node.getRootNode.getName, None, None, None) - case section => - Api.StackTraceElement( - element.getTarget.getRootNode.getName, - findFileByModuleName(section.getSource.getName), - Some(LocationResolver.sectionToRange(section)), - LocationResolver.getExpressionId(section).map(_.externalId) - ) - } + )(implicit ctx: RuntimeContext): Option[Api.StackTraceElement] = { + val node = Option(element.getLocation) + node.map(x => { + x.getEncapsulatingSourceSection match { + case null => + Api.StackTraceElement(x.getRootNode.getName, None, None, None) + case section => + Api.StackTraceElement( + element.getTarget.getRootNode.getName, + findFileByModuleName(section.getSource.getName), + Some(LocationResolver.sectionToRange(section)), + LocationResolver.getExpressionId(section).map(_.externalId) + ) + } + }) } - /** Get the language produced the runtime exception. - * - * @param ex the runtime exception - * @return the language of the source file produced the runtime exception - */ - def getLanguage(ex: TruffleException): Option[String] = - for { - location <- Option(ex.getSourceLocation) - source <- Option(location.getSource) - } yield source.getLanguage - /** Find source file path by the module name. * * @param module the module name diff --git a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala index 70b3ebecea10..ca5919f324b0 100644 --- a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala +++ b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala @@ -1,12 +1,7 @@ package org.enso.interpreter.instrument.job -import java.io.File -import java.util.function.Consumer -import java.util.logging.Level -import java.util.{Objects, UUID} - import cats.implicits._ -import com.oracle.truffle.api.TruffleException +import com.oracle.truffle.api.exception.AbstractTruffleException import org.enso.interpreter.instrument.IdExecutionInstrument.{ ExpressionCall, ExpressionValue @@ -29,6 +24,7 @@ import org.enso.interpreter.instrument.{ } import org.enso.interpreter.node.callable.FunctionCallInstrumentationNode.FunctionCall import org.enso.interpreter.runtime.data.text.Text +import org.enso.interpreter.runtime.error.{DataflowError, PanicSentinel} import org.enso.interpreter.service.error.{ ConstructorNotFoundException, MethodNotFoundException, @@ -37,8 +33,11 @@ import org.enso.interpreter.service.error.{ import org.enso.polyglot.LanguageInfo import org.enso.polyglot.runtime.Runtime.Api import org.enso.polyglot.runtime.Runtime.Api.ContextId -import org.enso.interpreter.runtime.error.{DataflowError, PanicSentinel} +import java.io.File +import java.util.function.Consumer +import java.util.logging.Level +import java.util.{Objects, UUID} import scala.jdk.OptionConverters._ /** Provides support for executing Enso code. Adds convenient methods to @@ -261,9 +260,10 @@ trait ProgramExecutionSupport { t: Throwable )(implicit ctx: RuntimeContext): Option[Api.ExecutionResult] = { t match { - case ex: TruffleException - if ErrorResolver.getLanguage(ex).forall(_ == LanguageInfo.ID) => - val section = Option(ex.getSourceLocation) + case ex: AbstractTruffleException + if Option(ctx.executionService.getLanguage(ex)) + .forall(_ == LanguageInfo.ID) => + val section = Option(ctx.executionService.getSourceLocation(ex)) Some( Api.ExecutionResult.Diagnostic.error( ex.getMessage, @@ -328,7 +328,7 @@ trait ProgramExecutionSupport { case sentinel: PanicSentinel => Api.ExpressionUpdate.Payload .Panic( - sentinel.getMessage, + sentinel.getPanic.getMessage, ErrorResolver.getStackTrace(sentinel).flatMap(_.expressionId) ) case error: DataflowError => diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala index 798ef3132722..a972f99b04b6 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala @@ -103,7 +103,7 @@ class ExpressionErrorsTest } def receive: Option[Api.Response] = { - Option(messageQueue.poll(5, TimeUnit.SECONDS)) + Option(messageQueue.poll(10, TimeUnit.SECONDS)) } def receive(n: Int): List[Api.Response] = { diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/RuntimeServerTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/RuntimeServerTest.scala index e406867c1ee4..5d8f0722fed1 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/RuntimeServerTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/RuntimeServerTest.scala @@ -3001,7 +3001,7 @@ class RuntimeServerTest contextId, Seq( Api.ExecutionResult.Diagnostic.error( - "Object 42 is not invokable.", + "Not_Invokable 42", Some(mainFile), Some(model.Range(model.Position(0, 7), model.Position(0, 24))), None, @@ -3145,7 +3145,7 @@ class RuntimeServerTest contextId, Seq( Api.ExecutionResult.Diagnostic.error( - "Type_Error Text 2", + "Type_Error Text 2 str", None, None, None, @@ -3302,7 +3302,7 @@ class RuntimeServerTest contextId, Seq( Api.ExecutionResult.Diagnostic.error( - "Unexpected type provided for argument `that` in Integer.+", + "Type_Error Number UnresolvedSymbol that", None, None, None, diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/MethodProcessor.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/MethodProcessor.java index 2c4c5dc56516..5583574f0f0a 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/MethodProcessor.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/MethodProcessor.java @@ -82,7 +82,7 @@ public boolean process(Set annotations, RoundEnvironment "org.enso.interpreter.runtime.callable.argument.ArgumentDefinition", "org.enso.interpreter.runtime.callable.function.Function", "org.enso.interpreter.runtime.callable.function.FunctionSchema", - "org.enso.interpreter.runtime.error.TypeError", + "org.enso.interpreter.runtime.error.PanicException", "org.enso.interpreter.runtime.state.Stateful", "org.enso.interpreter.runtime.type.TypesGen"); @@ -117,9 +117,7 @@ private void generateCode(MethodDefinition methodDefinition) throws IOException " private final ConditionProfile " + condName + " = ConditionProfile.createCountingProfile();"); - out.println( - " private final BranchProfile " + branchName + " = BranchProfile.create();" - ); + out.println(" private final BranchProfile " + branchName + " = BranchProfile.create();"); } } @@ -177,8 +175,7 @@ private void generateCode(MethodDefinition methodDefinition) throws IOException callArgNames.add("callerInfo"); } else { callArgNames.add("arg" + argumentDefinition.getPosition()); - generateArgumentRead( - out, argumentDefinition, methodDefinition.getDeclaredName(), "arguments"); + generateArgumentRead(out, argumentDefinition, "arguments"); } } String executeCall = "bodyNode.execute(" + String.join(", ", callArgNames) + ")"; @@ -227,16 +224,13 @@ private void generateCode(MethodDefinition methodDefinition) throws IOException } private void generateArgumentRead( - PrintWriter out, - MethodDefinition.ArgumentDefinition arg, - String methodName, - String argsArray) { + PrintWriter out, MethodDefinition.ArgumentDefinition arg, String argsArray) { if (!arg.requiresCast()) { generateUncastedArgumentRead(out, arg, argsArray); } else if (arg.getName().equals("this") && arg.getPosition() == 0) { generateUncheckedArgumentRead(out, arg, argsArray); } else { - generateCheckedArgumentRead(out, arg, methodName, argsArray); + generateCheckedArgumentRead(out, arg, argsArray); } if (!arg.acceptsError()) { @@ -244,18 +238,28 @@ private void generateArgumentRead( String varName = "arg" + arg.getPosition(); String condProfile = "arg" + arg.getPosition() + "ConditionProfile"; out.println( - " if (" + condProfile + ".profile(TypesGen.isDataflowError(" + varName + "))) {\n" + - " return new Stateful(state, " + varName + ");\n" + - " }" - ); + " if (" + + condProfile + + ".profile(TypesGen.isDataflowError(" + + varName + + "))) {\n" + + " return new Stateful(state, " + + varName + + ");\n" + + " }"); if (!(arg.getName().equals("this") && arg.getPosition() == 0)) { String branchProfile = "arg" + arg.getPosition() + "BranchProfile"; out.println( - " else if (TypesGen.isPanicSentinel(" + varName + ")) {\n" + - " " + branchProfile + ".enter();\n" + - " throw TypesGen.asPanicSentinel(" + varName + ");\n" + - " }" - ); + " else if (TypesGen.isPanicSentinel(" + + varName + + ")) {\n" + + " " + + branchProfile + + ".enter();\n" + + " throw TypesGen.asPanicSentinel(" + + varName + + ");\n" + + " }"); } } } @@ -294,10 +298,7 @@ private void generateUncheckedArgumentRead( } private void generateCheckedArgumentRead( - PrintWriter out, - MethodDefinition.ArgumentDefinition arg, - String methodName, - String argsArray) { + PrintWriter out, MethodDefinition.ArgumentDefinition arg, String argsArray) { String castName = "TypesGen.expect" + capitalize(arg.getTypeName()); String varName = "arg" + arg.getPosition(); out.println(" " + arg.getTypeName() + " " + varName + ";"); @@ -305,12 +306,18 @@ private void generateCheckedArgumentRead( out.println( " " + varName + " = " + castName + "(" + argsArray + "[" + arg.getPosition() + "]);"); out.println(" } catch (UnexpectedResultException e) {"); + out.println(" var builtins = lookupContextReference(Language.class).get().getBuiltins();"); out.println( - " throw new TypeError(\"Unexpected type provided for argument `" - + arg.getName() - + "` in " - + methodName - + "\", this);"); + " var expected = builtins.fromTypeSystem(TypesGen.getName(arguments[" + + arg.getPosition() + + "]));"); + out.println( + " var error = builtins.error().makeTypeError(expected, arguments[" + + arg.getPosition() + + "], \"" + + varName + + "\");"); + out.println(" throw new PanicException(error,this);"); out.println(" }"); } diff --git a/project/build.properties b/project/build.properties index 603fb0e47c51..0b2e09c5ac99 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1,2 +1 @@ -sbt.version=1.4.1 - +sbt.version=1.4.7 diff --git a/test/Tests/src/Data/Numbers_Spec.enso b/test/Tests/src/Data/Numbers_Spec.enso index d0d4fa99b625..010a455f7a20 100644 --- a/test/Tests/src/Data/Numbers_Spec.enso +++ b/test/Tests/src/Data/Numbers_Spec.enso @@ -42,7 +42,7 @@ spec = (almost_max_long * 2 / almost_max_long_times_three) . should_equal 0.6666666 epsilon=eps Test.specify "should support integer division" <| (10.div 3) . should_equal 3 - # (10.div 0).should_fail_with Arithmetic_Error + (10.div 0).should_fail_with Arithmetic_Error Test.specify "should support integral binary literals" <| lit = 2_01101101 lit . should_equal 109 diff --git a/test/Tests/src/Data/Time/Time_Spec.enso b/test/Tests/src/Data/Time/Time_Spec.enso index 2e7003bff367..8b5dd6df9c1c 100644 --- a/test/Tests/src/Data/Time/Time_Spec.enso +++ b/test/Tests/src/Data/Time/Time_Spec.enso @@ -109,7 +109,7 @@ spec = time . minute . should_equal 30 time . second . should_equal 20 time . nanosecond . should_equal 0 - time . zone . zone_id . should_equal "UTC" + time . zone . zone_id . should_equal "Etc/UTC" Test.specify "should parse custom format of local time" <| time = Time.parse_format "06 of May 2020 at 04:30AM" "dd 'of' MMMM yyyy 'at' hh:mma" time . year . should_equal 2020 diff --git a/test/Tests/src/Semantic/Error_Spec.enso b/test/Tests/src/Semantic/Error_Spec.enso index 8b44b26ec557..ad428454aaae 100644 --- a/test/Tests/src/Semantic/Error_Spec.enso +++ b/test/Tests/src/Semantic/Error_Spec.enso @@ -18,3 +18,7 @@ spec = err_3.target.to_text.should_equal "(My_Type False)" err_3.method_name.should_equal "nope" + Test.group "Dataflow Errors" <| + Test.specify "should be able to be displayed" <| + json = (Error.throw <| My_Type "aaa").to_display + json . should_equal <| (Json.from_pairs [["foo", "aaa"], ["type", "My_Type"]]).to_text diff --git a/test/Tests/src/Semantic/Js_Interop_Spec.enso b/test/Tests/src/Semantic/Js_Interop_Spec.enso index 5e3ae6d1354f..a6e9bcedf351 100644 --- a/test/Tests/src/Semantic/Js_Interop_Spec.enso +++ b/test/Tests/src/Semantic/Js_Interop_Spec.enso @@ -16,6 +16,19 @@ type My_Type var r = this.my_method_2(y) return r + 1; + foreign js my_throw = """ + var err = new Error("JS EXc"); + throw err; + + do_throw = Panic.throw this + + foreign js do_catch = """ + try { + this.do_throw(); + } catch (e) { + return e.a; + } + foreign js make_object = """ return { x: 10, @@ -60,3 +73,15 @@ spec = Test.group "Polyglot JS" <| _ -> False t.should_be_true + Test.specify "should allow Enso to catch JS exceptions" <| + value = My_Type 1 2 + result = Panic.recover <| value.my_throw + err = result.catch + err.cause.message . should_equal "JS EXc" + err.cause.name . should_equal "Error" + + Test.specify "should allow JS to catch Enso exceptions" <| + value = My_Type 7 2 + result = value.do_catch + result . should_equal 7 + From 3d8b8a46c64e1af54f4c93f58dfc9a9a48388f25 Mon Sep 17 00:00:00 2001 From: Ara Adkins Date: Thu, 18 Feb 2021 13:45:56 +0000 Subject: [PATCH 2/5] Fix the workflow --- .github/workflows/release.yml | 11 + .github/workflows/scala.yml | 361 ++++++++---------- build.sbt | 11 +- .../test/semantic/SystemProcessTest.scala | 3 +- project/FixInstrumentsGeneration.scala | 27 ++ test/Tests/src/Network/Http_Spec.enso | 18 +- tools/ci/docker/Dockerfile | 2 +- 7 files changed, 227 insertions(+), 206 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 481ba8477c9a..4a17da875c0a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,6 +98,7 @@ jobs: run: echo "ENSO_RELEASE_MODE=true" >> $GITHUB_ENV - name: Bootstrap the Project working-directory: repo + shell: bash run: | sleep 1 sbt --no-colors bootstrap @@ -106,6 +107,7 @@ jobs: - name: Verify Packages if: runner.os != 'Windows' # TODO [RW] CRLF handling in licenses task working-directory: repo + shell: bash run: | sleep 1 sbt --no-colors verifyLicensePackages @@ -113,6 +115,7 @@ jobs: # Prepare distributions - name: Build the Launcher Native Image working-directory: repo + shell: bash run: | sleep 1 sbt --no-colors launcher/buildNativeImage @@ -303,6 +306,7 @@ jobs: prerelease: true # - name: Login to ACR + # if: runner.os == "Linux" # uses: docker/login-action@v1 # with: # registry: ensosharedwus2acr.azurecr.io @@ -310,12 +314,14 @@ jobs: # password: ${{ secrets.ACR_PUSH_CLIENT_SECRET }} # # - name: Copy the docker entrypoint script + # if: runner.os == "Linux" # shell: bash # run: | # sleep 1 # cp ./repo/tools/ci/docker/docker-entrypoint.sh ./repo/built-distribution/enso-engine-${{ env.DIST_VERSION }}-linux-amd64/enso-${{ env.DIST_VERSION }}/bin # # - name: Publish Runtime Docker Image + # if: runner.os == "Linux" # shell: bash # run: | # sleep 1 @@ -536,3 +542,8 @@ jobs: asset_path: repo/built-distribution/launcher-manifest/launcher-manifest.yaml asset_name: launcher-manifest.yaml asset_content_type: application/yaml + + # Shutdown SBTn + - name: Shutdown SBTn + shell: bash + run: ${{ env.SBTN }} shutdown diff --git a/.github/workflows/scala.yml b/.github/workflows/scala.yml index 55e60b9bb1eb..4b572875701c 100644 --- a/.github/workflows/scala.yml +++ b/.github/workflows/scala.yml @@ -20,7 +20,7 @@ jobs: test_and_publish: name: Build and Test runs-on: ${{ matrix.os }} - timeout-minutes: 60 + timeout-minutes: 90 strategy: matrix: os: [macOS-latest, ubuntu-latest, windows-latest] @@ -29,8 +29,8 @@ jobs: - uses: actions/checkout@v2 - name: Enable Developer Command Prompt (Windows) uses: ilammy/msvc-dev-cmd@v1.5.0 -# - name: Setup Go -# uses: actions/setup-go@v2 + - name: Setup Go + uses: actions/setup-go@v2 - name: Disable TCP/UDP Offloading (macOS) if: runner.os == 'macOS' shell: bash @@ -47,11 +47,11 @@ jobs: run: > Disable-NetAdapterChecksumOffload -Name * -TcpIPv4 -UdpIPv4 -TcpIPv6 -UdpIPv6 -# - name: Install Rust -# uses: actions-rs/toolchain@v1.0.6 -# with: -# toolchain: ${{ env.rustToolchain }} -# override: true + - name: Install Rust + uses: actions-rs/toolchain@v1.0.6 + with: + toolchain: ${{ env.rustToolchain }} + override: true - name: Setup conda uses: s-weigand/setup-conda@v1.0.5 with: @@ -95,79 +95,56 @@ jobs: - name: Bootstrap Enso project run: | sleep 1 - sbtn --no-colors bootstrap + sbt --no-colors bootstrap - name: Build Enso run: | sleep 1 - sbtn --no-colors compile + sbt --no-colors compile - # Debugging - - name: Print JVM Version - run: | - java --version - - name: Print Instruments File + # Tests + - name: Setup Tests on Windows + if: runner.os == 'Windows' shell: bash run: | - cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; - for file in `ls .`; do echo $file; cat $file; done - cd ../../../../../../../; - - # Tests -# - name: Setup Tests on Windows -# if: runner.os == 'Windows' -# shell: bash -# run: | -# echo "CI_TEST_TIMEFACTOR=2" >> $GITHUB_ENV -# echo "CI_TEST_FLAKY_ENABLE=true" >> $GITHUB_ENV + echo "CI_TEST_TIMEFACTOR=2" >> $GITHUB_ENV + echo "CI_TEST_FLAKY_ENABLE=true" >> $GITHUB_ENV - name: Build the Launcher - shell: bash run: | sleep 1 - sbtn --no-colors launcher/buildNativeImage - - name: Print Instruments File - shell: bash - run: | - cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; - for file in `ls .`; do echo $file; cat $file; done - cd ../../../../../../../; + sbt --no-colors launcher/buildNativeImage - name: Build the Runner & Runtime Uberjars run: | sleep 1 - sbtn --no-colors engine-runner/assembly - - name: Print Instruments File - shell: bash - run: | - cd ./engine/runtime/target/scala-2.13/classes/META-INF/services; - for file in `ls .`; do echo $file; cat $file; done - cd ../../../../../../../; + sbt --no-colors "runtime/clean; engine-runner/assembly" - name: Test Enso run: | sleep 1 - sbtn --no-colors "set Global / parallelExecution := false; test" -# - name: Check Runtime Benchmark Compilation -# run: | -# sleep 1 -# sbt --no-colors runtime/Benchmark/compile -# - name: Check Language Server Benchmark Compilation -# run: | -# sleep 1 -# sbt --no-colors language-server/Benchmark/compile -# - name: Check Searcher Benchmark Compilation -# run: | -# sleep 1 -# sbt --no-colors searcher/Benchmark/compile + sbt --no-colors "set Global / parallelExecution := false; runtime/clean; compile; test" + - name: Check Runtime Benchmark Compilation + run: | + sleep 1 + sbt --no-colors "runtime/clean; runtime/Benchmark/compile" + - name: Check Language Server Benchmark Compilation + run: | + sleep 1 + sbt --no-colors language-server/Benchmark/compile + - name: Check Searcher Benchmark Compilation + run: | + sleep 1 + sbt --no-colors searcher/Benchmark/compile # Build Distribution -# - name: Build the Project Manager Native Image -# run: | -# sleep 1 -# sbt --no-colors project-manager/buildNativeImage -# - name: Build the Parser JS Bundle - # The builds are run on 3 platforms, but Flatbuffer schemas are platform - # agnostic, so they just need to be uploaded from one of the runners. -# if: runner.os == 'Linux' -# run: sbt -no-colors syntaxJS/fullOptJS + - name: Build the Project Manager Native Image + run: | + sleep 1 + sbt --no-colors project-manager/buildNativeImage + - name: Build the Parser JS Bundle + # The builds are run on 3 platforms, but + # Flatbuffer schemas are platform agnostic, so they just need to be + # uploaded from one of the runners. + if: runner.os == 'Linux' + run: sbt --no-colors syntaxJS/fullOptJS # Prepare distributions # The version used in filenames is based on the version of the launcher. @@ -175,32 +152,32 @@ jobs: # can be used interchangeably like this. If in the future the versions # become independent, this may require updating to use proper versions # for each component. -# - name: Prepare Distribution Version (Unix) -# if: runner.os != 'Windows' -# shell: bash -# run: | -# DIST_VERSION=$(./enso version --json --only-launcher | jq -r '.version') -# echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV -# -# - name: Prepare Distribution Version (Windows) -# if: runner.os == 'Windows' -# shell: bash -# run: | -# DIST_VERSION=$(./enso.exe version --json --only-launcher | jq -r '.version') -# echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV + - name: Prepare Distribution Version (Unix) + if: runner.os != 'Windows' + shell: bash + run: | + DIST_VERSION=$(./enso version --json --only-launcher | jq -r '.version') + echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV + + - name: Prepare Distribution Version (Windows) + if: runner.os == 'Windows' + shell: bash + run: | + DIST_VERSION=$(./enso.exe version --json --only-launcher | jq -r '.version') + echo "DIST_VERSION=$DIST_VERSION" >> $GITHUB_ENV # Currently the only architecture supported by Github runners is amd64 -# - name: Prepare Distribution Environment -# shell: bash -# run: > -# DIST_OS=$(echo ${{ runner.os }} | awk '{print tolower($0)}') bash -# tools/ci/prepare-distribution-env.sh + - name: Prepare Distribution Environment + shell: bash + run: > + DIST_OS=$(echo ${{ runner.os }} | awk '{print tolower($0)}') bash + tools/ci/prepare-distribution-env.sh -# - name: Prepare Launcher Distribution -# shell: bash -# run: | -# sleep 1 -# sbt buildLauncherDistribution + - name: Prepare Launcher Distribution + shell: bash + run: | + sleep 1 + sbt buildLauncherDistribution # The way artifacts are uploaded currently does not preserve the # executable bits for Unix. However putting artifacts into a ZIP would @@ -209,118 +186,118 @@ jobs: # So the following line has been removed from this step, as it does # nothing useful: # chmod +x $ENGINE_DIST_DIR/bin/enso -# - name: Prepare Engine Distribution -# shell: bash -# run: | -# sleep 1 -# sbt buildEngineDistribution -# -# - name: Prepare Project Manager Distribution -# shell: bash -# run: | -# sleep 1 -# sbt buildProjectManagerDistribution + - name: Prepare Engine Distribution + shell: bash + run: | + sleep 1 + sbt "runtime/clean; buildEngineDistribution" + + - name: Prepare Project Manager Distribution + shell: bash + run: | + sleep 1 + sbt buildProjectManagerDistribution # Test Distribution -# - name: Prepare Engine Test Environment -# shell: bash -# run: | -# go get -v github.com/ahmetb/go-httpbin/cmd/httpbin -# $(go env GOPATH)/bin/httpbin -host :8080 & -# -# - name: Test Engine Distribution (Unix) -# shell: bash -# if: runner.os != 'Windows' -# run: | -# $ENGINE_DIST_DIR/bin/enso --run test/Tests -# $ENGINE_DIST_DIR/bin/enso --run test/Table_Tests -# $ENGINE_DIST_DIR/bin/enso --run test/Geo_Tests -# -# - name: Test Engine Distribution (Windows) -# shell: bash -# if: runner.os == 'Windows' -# run: | -# $ENGINE_DIST_DIR/bin/enso.bat --run test/Tests -# $ENGINE_DIST_DIR/bin/enso.bat --run test/Table_Tests -# $ENGINE_DIST_DIR/bin/enso.bat --run test/Geo_Tests + - name: Prepare Engine Test Environment + shell: bash + run: | + go get -v github.com/ahmetb/go-httpbin/cmd/httpbin + $(go env GOPATH)/bin/httpbin -host :8080 & + + - name: Test Engine Distribution (Unix) + shell: bash + if: runner.os != 'Windows' + run: | + $ENGINE_DIST_DIR/bin/enso --run test/Tests + $ENGINE_DIST_DIR/bin/enso --run test/Table_Tests + $ENGINE_DIST_DIR/bin/enso --run test/Geo_Tests + + - name: Test Engine Distribution (Windows) + shell: bash + if: runner.os == 'Windows' + run: | + $ENGINE_DIST_DIR/bin/enso.bat --run test/Tests + $ENGINE_DIST_DIR/bin/enso.bat --run test/Table_Tests + $ENGINE_DIST_DIR/bin/enso.bat --run test/Geo_Tests # Publish -# - name: Publish the Engine Distribution Artifact -# uses: actions/upload-artifact@v2 -# with: -# name: ${{ env.ENGINE_DIST_NAME }} -# path: ${{ env.ENGINE_DIST_ROOT }} -# - name: Publish the Launcher -# uses: actions/upload-artifact@v2 -# with: -# name: ${{ env.LAUNCHER_DIST_NAME }} -# path: ${{ env.LAUNCHER_DIST_ROOT }} -# - name: Publish the Project Manager -# uses: actions/upload-artifact@v2 -# with: -# name: ${{ env.PROJECTMANAGER_DIST_NAME }} -# path: ${{ env.PROJECTMANAGER_DIST_ROOT }} + - name: Publish the Engine Distribution Artifact + uses: actions/upload-artifact@v2 + with: + name: ${{ env.ENGINE_DIST_NAME }} + path: ${{ env.ENGINE_DIST_ROOT }} + - name: Publish the Launcher + uses: actions/upload-artifact@v2 + with: + name: ${{ env.LAUNCHER_DIST_NAME }} + path: ${{ env.LAUNCHER_DIST_ROOT }} + - name: Publish the Project Manager + uses: actions/upload-artifact@v2 + with: + name: ${{ env.PROJECTMANAGER_DIST_NAME }} + path: ${{ env.PROJECTMANAGER_DIST_ROOT }} -# - name: Prepare the FlatBuffers Schemas for Upload + - name: Prepare the FlatBuffers Schemas for Upload # The builds are run on 3 platforms, but Flatbuffer schemas are platform # agnostic, so they just need to be uploaded from one of the runners. -# if: runner.os == 'Linux' -# run: | -# mkdir fbs-upload -# cp -r "engine/language-server/src/main/schema" fbs-upload/fbs-schema/ -# zip -r -m -ll "fbs-upload/fbs-schema.zip" "fbs-upload/fbs-schema/" -# - name: Publish the FlatBuffers Schemas -# if: runner.os == 'Linux' -# uses: actions/upload-artifact@v2 -# with: -# name: Engine Protocol FlatBuffers Schemas -# path: ./fbs-upload/fbs-schema.zip -# - name: Prepare Parser JS Bundle for Upload -# if: runner.os == 'Linux' -# run: | -# mkdir parser-upload -# cp ./target/scala-parser.js parser-upload -# - name: Publish the Parser JS Bundle -# if: runner.os == 'Linux' -# uses: actions/upload-artifact@v2 -# with: -# name: Parser JS Bundle -# path: ./target/scala-parser.js -# - name: Publish the Manifest -# if: runner.os == 'Linux' -# uses: actions/upload-artifact@v2 -# with: -# name: manifest -# path: ${{ env.ENGINE_DIST_DIR }}/manifest.yaml + if: runner.os == 'Linux' + run: | + mkdir fbs-upload + cp -r "engine/language-server/src/main/schema" fbs-upload/fbs-schema/ + zip -r -m -ll "fbs-upload/fbs-schema.zip" "fbs-upload/fbs-schema/" + - name: Publish the FlatBuffers Schemas + if: runner.os == 'Linux' + uses: actions/upload-artifact@v2 + with: + name: Engine Protocol FlatBuffers Schemas + path: ./fbs-upload/fbs-schema.zip + - name: Prepare Parser JS Bundle for Upload + if: runner.os == 'Linux' + run: | + mkdir parser-upload + cp ./target/scala-parser.js parser-upload + - name: Publish the Parser JS Bundle + if: runner.os == 'Linux' + uses: actions/upload-artifact@v2 + with: + name: Parser JS Bundle + path: ./target/scala-parser.js + - name: Publish the Manifest + if: runner.os == 'Linux' + uses: actions/upload-artifact@v2 + with: + name: manifest + path: ${{ env.ENGINE_DIST_DIR }}/manifest.yaml # Publish FlatBuffer Schemas and Parser Bundle to S3 -# - name: Prepare AWS Session -# shell: bash -# if: runner.os == 'Linux' -# run: | -# aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 -# ${{ secrets.ARTEFACT_S3_ACCESS_KEY_ID }} -# ${{ secrets.ARTEFACT_S3_SECRET_ACCESS_KEY }} -# us-west-2 -# text -# EOF -# - name: Upload Parser JS Bundle to S3 -# shell: bash -# if: runner.os == 'Linux' -# run: | -# aws s3 sync ./parser-upload s3://packages-luna/parser-js/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete -# - name: Upload FlatBuffers Schemas to S3 -# shell: bash -# if: runner.os == 'Linux' -# run: | -# aws s3 sync ./fbs-upload s3://packages-luna/fbs-schema/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete -# - name: Teardown AWS Session -# shell: bash -# if: runner.os == 'Linux' -# run: | -# aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 -# null -# null -# null -# text -# EOF + - name: Prepare AWS Session + shell: bash + if: runner.os == 'Linux' + run: | + aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 + ${{ secrets.ARTEFACT_S3_ACCESS_KEY_ID }} + ${{ secrets.ARTEFACT_S3_SECRET_ACCESS_KEY }} + us-west-2 + text + EOF + - name: Upload Parser JS Bundle to S3 + shell: bash + if: runner.os == 'Linux' + run: | + aws s3 sync ./parser-upload s3://packages-luna/parser-js/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete + - name: Upload FlatBuffers Schemas to S3 + shell: bash + if: runner.os == 'Linux' + run: | + aws s3 sync ./fbs-upload s3://packages-luna/fbs-schema/nightly/`git rev-parse HEAD` --profile s3-upload --acl public-read --delete + - name: Teardown AWS Session + shell: bash + if: runner.os == 'Linux' + run: | + aws configure --profile s3-upload <<-EOF > /dev/null 2>&1 + null + null + null + text + EOF diff --git a/build.sbt b/build.sbt index 72e38207ccf4..752feb6c4527 100644 --- a/build.sbt +++ b/build.sbt @@ -31,7 +31,7 @@ scalaVersion in ThisBuild := scalacVersion lazy val gatherLicenses = taskKey[Unit]("Gathers licensing information for relevant dependencies") gatherLicenses := { - GatherLicenses.run.value + val _ = GatherLicenses.run.value } lazy val verifyLicensePackages = taskKey[Unit]( @@ -964,11 +964,16 @@ lazy val parser = (project in file("lib/scala/parser")) ) .dependsOn(ast) +lazy val cleanInstruments = taskKey[Unit]( + "Cleans fragile class files to force a full recompilation and preserve" + + "consistency of instrumentation configuration." +) lazy val runtime = (project in file("engine/runtime")) .configs(Benchmark) .settings( version := ensoVersion, commands += WithDebugCommand.withDebug, + cleanInstruments := FixInstrumentsGeneration.cleanInstruments.value, inConfig(Compile)(truffleRunOptionsSettings), inConfig(Benchmark)(Defaults.testSettings), parallelExecution in Test := false, @@ -1267,7 +1272,7 @@ lazy val `std-bits` = project ), Compile / packageBin := Def.task { val result = (Compile / packageBin).value - StdBits + val _ = StdBits .copyDependencies( `std-lib-polyglot-root`, "std-bits.jar", @@ -1289,7 +1294,7 @@ lazy val `table` = project ), Compile / packageBin := Def.task { val result = (Compile / packageBin).value - StdBits + val _ = StdBits .copyDependencies( `table-polyglot-root`, "table.jar", diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/SystemProcessTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/SystemProcessTest.scala index e3ba85bfc330..a6bc14977708 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/SystemProcessTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/SystemProcessTest.scala @@ -195,7 +195,8 @@ class SystemProcessTest extends InterpreterTest with OsSpec { | result.stdout |""".stripMargin - eval(code) shouldEqual s"foobar${System.lineSeparator()}" + val result = eval(code).asString().replace("\r\n","\n") + result shouldEqual "foobar\n" consumeOut shouldEqual List() consumeErr shouldEqual List() } diff --git a/project/FixInstrumentsGeneration.scala b/project/FixInstrumentsGeneration.scala index 789e6a342caf..5f397df2173c 100644 --- a/project/FixInstrumentsGeneration.scala +++ b/project/FixInstrumentsGeneration.scala @@ -90,6 +90,33 @@ object FixInstrumentsGeneration { compilationResult } + /** Deletes the compiled instrumentation class files, forcing all of them to + * be recompiled. + * + * Since all instruments are recompiled at once, the service state should be + * consistent as all of them will be re-registered. + */ + def cleanInstruments = Def.task { + val log = streams.value.log + val root = baseDirectory.value + val classFilesDirectory = (Compile / classDirectory).value + val FragileFiles(_, fragileClassFiles) = + getFragileFiles(root, classFilesDirectory) + fragileClassFiles.foreach { file => + if (file.exists()) { + log.info(s"[clean-instruments] Removing $file") + file.delete() + } else { + log.info(s"[clean-instruments] $file was already missing") + } + } + log.info( + "All fragile class files have been deleted. The next compilation " + + "should be forced to recompile all of them, preserving instrumentation " + + "configuration consistency." + ) + } + private case class FragileFiles(sources: Seq[File], classFiles: Seq[File]) private def getFragileFiles( diff --git a/test/Tests/src/Network/Http_Spec.enso b/test/Tests/src/Network/Http_Spec.enso index 3e7cf6640b27..5078df2ed1cb 100644 --- a/test/Tests/src/Network/Http_Spec.enso +++ b/test/Tests/src/Network/Http_Spec.enso @@ -44,7 +44,7 @@ spec_impl = { "headers": { "Content-Length": "0", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -58,7 +58,7 @@ spec_impl = { "headers": { "Content-Length": "0", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -72,7 +72,7 @@ spec_impl = { "headers": { "Content-Length": "0", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -91,7 +91,7 @@ spec_impl = { "headers": { "Content-Length": "0", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -111,7 +111,7 @@ spec_impl = "headers": { "Content-Length": "12", "Content-Type": "text/plain", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -131,7 +131,7 @@ spec_impl = "headers": { "Content-Length": "7", "Content-Type": "application/x-www-form-urlencoded", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -151,7 +151,7 @@ spec_impl = "headers": { "Content-Length": "7", "Content-Type": "application/x-www-form-urlencoded", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -181,7 +181,7 @@ spec_impl = "headers": { "Content-Length": "13", "Content-Type": "application/json", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", @@ -204,7 +204,7 @@ spec_impl = "headers": { "Content-Length": "13", "Content-Type": "application/json", - "User-Agent": "Java-http-client/11.0.8" + "User-Agent": "Java-http-client/11.0.10" }, "origin": "127.0.0.1", "url": "", diff --git a/tools/ci/docker/Dockerfile b/tools/ci/docker/Dockerfile index 1f2317368243..45f51ea1560e 100644 --- a/tools/ci/docker/Dockerfile +++ b/tools/ci/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM oracle/graalvm-ce:20.2.0-java11 +FROM ghcr.io/graalvm/graalvm-ce:java11-21.0.0.2 USER root From a8b0a9ff3fef877d9f86b79f8ab7d1e0c9cf26e5 Mon Sep 17 00:00:00 2001 From: Ara Adkins Date: Mon, 22 Feb 2021 09:46:05 +0000 Subject: [PATCH 3/5] Clean up the release workflow --- .github/workflows/release.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a17da875c0a..93b53d84a1c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -542,8 +542,3 @@ jobs: asset_path: repo/built-distribution/launcher-manifest/launcher-manifest.yaml asset_name: launcher-manifest.yaml asset_content_type: application/yaml - - # Shutdown SBTn - - name: Shutdown SBTn - shell: bash - run: ${{ env.SBTN }} shutdown From a39e0813cb96b9e9ff3111ea2c5314bf013e4478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Wa=C5=9Bko?= Date: Mon, 22 Feb 2021 12:10:46 +0100 Subject: [PATCH 4/5] Make version string in tests shorter to avoid a Windows path length issue --- .../fake-releases/enso/enso-0.0.0/manifest.yaml | 2 +- .../Contents/Home/bin/java | 0 .../graalvm-ce-java11-1.foo}/bin/java | 0 .../graalvm-ce-java11-1.foo}/bin/java.exe | 0 .../components/RuntimeVersionManagerSpec.scala | 16 ++++++++-------- 5 files changed, 9 insertions(+), 9 deletions(-) rename lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/{vm-1.0.0.1.foo/graalvm-ce-java11-darwin-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo => vm-1.foo/graalvm-ce-java11-darwin-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo}/Contents/Home/bin/java (100%) rename lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/{vm-1.0.0.1.foo/graalvm-ce-java11-linux-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo => vm-1.foo/graalvm-ce-java11-linux-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo}/bin/java (100%) rename lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/{vm-1.0.0.1.foo/graalvm-ce-java11-windows-amd64-1.0.0.1.foo.zip/graalvm-ce-java11-1.0.0.1.foo => vm-1.foo/graalvm-ce-java11-windows-amd64-1.foo.zip/graalvm-ce-java11-1.foo}/bin/java.exe (100%) diff --git a/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/enso/enso-0.0.0/manifest.yaml b/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/enso/enso-0.0.0/manifest.yaml index 10571a0ec535..2e871ce09123 100644 --- a/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/enso/enso-0.0.0/manifest.yaml +++ b/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/enso/enso-0.0.0/manifest.yaml @@ -1,6 +1,6 @@ minimum-launcher-version: 0.0.1 minimum-project-manager-version: 0.0.1 -graal-vm-version: 1.0.0.1.foo +graal-vm-version: 1.foo graal-java-version: 11 jvm-options: - value: "-Dtruffle.class.path.append=$enginePackagePath\\component\\runtime.jar" diff --git a/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-darwin-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo/Contents/Home/bin/java b/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-darwin-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo/Contents/Home/bin/java similarity index 100% rename from lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-darwin-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo/Contents/Home/bin/java rename to lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-darwin-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo/Contents/Home/bin/java diff --git a/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-linux-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo/bin/java b/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-linux-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo/bin/java similarity index 100% rename from lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-linux-amd64-1.0.0.1.foo.tar.gz/graalvm-ce-java11-1.0.0.1.foo/bin/java rename to lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-linux-amd64-1.foo.tar.gz/graalvm-ce-java11-1.foo/bin/java diff --git a/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-windows-amd64-1.0.0.1.foo.zip/graalvm-ce-java11-1.0.0.1.foo/bin/java.exe b/lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-windows-amd64-1.foo.zip/graalvm-ce-java11-1.foo/bin/java.exe similarity index 100% rename from lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.0.0.1.foo/graalvm-ce-java11-windows-amd64-1.0.0.1.foo.zip/graalvm-ce-java11-1.0.0.1.foo/bin/java.exe rename to lib/scala/runtime-version-manager-test/src/main/resources/org/enso/runtimeversionmanager/test/fake-releases/graalvm/vm-1.foo/graalvm-ce-java11-windows-amd64-1.foo.zip/graalvm-ce-java11-1.foo/bin/java.exe diff --git a/lib/scala/runtime-version-manager-test/src/test/scala/org/enso/runtimeversionmanager/components/RuntimeVersionManagerSpec.scala b/lib/scala/runtime-version-manager-test/src/test/scala/org/enso/runtimeversionmanager/components/RuntimeVersionManagerSpec.scala index 680d4ad2acec..269dbf7ddeef 100644 --- a/lib/scala/runtime-version-manager-test/src/test/scala/org/enso/runtimeversionmanager/components/RuntimeVersionManagerSpec.scala +++ b/lib/scala/runtime-version-manager-test/src/test/scala/org/enso/runtimeversionmanager/components/RuntimeVersionManagerSpec.scala @@ -47,7 +47,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { Set(SemVer(0, 0, 0), SemVer(0, 0, 1), SemVer(0, 0, 1, Some("pre"))) val runtimeVersions = Set( - components.GraalVMVersion("1.0.0.1.foo", "11"), + components.GraalVMVersion("1.foo", "11"), components.GraalVMVersion("2.0.0", "11") ) engineVersions.map(componentsManager.findOrInstallEngine) @@ -138,7 +138,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { val runtimes2 = componentsManager.listInstalledGraalRuntimes() runtimes2 should have length 1 runtimes2.map(_.version).head shouldEqual components.GraalVMVersion( - "1.0.0.1.foo", + "1.foo", "11" ) @@ -183,7 +183,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { "support bundled components" in { val engineVersion = SemVer(0, 1, 0) - val runtimeVersion = GraalVMVersion("1.0.0.1.foo", "11") + val runtimeVersion = GraalVMVersion("1.foo", "11") prepareBundle( engines = Seq(engineVersion), runtimes = Seq(runtimeVersion) @@ -201,7 +201,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { "fail to uninstall a read-only bundled component" taggedAs OsUnix in { val engineVersion = SemVer(0, 1, 0) - val runtimeVersion = GraalVMVersion("1.0.0.1.foo", "11") + val runtimeVersion = GraalVMVersion("1.foo", "11") prepareBundle( engines = Seq(engineVersion), runtimes = Seq(runtimeVersion) @@ -213,7 +213,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { val enginePath = getTestDirectory / "dist" / "0.1.0" val runtimePath = - getTestDirectory / "runtime" / "graalvm-ce-java11-1.0.0.1.foo" + getTestDirectory / "runtime" / "graalvm-ce-java11-1.foo" enginePath.toFile.setWritable(false) try { @@ -247,7 +247,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { "include both bundled and installed components in list" in { prepareBundle( engines = Seq(SemVer(0, 0, 1)), - runtimes = Seq(GraalVMVersion("1.0.0.1.foo", "11")) + runtimes = Seq(GraalVMVersion("1.foo", "11")) ) val manager = makeRuntimeVersionManager() manager.findOrInstallEngine(SemVer(0, 1, 0)) @@ -261,7 +261,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { val runtimeVersions = manager.listInstalledGraalRuntimes().map(_.version) runtimeVersions.map(_.graalVersion) should contain theSameElementsAs Seq( - "1.0.0.1.foo", + "1.foo", "2.0.0" ) runtimeVersions.map(_.java).toSet shouldEqual Set("11") @@ -287,7 +287,7 @@ class RuntimeVersionManagerSpec extends RuntimeVersionManagerTest with OsSpec { private def fakeInstallEngine(searchPath: Path, version: SemVer): Unit = { val manifest = """minimum-launcher-version: 0.0.1 |minimum-project-manager-version: 0.0.1 - |graal-vm-version: 1.0.0.1.foo + |graal-vm-version: 1.foo |graal-java-version: 11""".stripMargin val root = searchPath / version.toString Files.createDirectories(root) From 5800bba564eef6f95f0ca1b070da2452b197eec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Wa=C5=9Bko?= Date: Mon, 22 Feb 2021 13:33:04 +0100 Subject: [PATCH 5/5] Try setting Native Image heap size to 3GB --- project/NativeImage.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/NativeImage.scala b/project/NativeImage.scala index 62be4bdf65a0..3098f1a00982 100644 --- a/project/NativeImage.scala +++ b/project/NativeImage.scala @@ -47,7 +47,7 @@ object NativeImage { staticOnLinux: Boolean, initializeAtBuildtime: Boolean = true, additionalOptions: Seq[String] = Seq.empty, - memoryLimitGigabytes: Option[Int] = Some(4), + memoryLimitGigabytes: Option[Int] = Some(3), initializeAtRuntime: Seq[String] = Seq.empty ): Def.Initialize[Task[Unit]] = Def .task {