summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/ast.nim2
-rwxr-xr-xcompiler/ccgexprs.nim15
-rwxr-xr-xcompiler/pas2nim/pasparse.nim2
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)