Exemple #1
0
abstract_vframe* processOopClass::vframe_at(smi index, void *FH, Process*& p,
                                   frame*& last) {
  p = checkProcess(this);
  if (!p) {
    prim_failure(FH, NOPROCESSERROR);
    return NULL;
  }
  if (index < 0 || !p->inSelf()) {
    prim_failure(FH, BADINDEXERROR);
    return NULL;
  }
  FlushRegisterWindows();
  last = p->last_self_frame(false);
  abstract_vframe* vf = new_vframe(last);
  if (vf->is_prologue()) vf = vf->sender();
  bool hideFirst = p != vmProcess;
  int32 i = 0;
  for ( ;; ) {
    if (i == index) break;
    vf = vf->sender();
    i++;
    if (!vf) break;
  }
  if (!vf || (vf->is_first_self_vframe() && hideFirst)) {
    prim_failure(FH, BADINDEXERROR);
    return NULL;
  }
  return vf;
}
Exemple #2
0
char* sendDesc::sendMessage( frame* lookupFrame,
                             oop receiver,
                             oop perform_selector,
                             oop perform_delegatee,
                             oop arg1 ) {
  ShowLookupInMonitor sl;

  LookupType type= lookupType();

  oop sel = static_or_dynamic_selector(  perform_selector,  type);
  oop del = static_or_dynamic_delegatee( perform_delegatee, type);

  sendMessagePrologue( receiver, lookupFrame );

  if ( !Trace) {
    // try codeTable first (order of magnitude faster)
  
    char* r = fastCacheLookupAndBackpatch(type,
                                          receiver->map()->enclosing_mapOop(),
                                          sel,
                                          del);
    if (r) {
      if (SilentTrace) LOG_EVENT1("SendMessage: fast-found %#lx", r);
      return r;
    }
  }

  // have to do it the slow way
  ResourceMark m;
  FlushRegisterWindows(); // for vframe conversion below
  cacheProbingLookup L( receiver,
                        sel,
                        del,
                        MH_TBD,  // method holder
                        new_vframe(lookupFrame),
                        this,
                        NULL,    // DIDesc
                        false ); // don't want a debug version

  // should we have switched stacks sooner? (dmu) also in SendDIMessage
  
  nmethod* nm = switchToVMStack( SendMessage_cont, &L );
  if (SilentTrace) LOG_EVENT1("sendDesc::sendMessage: found %#lx", nm);

  return
    Interpret
    ? L.interpretResultForCompiledSender(arg1)
    : nm->verifiedEntryPoint();
}
Exemple #3
0
frame* frame::make_full_frame_after_trap(char* pc) {
  FlushRegisterWindows();
  return make_full_frame(pc);
}
Exemple #4
0
void frame::fix_frame( char* pc, char* sp) {
  FlushRegisterWindows();
  assert(isOnVMStack(this), "will be overwritten");
  callees_sp()->set_link((sparc_fp*)sp);
  set_real_return_addr(pc);
}
Exemple #5
0
void NLRSupport::fix_current_return_address(char* addr) {
  // make sure this function doesn't get inlined
  FlushRegisterWindows();
  currentFrame()->fix_current_return_address(addr);
}
Exemple #6
0
oop processOopClass::ActivationStack_prim(void *FH) {
  ResourceMark rm;
  Process* p = checkProcess(this);
  if (p == currentProcess)
    p->killVFrameOopsAndSetWatermark( p->last_self_frame(false));
  if (!p) {
    prim_failure(FH, NOPROCESSERROR);
    return NULL;
  }
  FlushRegisterWindows();

  vframeBList = new VFrameBList(1000);

  p->stack()->vframes_do(addVFrameToList);

  bool hideFirst = p != vmProcess;
  if (vframeBList->nonEmpty() && hideFirst) (void) vframeBList->pop();

  smi len= vframeBList->length();
  objVectorOop resultVec= Memory->objVectorObj->cloneSize(len, CANFAIL);
  if (oop(resultVec) == failedAllocationOop) {
    out_of_memory_failure(FH, Memory->objVectorObj->size() + len);
    return NULL;
  }

  oop*         resultp   = resultVec->objs();

  // Build the result as a merge of vframeBList and existing vframeOops
  // and save mirrors of all the resulting vframeOops.
  vframeOop prev  = vframeList();
  vframeOop merge = prev->next();
  for (int i = 0; i < vframeBList->length(); i++) {
    abstract_vframe* vf = vframeBList->nth(i);
    mirrorOop mirror;
    if (merge && merge->is_equal(vf)) {
      mirror= merge->as_mirror_or_fail();
      if (oop(mirror) == failedAllocationOop) {
        out_of_memory_failure(FH);
        return NULL;
      }
      prev  = merge;
      merge = merge->next();
    } else {
      vframeOop vfo= clone_vframeOop(vf, p, CANFAIL);
      if (oop(vfo) == failedAllocationOop) {
        out_of_memory_failure(FH);
        return NULL;
      }
      mirror= vfo->as_mirror_or_fail();
      if (oop(mirror) == failedAllocationOop) {
        out_of_memory_failure(FH);
        return NULL;
      }
      vfo->insertAfter(prev);
      prev = vfo;
    }
    Memory->store(resultp++, mirror);
  }
  if (p == currentProcess)
    p->killVFrameOopsAndSetWatermark( p->last_self_frame(false));
  return resultVec;
}