lower类的accessCode解读
/** Access codes for dereferencing(解引用), assignment,
* and pre/post increment/decrement.
* Access codes for assignment operations are determined
* by method accessCode below.
*
* All access codes for accesses to the current class are even. 都是偶数
* If a member of the superclass should be accessed instead (because
* access was via a qualified super), add one to the corresponding code
* for the current class, making the number odd.
* This numbering scheme is used by the backend to decide whether
* to issue an invokevirtual or invokespecial call.
* 后端使用他的编号方案来决定是否发出一个invokevirtual或invokespecial call。
* @see Gen.visitSelect(Select tree)
*/
// 关于invokevirtual与invokespecial指令相关介绍:
// https://www.cnblogs.com/extjs4/p/9103190.html
// 如下的编号都为偶数
private static final int
DEREFcode = 0, // deref
ASSIGNcode = 2, // assign
PREINCcode = 4, // preinc
PREDECcode = 6, // predec
POSTINCcode = 8, // postinc
POSTDECcode = 10, // postdec
FIRSTASGOPcode = 12; // first assignment op
定义了accessCode为:0、2、4、6、8、10、12
举个例子,如下:
class TestAccessPrivateVar {
private int a = 1;
class MyInner {
public void t() {
int b = a; // deref
a = 2; // assign
int c;
c = ++a; // preinc
c = --a; // predec
c = a++; // postinc
c = a--; // postdec
a += 1; // first assignment op
}
}
}
iadd = 96,// 0x60 iadd 将栈顶两int型数值相加并将结果压入栈顶 ladd = 97,// 0x61 ladd 将栈顶两long型数值相加并将结果压入栈顶 fadd = 98,// 0x62 fadd 将栈顶两float型数值相加并将结果压入栈顶 dadd = 99,// 0x63 dadd 将栈顶两double型数值相加并将结果压入栈顶 isub = 100,// 0x64 is 将栈顶两int型数值相减并将结果压入栈顶 lsub = 101,// 0x65 ls 将栈顶两long型数值相减并将结果压入栈顶 fsub = 102,// 0x66 fs 将栈顶两float型数值相减并将结果压入栈顶 dsub = 103,// 0x67 ds 将栈顶两double型数值相减并将结果压入栈顶 imul = 104,// 0x68 imul 将栈顶两int型数值相乘并将结果压入栈顶 lmul = 105,// 0x69 lmul 将栈顶两long型数值相乘并将结果压入栈顶 fmul = 106,// 0x6a fmul 将栈顶两float型数值相乘并将结果压入栈顶 dmul = 107,// 0x6b dmul 将栈顶两double型数值相乘并将结果压入栈顶 idiv = 108,// 0x6c 将栈顶两int型数值相除并将结果压入栈顶 ldiv = 109,// 0x6d ldiv 将栈顶两long型数值相除并将结果压入栈顶 fdiv = 110,// 0x6e fdiv 将栈顶两float型数值相除并将结果压入栈顶 ddiv = 111,// 0x6f ddiv 将栈顶两double型数值相除并将结果压入栈顶 imod = 112,// 0x70 irem 将栈顶两int型数值作取模运算并将结果压入栈顶 lmod = 113,// 0x71 lrem 将栈顶两long型数值作取模运算并将结果压入栈顶 fmod = 114,// 0x72 frem 将栈顶两float型数值作取模运算并将结果压入栈顶 dmod = 115,// 0x73 drem 将栈顶两double型数值作取模运算并将结果压入栈顶 ineg = 116,// 0x74 ineg 将栈顶int型数值取负并将结果压入栈顶 lneg = 117,// 0x75 lneg 将栈顶long型数值取负并将结果压入栈顶 fneg = 118,// 0x76 fneg 将栈顶float型数值取负并将结果压入栈顶 dneg = 119,// 0x77 dneg 将栈顶double型数值取负并将结果压入栈顶 ishl = 120,// 0x78 ishl 将int型数值左移位指定位数并将结果压入栈顶 lshl = 121,// 0x79 lshl 将long型数值左移位指定位数并将结果压入栈顶 ishr = 122,// 0x7a ishr 将int型数值右(符号)移位指定位数并将结果压入栈顶 lshr = 123,// 0x7b lshr 将long型数值右(符号)移位指定位数并将结果压入栈顶 iushr = 124,// 0x7c iushr 将int型数值右(无符号)移位指定位数并将结果压入栈顶 lushr = 125,// 0x7d lushr 将long型数值右(无符号)移位指定位数并将结果压入栈顶 iand = 126,// 0x7e iand 将栈顶两int型数值作“按位与”并将结果压入栈顶 land = 127,// 0x7f land 将栈顶两long型数值作“按位与”并将结果压入栈顶 ior = 128,// 0x80 ior 将栈顶两int型数值作“按位或”并将结果压入栈顶 lor = 129,// 0x81 lor 将栈顶两long型数值作“按位或”并将结果压入栈顶 ixor = 130,// 0x82 ixor 将栈顶两int型数值作“按位异或”并将结果压入栈顶 lxor = 131,// 0x83 lxor 将栈顶两long型数值作“按位异或”并将结果压入栈顶
算出来的accessCode为:12、14、16 ... 80 、 82
int string_add = 256, // string +
算出来的accessCode为:84
int ishll = 270, // int shift left with long count 向左移动,移动类型为long
lshll = 271, // long shift left with long count
ishrl = 272, // int shift right with long count
lshrl = 273, // long shift right with long count
iushrl = 274, // int unsigned shift right with long count
lushrl = 275; // long unsigned shift right with long count 例如>>>
算出来的accessCode为:86、88、... 96
lower类的accessCode解读的更多相关文章
- java.lang.system 类源码解读
通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...
- java.lang.String 类源码解读
String类定义实现了java.io.Serializable, Comparable<String>, CharSequence 三个接口:并且为final修饰. public fin ...
- java.lang.Long 类源码解读
总体阅读了Long的源码,基本跟Integer类类似,所以特别全部贴出源码,直接注释进行理解. // final修饰符 public final class Long extends Number i ...
- 【QT相关】类头文件解读、QT编辑模式、读取text文本
Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...
- SimpleVisitorMemberType类的visitClassType解读
举个例子,如下: class CA<T>{ public T getVal(){ return null; } } interface IA{} interface IB{} public ...
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- Volley 框架解析(二)--RequestQueue核心解读
主要围绕RequestQueue进行解读,它的两个请求队列CacheQueue.NetworkQueue是如何调用的,第一条请求的执行过程及如何处理重复请求?对RequestQueue及相关的类进行详 ...
- Large Class--过大的类--要重构的信号
如果想利用单个类做太多事情,其内往往就会出现太多实例变量.一旦如此,Duplicated Code也就接踵而至. 解决方法: 1.将类内彼此相关的变量,将它们放在一起.使用Extrac ...
- TypeScript完全解读(26课时)_汇总贴
ECMAScript 6 入门:http://es6.ruanyifeng.com/ 官网:http://www.typescriptlang.org/ 中文网:https://www.tslang. ...
随机推荐
- 7) mvn dependency:tree
http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html mvn dependency:tree 查看 <de ...
- (最短路) Heavy Transportation --POJ--1797
链接: http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K To ...
- B-tree B+tree B*Tree
具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为B-树 ...
- html5 录制/保存视频/录音
国内这方面的资料真少的可怜,翻出去一搜一大把,推荐一个github的插件库,非常强大,支持各种各样的录制方式. 下载完成之后,引用对应的js立即可以使用. <script src="R ...
- 动态的把固定格式的json数据以菜单形式插入
var root=$("#side-menu"); $(menuData).each(function(i,n){ var top1Li=$("<li>< ...
- hibernate中常用的Hql语句总结
// HQL: Hibernate Query Language. // 特点: // >> 1,与SQL相似,SQL中的语法基本上都可以直接使用. // >> 2,SQL查询 ...
- 论文笔记(2)-Dropout-Regularization of Neural Networks using DropConnect
这篇paper使用DropConnect来规则化神经网络.dropconnect和dropout的区别如下图所示.dropout是随机吧隐含层的输出清空,而dropconnect是input unit ...
- 解决Redis/Codis Connection with master lost(复制超时)问题
今天在线上环境中遇到了codis-server报警,按照常规处理流程进行处理,报错步骤如下: 首先将codis-slave的rdb文件移除,并重启codis-slave 在codis-dashbord ...
- GitHub Android 开源项目汇总 (转)
转自:http://blog.csdn.net/ithomer/article/details/8882236 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于 ...
- C#开发微信小程序
个人见解,欢迎交流,不喜勿喷. 微信小程序相比于微信公众号的开发,区别在于微信小程序只请求第三方的数据,整个界面的交互(view)还是在微信小程序上实现,前后端完全分离,说白了,微信小程序开发与具 ...