Loosen “Local procedure/function assigned to procedure variable” restriction gracefully

后端 未结 4 1169
臣服心动
臣服心动 2020-12-31 19:30

Consider the following test-case:

{ CompilerVersion = 21 }
procedure Global();

  procedure Local();
  begin
  end;

type
  TProcedure = procedure ();
var
           


        
4条回答
  •  情话喂你
    2020-12-31 20:06

    If one really needs to use local procedures in D7 or earlier one could use this trick:

    procedure GlobalProc;
    var t,maxx:integer; itr,flag1,flag2:boolean; iterat10n:pointer;
        //Local procs:
        procedure iterat10n_01;begin {code #1 here} end;
        procedure iterat10n_10;begin {code #2 here} end;
        procedure iterat10n_11;begin {code #1+#2 here} end;
    begin
        //...
        t:=ord(flag2)*$10 or ord(flag1);
        if t=$11 then iterat10n:=@iterat10n_11
          else if t=$10 then iterat10n:=@iterat10n_10
            else if t=$01 then iterat10n:=@iterat10n_01
              else iterat10n:=nil;
        itr:=(iterat10n<>nil);
        //...
        for t:=1 to maxx do begin
            //...
            if(itr)then asm
                push ebp;
                call iterat10n;
                pop ecx;
            end;
            //...
        end;
        //...
    end;
    

    However the problem is that adress-registers could differ on different machines - so it's needed to write some code using local proc call and look via breakpoint which registers are used there...

    And yeah - in most real production cases this trick is just some kind of palliative.

提交回复
热议问题