mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 14:30:41 +02:00
* force mode objfpc for synthetic method implementations (to guarantee
that e.g. "out" and &-escaping are possible) git-svn-id: branches/jvmbackend@18590 -
This commit is contained in:
parent
4fbc1b5369
commit
ad6ae44093
@ -27,7 +27,7 @@ unit symcreat;
|
||||
interface
|
||||
|
||||
uses
|
||||
finput,tokens,scanner,
|
||||
finput,tokens,scanner,globtype,
|
||||
symconst,symbase,symtype,symdef;
|
||||
|
||||
|
||||
@ -36,6 +36,7 @@ interface
|
||||
old_scanner: tscannerfile;
|
||||
old_token: ttoken;
|
||||
old_c: char;
|
||||
old_modeswitches: tmodeswitches;
|
||||
valid: boolean;
|
||||
end;
|
||||
|
||||
@ -53,8 +54,10 @@ interface
|
||||
{ parses a (class or regular) method/constructor/destructor implementation
|
||||
from str, as if it appeared in the current unit's implementation section
|
||||
|
||||
WARNING: save the scanner state before calling this routine, and restore
|
||||
when done. }
|
||||
WARNINGS:
|
||||
* save the scanner state before calling this routine, and restore when done.
|
||||
* the code *must* be written in objfpc style
|
||||
}
|
||||
function str_parse_method_impl(str: ansistring; usefwpd: tprocdef; is_classdef: boolean):boolean;
|
||||
|
||||
|
||||
@ -95,7 +98,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
cutils,globtype,globals,verbose,systems,comphook,fmodule,
|
||||
cutils,globals,verbose,systems,comphook,fmodule,
|
||||
symsym,symtable,defutil,
|
||||
pbase,pdecobj,pdecsub,psub,
|
||||
node,nbas,nld,nmem,
|
||||
@ -115,12 +118,16 @@ implementation
|
||||
sstate.old_scanner:=current_scanner;
|
||||
sstate.old_token:=token;
|
||||
sstate.old_c:=c;
|
||||
sstate.old_modeswitches:=current_settings.modeswitches;
|
||||
sstate.valid:=true;
|
||||
{ creating a new scanner resets the block type, while we want to continue
|
||||
in the current one }
|
||||
old_block_type:=block_type;
|
||||
current_scanner:=tscannerfile.Create('_Macro_.'+tempname);
|
||||
block_type:=old_block_type;
|
||||
{ required for e.g. FpcDeepCopy record method (uses "out" parameter; field
|
||||
names are escaped via &, so should not cause conflicts }
|
||||
current_settings.modeswitches:=objfpcmodeswitches;
|
||||
end;
|
||||
|
||||
|
||||
@ -131,6 +138,7 @@ implementation
|
||||
current_scanner.free;
|
||||
current_scanner:=sstate.old_scanner;
|
||||
token:=sstate.old_token;
|
||||
current_settings.modeswitches:=sstate.old_modeswitches;
|
||||
c:=sstate.old_c;
|
||||
end;
|
||||
end;
|
||||
@ -293,7 +301,7 @@ implementation
|
||||
not is_dynamic_array(fsym.vardef)) or
|
||||
((fsym.vardef.typ=setdef) and
|
||||
not is_smallset(fsym.vardef)) then
|
||||
str:=str+'_fpc_ptrt(clone)^.'+fsym.realname+':='+fsym.realname+';';
|
||||
str:=str+'_fpc_ptrt(clone)^.&'+fsym.realname+':='+fsym.realname+';';
|
||||
end;
|
||||
end;
|
||||
str:=str+'end;';
|
||||
@ -325,7 +333,7 @@ implementation
|
||||
if (sym.typ=fieldvarsym) then
|
||||
begin
|
||||
fsym:=tfieldvarsym(sym);
|
||||
str:=str+'result.'+fsym.realname+':='+fsym.realname+';';
|
||||
str:=str+'result.&'+fsym.realname+':='+fsym.realname+';';
|
||||
end;
|
||||
end;
|
||||
str:=str+'end;';
|
||||
|
Loading…
Reference in New Issue
Block a user