* 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:
Jonas Maebe 2011-08-20 08:13:11 +00:00
parent 4fbc1b5369
commit ad6ae44093

View File

@ -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;';