/******************************************************************************* * Copyright (c) 2002,2006 IBM Corporation. * 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 com.ibm.wala.shrikeCT; import java.io.UnsupportedEncodingException; public class SourceDebugExtensionWriter extends ClassWriter.Element { final private int attrID; private byte[] table; public SourceDebugExtensionWriter(ClassWriter w) { if (w == null) { throw new IllegalArgumentException("w is null"); } attrID = w.addCPUtf8("SourceDebugExtension"); } @Override public int getSize() { return table == null ? 6 : 6 + table.length; } @Override public int copyInto(byte[] buf, int offset) throws IllegalArgumentException { ClassWriter.setUShort(buf, offset, attrID); ClassWriter.setInt(buf, offset + 2, getSize() - 6); offset += 6; if (table != null) { for (int i = 0; i < table.length; i++) { ClassWriter.setUByte(buf, offset, table[i]); offset++; } } return offset; } public void setRawTable(byte[] sourceDebug) { if (sourceDebug == null) { throw new IllegalArgumentException("sourceDebug is null"); } for (int i = 0; i < sourceDebug.length; i++) { if (sourceDebug[i] < 1) { throw new IllegalArgumentException("Invalid CP index: " + sourceDebug[i]); } } this.table = sourceDebug; } public void setDebugInfo(String sourceDebug) { if (sourceDebug == null) { throw new IllegalArgumentException("sourceDebug is null"); } try { byte[] bytes = sourceDebug.getBytes("UTF8"); setRawTable(bytes); } catch (UnsupportedEncodingException e) { System.err.println(e); } } }