[fpc-pascal] assigning a local function to a var
Marco van de Voort
marcov at stack.nl
Fri Jul 11 01:09:24 CEST 2008
> Thus, I would ask of the devs, has this functionality been considered?
Yes. A solution for this problem is needed for Mac Pascal compatability.
> Is there some particular reason that anyone is opposed to implementing
> it?
Not really I guess.
> Or is it just difficult to implement, and/or not considered useful?
Useful, but a lot of work.
> There is a part of me that wants to jump in and try to implement this in
> the compiler, although I suspect I would be in well over my head.
Well, my ideas about it were:
- there must be a local directive that enables a procvar type declaration t
to become a "full" procvar. (to switch between compatible and full). Maybe
mac mode should turn this on by default.
- The new "full" procvar type consists out of a framepointer and a procedure
address. A two pointer record, like tmethod.
- In case of a global procedure being assigned to the full procvar, the
framepointer=nil.
- In case of a local procedure being assigned to the full procvar, the
framepointer is the parents framepointer. (the implict first argument)
- Calling such localproc is of course only allowed from within the immediate
parent of the local procedure, so that the frame exists.
- When a procedure calls such a procedure, on asm level the code is roughly
like this:
if assigned(procvar.frameptr) then
procvar.procaddress(procvar.frameptr,arg1,arg2,arg3..)
else
procvar.procaddress(arg1,arg2,arg3..)
Of course this is just brainstorming. IIRC Jonas punched a few holes in it
when I talked to him about it, but I can't remember what they were. Except a
warning that the callnode code was complicated, due to the many ways a
procedure/method can be called. (think directives, special rules for
parameter order, hidden params, float params, small complex types etc)
> Before I consider making such an attempt (or looking for someone to do
> it) it'd be nice to get a feeling for whether such an extension would
> be welcome.
It's on the roadmap for the mac dialect:
http://wiki.freepascal.org/Mode_MacPas
(Search for "planned", it is the "nested procedure parameters") item)
> I am hard-pressed to detect any drawback or conflict, although of course
> that's largely because I have no idea how this stuff is actually
> implemented.
See above.
More information about the fpc-pascal
mailing list