Skip to content

Commit 80aad27

Browse files
authored
Merge pull request #259 from metafacture/258-fixMacroPerformanceRegression
Fix macro performance regression.
2 parents 2d98aae + 72b1c7e commit 80aad27

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

metafix/src/main/java/org/metafacture/metafix/FixBind.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void execute(final Metafix metafix, final Record record, final List<Strin
7474
put_macro {
7575
@Override
7676
public void execute(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options, final RecordTransformer recordTransformer) {
77-
recordTransformer.addVars(options);
77+
recordTransformer.setVars(options);
7878
metafix.putMacro(params.get(0), recordTransformer);
7979
}
8080
}

metafix/src/main/java/org/metafacture/metafix/RecordTransformer.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.slf4j.LoggerFactory;
4040

4141
import java.util.ArrayList;
42+
import java.util.Collections;
4243
import java.util.HashMap;
4344
import java.util.LinkedHashMap;
4445
import java.util.LinkedList;
@@ -62,15 +63,19 @@ public class RecordTransformer { // checkstyle-disable-line ClassFanOutComplexit
6263
private static final Logger LOG = LoggerFactory.getLogger(RecordTransformer.class);
6364

6465
private final List<Consumer<Record>> consumers = new LinkedList<>();
65-
private final List<Map<String, String>> vars = new ArrayList<>();
66+
private final List<Map<String, String>> vars = new ArrayList<>(Collections.nCopies(Vars.values().length, null));
6667
private final Metafix metafix;
6768
private final RecordTransformer parent;
6869

6970
private Supplier<String> currentMessageSupplier;
7071

72+
private enum Vars {
73+
GLOBAL, STATIC, DYNAMIC
74+
}
75+
7176
/*package-private*/ RecordTransformer(final Metafix metafix, final Fix fix) {
7277
this(metafix, fix.getElements(), null);
73-
addVars(metafix.getVars());
78+
setVars(Vars.GLOBAL, metafix.getVars());
7479
}
7580

7681
private RecordTransformer(final Metafix metafix, final List<Expression> expressions, final RecordTransformer parent) {
@@ -103,19 +108,14 @@ private RecordTransformer childTransformer(final List<Expression> expressions) {
103108
return new RecordTransformer(metafix, expressions, this);
104109
}
105110

106-
public void addVars(final Map<String, String> additionalVars) {
107-
vars.add(additionalVars);
108-
}
109-
110-
public void transform(final Record record, final Map<String, String> additionalVars) {
111-
final int index = vars.size();
112-
addVars(additionalVars);
111+
public void transform(final Record record, final Map<String, String> dynamicVars) {
112+
final Map<String, String> oldDynamicVars = setVars(Vars.DYNAMIC, dynamicVars);
113113

114114
try {
115115
transform(record);
116116
}
117117
finally {
118-
vars.remove(index);
118+
setVars(Vars.DYNAMIC, oldDynamicVars);
119119
}
120120
}
121121

@@ -269,9 +269,17 @@ private String executionExceptionMessage(final EObject object, final Resource re
269269
resource.getURI(), node.getStartLine(), NodeModelUtils.getTokenText(node));
270270
}
271271

272+
/*package-private*/ void setVars(final Map<String, String> staticVars) {
273+
setVars(Vars.STATIC, staticVars);
274+
}
275+
276+
private Map<String, String> setVars(final Vars type, final Map<String, String> newVars) {
277+
return vars.set(type.ordinal(), newVars);
278+
}
279+
272280
private Map<String, String> getVars() {
273281
final Map<String, String> mergedVars = parent != null ? parent.getVars() : new HashMap<>();
274-
vars.forEach(mergedVars::putAll);
282+
vars.stream().filter(v -> v != null).forEach(mergedVars::putAll);
275283
return mergedVars;
276284
}
277285

0 commit comments

Comments
 (0)