On Thu, 11 Nov 2010 23:45:39 +0100
Pelle Månsson <pelle.mans...@gmail.com> wrote:

> On 11/11/2010 10:15 PM, spir wrote:
> 
> > Well, since the pattern is OK _after_ call to Tuple's constructor (which 
> > does nothing more than recording its sub-patterns, see below) and only gets 
> > wrong when qutting this(), I fail to see how Tuple could be cause of 
> > anything. Also, the corruption is visible _before_ calling match() (which 
> > here delegates to Tuple's check()).
> >
> > I understand your note about returning an object actually allocated on the 
> > stack -- but here there are only implicitely referenced objects (class 
> > instances). This would mean that D creates the 2 sub-patterns on the stack? 
> > But why those objects, precisely? (Also note that they are of different 
> > classes: one is here a "String", the other a "ZeroOrMore"). They are stored 
> > in an array.
> >
> > What's troubling is that the array elements, meaning the supposed 
> > subpattern addresses, have changed. Maybe the patterns themselves are still 
> > ok, but the array data only are corrupted?
> > Oh, I may try to cast to String the memory area pointed inside 
> > this()....... Does not seem to work: I recorded the pointer read in this() 
> > (as String*) into a global; then in the test func:
> >      writeln("p: ",p);              // ok, same address as in this()
> >      writeln(cast(String)(*p));     // segfault!
> >
> > Anyway, just in case my reasoning is wrong, here is the whole Tuple class:
> >
> > ====================================================
> > class Tuple : Pattern {
> >      /**  pattern type for tuple of given patterns */
> >      static string typename = "Tuple";
> >      Pattern[] patterns;
> >      this (Pattern[] patterns...) {
> >          this.patterns = patterns;
> 
> You need to dup that. Arguments are passed on the stack.

Sorry, but I don't understand your hint. Where is the dup-ed array supposed to 
be allocated? Isn't the assignment supposed to copy it to the field, anyway? 
How else could one store an array to a field? And how are contained referenced 
objects supposed to stop vanishing thank to dup?
(I tried, anyway, but the did not stop segfault.)

I have one more example of segfault, in a brand new demo func matching 4 
operations. Very strange. With additions, all works fine. When I replace '+' by 
'-', I get a segfault _sometimes_. When I use '*' or '/', seems I get a 
segfault _everytime_. The patterns for the 4 operations are all the same, 
indeed.
Also, since the demo matches calculations of several operations, there can be 
whitespace. If I add some space after the operation, I get a segfault even for 
'+'.

What I intend to do is uninstall dmd2 to replace it by dmd1 and see what 
happens. What do you think?


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com

Reply via email to