[Issue 6204] New: emplace() for classes accepts larger chunk but fails in array assignment
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Jun 24 00:25:05 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6204
Summary: emplace() for classes accepts larger chunk but fails
in array assignment
Product: D
Version: D2
Platform: Other
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: Phobos
AssignedTo: nobody at puremagic.com
ReportedBy: acehreli at yahoo.com
--- Comment #0 from Ali Cehreli <acehreli at yahoo.com> 2011-06-24 00:20:13 PDT ---
This is tested with dmd 2.053 release version.
In the class version of emplace(), the following enforce indicates that it is
legal to have a chunk larger than the instance size:
enforce(chunk.length >= __traits(classInstanceSize, T),
new ConvException("emplace: chunk size too small"));
Unfortunately, the following array assignment fails when that's the case:
// Initialize the object in its pre-ctor state
(cast(byte[]) chunk)[] = typeid(T).init[];
Here is a program that reproduces the issue:
import std.conv;
class C
{
int i;
}
size_t alignedSize(T)()
{
return (__traits(classInstanceSize, T) + T.alignof - 1)
/ T.alignof * T.alignof;
}
void main()
{
enum roomPerObject = alignedSize!C();
ubyte[roomPerObject] buffer;
void[] placeForObject = (buffer.ptr)[0..roomPerObject];
emplace!C(placeForObject);
}
The last line throws at runtime:
object.Exception at src/rt/arraycat.d(31): lengths don't match for array copy
A proposed fix would be to assign only to the first part of the chunk:
(cast(byte[]) chunk)[0..__traits(classInstanceSize, T)] = typeid(T).init[];
(Note the range on the left hand side of the assignment.)
That gets rid of the problem but I am not sure about what to do with the
potentially-non-zero remaining bytes of the chunk. The caller may assume that
they will be cleared by emplace().
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list