hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp

Print this page




1919               obj->long_field_put(field_offset, STACK_LONG(-1));
1920             } else if (tos_type == ctos) {
1921               obj->char_field_put(field_offset, STACK_INT(-1));
1922             } else if (tos_type == stos) {
1923               obj->short_field_put(field_offset, STACK_INT(-1));
1924             } else if (tos_type == ftos) {
1925               obj->float_field_put(field_offset, STACK_FLOAT(-1));
1926             } else {
1927               obj->double_field_put(field_offset, STACK_DOUBLE(-1));
1928             }
1929           }
1930 
1931           UPDATE_PC_AND_TOS_AND_CONTINUE(3, count);
1932         }
1933 
1934       CASE(_new): {
1935         u2 index = Bytes::get_Java_u2(pc+1);
1936         constantPoolOop constants = istate->method()->constants();
1937         if (!constants->tag_at(index).is_unresolved_klass()) {
1938           // Make sure klass is initialized and doesn't have a finalizer
1939           oop entry = (klassOop) *constants->obj_at_addr(index);
1940           assert(entry->is_klass(), "Should be resolved klass");
1941           klassOop k_entry = (klassOop) entry;
1942           assert(k_entry->klass_part()->oop_is_instance(), "Should be instanceKlass");
1943           instanceKlass* ik = (instanceKlass*) k_entry->klass_part();
1944           if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
1945             size_t obj_size = ik->size_helper();
1946             oop result = NULL;
1947             // If the TLAB isn't pre-zeroed then we'll have to do it
1948             bool need_zero = !ZeroTLAB;
1949             if (UseTLAB) {
1950               result = (oop) THREAD->tlab().allocate(obj_size);
1951             }
1952             if (result == NULL) {
1953               need_zero = true;
1954               // Try allocate in shared eden
1955         retry:
1956               HeapWord* compare_to = *Universe::heap()->top_addr();
1957               HeapWord* new_top = compare_to + obj_size;
1958               if (new_top <= *Universe::heap()->end_addr()) {
1959                 if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) {


2009         //adjust pointer to start of stack element
2010         CALL_VM(InterpreterRuntime::multianewarray(THREAD, dimarray),
2011                 handle_exception);
2012         SET_STACK_OBJECT(THREAD->vm_result(), -dims);
2013         THREAD->set_vm_result(NULL);
2014         UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1));
2015       }
2016       CASE(_checkcast):
2017           if (STACK_OBJECT(-1) != NULL) {
2018             VERIFY_OOP(STACK_OBJECT(-1));
2019             u2 index = Bytes::get_Java_u2(pc+1);
2020             if (ProfileInterpreter) {
2021               // needs Profile_checkcast QQQ
2022               ShouldNotReachHere();
2023             }
2024             // Constant pool may have actual klass or unresolved klass. If it is
2025             // unresolved we must resolve it
2026             if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
2027               CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
2028             }
2029             klassOop klassOf = (klassOop) *(METHOD->constants()->obj_at_addr(index));
2030             klassOop objKlassOop = STACK_OBJECT(-1)->klass(); //ebx
2031             //
2032             // Check for compatibilty. This check must not GC!!
2033             // Seems way more expensive now that we must dispatch
2034             //
2035             if (objKlassOop != klassOf &&
2036                 !objKlassOop->klass_part()->is_subtype_of(klassOf)) {
2037               ResourceMark rm(THREAD);
2038               const char* objName = Klass::cast(objKlassOop)->external_name();
2039               const char* klassName = Klass::cast(klassOf)->external_name();
2040               char* message = SharedRuntime::generate_class_cast_message(
2041                 objName, klassName);
2042               VM_JAVA_ERROR(vmSymbols::java_lang_ClassCastException(), message);
2043             }
2044           } else {
2045             if (UncommonNullCast) {
2046 //              istate->method()->set_null_cast_seen();
2047 // [RGV] Not sure what to do here!
2048 
2049             }
2050           }
2051           UPDATE_PC_AND_CONTINUE(3);
2052 
2053       CASE(_instanceof):
2054           if (STACK_OBJECT(-1) == NULL) {
2055             SET_STACK_INT(0, -1);
2056           } else {
2057             VERIFY_OOP(STACK_OBJECT(-1));
2058             u2 index = Bytes::get_Java_u2(pc+1);
2059             // Constant pool may have actual klass or unresolved klass. If it is
2060             // unresolved we must resolve it
2061             if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
2062               CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
2063             }
2064             klassOop klassOf = (klassOop) *(METHOD->constants()->obj_at_addr(index));
2065             klassOop objKlassOop = STACK_OBJECT(-1)->klass();
2066             //
2067             // Check for compatibilty. This check must not GC!!
2068             // Seems way more expensive now that we must dispatch
2069             //
2070             if ( objKlassOop == klassOf || objKlassOop->klass_part()->is_subtype_of(klassOf)) {
2071               SET_STACK_INT(1, -1);
2072             } else {
2073               SET_STACK_INT(0, -1);
2074             }
2075           }
2076           UPDATE_PC_AND_CONTINUE(3);
2077 
2078       CASE(_ldc_w):
2079       CASE(_ldc):
2080         {
2081           u2 index;
2082           bool wide = false;
2083           int incr = 2; // frequent case
2084           if (opcode == Bytecodes::_ldc) {




1919               obj->long_field_put(field_offset, STACK_LONG(-1));
1920             } else if (tos_type == ctos) {
1921               obj->char_field_put(field_offset, STACK_INT(-1));
1922             } else if (tos_type == stos) {
1923               obj->short_field_put(field_offset, STACK_INT(-1));
1924             } else if (tos_type == ftos) {
1925               obj->float_field_put(field_offset, STACK_FLOAT(-1));
1926             } else {
1927               obj->double_field_put(field_offset, STACK_DOUBLE(-1));
1928             }
1929           }
1930 
1931           UPDATE_PC_AND_TOS_AND_CONTINUE(3, count);
1932         }
1933 
1934       CASE(_new): {
1935         u2 index = Bytes::get_Java_u2(pc+1);
1936         constantPoolOop constants = istate->method()->constants();
1937         if (!constants->tag_at(index).is_unresolved_klass()) {
1938           // Make sure klass is initialized and doesn't have a finalizer
1939           oop entry = constants->slot_at(index).get_oop();
1940           assert(entry->is_klass(), "Should be resolved klass");
1941           klassOop k_entry = (klassOop) entry;
1942           assert(k_entry->klass_part()->oop_is_instance(), "Should be instanceKlass");
1943           instanceKlass* ik = (instanceKlass*) k_entry->klass_part();
1944           if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
1945             size_t obj_size = ik->size_helper();
1946             oop result = NULL;
1947             // If the TLAB isn't pre-zeroed then we'll have to do it
1948             bool need_zero = !ZeroTLAB;
1949             if (UseTLAB) {
1950               result = (oop) THREAD->tlab().allocate(obj_size);
1951             }
1952             if (result == NULL) {
1953               need_zero = true;
1954               // Try allocate in shared eden
1955         retry:
1956               HeapWord* compare_to = *Universe::heap()->top_addr();
1957               HeapWord* new_top = compare_to + obj_size;
1958               if (new_top <= *Universe::heap()->end_addr()) {
1959                 if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) {


2009         //adjust pointer to start of stack element
2010         CALL_VM(InterpreterRuntime::multianewarray(THREAD, dimarray),
2011                 handle_exception);
2012         SET_STACK_OBJECT(THREAD->vm_result(), -dims);
2013         THREAD->set_vm_result(NULL);
2014         UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1));
2015       }
2016       CASE(_checkcast):
2017           if (STACK_OBJECT(-1) != NULL) {
2018             VERIFY_OOP(STACK_OBJECT(-1));
2019             u2 index = Bytes::get_Java_u2(pc+1);
2020             if (ProfileInterpreter) {
2021               // needs Profile_checkcast QQQ
2022               ShouldNotReachHere();
2023             }
2024             // Constant pool may have actual klass or unresolved klass. If it is
2025             // unresolved we must resolve it
2026             if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
2027               CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
2028             }
2029             klassOop klassOf = (klassOop) METHOD->constants()->slot_at(index).get_oop();
2030             klassOop objKlassOop = STACK_OBJECT(-1)->klass(); //ebx
2031             //
2032             // Check for compatibilty. This check must not GC!!
2033             // Seems way more expensive now that we must dispatch
2034             //
2035             if (objKlassOop != klassOf &&
2036                 !objKlassOop->klass_part()->is_subtype_of(klassOf)) {
2037               ResourceMark rm(THREAD);
2038               const char* objName = Klass::cast(objKlassOop)->external_name();
2039               const char* klassName = Klass::cast(klassOf)->external_name();
2040               char* message = SharedRuntime::generate_class_cast_message(
2041                 objName, klassName);
2042               VM_JAVA_ERROR(vmSymbols::java_lang_ClassCastException(), message);
2043             }
2044           } else {
2045             if (UncommonNullCast) {
2046 //              istate->method()->set_null_cast_seen();
2047 // [RGV] Not sure what to do here!
2048 
2049             }
2050           }
2051           UPDATE_PC_AND_CONTINUE(3);
2052 
2053       CASE(_instanceof):
2054           if (STACK_OBJECT(-1) == NULL) {
2055             SET_STACK_INT(0, -1);
2056           } else {
2057             VERIFY_OOP(STACK_OBJECT(-1));
2058             u2 index = Bytes::get_Java_u2(pc+1);
2059             // Constant pool may have actual klass or unresolved klass. If it is
2060             // unresolved we must resolve it
2061             if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
2062               CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
2063             }
2064             klassOop klassOf = (klassOop) METHOD->constants()->slot_at(index).get_oop();
2065             klassOop objKlassOop = STACK_OBJECT(-1)->klass();
2066             //
2067             // Check for compatibilty. This check must not GC!!
2068             // Seems way more expensive now that we must dispatch
2069             //
2070             if ( objKlassOop == klassOf || objKlassOop->klass_part()->is_subtype_of(klassOf)) {
2071               SET_STACK_INT(1, -1);
2072             } else {
2073               SET_STACK_INT(0, -1);
2074             }
2075           }
2076           UPDATE_PC_AND_CONTINUE(3);
2077 
2078       CASE(_ldc_w):
2079       CASE(_ldc):
2080         {
2081           u2 index;
2082           bool wide = false;
2083           int incr = 2; // frequent case
2084           if (opcode == Bytecodes::_ldc) {