[Issue 7787] New: Anonymous interface instantiation returned from anonymous function misbehaves
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Mar 27 10:18:35 PDT 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7787
Summary: Anonymous interface instantiation returned from
anonymous function misbehaves
Product: D
Version: D2
Platform: x86
OS/Version: Windows
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: tim.m.shea at gmail.com
--- Comment #0 from Tim Shea <tim.m.shea at gmail.com> 2012-03-27 10:18:58 PDT ---
I asked about this issue on stackoverflow, thinking I had made a mistake. The
url is
http://stackoverflow.com/questions/9752414/why-do-i-need-opcmp-for-an-anonymous-class
and includes details on how and why I discovered the problem.
Using DMD on Windows, if I return an anonymous class derived directly from an
interface from an anonymous function, the results are erratic and
unpredictable. I believe this is because the vtbl layout is not consistent
between the anonymous function creating the object and any clients of the
object. An example:
interface TestInterface {
string helloWorld();
}
class TestClass {
abstract string helloWorld();
}
void invokeFn(TestInterface function() f) {
auto t = f();
auto s = t.helloWorld();
writeln(s);
}
unittest {
auto f = function() {
return new class TestInterface {
string helloWorld() {
return "Hello World!";
}
};
};
// Invokes (f()).toString(), printing:
// "src.utilities.testopcmp.__unittest2.__funcliteral1.__anonclass10"
invokeFn(f);
}
void invokeFn(TestClass function() f) {
auto t = f();
auto s = t.helloWorld();
writeln(s);
}
unittest {
auto f = function() {
return new class TestClass {
string helloWorld() {
return "Goodbye World!";
}
};
};
// Invokes (f()).helloWorld(), printing:
// "Goodbye World!" as expected
invokeFn(f);
}
This may be a minor bug in the compiler or in object.d? If so, then a fix would
be appreciated. However, as abstract classes work correctly under the same
circumstances, if the issue is that interfaces *should not* be anonymously
instantiated (actually seems pretty reasonable) then that could be documented
and the above code could throw an error. In that case, even if the interface is
fixed, the anonymous function could probably declare a static nested abstract
class, and inherit that class. Thanks!
--
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