From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,7aeecd1069c28415 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Nick Roberts Newsgroups: comp.lang.ada Subject: Re: Objects and the Stack? Date: Fri, 17 Dec 2004 11:46:11 +0000 Message-ID: <32fv82F3l9al7U1@individual.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net vgBpvD/e876+8Nll+bFhHQTuCglaQ8VvcgS4rpXnFbIqN0lKo= User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.3) Gecko/20040910 X-Accept-Language: en-us, en In-Reply-To: Xref: g2news1.google.com comp.lang.ada:7028 Date: 2004-12-17T11:46:11+00:00 List-Id: Freejack wrote: > On Fri, 17 Dec 2004 00:28:23 +0000, Jeffrey Carter wrote: > > > >>The fact that pointers are generally not needed in Ada except when >>creating things such as dynamic data structures has nothing to do with >>tagged types. If you create objects of a classwide type, they are put on >>the stack if you declare them there, and in a storage pool if you >>allocate them there. >> > > Something like ... > declare > Stack : Obstack'Class := Item'(SomeIndex); > begin > IsPushed := Push(Item); > NewItem := Pop; > end; > Is what I have in mind. > > However what I'd like to be able to do( and what I'm working on. ) is > something like this... > > package body obstacks is > type obstack is abstract tagged null record; > > Stack : Obstack'Class; -- Problematic, needs some kind > of discriminant. > > function pkgbodyPush(X : Item) return obstack'class is > type NewStack is new Obstack with > record > Prev : Obstack'Class := Stack; > NewItem : Item := X; > end record; > PushedStack : NewStack; --Again, problematic > begin > return PushedStack; > > end pkgbodyPush; > > And then, every time the internal pkgbodyPush is called we get.. > > Stack := pkgbodyPush(X); > > See where I'm going with this? The above code is riddled with problems > that I gotta figure out. But that's the gist of it. The "Stack" variable > should remain on the "stack" as long as the package body is in scope. > That's my assumption at least. I'll know soon enough if I'm wrong. Heh. > > >>I'm not sure what you mean by "extended" here, whether you're referring >>to type extension or a value that becomes larger in 'Size, but this >>doesn't work the way I think you think it will. > > > Probably not. But then again, that's what experimentation is for. ;-> > That's one of the ways I learn new programming methods. By taking a > concept to the most absurd extreme I can imagine. I suppose so, but I think I should tell you now that what you trying (above) cannot work. The assumption in Ada is that the space reserved within a stack frame for an object cannot be resized (even though the space used /within/ the space reserved for an object can). So the compiler must be able to allocate the maximum size of an object on the stack. Since what you are attempting could cause Stack to grow to any size without limit, the compiler cannot know what maximum to allocate. It won't work, and so you must use the heap (or more correctly, a 'storage pool'). Ada has no equivalent of alloca() in C. It might be interesting to experiment with a compiler extension to provide this facility. Certain algorithms might benefit from it. declare Name: String := ""; pragma Extensible_Object(Name); begin ... Name := Name & ':'; -- changes its size ... It's an idea. -- Nick Roberts