87 if (throwError ==
true) {
172 #ifdef RESOLVE_VERBOSE
173 printf(
"resolve_class_from_name(");
177 printf(
",%d,%d)\n",(
int)checkaccess,(
int)link);
184 #ifdef RESOLVE_VERBOSE
185 printf(
" lookup result: %p\n",(
void*)cls);
191 if (classname[0] ==
'[') {
192 utf_ptr = classname.
begin() + 1;
193 len = classname.
size() - 1;
207 mode,checkaccess,link,&cls))
225 #ifdef RESOLVE_VERBOSE
243 #ifdef RESOLVE_VERBOSE
244 printf(
" checking access rights...\n");
273 #ifdef RESOLVE_VERBOSE
365 #ifdef RESOLVE_VERBOSE
366 printf(
"resolve_classref_or_classinfo(");
368 printf(
",%i,%i,%i)\n",mode,(
int)checkaccess,(
int)link);
388 mode, checkaccess, link, &c))
389 goto return_exception;
407 goto return_exception;
482 #ifdef RESOLVE_VERBOSE
483 printf(
"resolve_class_from_typedesc(");
485 printf(
",%i,%i)\n",(
int)checkaccess,(
int)link);
511 #ifdef RESOLVE_VERBOSE
556 #if defined(ENABLE_VERIFIER)
569 assert(supertype.
any);
610 assert(supertype.
cls);
620 #if defined(RESOLVE_VERBOSE)
621 printf(
"SUBTYPE CHECK FAILED!\n");
626 buf.
write(
"illegal access to protected member (");
628 buf.
write(
"subtype constraint violated (");
631 .
write(
" is not a subclass of ")
681 #if defined(ENABLE_VERIFIER)
693 assert(supertype.
any);
700 "Invalid use of returnAddress");
708 "Invalid use of uninitialized object");
731 for (i=0; i<count; ++
i) {
813 #if defined(ENABLE_VERIFIER)
829 #if defined(RESOLVE_VERBOSE)
830 printf(
"resolve_and_check_subtype_set:\n");
841 if (!setp || !setp->
any) {
855 for (; setp->
any; ++setp) {
857 #if defined(RESOLVE_VERBOSE)
859 printf(
"SUBTYPE CHECK FAILED!\n");
899 #ifdef ENABLE_VERIFIER
914 #ifdef RESOLVE_VERBOSE
920 ref->
classref,mode,checkaccess,
true,&cls))
939 return (
bool) checkresult;
1017 #ifdef ENABLE_VERIFIER
1043 #ifdef ENABLE_VERIFIER
1080 #if defined(ENABLE_VERIFIER)
1102 referer = refmethod->
clazz;
1105 declarer = fi->
clazz;
1114 #error This code assumes that `true` is `1`. Otherwise, use the ternary operator below.
1121 ?
"static field accessed via instance"
1122 :
"instance field accessed without instance");
1179 initclass = referer;
1186 insttip = instanceti;
1213 assert(fieldtyperef);
1228 assert(fieldtyperef);
1231 fieldtyperef->
name))
1272 referer = refmethod->
clazz;
1356 #ifdef RESOLVE_VERBOSE
1368 container = fi->
clazz;
1369 goto resolved_the_field;
1389 #ifdef RESOLVE_VERBOSE
1390 printf(
" resolving field in class...\n");
1414 #ifdef ENABLE_VERIFIER
1429 return (
bool) checkresult;
1445 return (
bool) checkresult;
1452 assert(fieldtyperef);
1460 return (
bool) checkresult;
1472 return (
bool) checkresult;
1536 referer = refmethod->
clazz;
1539 declarer = mi->
clazz;
1548 if ((referer != declarer) && (mi->
name != utf8::init)) {
1553 "INVOKESPECIAL calling non-super class method");
1596 #if defined(ENABLE_VERIFIER)
1609 #ifdef RESOLVE_VERBOSE
1610 printf(
"resolve_method_verifier_checks\n");
1616 referer = refmethod->
clazz;
1619 declarer = mi->
clazz;
1628 ?
"static method called via instance"
1629 :
"instance method called without instance");
1679 #if defined(ENABLE_VERIFIER)
1747 #if defined(ENABLE_VERIFIER)
1764 instancecount = (invokestatic) ? 0 : 1;
1771 for (i = md->
paramcount-1-instancecount; i>=0; --i) {
1772 param =
VAR(iptr->
sx.
s23.s2.args[i+instancecount]);
1776 assert(type == param->
type);
1812 #if defined(ENABLE_VERIFIER)
1827 instancecount = (invokestatic) ? 0 : 1;
1834 param = stack - (md->
paramslots - 1 - instancecount);
1836 for (i = instancecount; i < md->
paramcount; ++
i) {
1839 assert(type == param->
type);
1875 #if defined(ENABLE_VERIFIER)
1892 if (i < instancecount || paramtypes[i].type ==
TYPE_ADR) {
1893 if (i < instancecount) {
1960 #ifdef RESOLVE_VERBOSE
1961 printf(
"resolve_method_lazy\n");
1966 referer = refmethod->
clazz;
2012 if (invokespecial) {
2065 #ifdef RESOLVE_VERBOSE
2080 container = mi->
clazz;
2081 goto resolved_the_method;
2143 resolved_the_method:
2145 #ifdef ENABLE_VERIFIER
2154 return (
bool) checkresult;
2177 return (
bool) checkresult;
2190 if (paramtypes[
i+instancecount].type ==
TYPE_ADR) {
2198 return (
bool) checkresult;
2213 return (
bool) checkresult;
2250 #ifdef ENABLE_VERIFIER
2263 #ifdef RESOLVE_VERBOSE
2264 printf(
"unresolved_subtype_set_from_typeinfo\n");
2265 #ifdef TYPEINFO_DEBUG
2274 "Invalid use of returnAddress");
2280 "Invalid use of uninitialized object");
2289 if (declaredclassname == utf8::java_lang_Object
2298 for (i=0; i<count; ++
i) {
2353 #ifdef ENABLE_VERIFIER
2360 #ifdef RESOLVE_VERBOSE
2361 printf(
"create_unresolved_class\n");
2409 #ifdef RESOLVE_VERBOSE
2410 printf(
"create_unresolved_field\n");
2421 switch (iptr->
opc) {
2450 fieldref = iptr->
sx.
s23.s3.fmiref;
2454 #ifdef RESOLVE_VERBOSE
2484 #if defined(ENABLE_VERIFIER)
2501 #ifdef RESOLVE_VERBOSE
2502 printf(
"constrain_unresolved_field\n");
2542 "accessing field of uninitialized object");
2546 initclass = refmethod->
clazz;
2554 insttip = instanceti;
2606 #ifdef RESOLVE_VERBOSE
2607 printf(
"create_unresolved_method\n");
2647 #if defined(ENABLE_VERIFIER)
2667 #ifdef RESOLVE_VERBOSE
2668 printf(
"resolve_constrain_unresolved_method_instance\n");
2712 #if defined(ENABLE_VERIFIER)
2730 assert(md->
params != NULL);
2732 #ifdef RESOLVE_VERBOSE
2733 printf(
"resolve_constrain_unresolved_method_params\n");
2742 for (i=md->
paramcount-1-instancecount; i>=0; --i) {
2743 param =
VAR(iptr->
sx.
s23.s2.args[i+instancecount]);
2747 assert(type == param->
type);
2752 for (j=md->
paramcount-1-instancecount; j>i; --j)
2787 #if defined(ENABLE_VERIFIER)
2805 assert(md->
params != NULL);
2807 #ifdef RESOLVE_VERBOSE
2808 printf(
"resolve_constrain_unresolved_method_params_stackbased\n");
2817 param = stack - (md->
paramslots - 1 - instancecount);
2819 for (i = instancecount; i < md->
paramcount; ++
i) {
2822 assert(type == param->
type);
2827 for (j = 0; j < i - instancecount; ++j)
2853 #ifdef ENABLE_VERIFIER
2880 #ifdef ENABLE_VERIFIER
2899 #ifdef ENABLE_VERIFIER
2919 #ifdef ENABLE_VERIFIER
2925 for (i=0; i<count; ++
i)
2937 #if !defined(NDEBUG)
2954 fprintf(file,
" (empty)\n");
2958 for (;p->
any; ++p) {
2960 fprintf(file,
" ref: ");
2964 fprintf(file,
" cls: ");
2984 fprintf(file,
"unresolved_class(%p):\n",(
void *)ref);
2986 fprintf(file,
" referer : ");
2988 fprintf(file,
" refmethod : ");
2990 fprintf(file,
" refmethodd: ");
2992 fprintf(file,
" classname : ");
2994 fprintf(file,
" subtypeconstraints:\n");
3011 fprintf(file,
"unresolved_field(%p):\n",(
void *)ref);
3013 fprintf(file,
" referer : ");
3015 fprintf(file,
" refmethod : ");
3017 fprintf(file,
" refmethodd: ");
3019 fprintf(file,
" classname : ");
3021 fprintf(file,
" name : ");
3023 fprintf(file,
" descriptor: ");
3025 fprintf(file,
" parseddesc: ");
3027 fprintf(file,
" flags : %04x\n",ref->
flags);
3028 fprintf(file,
" instancetypes:\n");
3030 fprintf(file,
" valueconstraints:\n");
3049 fprintf(file,
"unresolved_method(%p):\n",(
void *)ref);
3051 fprintf(file,
" referer : ");
3053 fprintf(file,
" refmethod : ");
3055 fprintf(file,
" refmethodd: ");
3057 fprintf(file,
" classname : ");
3059 fprintf(file,
" name : ");
3061 fprintf(file,
" descriptor: ");
3063 fprintf(file,
" parseddesc: ");
3065 fprintf(file,
" flags : %04x\n",ref->
flags);
3066 fprintf(file,
" instancetypes:\n");
3068 fprintf(file,
" paramconstraints:\n");
3071 fprintf(file,
" param %d:\n",i);
3076 fprintf(file,
" (empty)\n");
void exceptions_throw_verifyerror(methodinfo *m, const char *message,...)
static void unresolved_subtype_set_free_list(classref_or_classinfo *list)
bool builtin_instanceof(java_handle_t *o, classinfo *c)
Utf8String utf8_str()
get utf-8 string contents of buffer as utf8-string
void init_class(classinfo *c)
Initialize object type.
fieldinfo * class_resolvefield(classinfo *c, Utf8String name, Utf8String desc, classinfo *referer)
methodinfo * class_resolveclassmethod(classinfo *c, Utf8String name, Utf8String desc, classinfo *referer, bool throwexception)
bool resolve_class_from_name(classinfo *referer, methodinfo *refmethod, Utf8String classname, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
classinfo * classcache_lookup(classloader_t *initloader, Utf8String classname)
resolve_result_t resolve_method_verifier_checks(methodinfo *refmethod, constant_FMIref *methodref, methodinfo *mi, bool invokestatic)
constant_classref * classref
bool access_is_accessible_member(classinfo *referer, classinfo *declarer, s4 memberflags)
#define FIELDREF_CLASSNAME(fmiref)
unresolved_field * resolve_create_unresolved_field(classinfo *referer, methodinfo *refmethod, instruction *iptr)
void exceptions_throw_linkageerror(const char *message, classinfo *c)
classref_or_classinfo list[1]
static classinfo * get_class_by_type(int type)
Returns the primitive class of the given type.
#define SUBTYPESET_IS_EMPTY(stset)
bool resolve_constrain_unresolved_method_params(jitdata *jd, unresolved_method *ref, methodinfo *refmethod, instruction *iptr)
classinfo * resolve_classref_eager_nonabstract(constant_classref *ref)
classinfo * class_array_of(classinfo *component, bool link)
void unresolved_class_debug_dump(unresolved_class *ref, FILE *file)
unresolved_method * resolve_create_unresolved_method(classinfo *referer, methodinfo *refmethod, constant_FMIref *methodref, bool invokestatic, bool invokespecial)
resolve_result_t resolve_field_lazy(methodinfo *refmethod, constant_FMIref *fieldref)
bool resolve_classref(methodinfo *refmethod, constant_classref *ref, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
const char * c_str()
get contents of buffer as zero-terminated c-style-string This strings lifetime is tied to it's buffer...
classloader_t * classloader
void resolve_handle_pending_exception(bool throwError)
bool is_newobject() const
classinfo * resolve_class_eager_no_access_check(unresolved_class *ref)
union constant_FMIref::@26 p
bool resolve_field(unresolved_field *ref, resolve_mode_t mode, fieldinfo **result)
void class_classref_println(constant_classref *cr)
void unresolved_method_debug_dump(unresolved_method *ref, FILE *file)
static resolve_result_t resolve_lazy_subtype_checks(methodinfo *refmethod, typeinfo_t *subtinfo, classref_or_classinfo supertype, resolve_err_t error)
methodinfo * referermethod
static resolve_result_t resolve_subtype_check(methodinfo *refmethod, classref_or_classinfo subtype, classref_or_classinfo supertype, resolve_mode_t mode, resolve_err_t error)
void unresolved_method_free(unresolved_method *ref)
JNIEnv jclass jobject const char * name
classinfo * class_java_lang_Object
bool resolve_constrain_unresolved_method_instance(unresolved_method *ref, methodinfo *refmethod, typeinfo_t *instanceti, bool invokespecial)
bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
Buffer & write_slash_to_dot(const char *)
write to buffer, replacing '/' by '.'
classinfo * class_multiarray_of(s4 dim, classinfo *element, bool link)
bool resolve_constrain_unresolved_method_params_stackbased(unresolved_method *ref, methodinfo *refmethod, typedescriptor_t *stack)
#define SAME_PACKAGE(a, b)
void unresolved_field_debug_dump(unresolved_field *ref, FILE *file)
void link(basicblock *v, basicblock *w)
#define IS_2_WORD_TYPE(a)
methodinfo * resolve_method_invokespecial_lookup(methodinfo *refmethod, methodinfo *mi)
resolve_result_t resolve_method_instance_type_checks(methodinfo *refmethod, methodinfo *mi, typeinfo_t *instanceti, bool invokespecial)
resolve_result_t resolve_method_lazy(methodinfo *refmethod, constant_FMIref *methodref, bool invokespecial)
bool resolve_class(unresolved_class *ref, resolve_mode_t mode, bool checkaccess, classinfo **result)
void exceptions_throw_incompatibleclasschangeerror(classinfo *c, const char *message)
constant_classref * class_get_self_classref(classinfo *cls)
constant_FMIref * fieldref
void method_println(methodinfo *m)
alloc::list< PassInfo::IDTy >::type & stack
classinfo * class_java_lang_ClassNotFoundException
void class_println(classinfo *c)
methodinfo * class_resolvemethod(classinfo *c, Utf8String name, Utf8String desc)
void exceptions_throw_abstractmethoderror(void)
unresolved_subtype_set subtypeconstraints
typeinfo_mergedlist_t * merged
static Utf8String from_utf8(const char *, size_t)
Fieldref, Methodref and InterfaceMethodref.
typecheck_result is_assignable_to_class(classref_or_classinfo dest) const
bool is_primitive() const
void typeinfo_print(FILE *file, const typeinfo_t *info, int indent)
bool resolve_method(unresolved_method *ref, resolve_mode_t mode, methodinfo **result)
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)
void unresolved_class_free(unresolved_class *ref)
union instruction::@12 sx
#define CLASSREF_OR_CLASSINFO_NAME(value)
const Utf8String descriptor
instruction * newobject_instruction() const
void params_from_paramtypes(s4 mflags)
bool class_issubclass(classinfo *sub, classinfo *super)
void utf_fprint_printable_ascii(FILE *file, Utf8String u)
classref_or_classinfo typeclass
void unresolved_subtype_set_debug_dump(unresolved_subtype_set *stset, FILE *file)
static bool unresolved_subtype_set_from_typeinfo(classinfo *referer, methodinfo *refmethod, unresolved_subtype_set *stset, typeinfo_t *tinfo, Utf8String declaredclassname)
void exceptions_throw_illegalaccessexception(Utf8String message)
#define METHODREF_CLASSNAME(fmiref)
resolve_result_t resolve_method_param_type_checks_stackbased(methodinfo *refmethod, methodinfo *mi, bool invokestatic, typedescriptor_t *stack)
constant_FMIref * methodref
fieldinfo * resolve_field_eager(unresolved_field *ref)
byte_iterator begin() const
classinfo * resolve_class_eager(unresolved_class *ref)
methodinfo * resolve_method_eager(unresolved_method *ref)
classinfo * link_class(classinfo *c)
classref_or_classinfo * subtyperefs
void exceptions_clear_exception(void)
bool resolve_classref_or_classinfo(methodinfo *refmethod, classref_or_classinfo cls, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
constant_classref * classref
java_handle_t * exceptions_get_exception(void)
static classref_or_classinfo to_classref_or_classinfo(classinfo *c)
Functions for casting a classref/classinfo to a classref_or_classinfo.
struct instruction::@12::@13 s23
void exceptions_throw_noclassdeffounderror_cause(java_handle_t *cause)
classinfo * load_class_from_classloader(Utf8String name, classloader_t *cl)
unresolved_subtype_set * paramconstraints
unresolved_class * create_unresolved_class(methodinfo *refmethod, constant_classref *classref, typeinfo_t *valuetype)
classinfo * resolve_classref_eager(constant_classref *ref)
const parseddesc_t parseddesc
unresolved_subtype_set instancetypes
methodinfo * referermethod
void method_methodref_println(constant_FMIref *mr)
bool classcache_add_constraint(classloader_t *a, classloader_t *b, Utf8String classname)
void descriptor_debug_print_typedesc(FILE *file, typedesc *d)
void descriptor_debug_print_methoddesc(FILE *file, methoddesc *d)
classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess)
PrimitiveType primitivetype
bool resolve_method_loading_constraints(classinfo *referer, methodinfo *mi)
resolve_result_t resolve_method_param_type_checks(jitdata *jd, methodinfo *refmethod, instruction *iptr, methodinfo *mi, bool invokestatic)
unresolved_subtype_set instancetypes
unresolved_subtype_set valueconstraints
#define MFREE(ptr, type, num)
bool resolve_constrain_unresolved_field(unresolved_field *ref, classinfo *referer, methodinfo *refmethod, typeinfo_t *instanceti, typeinfo_t *valueti)
#define UNRESOLVED_SUBTYPE_SET_EMTPY(stset)
methodinfo * referermethod
constant_classref * classref
constant_classref * class_get_classref_multiarray_of(s4 dim, constant_classref *ref)
bool is_reference() const
bool access_is_accessible_class(classinfo *referer, classinfo *cls)
void unresolved_field_free(unresolved_field *ref)
static resolve_result_t resolve_and_check_subtype_set(methodinfo *refmethod, unresolved_subtype_set *ref, classref_or_classinfo typeref, resolve_mode_t mode, resolve_err_t error)
methodinfo * class_resolveinterfacemethod(classinfo *c, Utf8String name, Utf8String desc, classinfo *referer, bool throwexception)