Skip to content

Commit 44e87dc

Browse files
committed
[GR-69712] Fix a few Web Image issues.
PullRequest: graal/22154
2 parents 3910516 + 8337e08 commit 44e87dc

File tree

4 files changed

+101
-15
lines changed

4 files changed

+101
-15
lines changed

web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/util/ReflectUtil.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,15 @@ private static Optional<Method> singleAbstractMethodForInterface(Class<?> javaIn
7272
return Optional.empty();
7373
}
7474

75+
Method[] methods;
76+
try {
77+
methods = javaInterface.getMethods();
78+
} catch (NoClassDefFoundError e) {
79+
return Optional.empty();
80+
}
81+
7582
Method sam = null;
76-
for (final Method method : javaInterface.getMethods()) {
83+
for (final Method method : methods) {
7784
if (OBJECT_METHODS.contains(method)) {
7885
// Skip the methods from the Object class.
7986
continue;

web-image/src/com.oracle.svm.webimage/src/com/oracle/svm/webimage/substitute/system/Target_java_lang_StackWalker_Web.java

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,90 @@
3030
import java.util.function.Function;
3131
import java.util.stream.Stream;
3232

33+
import com.oracle.svm.core.SubstrateOptions;
3334
import com.oracle.svm.core.annotate.Substitute;
3435
import com.oracle.svm.core.annotate.TargetClass;
3536

3637
@TargetClass(value = java.lang.StackWalker.class)
38+
@SuppressWarnings({"static-method", "unused"})
3739
final class Target_java_lang_StackWalker_Web {
3840

3941
@Substitute
40-
@SuppressWarnings({"static-method", "unused"})
4142
private void forEach(Consumer<? super StackFrame> action) {
4243
throw new UnsupportedOperationException("StackWalker.forEach");
4344
}
4445

4546
@Substitute
46-
@SuppressWarnings("static-method")
4747
private Class<?> getCallerClass() {
4848
throw new UnsupportedOperationException("StackWalker.getCallerClass");
4949
}
5050

5151
@Substitute
52-
@SuppressWarnings({"static-method", "unused"})
5352
private <T> T walk(Function<? super Stream<StackFrame>, ? extends T> function) {
54-
throw new UnsupportedOperationException("StackWalker.walk");
53+
if (SyntheticStackSupport.MAIN_STACK_FRAME == null) {
54+
throw new UnsupportedOperationException("StackWalker.walk");
55+
}
56+
return function.apply(Stream.of(SyntheticStackSupport.MAIN_STACK_FRAME));
57+
}
58+
}
59+
60+
final class SyntheticStackSupport {
61+
public static final StackTraceElement MAIN_STACK_TRACE_ELEMENT;
62+
static final StackFrame MAIN_STACK_FRAME;
63+
64+
static {
65+
String mainClassName = SubstrateOptions.Class.getValue();
66+
String mainMethodName = SubstrateOptions.Method.getValue();
67+
if (mainClassName.isEmpty() || mainMethodName.isEmpty()) {
68+
MAIN_STACK_TRACE_ELEMENT = null;
69+
MAIN_STACK_FRAME = null;
70+
} else {
71+
MAIN_STACK_TRACE_ELEMENT = new StackTraceElement(mainClassName, mainMethodName, "", 0);
72+
MAIN_STACK_FRAME = new StackFrame() {
73+
@Override
74+
public String getClassName() {
75+
return mainClassName;
76+
}
77+
78+
@Override
79+
public String getMethodName() {
80+
return mainMethodName;
81+
}
82+
83+
@Override
84+
public Class<?> getDeclaringClass() {
85+
try {
86+
return Class.forName(mainClassName);
87+
} catch (ClassNotFoundException e) {
88+
throw new UnsupportedOperationException("getDeclaringClass in StackWalker.walk");
89+
}
90+
}
91+
92+
@Override
93+
public int getByteCodeIndex() {
94+
return 0;
95+
}
96+
97+
@Override
98+
public String getFileName() {
99+
return MAIN_STACK_TRACE_ELEMENT.getFileName();
100+
}
101+
102+
@Override
103+
public int getLineNumber() {
104+
return MAIN_STACK_TRACE_ELEMENT.getLineNumber();
105+
}
106+
107+
@Override
108+
public boolean isNativeMethod() {
109+
return false;
110+
}
111+
112+
@Override
113+
public StackTraceElement toStackTraceElement() {
114+
return MAIN_STACK_TRACE_ELEMENT;
115+
}
116+
};
117+
}
55118
}
56119
}

web-image/src/com.oracle.svm.webimage/src/com/oracle/svm/webimage/substitute/system/Target_java_lang_Throwable_Web.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,6 @@ private Throwable fillInStackTrace_WasmLM() {
114114
public void setStackTrace(StackTraceElement[] stackTrace) {
115115
}
116116

117-
@Substitute
118-
private StackTraceElement[] getOurStackTrace() {
119-
if (stackTrace != null) {
120-
return stackTrace;
121-
} else {
122-
return new StackTraceElement[0];
123-
}
124-
}
125-
126117
@Substitute
127118
public void printStackTrace(PrintStream s) {
128119
JSExceptionSupport.printStackTrace(this, s::println);
@@ -133,3 +124,12 @@ public void printStackTrace(PrintWriter w) {
133124
JSExceptionSupport.printStackTrace(this, w::println);
134125
}
135126
}
127+
128+
@TargetClass(java.lang.StackTraceElement.class)
129+
@SuppressWarnings({"static-method", "unused"})
130+
final class Target_java_lang_StackTraceElement_Web {
131+
@Substitute
132+
static StackTraceElement[] of(Object x, int depth) {
133+
return new StackTraceElement[]{SyntheticStackSupport.MAIN_STACK_TRACE_ELEMENT};
134+
}
135+
}

web-image/src/com.oracle.svm.webimage/src/com/oracle/svm/webimage/substitute/system/WebImageJavaLangSubstitutions.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;
2929

3030
import java.io.ByteArrayInputStream;
31+
import java.io.Console;
3132
import java.io.IOException;
3233
import java.io.InputStream;
3334
import java.lang.reflect.AccessibleObject;
@@ -42,6 +43,7 @@
4243
import java.util.zip.DataFormatException;
4344

4445
import org.graalvm.nativeimage.Platforms;
46+
import org.graalvm.nativeimage.ProcessProperties;
4547

4648
import com.oracle.svm.core.NeverInline;
4749
import com.oracle.svm.core.OS;
@@ -59,7 +61,6 @@
5961
import com.oracle.svm.webimage.platform.WebImageJSPlatform;
6062
import com.oracle.svm.webimage.platform.WebImagePlatform;
6163
import com.oracle.svm.webimage.platform.WebImageWasmGCPlatform;
62-
import org.graalvm.nativeimage.ProcessProperties;
6364

6465
/*
6566
* Checkstyle: stop method name check
@@ -304,6 +305,11 @@ public static void arraycopy(Object src, int srcPos,
304305
public static String mapLibraryName(String libname) {
305306
return libname;
306307
}
308+
309+
@Substitute
310+
public static Console console() {
311+
return null;
312+
}
307313
}
308314

309315
@TargetClass(java.lang.Math.class)
@@ -917,6 +923,16 @@ private static long isAlive0(long pid) {
917923
}
918924
}
919925

926+
@TargetClass(className = "java.lang.ProcessBuilder")
927+
@SuppressWarnings({"static-method", "unused"})
928+
final class Target_java_lang_ProcessBuilder_Web {
929+
@Substitute
930+
public Process start() throws IOException {
931+
// Throw IOException instead of UnsupportedOperationException to allow fallback code to run.
932+
throw new IOException("Cannot run processes on Web Image yet");
933+
}
934+
}
935+
920936
class IsLinux implements BooleanSupplier {
921937
@Override
922938
public boolean getAsBoolean() {

0 commit comments

Comments
 (0)