summaryrefslogtreecommitdiff
path: root/closures/compiler/pexpr.pas
diff options
context:
space:
mode:
authorblaise <blaise@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-01-21 19:00:59 +0000
committerblaise <blaise@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-01-21 19:00:59 +0000
commit377f14fd544f12a50c90e9a193ac782a601e83cd (patch)
tree04db9286a948d3c4f656e26de97b21bdd04d5070 /closures/compiler/pexpr.pas
parent350adcb4b28481f4ae121a996c9f43dc019da18b (diff)
downloadfpc-377f14fd544f12a50c90e9a193ac782a601e83cd.tar.gz
~ ncgutil: generate interface thunks for local classes too
~ nld: during the first pass, we rewrite the nodes that load captured variables, except for nodes marked with the new flag loadnf_captured_param = pdecobj, symdef: factored out tobjectdef.register_implemented_interface + pexpr: access to captured variables from expressions; nameless routine declarations + symconst: new flags for tprocoption (po_nameless, po_has_closure) and tobjectoption (oo_is_nameless) ~ symdef: mangled name generator is now aware of local classes and interfaces + symsym: new field tabstractnormalvarsym.captured_into holds a reference to a new location for the captured variable git-svn-id: http://svn.freepascal.org/svn/fpc/branches/blaise@20138 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'closures/compiler/pexpr.pas')
-rw-r--r--closures/compiler/pexpr.pas20
1 files changed, 17 insertions, 3 deletions
diff --git a/closures/compiler/pexpr.pas b/closures/compiler/pexpr.pas
index 98002d8b10..2678308a86 100644
--- a/closures/compiler/pexpr.pas
+++ b/closures/compiler/pexpr.pas
@@ -70,7 +70,7 @@ implementation
nmat,nadd,nmem,nset,ncnv,ninl,ncon,nld,nflw,nbas,nutils,
{ parser }
scanner,
- pbase,pinline,ptype,pgenutil,
+ pbase,pinline,ptype,pgenutil,pnameless,
{ codegen }
cgbase,procinfo,cpuinfo
;
@@ -2248,8 +2248,15 @@ implementation
p1:=csubscriptnode.create(srsym,p1);
end
else
- { regular non-field load }
- p1:=cloadnode.create(srsym,srsymtable);
+ begin
+ if srsym.typ in [localvarsym,paravarsym] then
+ p1:=handle_possible_capture(current_procinfo.procdef, tabstractnormalvarsym(srsym))
+ else
+ p1:=nil;
+ if not assigned(p1) then
+ { regular non-field load }
+ p1:=cloadnode.create(srsym,srsymtable);
+ end
end;
syssym :
@@ -2946,6 +2953,13 @@ implementation
p1:=cinlinenode.create(in_objc_protocol_x,false,p1);
end;
+ // nameless routine
+ _PROCEDURE, _FUNCTION:
+ if assigned(current_procinfo) then
+ p1:=parse_nameless_routine(current_procinfo.procdef)
+ else // TODO: support this later? Delphi doesn't
+ internalerror(20120121);
+
else
begin
Message(parser_e_illegal_expression);