2
2
3
3
public class Test {
4
4
static Object output ;
5
- A left_a ;
6
- A right_a ;
5
+ static Object static_object ;
6
+ static A output_a ;
7
+ static ListNode static_list_node ;
8
+ A a1 ;
9
+ A a2 ;
7
10
8
11
public static class A {
9
- Object left_object ;
10
- Object right_object ;
12
+ Object object ;
11
13
}
12
14
13
15
// Precise access paths should work fine
14
16
public void field_setter (A parameter_a ) {
15
- output = parameter_a .left_object ;
17
+ output = parameter_a .object ;
18
+ }
19
+
20
+ public void apply_field_setter () {
21
+ A dynamic_object_a = new A ();
22
+ dynamic_object_a .object = static_object ;
23
+ field_setter (dynamic_object_a );
24
+ output_a = dynamic_object_a ;
16
25
}
17
26
18
27
// Precise access paths should work fine
19
28
public Object field_getter () {
20
- return left_a .left_object ;
29
+ return a1 .object ;
30
+ }
31
+
32
+ public Object apply_field_getter () {
33
+ return field_getter ();
34
+ }
35
+
36
+ // Precise access paths should work fine
37
+ public void set_field_of_external_object (
38
+ A parameter_a , Object parameter_object ) {
39
+ parameter_a .object = parameter_object ;
40
+ }
41
+
42
+ public void apply_set_field_of_external_object (
43
+ A parameter_a , Object parameter_object ) {
44
+ set_field_of_external_object (parameter_a , parameter_object );
45
+ }
46
+
47
+ // Precise access paths should work fine
48
+ public void conditionally_set_field_of_external_object (
49
+ A parameter_a , Object parameter_object , boolean b ) {
50
+ if (b ) {
51
+ parameter_a .object = parameter_object ;
52
+ }
53
+ }
54
+
55
+ public void apply_conditionally_set_field_of_external_object (
56
+ A parameter_a , Object parameter_object , boolean b ) {
57
+ conditionally_set_field_of_external_object (
58
+ parameter_a , parameter_object , b );
21
59
}
22
60
23
61
// Precise access paths should work fine
24
62
public void read_field_before_writing_to_aliasable_field () {
25
- output = right_a . left_object ;
26
- left_a . left_object = new Object ();
63
+ output = a2 . object ;
64
+ a1 . object = new Object ();
27
65
}
28
66
29
- // Precise access paths must be careful that right_a.left_object could be
30
- // aliased by left_a.left_object, so it might be changed by the first line,
31
- // and thus we cannot just return "right_a.left_object"
67
+ // Precise access paths should work fine
68
+ public void apply_read_field_before_writing_to_aliasable_field () {
69
+ read_field_before_writing_to_aliasable_field ();
70
+ }
71
+
72
+ // Precise access paths must be careful that a2.object could be
73
+ // aliased by a1.object, so it might be changed by the first line,
74
+ // and thus we cannot just return "a2.object"
32
75
public void read_field_after_writing_to_aliasable_field () {
33
- left_a .left_object = new Object ();
34
- output = right_a .left_object ;
76
+ a1 .object = new Object ();
77
+ output = a2 .object ;
78
+ }
79
+
80
+ public void apply_read_field_after_writing_to_aliasable_field () {
81
+ read_field_after_writing_to_aliasable_field ();
35
82
}
36
83
37
84
// Helper function for call_function_to_allocate_new_object()
38
85
public void allocate_new_object (A input_A ) {
39
- input_A .left_object = new Object ();
40
- }
86
+ input_A .object = new Object ();
87
+ }
41
88
42
89
// Precise access paths should work fine
43
90
public void call_function_to_allocate_new_object (A param_A ) {
44
91
allocate_new_object (param_A );
45
- output = param_A .left_object ;
92
+ output = param_A .object ;
93
+ }
94
+
95
+ public void apply_call_function_to_allocate_new_object (A param_A ) {
96
+ call_function_to_allocate_new_object (param_A );
46
97
}
47
98
48
99
public static class ListNode {
@@ -60,14 +111,43 @@ public void get_list_node(ListNode list_node, int index) {
60
111
output = list_node .data ;
61
112
}
62
113
114
+ public void apply_get_list_node (ListNode list_node , int index ) {
115
+ get_list_node (list_node , index );
116
+ }
117
+
118
+ public static class B {
119
+ A a ;
120
+ }
121
+
122
+ // Precise access paths should work fine
123
+ public void two_derefs (B parameter_b ) {
124
+ output = parameter_b .a .object ;
125
+ }
126
+
127
+ public void apply_two_derefs (B parameter_b ) {
128
+ two_derefs (parameter_b );
129
+ }
130
+
131
+ public void simple_function_should_export_precise_access_paths (A param_a ) {
132
+ param_a .object = static_object ;
133
+ }
134
+
135
+ public void check_using_precise_access_paths () {
136
+ A dynamic_object_1 = new A ();
137
+ A dynamic_object_2 = new A ();
138
+ simple_function_should_export_precise_access_paths (dynamic_object_2 );
139
+ output = dynamic_object_1 .object ;
140
+ }
141
+
63
142
public void simple_function_should_export_imprecise_access_paths (A param_a ) {
64
- param_a .left_object = new Object ();
143
+ param_a .object = new Object ();
144
+ static_list_node .data = null ;
65
145
}
66
146
67
147
public void check_using_imprecise_access_paths () {
68
148
A dynamic_object_1 = new A ();
69
149
A dynamic_object_2 = new A ();
70
150
simple_function_should_export_imprecise_access_paths (dynamic_object_2 );
71
- output = dynamic_object_1 .left_object ;
151
+ output = dynamic_object_1 .object ;
72
152
}
73
153
}
0 commit comments