blob: 9e67d2e92a5a36d1a964fd4b2bed8bbb29c9c57d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.util;
import org.eclipse.jdt.core.util.ClassFormatException;
import org.eclipse.jdt.core.util.IConstantPool;
import org.eclipse.jdt.core.util.IStackMapFrame;
import org.eclipse.jdt.core.util.IVerificationTypeInfo;
/**
* Default implementation of IStackMapFrame
*/
public class DefaultStackMapFrame extends ClassFileStruct implements IStackMapFrame {
private static final IVerificationTypeInfo[] EMPTY_LOCALS_OR_STACK_ITEMS = new IVerificationTypeInfo[0];
private int readOffset;
private int numberOfLocals;
private int numberOfStackItems;
private IVerificationTypeInfo[] locals;
private IVerificationTypeInfo[] stackItems;
private int offsetDelta;
/**
* Constructor for StackMapFrame.
*
* @param classFileBytes
* @param constantPool
* @param offset
* @throws ClassFormatException
*/
public DefaultStackMapFrame(
byte[] classFileBytes,
IConstantPool constantPool,
int offset) throws ClassFormatException {
// FULL_FRAME
this.offsetDelta = u2At(classFileBytes, 0, offset);
int tempLocals = u2At(classFileBytes, 2, offset);
this.numberOfLocals = tempLocals;
this.readOffset = 4;
if (tempLocals != 0) {
this.locals = new IVerificationTypeInfo[tempLocals];
for (int i = 0; i < tempLocals; i++) {
VerificationInfo verificationInfo = new VerificationInfo(classFileBytes, constantPool, offset + this.readOffset);
this.locals[i] = verificationInfo;
this.readOffset += verificationInfo.sizeInBytes();
}
} else {
this.locals = EMPTY_LOCALS_OR_STACK_ITEMS;
}
int tempStackItems = u2At(classFileBytes, this.readOffset, offset);
this.readOffset += 2;
this.numberOfStackItems = tempStackItems;
if (tempStackItems != 0) {
this.stackItems = new IVerificationTypeInfo[tempStackItems];
for (int i = 0; i < tempStackItems; i++) {
VerificationInfo verificationInfo = new VerificationInfo(classFileBytes, constantPool, offset + this.readOffset);
this.stackItems[i] = verificationInfo;
this.readOffset += verificationInfo.sizeInBytes();
}
} else {
this.stackItems = EMPTY_LOCALS_OR_STACK_ITEMS;
}
}
int sizeInBytes() {
return this.readOffset;
}
public int getFrameType() {
return 255; // full_frame
}
public IVerificationTypeInfo[] getLocals() {
return this.locals;
}
public int getNumberOfLocals() {
return this.numberOfLocals;
}
public int getNumberOfStackItems() {
return this.numberOfStackItems;
}
public int getOffsetDelta() {
return this.offsetDelta;
}
public IVerificationTypeInfo[] getStackItems() {
return this.stackItems;
}
}