diff options
| author | blaise <blaise@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-01-21 19:00:59 +0000 |
|---|---|---|
| committer | blaise <blaise@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-01-21 19:00:59 +0000 |
| commit | 377f14fd544f12a50c90e9a193ac782a601e83cd (patch) | |
| tree | 04db9286a948d3c4f656e26de97b21bdd04d5070 /closures/compiler/pexpr.pas | |
| parent | 350adcb4b28481f4ae121a996c9f43dc019da18b (diff) | |
| download | fpc-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.pas | 20 |
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); |
