--- a/hotspot/src/share/vm/ci/ciObject.hpp Tue Sep 15 11:09:34 2009 -0700
+++ b/hotspot/src/share/vm/ci/ciObject.hpp Tue Sep 15 21:53:47 2009 -0700
@@ -51,9 +51,10 @@
ciKlass* _klass;
uint _ident;
- enum { FLAG_BITS = 1};
+ enum { FLAG_BITS = 2 };
enum {
- PERM_FLAG = 1
+ PERM_FLAG = 1,
+ SCAVENGABLE_FLAG = 2
};
protected:
ciObject();
@@ -68,8 +69,15 @@
return JNIHandles::resolve_non_null(_handle);
}
- void set_perm() {
- _ident |= PERM_FLAG;
+ void init_flags_from(oop x) {
+ int flags = 0;
+ if (x != NULL) {
+ if (x->is_perm())
+ flags |= PERM_FLAG;
+ if (x->is_scavengable())
+ flags |= SCAVENGABLE_FLAG;
+ }
+ _ident |= flags;
}
// Virtual behavior of the print() method.
@@ -91,17 +99,27 @@
// A hash value for the convenience of compilers.
int hash();
- // Tells if this oop has an encoding. (I.e., is it null or perm?)
+ // Tells if this oop has an encoding as a constant.
+ // True if is_scavengable is false.
+ // Also true if ScavengeRootsInCode is non-zero.
// If it does not have an encoding, the compiler is responsible for
// making other arrangements for dealing with the oop.
- // See ciEnv::make_perm_array
- bool has_encoding();
+ // See ciEnv::make_array
+ bool can_be_constant();
+
+ // Tells if this oop should be made a constant.
+ // True if is_scavengable is false or ScavengeRootsInCode > 1.
+ bool should_be_constant();
// Is this object guaranteed to be in the permanent part of the heap?
// If so, CollectedHeap::can_elide_permanent_oop_store_barriers is relevant.
// If the answer is false, no guarantees are made.
bool is_perm() { return (_ident & PERM_FLAG) != 0; }
+ // Might this object possibly move during a scavenge operation?
+ // If the answer is true and ScavengeRootsInCode==0, the oop cannot be embedded in code.
+ bool is_scavengable() { return (_ident & SCAVENGABLE_FLAG) != 0; }
+
// The address which the compiler should embed into the
// generated code to represent this oop. This address
// is not the true address of the oop -- it will get patched
@@ -109,7 +127,7 @@
//
// Usage note: no address arithmetic allowed. Oop must
// be registered with the oopRecorder.
- jobject encoding();
+ jobject constant_encoding();
// What kind of ciObject is this?
virtual bool is_null_object() const { return false; }