if (VM_Magic.getMemoryAddress(sfp) == STACKFRAME_SENTINAL_FP) {
if (VM_Magic.getMemoryAddress(sfp) == STACKFRAME_SENTINEL_FP) {
  public final void update(VM_Address sfp, int whereFrom) {    if (DEBUG) {      VM.sysWrite("VM_EdgeListener.update(", sfp, ",", whereFrom);      VM.sysWriteln("): enter ", samplesTaken);    }    VM_Synchronization.fetchAndAdd(this,				   VM_Entrypoints.edgeListenerUpdateCalledField.getOffset(),				   1);    // don't take a sample for back edge yield points    if (whereFrom == VM_Thread.BACKEDGE) return;     int calleeCMID    = 0;    int callerCMID    = 0;    VM_Address returnAddress = VM_Address.zero();    if (VM_Magic.getMemoryAddress(sfp) == STACKFRAME_SENTINAL_FP) {      if (DEBUG) VM.sysWrite(" Walking off end of stack!\n");	      return;    }    calleeCMID = VM_Magic.getCompiledMethodID(sfp);    if (calleeCMID == INVISIBLE_METHOD_ID) {      if (DEBUG){	VM.sysWrite(" INVISIBLE_METHOD_ID  (assembler code) ");	VM.sysWrite(calleeCMID); VM.sysWrite("\n");             }       return;    }    returnAddress = VM_Magic.getReturnAddress(sfp); // return address in caller    sfp = VM_Magic.getCallerFramePointer(sfp);      // caller's frame pointer    if(VM_Magic.getMemoryAddress(sfp) == STACKFRAME_SENTINAL_FP) {      if (DEBUG) VM.sysWrite(" Walking off end of stack\n");	      return;    }    callerCMID = VM_Magic.getCompiledMethodID(sfp);    if (callerCMID == INVISIBLE_METHOD_ID) {      if (DEBUG) { 	VM.sysWrite(" INVISIBLE_METHOD_ID  (assembler code) ");	VM.sysWrite(callerCMID); VM.sysWrite("\n");       }	      return;    }    // store the offset of the return address from the beginning of the     // instruction    VM_CompiledMethod callerCM = VM_CompiledMethods.getCompiledMethod(callerCMID);    if (callerCM.getCompilerType() == VM_CompiledMethod.TRAP) {      if (DEBUG) {	VM.sysWriteln(" HARDWARE TRAP FRAME ");      }      return;    }    VM_Address beginningOfMachineCode = VM_Magic.objectAsAddress(callerCM.getInstructions());    VM_Offset callSite = returnAddress.diff(beginningOfMachineCode);    if (DEBUG){       VM.sysWrite("  <");VM.sysWrite(calleeCMID);VM.sysWrite(",");      VM.sysWrite(callerCMID);VM.sysWrite(",");VM.sysWrite(returnAddress);      VM.sysWrite(">\n");    }        // Find out what sample we are.    int sampleNumber = 	VM_Synchronization.fetchAndAdd(this, 						       VM_Entrypoints.edgeListenerSamplesTakenField.getOffset(),						       1);    int idx = 3*sampleNumber;    // If we got buffer slots that are beyond the end of the buffer, that means    // that we're actually not supposed to take the sample at all (the system    // is in the process of activating our organizer and processing the buffer).    if (idx < buffer.length) {      buffer[idx+0] = calleeCMID;      buffer[idx+1] = callerCMID;      buffer[idx+2] = callSite.toInt();      // If we are the last sample, we need to activate the organizer.      if (sampleNumber+1 == desiredSamples) {	activateOrganizer();      }     }   }