免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2303 | 回复: 4
打印 上一主题 下一主题

constant pool中double 和long变量是到底怎么写入的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-12 12:25 |只看该作者 |倒序浏览
在编一个读.class file的java程序。
程序基本正常,但是当源程序中有double或long常量的时候,对constant pool的读取就会出问题。读取的序号会发生混乱。我调了很久也没能解决。
jvm的规范说遇到这两种常量在读.class文件时要跳过一个entry。我的理解是正常读下一个entry,然后把序号加一,从再下一个entry开始视为有效entry。可是这样做了之后,发现总的entry少了一个。读到最后一个constant已经越界了。

这个问题不好说清楚。有谁做过类似的事情,能说一下对jvm规范里下面这句话的正确理解吗。


All eight-byte constants take up two entries in the constant_pool table of the class file, as well as in the in-memory version of the constant pool that is constructed when a class file is read. If a CONSTANT_Long_info or CONSTANT_Double_info structure is the item in the constant_pool table at index n, then the next valid item in the pool is located at index n+2. The constant_pool index n+1 must be considered invalid and must not be used.

先谢谢了!

论坛徽章:
0
2 [报告]
发表于 2004-10-12 12:54 |只看该作者

constant pool中double 和long变量是到底怎么写入的

因为double和long的需要的长度是constant_pool_entry能提供的长度的两倍。所以下一个constant要跳过一个再读。比如第n个entry是double,那么下一个有效的entry是第n+2个。第n个和第n+1个内容合在一起才是这个double的数值。
entry的数量是固定的。里面有多少个“有效的”constant entry可能需要自己来维护计数了。我没有仔细度过class specification。我读一下我们再继续讨论吧。

论坛徽章:
0
3 [报告]
发表于 2004-10-13 02:46 |只看该作者

constant pool中double 和long变量是到底怎么写入的

谢谢,要跳过一个entry是肯定的
但是到底怎么跳就是问题了。你说超过了一个entry能提供的最大长度,可是这个最大长度是多少,在规范里并没有说明。
以我的理解,entry并没有固定的长度。所以我所做的是读完double entry之后,读入一个byte,看下一个entry是什么类型,以类型来决定要跳过的长度。
这样做是我能理解的最合理的做法了。可是好像仍然不对。跳过的entry里面有内容,如果读出来看上去是很合理的东西。如果有好几个long或者double,跳过之后就乱套了。constant之间的指针都乱了。
所以想知道编译器在写class file时,到底是怎样写下一个entry的。是写一个随机生成的constant,还是有什么规则。或者写入的不是一个完整的entry,只是按照某种规则添加几个空byte以用掉被double侵占了一部分字节的下一个entry。

论坛徽章:
0
4 [报告]
发表于 2004-10-13 04:07 |只看该作者

constant pool中double 和long变量是到底怎么写入的

问题已经解决了,还是我对规范没理解对。
实际上问题很简单
在读entry的时候不跳过任何字节或entry
要跳的只是index号
也就是说读进来的下一个entry放在n+2号index里
对index n+1实际上什么都没有做

论坛徽章:
0
5 [报告]
发表于 2004-10-13 08:21 |只看该作者

constant pool中double 和long变量是到底怎么写入的

呵呵。我自己晕了。这个index具体是怎么使用的?楼上的朋友能不能简单解释一下?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP