exp_ch4.adb (Complete_Coextension_Finalization): Add machinery to handle the…
exp_ch4.adb (Complete_Coextension_Finalization): Add machinery to handle the creation of finalization lists and calls for nested... 2007-04-20 Javier Miranda <miranda@adacore.com> Hristian Kirtchev <kirtchev@adacore.com> Bob Duff <duff@adacore.com> * exp_ch4.adb (Complete_Coextension_Finalization): Add machinery to handle the creation of finalization lists and calls for nested coextensions when the root of the chains is part of a return statement. (Inside_A_Return_Statement): New function inside Complete_Coextension_ Finalization. (Expand_Record_Equality): Skip components that are interface types. (Displace_Allocator_Pointer): Add missing support for interface subtypes (Expand_N_Allocator): Replace invocation of Is_Local_Access_Discriminant with Rewrite_Coextension. Change the condition for detecting coextension root nodes. (Is_Local_Access_Discriminant): Removed. (Rewrite_Coextension): New routine which rewrites a static coextension as a temporary and uses its unrestricted access in the construction of the outer object. (Complete_Coextension_Finalization): New routine. Generate finalization attachment calls to all delayed coextensions. (Expand_N_Allocator): Call Complete_Coextension_Finalization whenever the allocator is not a coextension itself and has delayed coextensions. If the current allocator is controlled, but also a coextension, delay the generation of the finalization attachment call. Rename local variable "Node" to "Nod" in order to avoid confusion with "Elists.Node". (Expand_Allocator_Expression): Call Adjust for initialized allocators of limited types that are not inherently limited. Such an allocator is illegal, but is generated by the expander for a return statement, to copy the result onto the secondary stack. This is the only case where a limited object can be copied. Generate code to displace the pointer to the object if the qualified expression is a class-wide interface object. Such displacement was missing and hence the copy of the object was wrong. (Apply_Accessibility_Check): Handle allocated objects initialized in place. (Displace_Allocator_Pointer): Subsidiary procedure to Expand_N_Allocator and Expand_Allocator_Expression. Allocating class-wide interface objects this routine displaces the pointer to the allocated object to reference the component referencing the corresponding secondary dispatch table. Expand_Allocator_Expression): Add missing support to allocate class-wide interface objects initialized with a qualified expression. (Get_Allocator_Final_List): Test for an anonymous access type that is a function result type, and use the finalization list associated with the function scope in that case (such an anonymous type should not be treated like an access parameter's type). From-SVN: r125397
Showing
This diff is collapsed.
Click to expand it.
Please
register
or
sign in
to comment