Thread overview | |||||
---|---|---|---|---|---|
|
October 08, 2018 Details on how aggregates are constructed with `new` and later destroyed by the GC | ||||
---|---|---|---|---|
| ||||
I want to understand how calls to `new` for classes and structs are lowered by the compiler and druntime to a GC-allocation (specifically how the `ba`-argument bits are determined) followed by an initialization using default constructor or via a user-defined constructor called using arguments to `new`. And how this is related to the trait `hasElaborateConstructor` for both `classes` and `structs`. I also want to understand how manually defined constructors and destructors affect the setting of the GC finalizer for a given aggregate type. And how this is related to the trait `hasElaborateDestructor` for both `classes` and `structs`. Where's the dmd and druntime code that handles these steps? |
October 08, 2018 Re: Details on how aggregates are constructed with `new` and later destroyed by the GC | ||||
---|---|---|---|---|
| ||||
Posted in reply to Per Nordlöw | On Monday, 8 October 2018 at 11:19:40 UTC, Per Nordlöw wrote: > I want to understand how calls to `new` for classes see _d_newclass > and structs are lowered by the compiler and druntime to a GC-allocation (specifically how the `ba`-argument bits are determined) followed by an initialization using default constructor or via a user-defined constructor called using arguments to `new`. And how this is related to the trait `hasElaborateConstructor` for both `classes` and `structs`. Memory is allocated, .init (for classes this comes from typeid(T).initializer) is copied over the memory and then the constructor is run. > I also want to understand how manually defined constructors and destructors affect the setting of the GC finalizer for a given aggregate type. And how this is related to the trait `hasElaborateDestructor` for both `classes` and `structs` For classes the typeid(T).destructor is called on the class, for structs I'm not sure. > Where's the dmd and druntime code that handles these steps? should be src/rt/lifetime.d IIRC |
October 08, 2018 Re: Details on how aggregates are constructed with `new` and later destroyed by the GC | ||||
---|---|---|---|---|
| ||||
Posted in reply to Per Nordlöw | On Monday, 8 October 2018 at 11:19:40 UTC, Per Nordlöw wrote: > And how this is related to the trait `hasElaborateConstructor` for both `classes` and `structs`. There's no such trait as far as I'm aware. If there were, it'd likely be checking for the presence of a '__ctor' member. Thing is, it can't be generic because ctors may be templates, the best that can be done is checking if `T` is constructible with some arguments `Args`. > And how this is related to the trait `hasElaborateDestructor` for both `classes` and `structs`. It isn't. The trait literally just checks if the compiler has generated a '__dtor' member, and it doesn't do so for classes at all. |
Copyright © 1999-2021 by the D Language Foundation