[Issue 6194] [GSoC] Destructor gets called on object before it is copied when calling writeln()

2011-07-31 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6194


Kenji Hara k.hara...@gmail.com changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 CC||k.hara...@gmail.com
 Resolution||FIXED


--- Comment #5 from Kenji Hara k.hara...@gmail.com 2011-07-31 13:44:37 PDT ---
https://github.com/D-Programming-Language/phobos/commit/d2541785e79fa67212cb8281122b14e38ea12ecf

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 6194] [GSoC] Destructor gets called on object before it is copied when calling writeln()

2011-07-19 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6194



--- Comment #4 from Cristi Cobzarenco cristi.cobzare...@gmail.com 2011-07-19 
06:24:20 PDT ---
Here's a pull request with my fix.
https://github.com/D-Programming-Language/phobos/pull/151

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 6194] [GSoC] Destructor gets called on object before it is copied when calling writeln()

2011-06-24 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6194



--- Comment #3 from Cristi Cobzarenco cristi.cobzare...@gmail.com 2011-06-24 
04:23:28 PDT ---
(In reply to comment #2)
 I'm not sure if it's a bug in DMD or Phobos. I'm inclined to it's Phobos bug.
 The loop variable 'a' in the reduced 'formattedWrite' is obviously escaping 
 its
 scope, so calling the destructor is reasonable. However, this is essentially
 the implementation of std.format.formattedWrite:
 
 1. the arguments are taken address 
 
 foreach (i, arg; args)
 {
 funs[i] = formatGeneric!(Writer, typeof(arg), Char);
 // We can safely cast away shared because all data is either
 // immutable or completely owned by this function.
 argsAddresses[i] = cast(const(void*)) arg;
 }
 
 2. and then they are referred later for actual formatting.
 
 {
 funs[currentArg](w, argsAddresses[currentArg], spec);
 ++currentArg;
 }
 
 https://github.com/D-Programming-Language/phobos/blob/master/std/format.d#L302


This works for me:
 foreach (i, arg; args)
{
funs[i] = formatGeneric!(Writer, typeof(arg), Char);

static if(hasAliasing!(typeof(arg)))
{
-argsAddresses[i] = arg;
+argsAddresses[i] = args[i];

}
else
{
// We can safely cast away shared because all data is either
// immutable or completely owned by this function.
-argsAddresses[i] = cast(const(void*)) arg;
+argsAddresses[i] = cast(const(void*)) args[i];
}
}

Unfortunately we can't replace the foreach with a for loop because we can't do
typeof( args[ i ] ). Does any one have any idea how we could avoid copying the
arguments needlessly?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 6194] [GSoC] Destructor gets called on object before it is copied when calling writeln()

2011-06-22 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6194


kenn...@gmail.com changed:

   What|Removed |Added

 CC||kenn...@gmail.com


--- Comment #1 from kenn...@gmail.com 2011-06-22 09:51:21 PDT ---
Reduced:

---
struct Test {
int x;
~this() { x = 42; }
}
void formattedWrite(A...)(A args) {
Test* argsAddresses;
foreach (a; args) {
argsAddresses = a;
assert(argsAddresses.x != 42, line 9: unexpected: x == 42);
}
assert(argsAddresses.x != 42, line 11: unexpected: x == 42);
}
int main(string[] argv) {
auto a = Test(3);
formattedWrite(a);
return 0;
}
---
core.exception.AssertError@y.d(11): line 11: unexpected: x == 42

5   y   0x87e9 onAssertErrorMsg + 73
6   y   0x00011be6 _d_assert_msg + 26
7   y   0x1ab6 void
y.formattedWrite!(y.Test).formattedWrite(y.Test) + 138
8   y   0x1944 _Dmain + 24
9   y   0x000122e3 extern (C) int
rt.dmain2.main(int, char**).void runMain() + 23
10  y   0x00011e8d extern (C) int
rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 29
11  y   0x0001232b extern (C) int
rt.dmain2.main(int, char**).void runAll() + 59
12  y   0x00011e8d extern (C) int
rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 29
13  y   0x00011e27 main + 179
14  y   0x1921 start + 53

---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 6194] [GSoC] Destructor gets called on object before it is copied when calling writeln()

2011-06-22 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6194



--- Comment #2 from kenn...@gmail.com 2011-06-22 10:33:34 PDT ---
I'm not sure if it's a bug in DMD or Phobos. I'm inclined to it's Phobos bug.
The loop variable 'a' in the reduced 'formattedWrite' is obviously escaping its
scope, so calling the destructor is reasonable. However, this is essentially
the implementation of std.format.formattedWrite:

1. the arguments are taken address 

foreach (i, arg; args)
{
funs[i] = formatGeneric!(Writer, typeof(arg), Char);
// We can safely cast away shared because all data is either
// immutable or completely owned by this function.
argsAddresses[i] = cast(const(void*)) arg;
}

2. and then they are referred later for actual formatting.

{
funs[currentArg](w, argsAddresses[currentArg], spec);
++currentArg;
}

https://github.com/D-Programming-Language/phobos/blob/master/std/format.d#L302

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---