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; }
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; }