IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
SerialVersionUID.cs
Go to the documentation of this file.
1using System.Linq;
2
4
6{
7
11 static class SerialVersionUID
12 {
13
19 internal static long Compute(RuntimeJavaType javaType)
20 {
21 // dump class structure into hash writer
22 var writer = new SHA1HashWriter();
23 WriteClassName(writer, javaType);
24 WriteModifiers(writer, javaType);
25 WriteInterfaces(writer, javaType);
26 WriteFields(writer, javaType);
27 WriteStaticInitializer(writer, javaType);
28 WriteConstructors(writer, javaType);
29 WriteMethods(writer, javaType);
30
31 // finalize and convert to long
32 var hash = writer.Finalize();
33 var uuid = 0;
34 for (var i = 7; i >= 0; i--)
35 {
36 uuid <<= 8;
37 uuid |= hash[i];
38 }
39
40 return uuid;
41 }
42
43 static void WriteClassName(SHA1HashWriter writer, RuntimeJavaType javaType)
44 {
45 writer.WriteUtf8(javaType.Name);
46 }
47
48 static void WriteModifiers(SHA1HashWriter writer, RuntimeJavaType javaType)
49 {
50 var mods = javaType.ReflectiveModifiers & (Modifiers.Public | Modifiers.Final | Modifiers.Interface | Modifiers.Abstract);
51 if ((mods & Modifiers.Interface) != 0)
52 {
53 mods &= ~Modifiers.Abstract;
54 if (HasJavaMethods(javaType))
55 mods |= Modifiers.Abstract;
56 }
57
58 writer.WriteUInt32((uint)mods);
59 }
60
61 static bool HasJavaMethods(RuntimeJavaType javaType)
62 {
63 return javaType.GetMethods().Any(i => !i.IsHideFromReflection && !i.IsClassInitializer);
64 }
65
66 static void WriteInterfaces(SHA1HashWriter writer, RuntimeJavaType javaType)
67 {
68 foreach (var i in javaType.Interfaces.OrderBy(i => i.Name))
69 writer.WriteUtf8(i.Name);
70 }
71
72 static void WriteFields(SHA1HashWriter writer, RuntimeJavaType javaType)
73 {
74 foreach (var fw in javaType.GetFields().Where(i => !i.IsHideFromReflection).OrderBy(i => i.Name))
75 {
76 var mods = fw.Modifiers & (Modifiers.Public | Modifiers.Private | Modifiers.Protected | Modifiers.Static | Modifiers.Final | Modifiers.Volatile | Modifiers.Transient);
77 if (((mods & Modifiers.Private) == 0) || ((mods & (Modifiers.Static | Modifiers.Transient)) == 0))
78 {
79 writer.WriteUtf8(fw.Name);
80 writer.WriteUInt32((uint)mods);
81 writer.WriteUtf8(fw.Signature.Replace('.', '/'));
82 }
83 }
84 }
85
86 static void WriteStaticInitializer(SHA1HashWriter writer, RuntimeJavaType javaType)
87 {
88 var type = javaType.TypeAsTBD;
89 if (!type.IsArray && type.TypeInitializer != null)
90 {
91 if (!javaType.Context.AttributeHelper.IsHideFromJava(type.TypeInitializer))
92 {
93 writer.WriteUtf8("<clinit>");
94 writer.WriteUInt32((uint)Modifiers.Static);
95 writer.WriteUtf8("()V");
96 }
97 }
98 }
99
100 static void WriteConstructors(SHA1HashWriter writer, RuntimeJavaType javaType)
101 {
102 var ctors = javaType.GetMethods()
103 .Where(i => i.IsConstructor && !i.IsHideFromReflection && !i.IsPrivate)
104 .OrderBy(i => i.Signature);
105
106 foreach (var ctor in ctors)
107 {
108 var mods = ctor.Modifiers & (Modifiers.Public | Modifiers.Private | Modifiers.Protected | Modifiers.Static | Modifiers.Final | Modifiers.Synchronized | Modifiers.Native | Modifiers.Abstract | Modifiers.Strictfp);
109 writer.WriteUtf8(ctor.Name);
110 writer.WriteUInt32((uint)mods);
111 writer.WriteUtf8(ctor.Signature);
112 }
113 }
114
115 static void WriteMethods(SHA1HashWriter writer, RuntimeJavaType javaType)
116 {
117 var methods = javaType.GetMethods()
118 .Where(i => !i.IsConstructor && !i.IsHideFromReflection && !i.IsPrivate)
119 .OrderBy(i => i.Name)
120 .ThenBy(i => i.Signature);
121
122 foreach (var method in methods)
123 {
124 var mods = method.Modifiers & (Modifiers.Public | Modifiers.Private | Modifiers.Protected | Modifiers.Static | Modifiers.Final | Modifiers.Synchronized | Modifiers.Native | Modifiers.Abstract | Modifiers.Strictfp);
125 writer.WriteUtf8(method.Name);
126 writer.WriteUInt32((uint)mods);
127 writer.WriteUtf8(method.Signature);
128 }
129 }
130
131 }
132
133}
AttributeHelper AttributeHelper
Gets the AttributeHelper associated with this instance of the runtime.
Generates a SerialVerisonUID value by hashing data related to the type.
Provides methods to write basic building blocks to an incremental hash.