diff options
-rw-r--r-- | src/main/java/org/reasm/Assembly.java | 12 | ||||
-rw-r--r-- | src/test/java/org/reasm/AssemblyTest.java | 40 |
2 files changed, 51 insertions, 1 deletions
diff --git a/src/main/java/org/reasm/Assembly.java b/src/main/java/org/reasm/Assembly.java index cf7fc4e..1e7cb66 100644 --- a/src/main/java/org/reasm/Assembly.java +++ b/src/main/java/org/reasm/Assembly.java @@ -290,6 +290,16 @@ public final class Assembly { } /** + * Gets the current namespace for symbol lookup and symbol definition. + * + * @return the current namespace + */ + @CheckForNull + public final Namespace getCurrentNamespace() { + return this.currentNamespace; + } + + /** * Gets the current pass in this assembly. * * @return the current pass @@ -1083,9 +1093,9 @@ public final class Assembly { Architecture initialArchitecture = this.configuration.getInitialArchitecture(); this.blockStack.add(new Block(new AssemblyStepLocationGenerator(mainSourceFile.getSourceLocations(initialArchitecture), null, null, false), null)); + this.currentEncoding = UTF_8; this.currentNamespace = null; ++this.currentPass; - this.currentEncoding = UTF_8; for (CustomAssemblyData customAssemblyData : this.customAssemblyData.values()) { customAssemblyData.startedNewPass(); diff --git a/src/test/java/org/reasm/AssemblyTest.java b/src/test/java/org/reasm/AssemblyTest.java index fe878b9..839e220 100644 --- a/src/test/java/org/reasm/AssemblyTest.java +++ b/src/test/java/org/reasm/AssemblyTest.java @@ -2404,6 +2404,46 @@ public class AssemblyTest { } /** + * Asserts that the state specific to the current pass is reset when a new pass is started. + */ + @Test + public void startNewPass() { + final TestSourceNode nodeThatDefinesTheLocalBarSymbol = createNodeThatDefinesASymbol("bar", true, SymbolType.CONSTANT, + FORTY_TWO); + final TestSourceNode nodeThatDefinesTheSuffixBazSymbol = createNodeThatDefinesASymbol(".baz", false, SymbolType.CONSTANT, + FORTY_TWO); + final TestSourceNode nodeThatReferencesTheFooSymbol = createNodeThatReferencesASymbol("foo"); + final TestSourceNode nodeThatDefinesTheFooSymbol = createNodeThatDefinesASymbol("foo", SymbolType.CONSTANT, FORTY_TWO); + final SourceNode rootNode = new SimpleCompositeSourceNode(Arrays.asList(nodeThatDefinesTheLocalBarSymbol, + nodeThatDefinesTheSuffixBazSymbol, nodeThatReferencesTheFooSymbol, nodeThatDefinesTheFooSymbol)); + final Assembly assembly = createAssembly(rootNode); + + step(assembly, AssemblyCompletionStatus.PENDING); + step(assembly, AssemblyCompletionStatus.PENDING); + step(assembly, AssemblyCompletionStatus.PENDING); + step(assembly, AssemblyCompletionStatus.PENDING); + step(assembly, AssemblyCompletionStatus.STARTED_NEW_PASS); + + assertThat(assembly.getSteps(), is(empty())); + assertThat(assembly.getProgramCounter(), is(0L)); + assertThat(assembly.getCurrentEncoding(), is(Charset.forName("UTF-8"))); + assertThat(assembly.getCurrentNamespace(), is(nullValue())); + assertThat(assembly.getCurrentPass(), is(2)); + + // Check that the counters for anonymous symbols are reset. + assertThat(assembly.resolveSymbolReference(SymbolContext.VALUE, "+", false, false, null, null).getName(), is("__forw1")); + assertThat(assembly.resolveSymbolReference(SymbolContext.VALUE, "-", false, false, null, null).getName(), is("__back0")); + + // Check that the scope key is reset. + step(assembly, AssemblyCompletionStatus.PENDING); + assertThat(assembly.getScope(null), is(notNullValue())); + + // Check that the last non-suffix symbol is reset. + step(assembly, AssemblyCompletionStatus.PENDING); + assertThat(assembly.resolveSymbolReference(SymbolContext.VALUE, ".baz", false, false, null, null).getName(), is(".baz")); + } + + /** * Asserts that {@link Assembly#step()} generates {@link AssemblyStep} objects correctly and that * {@link Assembly#writeAssembledDataTo(OutputStream)} writes the assembled data to the specified {@link OutputStream} * correctly. |