summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/reasm/Assembly.java12
-rw-r--r--src/test/java/org/reasm/AssemblyTest.java40
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.