From ebe633a2cc178a5daf151b9da995db5f7365824a Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 8 Oct 2012 15:26:56 -0700 Subject: [PATCH] replace ctor for single ctx and don't merge wildcards when payloads aren't the same. fixes a unit test. --- .../v4/runtime/atn/ArrayPredictionContext.java | 6 +++--- .../org/antlr/v4/runtime/atn/LL1Analyzer.java | 2 +- .../v4/runtime/atn/LexerATNSimulator.java | 2 +- .../v4/runtime/atn/ParserATNSimulator.java | 4 ++-- .../v4/runtime/atn/PredictionContext.java | 18 ++++++++---------- .../atn/SingletonPredictionContext.java | 10 +++++++++- .../test/org/antlr/v4/test/TestGraphNodes.java | 5 ++--- 7 files changed, 26 insertions(+), 21 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java index 72f0bcb4b..fafd85ef8 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java @@ -84,7 +84,7 @@ public class ArrayPredictionContext extends PredictionContext { @Override public SingletonPredictionContext next() { SingletonPredictionContext ctx = - new SingletonPredictionContext(parents[i], invokingStates[i]); + SingletonPredictionContext.create(parents[i], invokingStates[i]); i++; return ctx; } @@ -144,8 +144,8 @@ public class ArrayPredictionContext extends PredictionContext { next = PredictionContext.EMPTY; } else { - next = new SingletonPredictionContext(this.parents[i], - this.invokingStates[i]); + next = SingletonPredictionContext.create(this.parents[i], + this.invokingStates[i]); } boolean rootIsWildcard = fullCtx; newCtx = merge(newCtx, next, rootIsWildcard, mergeCache); diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java b/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java index df53ff630..db479a381 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java @@ -124,7 +124,7 @@ public class LL1Analyzer { Transition t = s.transition(i); if ( t.getClass() == RuleTransition.class ) { PredictionContext newContext = - new SingletonPredictionContext(ctx, s.stateNumber); + SingletonPredictionContext.create(ctx, s.stateNumber); _LOOK(t.target, newContext, look, lookBusy, seeThruPreds); } else if ( t instanceof PredicateTransition ) { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java index e49d61aad..ae12f9ef8 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java @@ -667,7 +667,7 @@ public class LexerATNSimulator extends ATNSimulator { switch (t.getSerializationType()) { case Transition.RULE: PredictionContext newContext = - new SingletonPredictionContext(config.context, p.stateNumber); + SingletonPredictionContext.create(config.context, p.stateNumber); c = new LexerATNConfig(config, t.target, newContext); break; case Transition.PREDICATE: diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java index 4c693cf53..31631d410 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java @@ -1115,7 +1115,7 @@ public class ParserATNSimulator extends ATNSimulator { config.state.getClass()==PlusLoopbackState.class ) { config.context = - new SingletonPredictionContext(config.context, config.state.stateNumber); + SingletonPredictionContext.create(config.context, config.state.stateNumber); // alter config; it's ok, since all calls to closure pass in a fresh config for us to chase if ( debug ) System.out.println("Loop back; push "+config.state.stateNumber+", stack="+config.context); } @@ -1286,7 +1286,7 @@ public class ParserATNSimulator extends ATNSimulator { ", ctx="+config.context); } PredictionContext newContext = - new SingletonPredictionContext(config.context, config.state.stateNumber); + SingletonPredictionContext.create(config.context, config.state.stateNumber); return new ATNConfig(config, t.target, newContext); } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java b/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java index 3ae3ca086..b0b651dd8 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java @@ -53,7 +53,7 @@ public abstract class PredictionContext implements Iterable mergeCache) { - if ( (a==null&&b==null) || a==b || a.equals(b) ) return a; // share same graph if both same + // share same graph if both same + if ( (a==null&&b==null) || a==b || (a!=null&&a.equals(b)) ) return a; if ( a instanceof SingletonPredictionContext && b instanceof SingletonPredictionContext) { return mergeSingletons((SingletonPredictionContext)a, @@ -178,17 +179,13 @@ public abstract class PredictionContext implements Iterable iterator() { final SingletonPredictionContext self = this; diff --git a/tool/test/org/antlr/v4/test/TestGraphNodes.java b/tool/test/org/antlr/v4/test/TestGraphNodes.java index 24d361b18..b2cc58d77 100644 --- a/tool/test/org/antlr/v4/test/TestGraphNodes.java +++ b/tool/test/org/antlr/v4/test/TestGraphNodes.java @@ -2,7 +2,6 @@ package org.antlr.v4.test; import junit.framework.TestCase; import org.antlr.v4.runtime.atn.ArrayPredictionContext; -import org.antlr.v4.runtime.atn.EmptyPredictionContext; import org.antlr.v4.runtime.atn.PredictionContext; import org.antlr.v4.runtime.atn.PredictionContextCache; import org.antlr.v4.runtime.atn.SingletonPredictionContext; @@ -763,7 +762,7 @@ public class TestGraphNodes extends TestCase { } public SingletonPredictionContext createSingleton(PredictionContext parent, int payload) { - SingletonPredictionContext a = new SingletonPredictionContext(parent, payload); + SingletonPredictionContext a = SingletonPredictionContext.create(parent, payload); return a; } @@ -820,7 +819,7 @@ public class TestGraphNodes extends TestCase { } for (int i = 0; i < current.size(); i++) { - if (current.getInvokingState(i) == EmptyPredictionContext.EMPTY_INVOKING_STATE) { + if (current.getInvokingState(i) == PredictionContext.EMPTY_FULL_CTX_INVOKING_STATE) { continue; }