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 // ------------------------------------------------------------------