| /* |
| * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| |
| package sun.tools.java; |
| |
| import java.io.*; |
| |
| /** |
| * WARNING: The contents of this source file are not part of any |
| * supported API. Code that depends on them does so at its own risk: |
| * they are subject to change or removal without notice. |
| */ |
| public class BinaryCode implements Constants { |
| int maxStack; // maximum stack used by code |
| int maxLocals; // maximum locals used by code |
| BinaryExceptionHandler exceptionHandlers[]; |
| BinaryAttribute atts; // code attributes |
| BinaryConstantPool cpool; // constant pool of the class |
| byte code[]; // the byte code |
| |
| /** |
| * Construct the binary code from the code attribute |
| */ |
| |
| public |
| BinaryCode(byte data[], BinaryConstantPool cpool, Environment env) { |
| DataInputStream in = new DataInputStream(new ByteArrayInputStream(data)); |
| try { |
| this.cpool = cpool; |
| // JVM 4.7.4 CodeAttribute.max_stack |
| this.maxStack = in.readUnsignedShort(); |
| // JVM 4.7.4 CodeAttribute.max_locals |
| this.maxLocals = in.readUnsignedShort(); |
| // JVM 4.7.4 CodeAttribute.code_length |
| int code_length = in.readInt(); |
| this.code = new byte[code_length]; |
| // JVM 4.7.4 CodeAttribute.code[] |
| in.read(this.code); |
| // JVM 4.7.4 CodeAttribute.exception_table_length |
| int exception_count = in.readUnsignedShort(); |
| this.exceptionHandlers = new BinaryExceptionHandler[exception_count]; |
| for (int i = 0; i < exception_count; i++) { |
| // JVM 4.7.4 CodeAttribute.exception_table.start_pc |
| int start = in.readUnsignedShort(); |
| // JVM 4.7.4 CodeAttribute.exception_table.end_pc |
| int end = in.readUnsignedShort(); |
| // JVM 4.7.4 CodeAttribute.exception_table.handler_pc |
| int handler = in.readUnsignedShort(); |
| // JVM 4.7.4 CodeAttribute.exception_table.catch_type |
| ClassDeclaration xclass = cpool.getDeclaration(env, in.readUnsignedShort()); |
| this.exceptionHandlers[i] = |
| new BinaryExceptionHandler(start, end, handler, xclass); |
| } |
| this.atts = BinaryAttribute.load(in, cpool, ~0); |
| if (in.available() != 0) { |
| System.err.println("Should have exhausted input stream!"); |
| } |
| } catch (IOException e) { |
| throw new CompilerError(e); |
| } |
| } |
| |
| |
| /** |
| * Accessors |
| */ |
| |
| public BinaryExceptionHandler getExceptionHandlers()[] { |
| return exceptionHandlers; |
| } |
| |
| public byte getCode()[] { return code; } |
| |
| public int getMaxStack() { return maxStack; } |
| |
| public int getMaxLocals() { return maxLocals; } |
| |
| public BinaryAttribute getAttributes() { return atts; } |
| |
| /** |
| * Load a binary class |
| */ |
| public static |
| BinaryCode load(BinaryMember bf, BinaryConstantPool cpool, Environment env) { |
| byte code[] = bf.getAttribute(idCode); |
| return (code != null) ? new BinaryCode(code, cpool, env) : null; |
| } |
| } |