⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 completeclassreader.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
字号:
/**
 * @(#)CompleteClassReader.java	1.16 03/01/23
 *
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.sun.tools.javac.v8.code;
import com.sun.tools.javac.v8.util.*;

import com.sun.tools.javac.v8.code.Type.*;

import com.sun.tools.javac.v8.code.Symbol.*;


/**
 * This class contains some minor modifications wrt ClassReader
 *  which read complete constant pool and code sections with the class that is read in.
 *  Usually, these sections are omitted when reading class files.
 */
public class CompleteClassReader extends ClassReader {

    public CompleteClassReader(Context context) {
        super(context, false);
    }

    /**
      * As in ClassReader except that all of constant pool is immediately read in.
      */
    void indexPool() {
        super.indexPool();
        for (int i = 1; i < poolObj.length; i++)
            readPool(i);
    }

    /**
      * As in ClassReader except that constant pool is stored in class `c'.
      */
    void readClass(ClassSymbol c) {
        c.pool = new Pool(poolObj.length, poolObj);
        super.readClass(c);
    }

    /**
      * As in ClassReader except that code is read in and entered
      *  into method symbol.
      */
    void readMemberAttr(Symbol sym, Name attrName, int attrLen) {
        if (attrName == names.Code) {
            ((MethodSymbol) sym).code = readCode(sym);
        } else {
            super.readMemberAttr(sym, attrName, attrLen);
        }
    }

    /**
      * Read code block.
      */
    Code readCode(Symbol owner) {
        Code code = new Code(false, true, true, null);
        code.max_stack = nextChar();
        code.max_locals = nextChar();
        code.cp = nextInt();
        code.code = new byte[code.cp];
        System.arraycopy(buf, bp, code.code, 0, code.cp);
        bp += code.cp;
        char ncatches = nextChar();
        for (int i = 0; i < ncatches; i++) {
            code.addCatch(nextChar(), nextChar(), nextChar(), nextChar());
        }
        char ac = nextChar();
        for (int i = 0; i < ac; i++) {
            Name attrName = readName(nextChar());
            int attrLen = nextInt();
            if (attrName == names.LineNumberTable) {
                char nlines = nextChar();
                for (int j = 0; j < nlines; j++) {
                    code.addLineNumber(nextChar(), nextChar());
                }
            } else if (attrName == names.LocalVariableTable) {
                int count = nextChar();
                for (int j = 0; j < count; j++) {
                    char start_pc = nextChar();
                    char length = nextChar();
                    VarSymbol sym = new VarSymbol(0, readName(nextChar()),
                            readType(nextChar()), owner);
                    sym.adr = nextChar();
                    Code.LocalVar v = new Code.LocalVar(sym);
                    v.start_pc = start_pc;
                    v.length = length;
                    code.putVar(v);
                }
            } else {
                unrecogized(attrName);
                bp = bp + attrLen;
            }
        }
        return code;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -