From 9c9c54de6531db670bca5ec01cf0c73e4062e9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Sat, 12 Nov 2022 19:39:59 +0100 Subject: [PATCH] Delete defined modules if evaluation fails (#1528) --- lib/livebook/runtime/evaluator.ex | 7 ++++++- test/livebook/runtime/evaluator_test.exs | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/livebook/runtime/evaluator.ex b/lib/livebook/runtime/evaluator.ex index f9e3bc24f..7fff0f17a 100644 --- a/lib/livebook/runtime/evaluator.ex +++ b/lib/livebook/runtime/evaluator.ex @@ -350,10 +350,11 @@ defmodule Livebook.Runtime.Evaluator do eval_result = eval(code, context.binding, context.env) evaluation_time_ms = time_diff_ms(start_time) + tracer_info = Evaluator.IOProxy.get_tracer_info(state.io_proxy) + {new_context, result, code_error, identifiers_used, identifiers_defined} = case eval_result do {:ok, value, binding, env} -> - tracer_info = Evaluator.IOProxy.get_tracer_info(state.io_proxy) context_id = random_id() new_context = %{ @@ -370,6 +371,10 @@ defmodule Livebook.Runtime.Evaluator do {new_context, result, nil, identifiers_used, identifiers_defined} {:error, kind, error, stacktrace, code_error} -> + for {module, _} <- tracer_info.modules_defined do + delete_module!(module) + end + result = {:error, kind, error, stacktrace} identifiers_used = :unknown identifiers_defined = %{} diff --git a/test/livebook/runtime/evaluator_test.exs b/test/livebook/runtime/evaluator_test.exs index 70ae9d121..74ada5194 100644 --- a/test/livebook/runtime/evaluator_test.exs +++ b/test/livebook/runtime/evaluator_test.exs @@ -334,6 +334,20 @@ defmodule Livebook.Runtime.EvaluatorTest do assert {:docs_v1, _, _, _, _, _, _} = Code.fetch_docs(Livebook.Runtime.EvaluatorTest.Disk) end + test "deletes defined modules if the evaluation fails", %{evaluator: evaluator} do + code = """ + defmodule Livebook.Runtime.EvaluatorTest.Raised do + end + + raise "failed" + """ + + Evaluator.evaluate_code(evaluator, code, :code_1, []) + assert_receive {:runtime_evaluation_response, :code_1, {:error, _, _, _}, metadata()} + + refute Code.ensure_loaded?(Livebook.Runtime.EvaluatorTest.Raised) + end + @tag :with_ebin_path test "runs doctests when a module is defined", %{evaluator: evaluator} do code = ~S'''