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