Revision | 80a05a1a4fbfeb170b1f26f1744916d6b29a2f73 (tree) |
---|---|
Zeit | 2023-01-26 01:29:44 |
Autor | miyakawataku |
Commiter | miyakawataku |
stack bound lvar can also be nullable
@@ -49,20 +49,26 @@ | ||
49 | 49 | |
50 | 50 | int freeInd = free().indexOf(lvar); |
51 | 51 | if (freeInd >= 0) { |
52 | - boolean nonnull = lvar instanceof LocalVar.Generated | |
53 | - || CONTROL_LVARS.contains(lvar); | |
54 | - return new Allocation.Field(freeInd, nonnull); | |
52 | + return new Allocation.Field(freeInd, isNonNull(lvar)); | |
55 | 53 | } |
56 | 54 | |
57 | 55 | int stackInd = stackBound().indexOf(lvar); |
58 | 56 | if (stackInd >= 0) { |
59 | - return new Allocation.Stack(stackInd, true); | |
57 | + return new Allocation.Stack(stackInd, isNonNull(lvar)); | |
60 | 58 | } |
61 | 59 | |
62 | 60 | return new Allocation.Unused(); |
63 | 61 | } |
64 | 62 | |
65 | 63 | /** |
64 | + * Whether the local var is nonnull. | |
65 | + */ | |
66 | + private boolean isNonNull(LocalVar lvar) { | |
67 | + return lvar instanceof LocalVar.Generated | |
68 | + || CONTROL_LVARS.contains(lvar); | |
69 | + } | |
70 | + | |
71 | + /** | |
66 | 72 | * Analyzes the vars as of the inner SSA fun for the case a local var |
67 | 73 | * of a control fun is overridden on the top level. |
68 | 74 | * |
@@ -31,7 +31,9 @@ | ||
31 | 31 | List.of( |
32 | 32 | new LocalVar.Generated("X", "x"), |
33 | 33 | new LocalVar.Generated("Y", "y"), |
34 | - new LocalVar.Generated("Z", "z"))); | |
34 | + new LocalVar.Generated("Z", "z"), | |
35 | + new LocalVar.Original("W"), | |
36 | + new LocalVar.Original("raise"))); | |
35 | 37 | |
36 | 38 | @Test |
37 | 39 | public void get_recv() { |
@@ -76,6 +78,18 @@ | ||
76 | 78 | } |
77 | 79 | |
78 | 80 | @Test |
81 | + public void get_stacked_nullable() { | |
82 | + assertThat(analysis.get(new LocalVar.Original("W"))) | |
83 | + .isEqualTo(new Allocation.Stack(3, false)); | |
84 | + } | |
85 | + | |
86 | + @Test | |
87 | + public void get_stacked_control_sym() { | |
88 | + assertThat(analysis.get(new LocalVar.Original("raise"))) | |
89 | + .isEqualTo(new Allocation.Stack(4, true)); | |
90 | + } | |
91 | + | |
92 | + @Test | |
79 | 93 | public void get_unused() { |
80 | 94 | assertThat(analysis.get(new LocalVar.Original("unused"))) |
81 | 95 | .isEqualTo(new Allocation.Unused()); |