Skip to content

Commit f028741

Browse files
committed
mutual dependent class not working #65
1 parent 72284b6 commit f028741

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/CodeEvaluator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ protected Object evalSingle(String code) {
114114
throw new RuntimeException(e);
115115
}
116116

117-
if (!event.status().isDefined()) {
117+
// Undefined snippets are generally bad, unless we can still recover from them. E.g.,
118+
// "Unresolved dependencies" errors are recoverable when those dependencies are defined in the later
119+
// snippets.
120+
if (event.status() != Snippet.Status.RECOVERABLE_NOT_DEFINED && !event.status().isDefined()) {
118121
throw new CompilationException(event);
119122
}
120123
}

jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/JJavaLoaderDelegate.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,15 @@ public JJavaLoaderDelegate() {
3131
@Override
3232
public void load(ExecutionControl.ClassBytecodes[] cbcs) throws ExecutionControl.ClassInstallException {
3333
boolean[] installed = new boolean[cbcs.length];
34-
int i = 0;
34+
35+
// Must record all defined classes before attempting to load them. Otherwise, classes depending on other,
36+
// not yet loaded classes, may fail (see https://github.com/dflib/jjava/issues/65)
3537
for (ExecutionControl.ClassBytecodes cbc : cbcs) {
3638
declaredClasses.put(cbc.name(), cbc.bytecodes());
39+
}
40+
41+
int i = 0;
42+
for (ExecutionControl.ClassBytecodes cbc : cbcs) {
3743
try {
3844
Class<?> loaderClass = classLoader.findClass(cbc.name());
3945
loadedClasses.put(cbc.name(), loaderClass);

0 commit comments

Comments
 (0)