001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.mmtk.plan.semispace.gcspy; 014 015 import org.mmtk.plan.Trace; 016 import org.mmtk.plan.semispace.SSTraceLocal; 017 import org.mmtk.policy.Space; 018 019 import org.vmmagic.pragma.*; 020 import org.vmmagic.unboxed.*; 021 022 /** 023 * This class implements the core functionality for a transitive 024 * closure over the heap graph. 025 */ 026 @Uninterruptible 027 public final class SSGCspyTraceLocal extends SSTraceLocal { 028 /** 029 * Constructor 030 */ 031 public SSGCspyTraceLocal(Trace trace) { 032 super(trace); 033 } 034 035 /**************************************************************************** 036 * 037 * Externally visible Object processing and tracing 038 */ 039 040 /** 041 * {@inheritDoc} 042 */ 043 @Override 044 @Inline 045 public ObjectReference traceObject(ObjectReference object) { 046 if (object.isNull()) return object; 047 if (Space.isInSpace(SSGCspy.GCSPY, object)) 048 return SSGCspy.gcspySpace.traceObject(this, object); 049 return super.traceObject(object); 050 } 051 052 /** 053 * Will this object move from this point on, during the current trace ? 054 * 055 * @param object The object to query. 056 * @return True if the object will not move. 057 */ 058 @Override 059 public boolean willNotMoveInCurrentCollection(ObjectReference object) { 060 if (Space.isInSpace(SSGCspy.GCSPY, object)) 061 return true; 062 return super.willNotMoveInCurrentCollection(object); 063 } 064 }