int SharkTargetInvariants::count_monitors() { int result = 0; if (is_synchronized() || target()->has_monitor_bytecodes()) { for (int i = 0; i < flow()->block_count(); i++) { result = MAX2(result, flow()->pre_order_at(i)->monitor_count()); } } return result; }
void AccessFlags::print_on(outputStream* st) const { if (is_public ()) st->print("public " ); if (is_private ()) st->print("private " ); if (is_protected ()) st->print("protected " ); if (is_static ()) st->print("static " ); if (is_final ()) st->print("final " ); if (is_synchronized()) st->print("synchronized "); if (is_volatile ()) st->print("volatile " ); if (is_transient ()) st->print("transient " ); if (is_native ()) st->print("native " ); if (is_interface ()) st->print("interface " ); if (is_abstract ()) st->print("abstract " ); if (is_strict ()) st->print("strict " ); if (is_synthetic ()) st->print("synthetic " ); if (is_old ()) st->print("{old} " ); if (is_obsolete ()) st->print("{obsolete} " ); }
void dispatch_virtual (Object *ref, int signature, byte *retAddr) { ClassRecord *classRecord; MethodRecord *methodRecord; int classIndex; #if DEBUG_METHODS printf("dispatch_virtual %d\n", signature); #endif if (ref == JNULL) { throw_new_exception (JAVA_LANG_NULLPOINTEREXCEPTION); return; } // When calling methods on arrays, we use the methods for the Object class... classIndex = get_class_index(ref); LABEL_METHODLOOKUP: classRecord = get_class_record (classIndex); methodRecord = find_method (classRecord, signature); if (methodRecord == null) { #if SAFE if (classIndex == JAVA_LANG_OBJECT) { throw_new_exception (JAVA_LANG_NOSUCHMETHODERROR); return; } #endif classIndex = classRecord->parentClass; goto LABEL_METHODLOOKUP; } if (dispatch_special (methodRecord, retAddr)) { if (is_synchronized(methodRecord)) { current_stackframe()->monitor = ref; enter_monitor (currentThread, ref); } } }
void dispatch_virtual (Object *ref, TWOBYTES signature, byte *retAddr) { MethodRecord *auxMethodRecord; byte auxByte; #if DEBUG_METHODS printf("dispatch_virtual %d\n", signature); #endif if (ref == JNULL) { throw_exception (nullPointerException); return; } auxByte = get_class_index(ref); LABEL_METHODLOOKUP: tempClassRecord = get_class_record (auxByte); auxMethodRecord = find_method (tempClassRecord, signature); if (auxMethodRecord == null) { #if SAFE if (auxByte == JAVA_LANG_OBJECT) { throw_exception (noSuchMethodError); return; } #endif auxByte = tempClassRecord->parentClass; goto LABEL_METHODLOOKUP; } if (dispatch_special (auxMethodRecord, retAddr)) { if (is_synchronized(auxMethodRecord)) { current_stackframe()->monitor = ref; enter_monitor (currentThread, ref); } } }
/** * Calls static initializer if necessary before * dispatching with dispatch_special(). * @param retAddr Return bytecode address. * @param btAddr Backtrack bytecode address (in case * static initializer is executed). */ void dispatch_special_checked (byte classIndex, byte methodIndex, byte *retAddr, byte *btAddr) { ClassRecord *classRecord; MethodRecord *methodRecord; #if DEBUG_METHODS printf ("dispatch_special_checked: %d, %d, %d, %d\n", classIndex, methodIndex, (int) retAddr, (int) btAddr); #endif // If we need to run the initializer then the real method will get called // later, when we re-run the current instruction. classRecord = get_class_record (classIndex); if (!is_initialized_idx (classIndex)) if (dispatch_static_initializer (classRecord, btAddr) != EXEC_CONTINUE) return; methodRecord = get_method_record (classRecord, methodIndex); if(dispatch_special (methodRecord, retAddr)) { if (is_synchronized(methodRecord)) { if (!is_static(methodRecord)) { Object *ref = (Object *)curLocalsBase[0]; current_stackframe()->monitor = ref; enter_monitor (currentThread, ref); } else { Object *ref = (Object *)classRecord; current_stackframe()->monitor = ref; enter_monitor (currentThread, ref); } } } }
// ------------------------------------------------------------------ // ciFlags::print_member_flags void ciFlags::print_member_flags(outputStream* st) { if (is_public()) { st->print("public"); } else if (is_private()) { st->print("private"); } else if (is_protected()) { st->print("protected"); } else { st->print("DEFAULT_ACCESS"); } if (is_static()) { st->print(",static"); } if (is_final()) { st->print(",final"); } if (is_synchronized()) { st->print(",synchronized"); } if (is_volatile()) { st->print(",volatile"); } if (is_transient()) { st->print(",transient"); } if (is_native()) { st->print(",native"); } if (is_abstract()) { st->print(",abstract"); } if (is_strict()) { st->print(",strict"); } }