From 77235947c15f66fd3a933a6832eecabe1991e93a Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:08:10 +0100 Subject: Fix for shr with PHP (using >>) --- compiler/jsgen.nim | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 7a927f41e..5da61e382 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: -- cgit 1.4.1-2-gfad0 From e737b47ee148c77184ad985573d1cfc329b2fcab Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:30:21 +0100 Subject: Fix for index check in PHP code. --- compiler/jsgen.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 5da61e382..21bd45d71 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: -- cgit 1.4.1-2-gfad0 From fa6692f33faf00976a0ca5d4209b4942b81fdf15 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 00:35:02 +0100 Subject: Fix tuple field access in PHP. --- compiler/jsgen.nim | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 21bd45d71..909785a28 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 -- cgit 1.4.1-2-gfad0 From a6460e2c918969d1662e6db734994743a179750b Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 01:32:54 +0100 Subject: Fix für Char to String in 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(+) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 909785a28..0099f48a9 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: -- cgit 1.4.1-2-gfad0 From bb3fe1493da446d1476d7bf6f93d412b60ade905 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 04:28:27 +0100 Subject: Better code and fix for JS regression. --- compiler/jsgen.nim | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 0099f48a9..d232f726a 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: -- cgit 1.4.1-2-gfad0 From e66f5c419c0b4728b0a9e2c12e13e23c4509d8b1 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 05:22:32 +0100 Subject: Corrected (unsigned) shr for PHP Codegen --- compiler/jsgen.nim | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index d232f726a..052f482ac 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: -- cgit 1.4.1-2-gfad0 From 2522ac9133744b94ea58e07abb1d2b5099165109 Mon Sep 17 00:00:00 2001 From: Hans Raaf Date: Sun, 7 Feb 2016 06:00:14 +0100 Subject: 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(-) (limited to 'compiler/jsgen.nim') diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 052f482ac..f01d4d877 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 -- cgit 1.4.1-2-gfad0