From: <dav...@us...> - 2012-09-12 10:57:37
|
Revision: 5032 http://qore.svn.sourceforge.net/qore/?rev=5032&view=rev Author: david_nichols Date: 2012-09-12 10:57:26 +0000 (Wed, 12 Sep 2012) Log Message: ----------- fixed the unary minus operator with "number" values Modified Paths: -------------- qore/trunk/include/qore/intern/qore_number_private.h qore/trunk/lib/QoreUnaryMinusOperatorNode.cpp Modified: qore/trunk/include/qore/intern/qore_number_private.h =================================================================== --- qore/trunk/include/qore/intern/qore_number_private.h 2012-09-12 10:45:15 UTC (rev 5031) +++ qore/trunk/include/qore/intern/qore_number_private.h 2012-09-12 10:57:26 UTC (rev 5032) @@ -224,11 +224,17 @@ } DLLLOCAL qore_number_private* negate() const { - qore_number_private* p = new qore_number_private(mpfr_get_prec(num)); - mpfr_neg(p->num, num, QORE_MPFR_RND); + qore_number_private* p = new qore_number_private(*this); + mpfr_neg(p->num, p->num, QORE_MPFR_RND); return p; } + DLLLOCAL qore_number_private* absolute() const { + qore_number_private* p = new qore_number_private(*this); + mpfr_abs(p->num, p->num, QORE_MPFR_RND); + return p; + } + DLLLOCAL void inc() { MPFR_DECL_INIT(tmp, mpfr_get_prec(num)); mpfr_set(tmp, num, QORE_MPFR_RND); Modified: qore/trunk/lib/QoreUnaryMinusOperatorNode.cpp =================================================================== --- qore/trunk/lib/QoreUnaryMinusOperatorNode.cpp 2012-09-12 10:45:15 UTC (rev 5031) +++ qore/trunk/lib/QoreUnaryMinusOperatorNode.cpp 2012-09-12 10:57:26 UTC (rev 5032) @@ -41,6 +41,8 @@ return 0; if (v) { + if (v->getType() == NT_NUMBER) + return reinterpret_cast<const QoreNumberNode*>(*v)->negate(); if (v->getType() == NT_FLOAT) return new QoreFloatNode(-reinterpret_cast<const QoreFloatNode *>(*v)->f); if (v->getType() == NT_DATE) @@ -89,6 +91,10 @@ typeInfo = bigIntTypeInfo; return new QoreBigIntNode(-reinterpret_cast<const QoreBigIntNode *>(exp)->val); } + if (t == NT_NUMBER) { + typeInfo = numberTypeInfo; + return reinterpret_cast<const QoreNumberNode*>(exp)->negate(); + } if (t == NT_FLOAT) { typeInfo = floatTypeInfo; return new QoreFloatNode(-reinterpret_cast<const QoreFloatNode *>(exp)->f); @@ -104,6 +110,8 @@ if (typeInfo->hasType()) { if (typeInfo->isType(NT_FLOAT)) typeInfo = floatTypeInfo; + else if (typeInfo->isType(NT_NUMBER)) + typeInfo = numberTypeInfo; else if (typeInfo->isType(NT_DATE)) typeInfo = dateTypeInfo; else if (typeInfo->isType(NT_INT)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |