January 31, 2015 [dmd-internals] [D-Programming-Language/dmd] 502fd5: Set return type of lazy void delegates to void | ||||
---|---|---|---|---|
| ||||
Attachments:
| Branch: refs/heads/master Home: https://github.com/D-Programming-Language/dmd Commit: 502fd53028407a6107be3760e8c48f3d95a841fa https://github.com/D-Programming-Language/dmd/commit/502fd53028407a6107be3760e8c48f3d95a841fa Author: Johannes Pfau <johannespfau@gmail.com> Date: 2015-01-31 (Sat, 31 Jan 2015) Changed paths: M src/delegatize.c M src/expression.c M src/expression.h Log Message: ----------- Set return type of lazy void delegates to void Before this commit the delegates generated for lazy void parameters returned the type of the wrapped expression. Example: void test(lazy void a) {} test(new Object()); //The generated delegate returns Object The delegate calling code however expects a delegate with no return value. Usually the result of the lazy func delegate is returned in a register. As a function may modify the result register internally even if defined with void return type this never causes problems and the value is ignored. For bigger aggregate types (on ARM already >4byte) the result is written onto the stack and this requires an additional hidden parameter passed to the delegate. But as the delegate is called as void(...) the additional parameter is never initialized and whatever is in the argument register is passed into the function and used as the location were the result will be written ==> memory corruption. Commit: b4f0403e7dce280e83f2c902f2a5020dd25dec14 https://github.com/D-Programming-Language/dmd/commit/b4f0403e7dce280e83f2c902f2a5020dd25dec14 Author: Hara Kenji <k.hara.pg+dev@gmail.com> Date: 2015-01-31 (Sat, 31 Jan 2015) Changed paths: M src/delegatize.c M src/expression.c M src/expression.h Log Message: ----------- Merge pull request #4360 from jpf91/gdc Set return type of lazy void delegates to void [GDC] [ARM] Compare: https://github.com/D-Programming-Language/dmd/compare/f1b6d1386480...b4f0403e7dce |
Copyright © 1999-2021 by the D Language Foundation