CACAO
resolve.hpp
Go to the documentation of this file.
1 /* src/vm/resolve.hpp - resolving classes/interfaces/fields/methods
2 
3  Copyright (C) 1996-2014
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 
26 #ifndef RESOLVE_HPP_
27 #define RESOLVE_HPP_ 1
28 
29 #include <stdio.h> // for FILE, NULL
30 #include "config.h" // for ENABLE_VERIFIER
31 #include "vm/references.hpp" // for classref_or_classinfo
32 #include "vm/types.hpp" // for s4
33 #include "vm/utf8.hpp" // for Utf8String
34 
35 struct classinfo;
36 struct fieldinfo;
37 struct instruction;
38 struct jitdata;
39 struct methodinfo;
40 struct typedesc;
41 struct unresolved_class;
42 struct unresolved_field;
43 struct unresolved_method;
45 struct typedescriptor_t;
46 struct typeinfo_t;
47 
48 /* constants ******************************************************************/
49 
50 #define RESOLVE_STATIC 0x0001 /* ref to static fields/methods */
51 #define RESOLVE_PUTFIELD 0x0002 /* field ref inside a PUT{FIELD,STATIC}... */
52 #define RESOLVE_SPECIAL 0x0004 /* method ref inside INVOKESPECIAL */
53 
54 
55 /* enums **********************************************************************/
56 
57 typedef enum {
61 
62 typedef enum {
66 
67 typedef enum {
68  resolveFailed = false, /* this must be a false value */
69  resolveDeferred = true, /* this must be a true value */
72 
73 /* structs ********************************************************************/
74 
76  classref_or_classinfo *subtyperefs; /* NULL terminated list */
77 };
78 
83 };
84 
85 /* XXX unify heads of unresolved_field and unresolved_method? */
86 
91 
94 };
95 
100 
103 };
104 
105 #define SUBTYPESET_IS_EMPTY(stset) \
106  ((stset).subtyperefs == NULL)
107 
108 #define UNRESOLVED_SUBTYPE_SET_EMTPY(stset) \
109  do { (stset).subtyperefs = NULL; } while(0)
110 
111 
112 /* function prototypes ********************************************************/
113 
114 void resolve_handle_pending_exception(bool throwError);
115 
116 bool resolve_class_from_name(classinfo* referer,methodinfo *refmethod,
117  Utf8String classname,
118  resolve_mode_t mode,
119  bool checkaccess,
120  bool link,
121  classinfo **result);
122 
123 bool resolve_classref(methodinfo *refmethod,
124  constant_classref *ref,
125  resolve_mode_t mode,
126  bool checkaccess,
127  bool link,
128  classinfo **result);
129 
132  resolve_mode_t mode,
133  bool checkaccess,
134  bool link,
135  classinfo **result);
136 
138 
139 bool resolve_class_from_typedesc(typedesc *d,bool checkaccess,bool link,classinfo **result);
140 
141 #ifdef ENABLE_VERIFIER
143  resolve_mode_t mode,
144  bool checkaccess,
145  classinfo **result);
146 #endif /* ENABLE_VERIFIER */
147 
149  resolve_mode_t mode,
150  fieldinfo **result);
151 
153  resolve_mode_t mode,
154  methodinfo **result);
155 
156 #ifdef ENABLE_VERIFIER
158  constant_classref *classref,
159  typeinfo_t *valuetype);
160 #endif
161 
163  methodinfo *refmethod,
164  instruction *iptr);
165 
167  methodinfo *refmethod,
168  constant_FMIref *methodref,
169  bool invokestatic,
170  bool invokespecial);
171 
175 
177  constant_FMIref *methodref,
178  bool invokespecial);
179 
181  constant_FMIref *fieldref);
182 
183 #if defined(ENABLE_VERIFIER)
185  constant_FMIref *fieldref,
186  classinfo *container,
187  fieldinfo *fi,
188  typeinfo_t *instanceti,
189  typeinfo_t *valueti,
190  bool isstatic,
191  bool isput);
192 
194  classinfo *referer,
195  methodinfo *refmethod,
196  typeinfo_t *instanceti,
197  typeinfo_t *valueti);
198 
200  constant_FMIref *methodref,
201  methodinfo *mi,
202  bool invokestatic);
203 
205  methodinfo *mi,
206  typeinfo_t *instanceti,
207  bool invokespecial);
208 
210  methodinfo *refmethod,
211  instruction *iptr,
212  methodinfo *mi,
213  bool invokestatic);
214 
216  methodinfo *refmethod,
217  methodinfo *mi,
218  bool invokestatic,
220 
222  methodinfo *mi);
223 
225  methodinfo *refmethod,
226  typeinfo_t *instanceti,
227  bool invokespecial);
228 
230  unresolved_method *ref,
231  methodinfo *refmethod,
232  instruction *iptr);
233 
235  unresolved_method *ref,
236  methodinfo *refmethod,
238 
239 #endif /* defined(ENABLE_VERIFIER) */
240 
241 #ifndef NDEBUG
242 void unresolved_class_debug_dump(unresolved_class *ref,FILE *file);
243 void unresolved_field_debug_dump(unresolved_field *ref,FILE *file);
244 void unresolved_method_debug_dump(unresolved_method *ref,FILE *file);
246 #endif
247 
252 
253 #ifdef ENABLE_VERIFIER
256 #endif
257 
258 #endif // RESOLVE_HPP_
259 
260 /*
261  * These are local overrides for various environment variables in Emacs.
262  * Please do not remove this and leave it at the end of the file, where
263  * Emacs will automagically detect them.
264  * ---------------------------------------------------------------------
265  * Local variables:
266  * mode: c++
267  * indent-tabs-mode: t
268  * c-basic-offset: 4
269  * tab-width: 4
270  * End:
271  * vim:noexpandtab:sw=4:ts=4:
272  */
273 
bool resolve_class_from_name(classinfo *referer, methodinfo *refmethod, Utf8String classname, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:153
Definition: jit.hpp:126
resolve_result_t resolve_method_verifier_checks(methodinfo *refmethod, constant_FMIref *methodref, methodinfo *mi, bool invokestatic)
Definition: resolve.cpp:1597
constant_classref * classref
Definition: resolve.hpp:80
unresolved_field * resolve_create_unresolved_field(classinfo *referer, methodinfo *refmethod, instruction *iptr)
Definition: resolve.cpp:2402
bool resolve_constrain_unresolved_method_params(jitdata *jd, unresolved_method *ref, methodinfo *refmethod, instruction *iptr)
Definition: resolve.cpp:2713
resolve_mode_t
Definition: resolve.hpp:57
classinfo * resolve_classref_eager_nonabstract(constant_classref *ref)
Definition: resolve.cpp:986
void unresolved_class_debug_dump(unresolved_class *ref, FILE *file)
Definition: resolve.cpp:2982
unresolved_method * resolve_create_unresolved_method(classinfo *referer, methodinfo *refmethod, constant_FMIref *methodref, bool invokestatic, bool invokespecial)
Definition: resolve.cpp:2596
resolve_result_t resolve_field_lazy(methodinfo *refmethod, constant_FMIref *fieldref)
Definition: resolve.cpp:1261
bool resolve_classref(methodinfo *refmethod, constant_classref *ref, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:309
void resolve_handle_pending_exception(bool throwError)
Definition: resolve.cpp:78
classinfo * resolve_class_eager_no_access_check(unresolved_class *ref)
Definition: resolve.cpp:1044
bool resolve_field(unresolved_field *ref, resolve_mode_t mode, fieldinfo **result)
Definition: resolve.cpp:1342
void unresolved_method_debug_dump(unresolved_method *ref, FILE *file)
Definition: resolve.cpp:3045
methodinfo * referermethod
Definition: resolve.hpp:89
void unresolved_method_free(unresolved_method *ref)
Definition: resolve.cpp:2915
bool resolve_constrain_unresolved_method_instance(unresolved_method *ref, methodinfo *refmethod, typeinfo_t *instanceti, bool invokespecial)
Definition: resolve.cpp:2648
bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:473
bool resolve_constrain_unresolved_method_params_stackbased(unresolved_method *ref, methodinfo *refmethod, typedescriptor_t *stack)
Definition: resolve.cpp:2788
void unresolved_field_debug_dump(unresolved_field *ref, FILE *file)
Definition: resolve.cpp:3009
void link(basicblock *v, basicblock *w)
Definition: dominator.cpp:178
resolve_result_t resolve_method_instance_type_checks(methodinfo *refmethod, methodinfo *mi, typeinfo_t *instanceti, bool invokespecial)
Definition: resolve.cpp:1680
resolve_result_t resolve_method_lazy(methodinfo *refmethod, constant_FMIref *methodref, bool invokespecial)
Definition: resolve.cpp:1950
bool resolve_class(unresolved_class *ref, resolve_mode_t mode, bool checkaccess, classinfo **result)
Definition: resolve.cpp:900
constant_FMIref * fieldref
Definition: resolve.hpp:88
alloc::list< PassInfo::IDTy >::type & stack
unresolved_subtype_set subtypeconstraints
Definition: resolve.hpp:82
Fieldref, Methodref and InterfaceMethodref.
Definition: references.hpp:86
int32_t s4
Definition: types.hpp:45
bool resolve_method(unresolved_method *ref, resolve_mode_t mode, methodinfo **result)
Definition: resolve.cpp:2055
resolve_result_t resolve_field_verifier_checks(methodinfo *refmethod, constant_FMIref *fieldref, classinfo *container, fieldinfo *fi, typeinfo_t *instanceti, typeinfo_t *valueti, bool isstatic, bool isput)
Definition: resolve.cpp:1081
void unresolved_class_free(unresolved_class *ref)
Definition: resolve.cpp:2876
void unresolved_subtype_set_debug_dump(unresolved_subtype_set *stset, FILE *file)
Definition: resolve.cpp:2949
resolve_err_t
Definition: resolve.hpp:62
resolve_result_t resolve_method_param_type_checks_stackbased(methodinfo *refmethod, methodinfo *mi, bool invokestatic, typedescriptor_t *stack)
Definition: resolve.cpp:1813
constant_FMIref * methodref
Definition: resolve.hpp:97
fieldinfo * resolve_field_eager(unresolved_field *ref)
Definition: resolve.cpp:1497
classinfo * resolve_class_eager(unresolved_class *ref)
Definition: resolve.cpp:1018
methodinfo * resolve_method_eager(unresolved_method *ref)
Definition: resolve.cpp:2236
classref_or_classinfo * subtyperefs
Definition: resolve.hpp:76
bool resolve_classref_or_classinfo(methodinfo *refmethod, classref_or_classinfo cls, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:351
unresolved_subtype_set * paramconstraints
Definition: resolve.hpp:102
unresolved_class * create_unresolved_class(methodinfo *refmethod, constant_classref *classref, typeinfo_t *valuetype)
Definition: resolve.cpp:2354
classinfo * resolve_classref_eager(constant_classref *ref)
Definition: resolve.cpp:961
unresolved_subtype_set instancetypes
Definition: resolve.hpp:92
methodinfo * referermethod
Definition: resolve.hpp:81
classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess)
Definition: resolve.cpp:437
bool resolve_method_loading_constraints(classinfo *referer, methodinfo *mi)
Definition: resolve.cpp:1876
resolve_result_t resolve_method_param_type_checks(jitdata *jd, methodinfo *refmethod, instruction *iptr, methodinfo *mi, bool invokestatic)
Definition: resolve.cpp:1748
unresolved_subtype_set instancetypes
Definition: resolve.hpp:101
unresolved_subtype_set valueconstraints
Definition: resolve.hpp:93
resolve_result_t
Definition: resolve.hpp:67
bool resolve_constrain_unresolved_field(unresolved_field *ref, classinfo *referer, methodinfo *refmethod, typeinfo_t *instanceti, typeinfo_t *valueti)
Definition: resolve.cpp:2485
methodinfo * referermethod
Definition: resolve.hpp:98
void unresolved_field_free(unresolved_field *ref)
Definition: resolve.cpp:2895