01: /*******************************************************************************
02: * Copyright (c) 2000, 2006 IBM Corporation and others.
03: * All rights reserved. This program and the accompanying materials
04: * are made available under the terms of the Eclipse Public License v1.0
05: * which accompanies this distribution, and is available at
06: * http://www.eclipse.org/legal/epl-v10.html
07: *
08: * Contributors:
09: * IBM Corporation - initial API and implementation
10: *******************************************************************************/package org.eclipse.jdt.internal.compiler.codegen;
11:
12: public class CaseLabel extends BranchLabel {
13:
14: public int instructionPosition = POS_NOT_SET;
15:
16: /**
17: * CaseLabel constructor comment.
18: * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream
19: */
20: public CaseLabel(CodeStream codeStream) {
21: super (codeStream);
22: }
23:
24: /*
25: * Put down a reference to the array at the location in the codestream.
26: * #placeInstruction() must be performed prior to any #branch()
27: */
28: void branch() {
29: if (position == POS_NOT_SET) {
30: addForwardReference(codeStream.position);
31: // Leave 4 bytes free to generate the jump offset afterwards
32: codeStream.position += 4;
33: codeStream.classFileOffset += 4;
34: } else { //Position is set. Write it!
35: /*
36: * Position is set. Write it if it is not a wide branch.
37: */
38: this .codeStream.writeSignedWord(this .position
39: - this .instructionPosition);
40: }
41: }
42:
43: /*
44: * No support for wide branches yet
45: */
46: void branchWide() {
47: this .branch(); // case label branch is already wide
48: }
49:
50: public boolean isCaseLabel() {
51: return true;
52: }
53:
54: public boolean isStandardLabel() {
55: return false;
56: }
57:
58: /*
59: * Put down a reference to the array at the location in the codestream.
60: */
61: public void place() {
62: if ((this .tagBits & USED) != 0) {
63: position = codeStream.getPosition();
64: } else {
65: position = codeStream.position;
66: }
67: if (instructionPosition != POS_NOT_SET) {
68: int offset = position - instructionPosition;
69: int[] forwardRefs = forwardReferences();
70: for (int i = 0, length = forwardReferenceCount(); i < length; i++) {
71: codeStream.writeSignedWord(forwardRefs[i], offset);
72: }
73: // add the label int the codeStream labels collection
74: codeStream.addLabel(this );
75: }
76: }
77:
78: /*
79: * Put down a reference to the array at the location in the codestream.
80: */
81: void placeInstruction() {
82: if (instructionPosition == POS_NOT_SET) {
83: instructionPosition = codeStream.position;
84: }
85: }
86: }
|