From cf9ca82f82654d3f49d8a4c21a84e81b7ad1e343 Mon Sep 17 00:00:00 2001 From: "Bradley C. Kuszmaul" Date: Fri, 26 Apr 2024 13:02:42 -0400 Subject: [PATCH] Fix up the scoping for the `@mock` macro. Previously, the macro required `Mocking` to be visible in the caller's context: It was invoking `Mocking.activated()`, for exmaple. Now it invokes `$activated()`, which makes sure that the code uses the right version of `activated`. Similarly for `get_alternate` and `Patch`. Also, the macro was doing some unceessary `gensym` calls, which macro hygene can take care of automatically. --- src/mock.jl | 17 +++++++---------- src/patch.jl | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/mock.jl b/src/mock.jl index edc6cfb..447ac2e 100644 --- a/src/mock.jl +++ b/src/mock.jl @@ -6,24 +6,21 @@ macro mock(expr) expr.head == :call || error("expression is not a function call") target = expr.args[1] - args = filter(!Mocking.iskwarg, expr.args[2:end]) + args = filter(!iskwarg, expr.args[2:end]) kwargs = extract_kwargs(expr) - args_var = gensym("args") - alternate_var = gensym("alt") - # Due to how world-age works (see Julia issue #265 and PR #17057) when # `Mocking.activated` is overwritten then all dependent functions will be recompiled. # When `Mocking.activated() == false` then Julia will optimize the # code below to have zero-overhead by only executing the original expression. result = quote - if Mocking.activated() - local $args_var = tuple($(args...)) - local $alternate_var = Mocking.get_alternate($target, $args_var...) - if $alternate_var !== nothing - Base.invokelatest($alternate_var, $args_var...; $(kwargs...)) + if $activated() + args_var = tuple($(args...)) + alternate_var = $get_alternate($target, args_var...) + if alternate_var !== nothing + Base.invokelatest(alternate_var, args_var...; $(kwargs...)) else - $target($args_var...; $(kwargs...)) + $target(args_var...; $(kwargs...)) end else $target($(args...); $(kwargs...)) diff --git a/src/patch.jl b/src/patch.jl index 14f6cd7..718d9c7 100644 --- a/src/patch.jl +++ b/src/patch.jl @@ -29,7 +29,7 @@ macro patch(expr::Expr) # We need to evaluate the alternate function in the context of the `@patch` macro in # order to support closures. - return esc(:(Mocking.Patch($target, $alternate))) + return esc(:($Patch($target, $alternate))) end struct PatchEnv