@@ -144,6 +144,20 @@ private interface RecursiveDeserializer {
144
144
Object deserialize (Object json , ProxyFactory proxyFactory ) throws DeserializationException ;
145
145
146
146
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 ();
147
161
}
148
162
149
163
private sealed interface ObjectSerializer {
@@ -805,7 +819,6 @@ public Object deserialize(EconomicMap<String, Object> json, RecursiveDeserialize
805
819
}
806
820
807
821
private static final class RegisterSerializer implements ObjectSerializer {
808
-
809
822
@ Override
810
823
public Class <?> clazz () {
811
824
return Register .class ;
@@ -820,20 +833,17 @@ public String tag() {
820
833
public void serialize (Object instance , JsonBuilder .ObjectBuilder objectBuilder , RecursiveSerializer serializer ) throws IOException {
821
834
Register register = (Register ) instance ;
822
835
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 ());
827
836
}
828
837
829
838
@ 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 {
831
840
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" );
837
847
}
838
848
}
839
849
@@ -1687,12 +1697,14 @@ public void serialize(Object instance, JsonBuilder.ObjectBuilder objectBuilder,
1687
1697
public Object deserialize (EconomicMap <String , Object > json , RecursiveDeserializer deserializer , ProxyFactory proxyFactory ) throws DeserializationException {
1688
1698
String name = (String ) json .get ("name" );
1689
1699
EnumSet <?> features = (EnumSet <?>) deserializer .deserialize (json .get ("features" ), proxyFactory );
1690
- return switch (name ) {
1700
+ Architecture architecture = switch (name ) {
1691
1701
case "AMD64" -> new AMD64 ((EnumSet <AMD64 .CPUFeature >) features );
1692
1702
case "riscv64" -> new RISCV64 ((EnumSet <RISCV64 .CPUFeature >) features );
1693
1703
case "aarch64" -> new AArch64 ((EnumSet <AArch64 .CPUFeature >) features );
1694
1704
default -> throw new IllegalStateException ("Unexpected value: " + name );
1695
1705
};
1706
+ deserializer .setArchitecture (architecture );
1707
+ return architecture ;
1696
1708
}
1697
1709
}
1698
1710
@@ -1932,41 +1944,55 @@ public void dump(RecordedCompilationUnit compilationUnit, JsonWriter writer) thr
1932
1944
recursiveSerializer .serialize (compilationUnit , writer .valueBuilder (), RecordedCompilationUnitSerializer .TAG );
1933
1945
}
1934
1946
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 ;
1948
1965
}
1949
- return deserializer .deserialize (map , this , proxyFactory );
1950
- } else {
1951
- return json ;
1952
1966
}
1953
- }
1954
1967
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." );
1963
1980
}
1964
- return deserializer .deserialize (map , this , proxyFactory );
1965
- } else {
1966
- throw new IllegalArgumentException ("Expected a map." );
1967
1981
}
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
+ }
1970
1996
1971
1997
/**
1972
1998
* Loads a recorded compilation unit from the given reader.
@@ -1979,6 +2005,6 @@ public Object deserialize(Object json, ProxyFactory proxyFactory, String tag) th
1979
2005
*/
1980
2006
public RecordedCompilationUnit load (Reader source , ProxyFactory proxyFactory ) throws IOException , DeserializationException {
1981
2007
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 );
1983
2009
}
1984
2010
}
0 commit comments