当前位置:   article > 正文

2402d,d引入新的勾挂降级

2402d,d引入新的勾挂降级

原文

我正在试为ArrayLiteralExps添加一个降级模板.它应该调用_d_arrayliteralTX1.我在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

初步分析[1,2,3],按int[][2]推导类型.

然后,使用implicitCastTo4提升类型为long[].如果把勾挂插入到[2]中,则其类型为int[],从而导致3*4=12字节,而不是3*8=24的错误分配.

这反之又会导致按初化数组元素时破坏堆.
a问题可通过将[1,2]的降级复制到[1,2,3]然后在AST不再更改的e2ir.d5中把勾挂的长度参数从2更新为3来解决它.
这很丑陋,因为它需要更改constfold.d,并更改e2ir.d的逻辑,这需要GDCLDC胶水层相样更改.

b问题也可通过在implicitCastTo降级来解决.但该方法也很丑陋,因为现在在2个地方降级,其中一个还完全不直观.

再加上b问题方法的补丁散落在各处,很难维护代码,且因为冗余的降级和分析而降低性能.

因此,建议的按a和b及也适合其他勾挂的全局方法,是在完成分析语义并生成明确的AST后,创建另一个仅用来降级的趟.

提供统一位置来引入所有的DRuntime降级,从长远看,会更可读可维护.这样遍历AST会损害性能,因此只需,在数组存储降级的节点,就可以了,以便此新趟迭代此小得多的数组,而不是整个AST.

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/111236
推荐阅读
  

闽ICP备14008679号