From 77235947c15f66fd3a933a6832eecabe1991e93a Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:08:10 +0100 Subject: [PATCH 1/7] Fix for shr with PHP (using >>) --- compiler/jsgen.nim | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 7a927f41ea..5da61e3821 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -452,11 +452,17 @@ proc arith(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = of mMulU: binaryUintExpr(p, n, r, "*") of mDivU: binaryUintExpr(p, n, r, "/") of mShrI: - var x, y: TCompRes - gen(p, n.sons[1], x) - gen(p, n.sons[2], y) - let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) - r.res = "(($1 $2) >>> $3)" % [x.rdLoc, trimmer, y.rdLoc] + if p.target == targetPHP: + var x, y: TCompRes + gen(p, n.sons[1], x) + gen(p, n.sons[2], y) + r.res = "$1 >> $2" % [x.rdLoc, y.rdLoc] + else: + var x, y: TCompRes + gen(p, n.sons[1], x) + gen(p, n.sons[2], y) + let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) + r.res = "(($1 $2) >> $3)" % [x.rdLoc, trimmer, y.rdLoc] of mCharToStr, mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr: if p.target == targetPHP: From e737b47ee148c77184ad985573d1cfc329b2fcab Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:30:21 +0100 Subject: [PATCH 2/7] Fix for index check in PHP code. --- compiler/jsgen.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 5da61e3821..21bd45d710 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -891,7 +891,10 @@ proc genArrayAddr(p: PProc, n: PNode, r: var TCompRes) = else: first = 0 if optBoundsCheck in p.options and not isConstExpr(m.sons[1]): useMagic(p, "chckIndx") - r.res = "chckIndx($1, $2, $3.length)-$2" % [b.res, rope(first), a.res] + if p.target == targetPHP: + r.res = "chckIndx($1, $2, count($3))-$2" % [b.res, rope(first), a.res] + else: + r.res = "chckIndx($1, $2, $3.length)-$2" % [b.res, rope(first), a.res] elif first != 0: r.res = "($1)-$2" % [b.res, rope(first)] else: From fa6692f33faf00976a0ca5d4209b4942b81fdf15 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:35:02 +0100 Subject: [PATCH 3/7] Fix tuple field access in PHP. --- compiler/jsgen.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 21bd45d710..909785a287 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -844,7 +844,10 @@ proc genFieldAddr(p: PProc, n: PNode, r: var TCompRes) = let b = if n.kind == nkHiddenAddr: n.sons[0] else: n gen(p, b.sons[0], a) if skipTypes(b.sons[0].typ, abstractVarRange).kind == tyTuple: - r.res = makeJSString("Field" & $getFieldPosition(b.sons[1])) + if p.target == targetJS: + r.res = makeJSString( "Field" & $getFieldPosition(b.sons[1]) ) + else: + r.res = makeJSString( $getFieldPosition(b.sons[1]) ) else: if b.sons[1].kind != nkSym: internalError(b.sons[1].info, "genFieldAddr") var f = b.sons[1].sym From a6460e2c918969d1662e6db734994743a179750b Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 01:32:54 +0100 Subject: [PATCH 4/7] =?UTF-8?q?Fix=20f=C3=BCr=20Char=20to=20String=20in=20?= =?UTF-8?q?PHP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compiler/jsgen.nim | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 909785a287..0099f48a97 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -470,6 +470,10 @@ proc arith(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = var x: TCompRes gen(p, n.sons[1], x) r.res = "$#[$#]" % [genEnumInfoPHP(p, n.sons[1].typ), x.rdLoc] + elif op == mCharToStr: + var x: TCompRes + gen(p, n.sons[1], x) + r.res = "chr($#)" % [x.rdLoc] else: gen(p, n.sons[1], r) else: From bb3fe1493da446d1476d7bf6f93d412b60ade905 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 04:28:27 +0100 Subject: [PATCH 5/7] Better code and fix for JS regression. --- compiler/jsgen.nim | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 0099f48a97..d232f726ac 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -452,17 +452,14 @@ proc arith(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = of mMulU: binaryUintExpr(p, n, r, "*") of mDivU: binaryUintExpr(p, n, r, "/") of mShrI: + var x, y: TCompRes + gen(p, n.sons[1], x) + gen(p, n.sons[2], y) if p.target == targetPHP: - var x, y: TCompRes - gen(p, n.sons[1], x) - gen(p, n.sons[2], y) r.res = "$1 >> $2" % [x.rdLoc, y.rdLoc] else: - var x, y: TCompRes - gen(p, n.sons[1], x) - gen(p, n.sons[2], y) let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) - r.res = "(($1 $2) >> $3)" % [x.rdLoc, trimmer, y.rdLoc] + r.res = "(($1 $2) >>> $3)" % [x.rdLoc, trimmer, y.rdLoc] of mCharToStr, mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr: if p.target == targetPHP: @@ -851,7 +848,7 @@ proc genFieldAddr(p: PProc, n: PNode, r: var TCompRes) = if p.target == targetJS: r.res = makeJSString( "Field" & $getFieldPosition(b.sons[1]) ) else: - r.res = makeJSString( $getFieldPosition(b.sons[1]) ) + r.res = getFieldPosition(b.sons[1]).rope else: if b.sons[1].kind != nkSym: internalError(b.sons[1].info, "genFieldAddr") var f = b.sons[1].sym @@ -899,7 +896,10 @@ proc genArrayAddr(p: PProc, n: PNode, r: var TCompRes) = if optBoundsCheck in p.options and not isConstExpr(m.sons[1]): useMagic(p, "chckIndx") if p.target == targetPHP: - r.res = "chckIndx($1, $2, count($3))-$2" % [b.res, rope(first), a.res] + if typ.kind != tyString: + r.res = "chckIndx($1, $2, count($3))-$2" % [b.res, rope(first), a.res] + else: + r.res = "chckIndx($1, $2, strlen($3))-$2" % [b.res, rope(first), a.res] else: r.res = "chckIndx($1, $2, $3.length)-$2" % [b.res, rope(first), a.res] elif first != 0: From e66f5c419c0b4728b0a9e2c12e13e23c4509d8b1 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 05:22:32 +0100 Subject: [PATCH 6/7] Corrected (unsigned) shr for PHP Codegen --- compiler/jsgen.nim | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index d232f726ac..052f482ac3 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -400,13 +400,22 @@ proc binaryExpr(p: PProc, n: PNode, r: var TCompRes, magic, frmt: string) = r.res = frmt % [x.rdLoc, y.rdLoc] r.kind = resExpr -proc unsignedTrimmer(size: BiggestInt): Rope = +proc unsignedTrimmerJS(size: BiggestInt): Rope = case size of 1: rope"& 0xff" of 2: rope"& 0xffff" of 4: rope">>> 0" else: rope"" +proc unsignedTrimmerPHP(size: BiggestInt): Rope = + case size + of 1: rope"& 0xff" + of 2: rope"& 0xffff" + else: rope"" + +template unsignedTrimmer(size: BiggestInt): Rope = + size.unsignedTrimmerJS | size.unsignedTrimmerPHP + proc binaryUintExpr(p: PProc, n: PNode, r: var TCompRes, op: string, reassign: bool = false) = var x, y: TCompRes gen(p, n.sons[1], x) @@ -455,10 +464,10 @@ proc arith(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = var x, y: TCompRes gen(p, n.sons[1], x) gen(p, n.sons[2], y) + let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) if p.target == targetPHP: - r.res = "$1 >> $2" % [x.rdLoc, y.rdLoc] + r.res = "(($1 $2) >= 0) ? (($1 $2) >> $3) : ((($1 $2) & 0x7fffffff) >> $3) | (0x40000000 >> ($3 - 1))" % [x.rdLoc, trimmer, y.rdLoc] else: - let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) r.res = "(($1 $2) >>> $3)" % [x.rdLoc, trimmer, y.rdLoc] of mCharToStr, mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, mEnumToStr: From 2522ac9133744b94ea58e07abb1d2b5099165109 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 06:00:14 +0100 Subject: [PATCH 7/7] Made the test tints.nim work for the PHP codegen (uint shifts and casts). --- compiler/jsgen.nim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 052f482ac3..f01d4d877d 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -411,6 +411,7 @@ proc unsignedTrimmerPHP(size: BiggestInt): Rope = case size of 1: rope"& 0xff" of 2: rope"& 0xffff" + of 4: rope"& 0xffffffff" else: rope"" template unsignedTrimmer(size: BiggestInt): Rope = @@ -466,6 +467,7 @@ proc arith(p: PProc, n: PNode, r: var TCompRes, op: TMagic) = gen(p, n.sons[2], y) let trimmer = unsignedTrimmer(n[1].typ.skipTypes(abstractRange).size) if p.target == targetPHP: + # XXX prevent multi evaluations r.res = "(($1 $2) >= 0) ? (($1 $2) >> $3) : ((($1 $2) & 0x7fffffff) >> $3) | (0x40000000 >> ($3 - 1))" % [x.rdLoc, trimmer, y.rdLoc] else: r.res = "(($1 $2) >>> $3)" % [x.rdLoc, trimmer, y.rdLoc] @@ -1864,7 +1866,9 @@ proc genCast(p: PProc, n: PNode, r: var TCompRes) = r.res = "($1 $2)" % [r.res, trimmer] elif fromUint: if src.size == 4 and dest.size == 4: - r.res = "($1|0)" % [r.res] + # XXX prevent multi evaluations + r.res = "($1|0)" % [r.res] | + "($1>(float)2147483647?(int)$1-4294967296:$1)" % [r.res] else: let trimmer = unsignedTrimmer(dest.size) let minuend = case dest.size