diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-03-05 17:55:51 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-03-05 17:55:51 +0100 |
commit | b02e31e409d032849553089016e77bbdf11afef3 (patch) | |
tree | 2ece7c0a5d23c6b24a6f7a0e263d28123a684055 /compiler | |
parent | db67e95bb230f1ce0c503e1ecf86b392d089b663 (diff) | |
download | Nim-b02e31e409d032849553089016e77bbdf11afef3.tar.gz |
PHP codegen: function pointers work
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/jsgen.nim | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 5ae01a67d..8af6239a5 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -56,7 +56,8 @@ type TResKind = enum resNone, # not set resExpr, # is some complex expression - resVal # is a temporary/value/l-value + resVal, # is a temporary/value/l-value + resCallee # expression is callee TCompRes = object kind: TResKind typ: TJSTypeKind @@ -1096,7 +1097,10 @@ proc genSym(p: PProc, n: PNode, r: var TCompRes) = p.declareGlobal(s.id, r.res) of skProc, skConverter, skMethod: discard mangleName(s, p.target) - r.res = s.loc.r + if p.target == targetPHP and r.kind != resCallee: + r.res = makeJsString($s.loc.r) + else: + r.res = s.loc.r if lfNoDecl in s.loc.flags or s.magic != mNone or {sfImportc, sfInfixCall} * s.flags != {}: discard @@ -1231,6 +1235,8 @@ proc genInfixCall(p: PProc, n: PNode, r: var TCompRes) = r.typ = etyNone add(r.res, "." | "->") var op: TCompRes + if p.target == targetPHP: + op.kind = resCallee gen(p, n.sons[0], op) add(r.res, op.res) genArgs(p, n, r, 2) @@ -1239,6 +1245,8 @@ proc genCall(p: PProc, n: PNode, r: var TCompRes) = if thisParam(p, n.sons[0].typ) != nil: genInfixCall(p, n, r) return + if p.target == targetPHP: + r.kind = resCallee gen(p, n.sons[0], r) genArgs(p, n, r) @@ -1907,7 +1915,7 @@ proc genCast(p: PProc, n: PNode, r: var TCompRes) = proc gen(p: PProc, n: PNode, r: var TCompRes) = r.typ = etyNone - r.kind = resNone + if r.kind != resCallee: r.kind = resNone #r.address = nil r.res = nil case n.kind |