Example #1
0
int32 LabelSet::RecordLabelInfo( AbstractByteCode* b, oop label, int32 sd, 
                              LabelOccurrence why,  int32 bci) {
  static char buf[BUFSIZ];                       
  LabelInfo* li= at(label);
  if ( li == NULL ) {
    if (index == maxIndex)
      grow();
    labels[index++] = li= new LabelInfo(label, sd, bci, -1);
    li->isDefined = why == defineLabel;
  }
  else {
    if ( li->stack_depth != sd ) {
      b->errorMessage = buf;
      char psb[BUFSIZ];
      label->print_string(psb);
      sprintf(buf,
              "Label %s has stack depth %d at bytecode %d, "
              "but has differing stack depth %d at bytecode %d",
              psb,
              li->stack_depth, li->bci,
              sd, bci);
      return -1;
    }
    if ( why == defineLabel ) {
      if ( li->isDefined ) { 
        b->errorMessage = buf;
        char psb[BUFSIZ];
        label->print_string(psb);
        sprintf(buf,
          "Label %s is multiply defined at bytecodes %d and %d",
          psb,
          li->bci, bci);
        return -1;
      }
      li->bci = bci;
      li->isDefined = true;
    }
  }
  // dont alloc lit for label def, might be used in case only
  if (li->literalIndex == -1  &&  why == simpleBranch)
    li->literalIndex= b->GenLabelLiteral();
  return why == simpleBranch  ?  li->literalIndex  :  0;
}
Example #2
0
bool LabelSet::ResolveLabel( AbstractByteCode* b,
                             oop lbl, objVectorOop pcs, int32 i) {
  static char buf[BUFSIZ];
  LabelInfo* li = at(lbl);
  if ( li == NULL  ||  !li->isDefined) { 
      char psb[BUFSIZ];
      lbl->print_string(psb);
      b->errorMessage = buf;
      sprintf(buf, "Label %s is undefined", psb);
    return false;
  }
  pcs->obj_at_put(i, as_smiOop(li->bci));
  return true;
}