原文
上周,我开始转换_d_arrayliteralTX
为模板
.勾挂
有点类似_d_newarrayT
,因为用它来分配
数组字面,如[1,2,3]
.
注意,与也会初化
新创建数组的_d_newarrayT
不同,_d_arrayliteralTX
只是为它分配
内存.来限制
传递给勾挂
的参数数.
如果它也要初化
数组,它必须按额外变参
接收内容.我坚持这样,因为现在有了模板勾挂
,额外变参模板参数
表明,编译器已处理得同样好
且代码更少
.
数组字面
的一个令人讨厌的事实是,在语义分析
后(所以在引入勾挂
后)有大量优化
.总之,或完全消除
它们,或通过连接
合并成更大的字面
.
如,编译器将[1,2,3]~4
优化为[1,2,3,4]
.这很麻烦,因为勾挂按参数
接收数组长度,但在前例中该长度
发生了变化.
因为是在语义分析
时引入的降级
,并且该优化(这不是唯一可能
的优化)在optimize.d
时,因此在语义分析
之后,我必须在多个地方更改ArrayLiteralExps
,这不能扩展,如果不考虑勾挂
时,又引入另一个更改ArrayLiteralExp
,则会引入错误
.
本周试的更简洁
方法是,在IR
生成时再次检查
调用勾挂,并根据数组
的新大小更新
数组长度参数.