diff options
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/ast.nim | 2 | ||||
-rwxr-xr-x | compiler/ccgexprs.nim | 15 | ||||
-rwxr-xr-x | compiler/pas2nim/pasparse.nim | 2 |
3 files changed, 16 insertions, 3 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 9f3a99363..7bd893a07 100755 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -398,7 +398,7 @@ type mEqI64, mLeI64, mLtI64, mEqF64, mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, mEqB, mLeB, mLtB, mEqRef, - mEqProc, mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, + mEqUntracedRef, mLePtr, mLtPtr, mEqCString, mXor, mEqProc, mUnaryMinusI, mUnaryMinusI64, mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 2199f2067..e02a38004 100755 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -458,7 +458,6 @@ proc binaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) = "($1 <= $2)", # LeB "($1 < $2)", # LtB "($1 == $2)", # EqRef - "($1 == $2)", # EqProc "($1 == $2)", # EqPtr "($1 <= $2)", # LePtr "($1 < $2)", # LtPtr @@ -477,6 +476,19 @@ proc binaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) = ropef(binArithTab[op], [rdLoc(a), rdLoc(b), toRope(s), getSimpleTypeDesc(p.module, e.typ)])) +proc genEqProc(p: BProc, e: PNode, d: var TLoc) = + var a, b: TLoc + assert(e.sons[1].typ != nil) + assert(e.sons[2].typ != nil) + InitLocExpr(p, e.sons[1], a) + InitLocExpr(p, e.sons[2], b) + if a.t.callConv == ccClosure: + putIntoDest(p, d, e.typ, + ropef("($1.ClPrc == $2.ClPrc && $1.ClEnv == $2.ClEnv)", [ + rdLoc(a), rdLoc(b)])) + else: + putIntoDest(p, d, e.typ, ropef("($1 == $2)", [rdLoc(a), rdLoc(b)])) + proc unaryArith(p: BProc, e: PNode, d: var TLoc, op: TMagic) = const unArithTab: array[mNot..mToBiggestInt, string] = ["!($1)", # Not @@ -1367,6 +1379,7 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mUnaryMinusI..mAbsI64: unaryArithOverflow(p, e, d, op) of mAddF64..mDivF64: binaryFloatArith(p, e, d, op) of mShrI..mXor: binaryArith(p, e, d, op) + of mEqProc: genEqProc(p, e, d) of mAddi..mModi64: binaryArithOverflow(p, e, d, op) of mRepr: genRepr(p, e, d) of mGetTypeInfo: genGetTypeInfo(p, e, d) diff --git a/compiler/pas2nim/pasparse.nim b/compiler/pas2nim/pasparse.nim index 2154b4add..da716c621 100755 --- a/compiler/pas2nim/pasparse.nim +++ b/compiler/pas2nim/pasparse.nim @@ -1032,7 +1032,7 @@ proc identVis(p: var TParser): PNode = getTok(p) type - TSymbolParser = proc (p: var TParser): PNode + TSymbolParser = proc (p: var TParser): PNode {.nimcall.} proc rawIdent(p: var TParser): PNode = result = createIdentNodeP(p.tok.ident, p) |