src/share/vm/ci/ciInstanceKlass.cpp

changeset 1573
dd57230ba8fe
parent 1515
7c57aead6d3e
child 1577
4ce7240d622c
     1.1 --- a/src/share/vm/ci/ciInstanceKlass.cpp	Tue Jan 05 13:05:58 2010 +0100
     1.2 +++ b/src/share/vm/ci/ciInstanceKlass.cpp	Tue Jan 05 15:21:25 2010 +0100
     1.3 @@ -232,8 +232,48 @@
     1.4  // ------------------------------------------------------------------
     1.5  // ciInstanceKlass::uses_default_loader
     1.6  bool ciInstanceKlass::uses_default_loader() {
     1.7 -  VM_ENTRY_MARK;
     1.8 -  return loader() == NULL;
     1.9 +  // Note:  We do not need to resolve the handle or enter the VM
    1.10 +  // in order to test null-ness.
    1.11 +  return _loader == NULL;
    1.12 +}
    1.13 +
    1.14 +// ------------------------------------------------------------------
    1.15 +// ciInstanceKlass::is_in_package
    1.16 +//
    1.17 +// Is this klass in the given package?
    1.18 +bool ciInstanceKlass::is_in_package(const char* packagename, int len) {
    1.19 +  // To avoid class loader mischief, this test always rejects application classes.
    1.20 +  if (!uses_default_loader())
    1.21 +    return false;
    1.22 +  GUARDED_VM_ENTRY(
    1.23 +    return is_in_package_impl(packagename, len);
    1.24 +  )
    1.25 +}
    1.26 +
    1.27 +bool ciInstanceKlass::is_in_package_impl(const char* packagename, int len) {
    1.28 +  ASSERT_IN_VM;
    1.29 +
    1.30 +  // If packagename contains trailing '/' exclude it from the
    1.31 +  // prefix-test since we test for it explicitly.
    1.32 +  if (packagename[len - 1] == '/')
    1.33 +    len--;
    1.34 +
    1.35 +  if (!name()->starts_with(packagename, len))
    1.36 +    return false;
    1.37 +
    1.38 +  // Test if the class name is something like "java/lang".
    1.39 +  if ((len + 1) > name()->utf8_length())
    1.40 +    return false;
    1.41 +
    1.42 +  // Test for trailing '/'
    1.43 +  if ((char) name()->byte_at(len) != '/')
    1.44 +    return false;
    1.45 +
    1.46 +  // Make sure it's not actually in a subpackage:
    1.47 +  if (name()->index_of_at(len+1, "/", 1) >= 0)
    1.48 +    return false;
    1.49 +
    1.50 +  return true;
    1.51  }
    1.52  
    1.53  // ------------------------------------------------------------------

mercurial