From 4b56abb60f9da9cfa323be36791fe4b8ae593854 Mon Sep 17 00:00:00 2001 From: Peter Thomas Date: Mon, 21 Jun 2021 16:21:30 +0530 Subject: [PATCH] small changes while cleaning up #1558 --- .../intuit/karate/core/ScenarioEngine.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java index 524c698e9..92f1715f9 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java @@ -1022,12 +1022,15 @@ public void init() { // not in constructor because it has to be on Runnable.run( runtime.magicVariables.forEach((k, v) -> { // even hidden variables may need pre-processing // for e.g. the __arg may contain functions that originated in a different js context - recurseAndAttach(k, v, seen); - setHiddenVariable(k, v); + Object o = recurseAndAttach(k, v, seen); + if (o == null) { + o = v; + } + JS.put(k, o); }); attachVariables(seen); // re-hydrate any functions from caller or background - setHiddenVariable(KARATE, bridge); - setHiddenVariable(READ, readFunction); + JS.put(KARATE, bridge); + JS.put(READ, readFunction); HttpClient client = runtime.featureRuntime.suite.clientFactory.create(this); // edge case: can be set by dynamic scenario outline background // or be left as-is because a callonce triggered init() @@ -1072,12 +1075,6 @@ protected Map detachVariables() { return detached; } - // only called by "call" routine - protected void recurseAndAttach(String name, Object o) { - Set seen = Collections.newSetFromMap(new IdentityHashMap()); - recurseAndAttach(name, o, seen); - } - private Object recurseAndAttach(String name, Object o, Set seen) { if (o instanceof Value) { try { @@ -1943,7 +1940,8 @@ public Variable call(Variable called, Variable arg, boolean sharedScope) { case FEATURE: // will be always a map or a list of maps (loop call result) Object callResult = callFeature(called.getValue(), arg, -1, sharedScope); - recurseAndAttach("", callResult); + Set seen = Collections.newSetFromMap(new IdentityHashMap()); + recurseAndAttach("", callResult, seen); return new Variable(callResult); default: throw new RuntimeException("not a callable feature or js function: " + called);