/******************************************************************************* * Copyright (c) 2000, 2009 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.compiler.codegen; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; public class ExceptionLabel extends Label { public int ranges[] = {POS_NOT_SET,POS_NOT_SET}; public int count = 0; // incremented each time placeStart or placeEnd is called public TypeBinding exceptionType; public ExceptionLabel(CodeStream codeStream, TypeBinding exceptionType) { super(codeStream); this.exceptionType = exceptionType; } public void place() { // register the handler inside the codeStream then normal place this.codeStream.registerExceptionHandler(this); this.position = this.codeStream.getPosition(); } public void placeEnd() { int endPosition = this.codeStream.position; if (this.ranges[this.count-1] == endPosition) { // start == end ? // discard empty exception handler this.count--; } else { this.ranges[this.count++] = endPosition; } } public void placeStart() { int startPosition = this.codeStream.position; if (this.count > 0 && this.ranges[this.count-1] == startPosition) { // start == previous end ? // reopen current handler this.count--; return; } // only need to grow on even additions (i.e. placeStart only) int length; if (this.count == (length = this.ranges.length)) { System.arraycopy(this.ranges, 0, this.ranges = new int[length*2], 0, length); } this.ranges[this.count++] = startPosition; } public String toString() { String basic = getClass().getName(); basic = basic.substring(basic.lastIndexOf('.')+1); StringBuffer buffer = new StringBuffer(basic); buffer.append('@').append(Integer.toHexString(hashCode())); buffer.append("(type=").append(this.exceptionType == null ? CharOperation.NO_CHAR : this.exceptionType.readableName()); //$NON-NLS-1$ buffer.append(", position=").append(this.position); //$NON-NLS-1$ buffer.append(", ranges = "); //$NON-NLS-1$ if (this.count == 0) { buffer.append("[]"); //$NON-NLS-1$ } else { for (int i = 0; i < this.count; i++) { if ((i & 1) == 0) { buffer.append("[").append(this.ranges[i]); //$NON-NLS-1$ } else { buffer.append(",").append(this.ranges[i]).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ } } if ((this.count & 1) == 1) { buffer.append(",?]"); //$NON-NLS-1$ } } buffer.append(')'); return buffer.toString(); } }