Merge pull request #397 from dicej/master

fix broken interpreter build due to out-of-order class initialization
This commit is contained in:
Joshua Warner 2015-01-15 18:19:44 -07:00
commit 5a87455e64
2 changed files with 21 additions and 2 deletions

View File

@ -1408,8 +1408,20 @@ void writeInitializations(Output* out, Module& module)
} }
} }
void writeJavaInitialization(Output* out, Class* cl) void writeJavaInitialization(Output* out,
Class* cl,
std::set<Class*>& alreadyInited)
{ {
if (alreadyInited.find(cl) != alreadyInited.end()) {
return;
}
alreadyInited.insert(cl);
if (cl->super) {
writeJavaInitialization(out, cl->super, alreadyInited);
}
out->write("bootJavaClass(t, Gc::"); out->write("bootJavaClass(t, Gc::");
out->write(capitalize(cl->name)); out->write(capitalize(cl->name));
out->write("Type, "); out->write("Type, ");
@ -1436,10 +1448,11 @@ void writeJavaInitialization(Output* out, Class* cl)
void writeJavaInitializations(Output* out, Module& module) void writeJavaInitializations(Output* out, Module& module)
{ {
std::set<Class*> alreadyInited;
for (const auto p : module.classes) { for (const auto p : module.classes) {
Class* cl = p.second; Class* cl = p.second;
if (cl->javaName.size()) { if (cl->javaName.size()) {
writeJavaInitialization(out, cl); writeJavaInitialization(out, cl, alreadyInited);
} }
} }
} }

View File

@ -16,6 +16,12 @@ public class NullPointer {
} }
public static void main(String[] args) { public static void main(String[] args) {
try {
((Object) null).getClass();
} catch (Exception e) {
e.printStackTrace();
}
try { try {
throw_(null); throw_(null);
throw new RuntimeException(); throw new RuntimeException();