/
Returns.java
93 lines (75 loc) · 3.02 KB
/
Returns.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Copyright (c) 2017-2022 Software Architecture Group, Hasso Plattner Institute
* Copyright (c) 2021-2022 Oracle and/or its affiliates
*
* Licensed under the MIT License.
*/
package de.hpi.swa.trufflesqueak.exceptions;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.nodes.ControlFlowException;
import de.hpi.swa.trufflesqueak.model.ContextObject;
import de.hpi.swa.trufflesqueak.model.FrameMarker;
public final class Returns {
private abstract static class AbstractReturn extends ControlFlowException {
private static final long serialVersionUID = 1L;
protected final Object returnValue;
private AbstractReturn(final Object result) {
assert result != null : "Unexpected `null` value";
returnValue = result;
}
public final Object getReturnValue() {
return returnValue;
}
}
public static final class NonLocalReturn extends AbstractReturn {
private static final long serialVersionUID = 1L;
private final Object targetContextOrMarker;
public NonLocalReturn(final Object returnValue, final Object targetContextOrMarker) {
super(returnValue);
assert targetContextOrMarker instanceof ContextObject || targetContextOrMarker instanceof FrameMarker;
this.targetContextOrMarker = targetContextOrMarker;
}
public Object getTargetContextOrMarker() {
return targetContextOrMarker;
}
@Override
public String toString() {
CompilerAsserts.neverPartOfCompilation();
return "NLR (value: " + returnValue + ", target: " + targetContextOrMarker + ")";
}
}
public static final class NonVirtualReturn extends AbstractReturn {
private static final long serialVersionUID = 1L;
private final ContextObject targetContext;
private final ContextObject currentContext;
public NonVirtualReturn(final Object returnValue, final ContextObject targetContext, final ContextObject currentContext) {
super(returnValue);
this.targetContext = targetContext;
this.currentContext = currentContext;
}
public ContextObject getTargetContext() {
return targetContext;
}
public ContextObject getCurrentContext() {
return currentContext;
}
@Override
public String toString() {
CompilerAsserts.neverPartOfCompilation();
return "NVR (value: " + returnValue + ", current: " + currentContext + ", target: " + targetContext + ")";
}
}
public static final class TopLevelReturn extends AbstractReturn {
private static final long serialVersionUID = 1L;
public TopLevelReturn(final Object result) {
super(result);
}
@Override
public String toString() {
CompilerAsserts.neverPartOfCompilation();
return "TLR (value: " + returnValue + ")";
}
}
private Returns() {
}
}