赞
踩
我正在试为ArrayLiteralExps
添加一个降级模板
.它应该调用_d_arrayliteralTX
1.我在expressionsem.d
中引入了以前的所有降级
,并打算通过在此处添加它来同样处理该降级.
但是,ArrayLiteralExps
比其他式
更挑剔,因为编译器干了许多优化,并最终创建了额外的ArrayLiteralExps
或更改
了它们的类型.
以下是主要问题:
a
.constfold.d
会将[1,2]~3
等式替换为[1,2,3]
3.新的ArrayLiteralExp
不会语义分析
(因为很明显,如果操作数
这样做,则结果
会有正确的类型),且设置其类型
为[1,2]
.
但是,这会导致[1,2,3]
错过其降级.注意,现在不再使用[1,2]
的降级.
b
.有时,按存储
它的变量
的类型
提升数组字面
的类型.考虑以下式:
long[] arr = [1, 2, 3]
初步分析[1,2,3]
,按int[][2]
推导类型.
然后,使用implicitCastTo
4提升类型为long[]
.如果把勾挂插入到[2]
中,则其类型为int[]
,从而导致3*4=12
字节,而不是3*8=24
的错误分配.
这反之又会导致按长
初化数组元素
时破坏堆.
a问题
可通过将[1,2]
的降级复制到[1,2,3]
然后在AST
不再更改的e2ir.d
5中把勾挂的长度参数
从2更新为3来解决它.
这很丑陋,因为它需要更改constfold.d
,并更改e2ir.d
的逻辑,这需要GDC
和LDC
的胶水层
相样更改.
b问题
也可通过在implicitCastTo
中降级
来解决.但该方法也很丑陋,因为现在在2个地方降级
,其中一个
还完全不直观.
再加上b问题
方法的补丁散落
在各处,很难维护
代码,且因为冗余的降级和分析
而降低性能
.
因此,建议的按a和b
及也适合其他
勾挂的全局方法
,是在完成分析语义
并生成明确的AST
后,创建另一个仅用来降级
的趟.
提供统一位置来引入所有的DRuntime
降级,从长远看,会更可读
及可维护
.这样遍历AST
会损害性能,因此只需,在数组
中存储
要降级
的节点,就可以了,以便此新趟
仅迭代
此小得多的数组
,而不是整个AST
.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。