bool Parse::push_constant(ciConstant constant, bool require_constant) { switch (constant.basic_type()) { case T_BOOLEAN: push( intcon(constant.as_boolean()) ); break; case T_INT: push( intcon(constant.as_int()) ); break; case T_CHAR: push( intcon(constant.as_char()) ); break; case T_BYTE: push( intcon(constant.as_byte()) ); break; case T_SHORT: push( intcon(constant.as_short()) ); break; case T_FLOAT: push( makecon(TypeF::make(constant.as_float())) ); break; case T_DOUBLE: push_pair( makecon(TypeD::make(constant.as_double())) ); break; case T_LONG: push_pair( longcon(constant.as_long()) ); break; case T_ARRAY: case T_OBJECT: { // cases: // can_be_constant = (oop not scavengable || ScavengeRootsInCode != 0) // should_be_constant = (oop not scavengable || ScavengeRootsInCode >= 2) // An oop is not scavengable if it is in the perm gen. ciObject* oop_constant = constant.as_object(); if (oop_constant->is_null_object()) { push( zerocon(T_OBJECT) ); break; } else if (require_constant || oop_constant->should_be_constant()) { push( makecon(TypeOopPtr::make_from_constant(oop_constant, require_constant)) ); break; } else { // we cannot inline the oop, but we can use it later to narrow a type return false; } } case T_ILLEGAL: { // Invalid ciConstant returned due to OutOfMemoryError in the CI assert(C->env()->failing(), "otherwise should not see this"); // These always occur because of object types; we are going to // bail out anyway, so make the stack depths match up push( zerocon(T_OBJECT) ); return false; } default: ShouldNotReachHere(); return false; } // success return true; }
// Handy well-known nodes: Node* null() const { return zerocon(T_OBJECT); }