📄 completeclassreader.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 + -