www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 12406] New: Broken delegate closure

https://d.puremagic.com/issues/show_bug.cgi?id=12406

           Summary: Broken delegate closure
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: lt.infiltrator gmail.com


--- Comment #0 from Infiltrator <lt.infiltrator gmail.com> 2014-03-18 17:56:05
PDT ---
In some ((apparently) random and confusing) cases, a delegate's closure is
broken, and seems to be influenced by completely unrelated pieces of code.

http://dpaste.dzfl.pl/5f9ebc61274a




------------------------------------------------------------------------
import std.functional;
import std.stdio;

class UserInterface {
   void title(string title) { _messages = title; } /* Changing this to
writeln(title) and removing display(), below, magically fixes it. */
   string display() {
      writeln(_messages);
      stdout.flush;
      return readln;
   }
   string _messages;
}

class Screen {
   void addMessageSource(string delegate()) { }
   void addOption(Screen delegate() action) {
      _options ~= Option(action);
   }
   Screen execute(UserInterface ui) {
      ui.title(title);
      auto action = _options[0].action;
      ui.display; /* Removing this line magically fixes it. */
      return action();
   }
   this(string title) { this.title = title; }
   struct Option { Screen delegate() action; }
   string title;
   Option[] _options;
}

string printStatus(int) { return "Printing status"; }

void configureScreen(Screen screen) {
   auto systemStatus = new Screen("System status");
   int x;
   systemStatus.addMessageSource(&curry!(printStatus, x));  /* Removing this
line magically fixes it.  */
   Screen renameName() { return new Screen("Rename system"); }
   Screen renameSelect() {
      auto ret = new Screen("Select system");
      void addItem() { ret.addOption(&renameName); }  /* Removing this line
magically fixes it. */
      ret.addOption(() => screen);  /* The segfault occurs here. */
      return ret;
   }
   screen.addOption(&renameSelect);
}
int main() {
   auto screen = new Screen("Systems screen");
   configureScreen(screen);
   while(screen) screen = screen.execute(new UserInterface);
   return 0;
}

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