src/share/vm/opto/type.cpp

changeset 990
35ae4dd6c27c
parent 852
f4fe12e429a4
child 992
465813e0303a
     1.1 --- a/src/share/vm/opto/type.cpp	Tue Jan 13 14:02:19 2009 -0800
     1.2 +++ b/src/share/vm/opto/type.cpp	Wed Jan 14 14:12:00 2009 -0800
     1.3 @@ -2471,6 +2471,8 @@
     1.4    const Type* ft = join(kills);
     1.5    const TypeInstPtr* ftip = ft->isa_instptr();
     1.6    const TypeInstPtr* ktip = kills->isa_instptr();
     1.7 +  const TypeKlassPtr* ftkp = ft->isa_klassptr();
     1.8 +  const TypeKlassPtr* ktkp = kills->isa_klassptr();
     1.9  
    1.10    if (ft->empty()) {
    1.11      // Check for evil case of 'this' being a class and 'kills' expecting an
    1.12 @@ -2484,6 +2486,8 @@
    1.13      // uplift the type.
    1.14      if (!empty() && ktip != NULL && ktip->is_loaded() && ktip->klass()->is_interface())
    1.15        return kills;             // Uplift to interface
    1.16 +    if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface())
    1.17 +      return kills;             // Uplift to interface
    1.18  
    1.19      return Type::TOP;           // Canonical empty value
    1.20    }
    1.21 @@ -2499,6 +2503,12 @@
    1.22      // Happens in a CTW of rt.jar, 320-341, no extra flags
    1.23      return ktip->cast_to_ptr_type(ftip->ptr());
    1.24    }
    1.25 +  if (ftkp != NULL && ktkp != NULL &&
    1.26 +      ftkp->is_loaded() &&  ftkp->klass()->is_interface() &&
    1.27 +      ktkp->is_loaded() && !ktkp->klass()->is_interface()) {
    1.28 +    // Happens in a CTW of rt.jar, 320-341, no extra flags
    1.29 +    return ktkp->cast_to_ptr_type(ftkp->ptr());
    1.30 +  }
    1.31  
    1.32    return ft;
    1.33  }

mercurial