46
46
* cache with languages found in application classloader.
47
47
*/
48
48
final class LanguageCache {
49
- static final boolean PRELOAD ;
49
+ private static final boolean PRELOAD ;
50
50
private static final Map <String , LanguageCache > CACHE ;
51
51
private TruffleLanguage <?> language ;
52
52
private final String className ;
@@ -55,18 +55,29 @@ final class LanguageCache {
55
55
private final String version ;
56
56
57
57
static {
58
- Map <String , LanguageCache > map = null ;
59
- if (TruffleOptions .AOT ) {
60
- map = languages ();
61
- for (LanguageCache info : map .values ()) {
62
- info .getImpl (true );
63
- }
64
- }
65
- CACHE = map ;
58
+ CACHE = TruffleOptions .AOT ? initializeLanguages (loader ()) : null ;
66
59
PRELOAD = CACHE != null ;
67
60
}
68
61
69
- LanguageCache (String prefix , Properties info , TruffleLanguage <?> language ) {
62
+ /**
63
+ * This method initializes all languages under the provided classloader.
64
+ *
65
+ * NOTE: Method's signature should not be changed as it is reflectively invoked from AOT
66
+ * compilation.
67
+ *
68
+ * @param loader The classloader to be used for finding languages.
69
+ * @return A map of initialized languages.
70
+ */
71
+ private static Map <String , LanguageCache > initializeLanguages (ClassLoader loader ) {
72
+ Map <String , LanguageCache > map ;
73
+ map = createLanguages (loader );
74
+ for (LanguageCache info : map .values ()) {
75
+ info .createLanguage (loader );
76
+ }
77
+ return map ;
78
+ }
79
+
80
+ private LanguageCache (String prefix , Properties info , TruffleLanguage <?> language ) {
70
81
this .className = info .getProperty (prefix + "className" );
71
82
this .name = info .getProperty (prefix + "name" );
72
83
this .version = info .getProperty (prefix + "version" );
@@ -90,20 +101,14 @@ private static ClassLoader loader() {
90
101
return l ;
91
102
}
92
103
93
- private static TruffleLanguage <?> find (String name , ClassLoader loader ) throws NoSuchFieldException , IllegalAccessException , ClassNotFoundException {
94
- if (PRELOAD ) {
95
- return CACHE .get (name ).language ;
96
- } else {
97
- Class <?> langClazz = Class .forName (name , true , loader );
98
- return (TruffleLanguage <?>) langClazz .getField ("INSTANCE" ).get (null );
99
- }
100
- }
101
-
102
104
static Map <String , LanguageCache > languages () {
103
105
if (PRELOAD ) {
104
106
return CACHE ;
105
107
}
106
- ClassLoader loader = loader ();
108
+ return createLanguages (loader ());
109
+ }
110
+
111
+ private static Map <String , LanguageCache > createLanguages (ClassLoader loader ) {
107
112
Map <String , LanguageCache > map = new LinkedHashMap <>();
108
113
Enumeration <URL > en ;
109
114
try {
@@ -154,13 +159,20 @@ TruffleLanguage<?> getImpl(boolean create) {
154
159
return language ;
155
160
}
156
161
if (create ) {
157
- try {
158
- language = LanguageCache .find (className , loader ());
159
- } catch (Exception ex ) {
160
- throw new IllegalStateException ("Cannot initialize " + getName () + " language with implementation " + className , ex );
161
- }
162
+ createLanguage (loader ());
162
163
}
163
164
return language ;
164
165
}
165
166
167
+ private void createLanguage (ClassLoader loader ) {
168
+ try {
169
+ TruffleLanguage <?> result ;
170
+ Class <?> langClazz = Class .forName (className , true , loader );
171
+ result = (TruffleLanguage <?>) langClazz .getField ("INSTANCE" ).get (null );
172
+ language = result ;
173
+ } catch (Exception ex ) {
174
+ throw new IllegalStateException ("Cannot initialize " + getName () + " language with implementation " + className , ex );
175
+ }
176
+ }
177
+
166
178
}
0 commit comments