segfault
spir
denis.spir at gmail.com
Sat Nov 13 12:57:50 PST 2010
On Fri, 12 Nov 2010 08:03:26 -0500
"Steven Schveighoffer" <schveiguy at yahoo.com> wrote:
> Pelle, I spent all this time helping him, and you swoop in with the answer
> :)
>
> Yes, he is right, you need to dup the patterns argument. It is something
> I very recently discovered.
Wow, first thought dup did not solve the issue, but it fact I had introduced another bug in the meanyrime ;-) All works fine, now. I'll be able to restart working on this. D soon has a prototype for a PEG lib.
> Here is what happens:
>
> void foo(int[] arg...) {}
>
> foo(1,2,3);
>
> What the compiler does is push 1, 2, and 3 onto the stack, then passes in
> a dynamic array reference to that stack data. It does this because heap
> allocations are much more expensive than stack allocations. When you just
> "save" the data, it is no longer valid. The reason the code all works
> within the List constructor is because that is the stack frame where the
> array is pushed onto the stack.
Right.
> Note, you can do foo([1,2,3]), and you will be wasting time duping, but I
> have found a solution to that, overloading:
>
> void foo(int[] arg) {}
>
> If you pass in an array, then the second overload is used, if you pass in
> individual arguments the first overload is used.
All right. I find a bit strange that the compiler accepts f([1,2,3]) when the declaration reads eg void f(int[] ints...). Anyway, it cannot harm, I guess.
> Essentially, if you change your line above to:
>
> this.patterns = patterns.dup;
Works, but I don't understand why: isn't the duplicate also allocated on the stack? I mean, dup is supposed to just duplicate, isn't it? what does it give to the new structure that the original one hasn't? I thought I would have to do for instance:
ints[] x;
void f(int[] ints...) {
x.length = ints.length; // allocate new area on the heap
x[] = ints[]; // copy elements in there
}
> All is well, you should be good.
yo!
> -Steve
Thank you and Pelle for your help,
Denis
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com
More information about the Digitalmars-d-learn
mailing list