@@ -144,6 +144,20 @@ private interface RecursiveDeserializer {
144144 Object deserialize (Object json , ProxyFactory proxyFactory ) throws DeserializationException ;
145145
146146 Object deserialize (Object json , ProxyFactory proxyFactory , String tag ) throws DeserializationException ;
147+
148+ /**
149+ * Sets the {@link Architecture} parsed by this deserializer.
150+ *
151+ * @param arch the architecture
152+ */
153+ void setArchitecture (Architecture arch );
154+
155+ /**
156+ * Gets the {@link Architecture} parsed by this deserializer.
157+ *
158+ * @return the architecture
159+ */
160+ Architecture getArchitecture ();
147161 }
148162
149163 private sealed interface ObjectSerializer {
@@ -805,7 +819,6 @@ public Object deserialize(EconomicMap<String, Object> json, RecursiveDeserialize
805819 }
806820
807821 private static final class RegisterSerializer implements ObjectSerializer {
808-
809822 @ Override
810823 public Class <?> clazz () {
811824 return Register .class ;
@@ -820,20 +833,17 @@ public String tag() {
820833 public void serialize (Object instance , JsonBuilder .ObjectBuilder objectBuilder , RecursiveSerializer serializer ) throws IOException {
821834 Register register = (Register ) instance ;
822835 objectBuilder .append ("number" , register .number );
823- objectBuilder .append ("name" , register .name );
824- objectBuilder .append ("encoding" , register .encoding );
825- objectBuilder .append ("catName" , register .getRegisterCategory ().toString ());
826- objectBuilder .append ("containsRef" , register .mayContainReference ());
827836 }
828837
829838 @ Override
830- public Object deserialize (EconomicMap <String , Object > json , RecursiveDeserializer deserializer , ProxyFactory proxyFactory ) {
839+ public Object deserialize (EconomicMap <String , Object > json , RecursiveDeserializer deserializer , ProxyFactory proxyFactory ) throws DeserializationException {
831840 int number = (int ) json .get ("number" );
832- String name = (String ) json .get ("name" );
833- int encoding = (int ) json .get ("encoding" );
834- String catName = (String ) json .get ("catName" );
835- boolean containsRef = (boolean ) json .get ("containsRef" );
836- return new Register (number , encoding , name , new Register .RegisterCategory (catName , containsRef ));
841+ for (Register register : deserializer .getArchitecture ().getRegisters ()) {
842+ if (register .number == number ) {
843+ return register ;
844+ }
845+ }
846+ throw new DeserializationException (this , json , "Register not found" );
837847 }
838848 }
839849
@@ -1687,12 +1697,14 @@ public void serialize(Object instance, JsonBuilder.ObjectBuilder objectBuilder,
16871697 public Object deserialize (EconomicMap <String , Object > json , RecursiveDeserializer deserializer , ProxyFactory proxyFactory ) throws DeserializationException {
16881698 String name = (String ) json .get ("name" );
16891699 EnumSet <?> features = (EnumSet <?>) deserializer .deserialize (json .get ("features" ), proxyFactory );
1690- return switch (name ) {
1700+ Architecture architecture = switch (name ) {
16911701 case "AMD64" -> new AMD64 ((EnumSet <AMD64 .CPUFeature >) features );
16921702 case "riscv64" -> new RISCV64 ((EnumSet <RISCV64 .CPUFeature >) features );
16931703 case "aarch64" -> new AArch64 ((EnumSet <AArch64 .CPUFeature >) features );
16941704 default -> throw new IllegalStateException ("Unexpected value: " + name );
16951705 };
1706+ deserializer .setArchitecture (architecture );
1707+ return architecture ;
16961708 }
16971709 }
16981710
@@ -1932,41 +1944,55 @@ public void dump(RecordedCompilationUnit compilationUnit, JsonWriter writer) thr
19321944 recursiveSerializer .serialize (compilationUnit , writer .valueBuilder (), RecordedCompilationUnitSerializer .TAG );
19331945 }
19341946
1935- private final RecursiveDeserializer recursiveDeserializer = new RecursiveDeserializer () {
1936- @ Override
1937- @ SuppressWarnings ("unchecked" )
1938- public Object deserialize (Object json , ProxyFactory proxyFactory ) throws DeserializationException {
1939- if (json instanceof EconomicMap <?, ?>) {
1940- EconomicMap <String , Object > map = (EconomicMap <String , Object >) json ;
1941- String tag = (String ) map .get ("tag" );
1942- if (tag == null ) {
1943- throw new IllegalArgumentException ("The JSON map does not contain a tag: " + map );
1944- }
1945- ObjectSerializer deserializer = tagSerializers .get (tag );
1946- if (deserializer == null ) {
1947- throw new IllegalArgumentException ("No deserializer registered for tag " + tag );
1947+ private RecursiveDeserializer createRecursiveDeserializer () {
1948+ return new RecursiveDeserializer () {
1949+ @ Override
1950+ @ SuppressWarnings ("unchecked" )
1951+ public Object deserialize (Object json , ProxyFactory proxyFactory ) throws DeserializationException {
1952+ if (json instanceof EconomicMap <?, ?>) {
1953+ EconomicMap <String , Object > map = (EconomicMap <String , Object >) json ;
1954+ String tag = (String ) map .get ("tag" );
1955+ if (tag == null ) {
1956+ throw new IllegalArgumentException ("The JSON map does not contain a tag: " + map );
1957+ }
1958+ ObjectSerializer deserializer = tagSerializers .get (tag );
1959+ if (deserializer == null ) {
1960+ throw new IllegalArgumentException ("No deserializer registered for tag " + tag );
1961+ }
1962+ return deserializer .deserialize (map , this , proxyFactory );
1963+ } else {
1964+ return json ;
19481965 }
1949- return deserializer .deserialize (map , this , proxyFactory );
1950- } else {
1951- return json ;
19521966 }
1953- }
19541967
1955- @ Override
1956- @ SuppressWarnings ("unchecked" )
1957- public Object deserialize (Object json , ProxyFactory proxyFactory , String tag ) throws DeserializationException {
1958- if (json instanceof EconomicMap <?, ?>) {
1959- EconomicMap <String , Object > map = (EconomicMap <String , Object >) json ;
1960- ObjectSerializer deserializer = tagSerializers .get (tag );
1961- if (deserializer == null ) {
1962- throw new IllegalArgumentException ("No deserializer registered for tag " + tag );
1968+ @ Override
1969+ @ SuppressWarnings ("unchecked" )
1970+ public Object deserialize (Object json , ProxyFactory proxyFactory , String tag ) throws DeserializationException {
1971+ if (json instanceof EconomicMap <?, ?>) {
1972+ EconomicMap <String , Object > map = (EconomicMap <String , Object >) json ;
1973+ ObjectSerializer deserializer = tagSerializers .get (tag );
1974+ if (deserializer == null ) {
1975+ throw new IllegalArgumentException ("No deserializer registered for tag " + tag );
1976+ }
1977+ return deserializer .deserialize (map , this , proxyFactory );
1978+ } else {
1979+ throw new IllegalArgumentException ("Expected a map." );
19631980 }
1964- return deserializer .deserialize (map , this , proxyFactory );
1965- } else {
1966- throw new IllegalArgumentException ("Expected a map." );
19671981 }
1968- }
1969- };
1982+
1983+ private Architecture architecture ;
1984+
1985+ @ Override
1986+ public void setArchitecture (Architecture arch ) {
1987+ architecture = arch ;
1988+ }
1989+
1990+ @ Override
1991+ public Architecture getArchitecture () {
1992+ return architecture ;
1993+ }
1994+ };
1995+ }
19701996
19711997 /**
19721998 * Loads a recorded compilation unit from the given reader.
@@ -1979,6 +2005,6 @@ public Object deserialize(Object json, ProxyFactory proxyFactory, String tag) th
19792005 */
19802006 public RecordedCompilationUnit load (Reader source , ProxyFactory proxyFactory ) throws IOException , DeserializationException {
19812007 JsonParser parser = new JsonParser (source );
1982- return (RecordedCompilationUnit ) recursiveDeserializer .deserialize (parser .parse (), proxyFactory , RecordedCompilationUnitSerializer .TAG );
2008+ return (RecordedCompilationUnit ) createRecursiveDeserializer () .deserialize (parser .parse (), proxyFactory , RecordedCompilationUnitSerializer .TAG );
19832009 }
19842010}
0 commit comments