< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page
@@ -117,10 +117,27 @@
    }
  
    frame& get_frame()                             { return _last_frame; }
  };
  
+ class ProfileTrapsMark : public StackObj {
+   JavaThread* _thread;
+  public:
+   ProfileTrapsMark(JavaThread* current) : _thread(current) {}
+   ~ProfileTrapsMark() {
+     JavaThread* THREAD = _thread;
+     if (HAS_PENDING_EXCEPTION) {
+       if (ProfileTraps && PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_NullPointerException()) {
+         // Preserve the original exception across the call to note_trap()
+         PreserveExceptionMark pm(_thread);
+         // Recording the trap will help the compiler to potentially recognize this exception as "hot"
+         InterpreterRuntime::note_trap(_thread, Deoptimization::Reason_null_check);
+       }
+     }
+   }
+ };
+ 
  //------------------------------------------------------------------------------------------------------------------------
  // State accessors
  
  void InterpreterRuntime::set_bcp_and_mdp(address bcp, JavaThread* current) {
    LastFrameAccessor last_frame(current);

@@ -215,11 +232,11 @@
  
    // Make sure we are not instantiating an abstract klass
    klass->check_valid_for_instantiation(true, CHECK);
  
    // Make sure klass is initialized
-   klass->initialize(CHECK);
+   klass->initialize_preemptable(CHECK_AND_CLEAR_PREEMPTED);
  
    oop obj = klass->allocate_instance(CHECK);
    current->set_vm_result_oop(obj);
  JRT_END
  

@@ -639,30 +656,31 @@
  //------------------------------------------------------------------------------------------------------------------------
  // Fields
  //
  
  void InterpreterRuntime::resolve_get_put(JavaThread* current, Bytecodes::Code bytecode) {
+   JavaThread* THREAD = current;
    LastFrameAccessor last_frame(current);
    constantPoolHandle pool(current, last_frame.method()->constants());
    methodHandle m(current, last_frame.method());
  
-   resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, true /*initialize_holder*/, current);
+   resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, StaticMode::initialize_klass_preemptable, CHECK_AND_CLEAR_PREEMPTED);
  }
  
  void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, int field_index,
                                           methodHandle& m,
                                           constantPoolHandle& pool,
-                                          bool initialize_holder, TRAPS) {
+                                          StaticMode static_mode, TRAPS) {
    fieldDescriptor info;
    bool is_put    = (bytecode == Bytecodes::_putfield  || bytecode == Bytecodes::_nofast_putfield ||
                      bytecode == Bytecodes::_putstatic);
    bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);
  
    {
      JvmtiHideSingleStepping jhss(THREAD);
      LinkResolver::resolve_field_access(info, pool, field_index,
-                                        m, bytecode, initialize_holder, CHECK);
+                                        m, bytecode, static_mode, CHECK);
    } // end JvmtiHideSingleStepping
  
    // check if link resolution caused cpCache to be updated
    if (pool->resolved_field_entry_at(field_index)->is_resolved(bytecode)) return;
  

@@ -812,28 +830,18 @@
    constantPoolHandle pool(current, last_frame.method()->constants());
  
    methodHandle resolved_method;
  
    int method_index = last_frame.get_index_u2(bytecode);
-   {
+   { ProfileTrapsMark pt(current);
      JvmtiHideSingleStepping jhss(current);
      JavaThread* THREAD = current; // For exception macros.
      LinkResolver::resolve_invoke(info, receiver, pool,
                                   method_index, bytecode,
-                                  THREAD);
- 
-     if (HAS_PENDING_EXCEPTION) {
-       if (ProfileTraps && PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_NullPointerException()) {
-         // Preserve the original exception across the call to note_trap()
-         PreserveExceptionMark pm(current);
-         // Recording the trap will help the compiler to potentially recognize this exception as "hot"
-         note_trap(current, Deoptimization::Reason_null_check);
-       }
-       return;
-     }
- 
+                                  StaticMode::initialize_klass_preemptable, CHECK_AND_CLEAR_PREEMPTED);
      resolved_method = methodHandle(current, info.resolved_method());
+     ResourceMark rm(THREAD);
    } // end JvmtiHideSingleStepping
  
    update_invoke_cp_cache_entry(info, bytecode, resolved_method, pool, method_index);
  }
  
< prev index next >