< prev index next >

src/hotspot/share/ci/ciTypeFlow.hpp

Print this page
*** 329,18 ***
      void      pop_array() {
        assert(type_at_tos() == null_type() ||
               type_at_tos()->is_array_klass(), "must be array type");
        pop();
      }
!     // pop_objArray and pop_typeArray narrow the tos to ciObjArrayKlass
!     // or ciTypeArrayKlass (resp.).  In the rare case that an explicit
      // null is popped from the stack, we return null.  Caller beware.
!     ciObjArrayKlass* pop_objArray() {
        ciType* array = pop_value();
        if (array == null_type())  return nullptr;
!       assert(array->is_obj_array_klass(), "must be object array type");
!       return array->as_obj_array_klass();
      }
      ciTypeArrayKlass* pop_typeArray() {
        ciType* array = pop_value();
        if (array == null_type())  return nullptr;
        assert(array->is_type_array_klass(), "must be prim array type");
--- 329,19 ---
      void      pop_array() {
        assert(type_at_tos() == null_type() ||
               type_at_tos()->is_array_klass(), "must be array type");
        pop();
      }
!     // pop_objOrFlatArray and pop_typeArray narrow the tos to ciObjArrayKlass,
!     // ciFlatArrayKlass or ciTypeArrayKlass (resp.). In the rare case that an explicit
      // null is popped from the stack, we return null.  Caller beware.
!     ciArrayKlass* pop_objOrFlatArray() {
        ciType* array = pop_value();
        if (array == null_type())  return nullptr;
!       assert(array->is_obj_array_klass() || array->is_flat_array_klass(),
!              "must be a flat or an object array type");
+       return array->as_array_klass();
      }
      ciTypeArrayKlass* pop_typeArray() {
        ciType* array = pop_value();
        if (array == null_type())  return nullptr;
        assert(array->is_type_array_klass(), "must be prim array type");

*** 350,11 ***
        push(null_type());
      }
      void      do_null_assert(ciKlass* unloaded_klass);
  
      // Helper convenience routines.
!     void do_aaload(ciBytecodeStream* str);
      void do_checkcast(ciBytecodeStream* str);
      void do_getfield(ciBytecodeStream* str);
      void do_getstatic(ciBytecodeStream* str);
      void do_invoke(ciBytecodeStream* str, bool has_receiver);
      void do_jsr(ciBytecodeStream* str);
--- 351,11 ---
        push(null_type());
      }
      void      do_null_assert(ciKlass* unloaded_klass);
  
      // Helper convenience routines.
!     void do_aload(ciBytecodeStream* str);
      void do_checkcast(ciBytecodeStream* str);
      void do_getfield(ciBytecodeStream* str);
      void do_getstatic(ciBytecodeStream* str);
      void do_invoke(ciBytecodeStream* str, bool has_receiver);
      void do_jsr(ciBytecodeStream* str);

*** 847,10 ***
--- 848,12 ---
    int start_block_num() const       { return 0; }
    Block* rpo_at(int rpo) const      { assert(0 <= rpo && rpo < block_count(), "out of bounds");
                                        return _block_map[rpo]; }
    int inc_next_pre_order()          { return _next_pre_order++; }
  
+   ciType* mark_as_null_free(ciType* type);
+ 
  private:
    // A work list used during flow analysis.
    Block* _work_list;
  
    // List of blocks in reverse post order
< prev index next >