/******************************************************************************* | |
* Copyright (c) 2000, 2004 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Common Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/cpl-v10.html | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.wst.jsdt.internal.compiler.codegen; | |
public class CaseLabel extends Label { | |
public int instructionPosition = POS_NOT_SET; | |
public int backwardsBranch = POS_NOT_SET; | |
/** | |
* CaseLabel constructor comment. | |
* @param codeStream org.eclipse.wst.jsdt.internal.compiler.codegen.CodeStream | |
*/ | |
public CaseLabel(CodeStream codeStream) { | |
super(codeStream); | |
} | |
/* | |
* Put down a refernece to the array at the location in the codestream. | |
*/ | |
void branch() { | |
if (position == POS_NOT_SET) { | |
addForwardReference(codeStream.position); | |
// Leave 4 bytes free to generate the jump offset afterwards | |
codeStream.position += 4; | |
codeStream.classFileOffset += 4; | |
} else { //Position is set. Write it! | |
codeStream.writeSignedWord(position - codeStream.position + 1); | |
} | |
} | |
/* | |
* Put down a refernece to the array at the location in the codestream. | |
*/ | |
void branchWide() { | |
if (position == POS_NOT_SET) { | |
addForwardReference(codeStream.position); | |
// Leave 4 bytes free to generate the jump offset afterwards | |
codeStream.position += 4; | |
} else { //Position is set. Write it! | |
codeStream.writeSignedWord(position - codeStream.position + 1); | |
} | |
} | |
public boolean isStandardLabel(){ | |
return false; | |
} | |
/* | |
* Put down a reference to the array at the location in the codestream. | |
*/ | |
public void place() { | |
position = codeStream.position; | |
if (instructionPosition == POS_NOT_SET) | |
backwardsBranch = position; | |
else { | |
int offset = position - instructionPosition; | |
for (int i = 0; i < forwardReferenceCount; i++) { | |
codeStream.writeSignedWord(forwardReferences[i], offset); | |
} | |
// add the label int the codeStream labels collection | |
codeStream.addLabel(this); | |
} | |
} | |
/* | |
* Put down a refernece to the array at the location in the codestream. | |
*/ | |
void placeInstruction() { | |
if (instructionPosition == POS_NOT_SET) { | |
instructionPosition = codeStream.position; | |
if (backwardsBranch != POS_NOT_SET) { | |
int offset = backwardsBranch - instructionPosition; | |
for (int i = 0; i < forwardReferenceCount; i++) | |
codeStream.writeSignedWord(forwardReferences[i], offset); | |
backwardsBranch = POS_NOT_SET; | |
} | |
} | |
} | |
} |