r9600: fixed the intermittent failures we were getting with ejs in the build
authorAndrew Tridgell <tridge@samba.org>
Thu, 25 Aug 2005 00:57:21 +0000 (00:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:33 +0000 (13:34 -0500)
farm.
(This used to be commit b23bffcba62df954c7fb439c78b962fbd262cc5e)

source4/lib/appweb/ejs/ejsParser.c

index 871907dd10e87adf4ea9c61b55bc8cec3f177511..da7b544c90b89d95e03c9c99071c9bac17fd42bf 100644 (file)
@@ -1485,6 +1485,23 @@ static int evalCond(Ejs *ep, MprVar *lhs, int rel, MprVar *rhs)
        return 0;
 }
 
+
+/*
+  return true if this string is a valid number
+*/
+static int string_is_number(const char *s)
+{
+       char *endptr = NULL;
+       if (s == NULL || *s == 0) {
+               return 0;
+       }
+       strtod(s, &endptr);
+       if (endptr != NULL && *endptr == 0) {
+               return 1;
+       }
+       return 0;
+}
+
 /******************************************************************************/
 /*
  *     Evaluate an operation. Returns with the result in ep->result. Returns -1
@@ -1533,6 +1550,24 @@ static int evalExpr(Ejs *ep, MprVar *lhs, int rel, MprVar *rhs)
                /* Nothing more can be done */
        }
 
+       /* undefined and null are special, in that they don't get promoted when
+          comparing */
+       if (rel == EJS_EXPR_EQ || rel == EJS_EXPR_NOTEQ) {
+               if (lhs->type == MPR_TYPE_UNDEFINED || rhs->type == MPR_TYPE_UNDEFINED) {
+                       return evalBoolExpr(ep, 
+                                                               lhs->type == MPR_TYPE_UNDEFINED, 
+                                                               rel, 
+                                                               rhs->type == MPR_TYPE_UNDEFINED);
+               }
+
+               if (lhs->type == MPR_TYPE_NULL || rhs->type == MPR_TYPE_NULL) {
+                       return evalBoolExpr(ep, 
+                                                               lhs->type == MPR_TYPE_NULL, 
+                                                               rel, 
+                                                               rhs->type == MPR_TYPE_NULL);
+               }
+       }
+
        /*
         *      From here on, lhs and rhs may contain allocated data (strings), so 
         *      we must always destroy before overwriting.
@@ -1556,7 +1591,7 @@ static int evalExpr(Ejs *ep, MprVar *lhs, int rel, MprVar *rhs)
         */
        if (lhs->type != rhs->type) {
                if (lhs->type == MPR_TYPE_STRING) {
-                       if (isdigit((int) lhs->string[0])) {
+                       if (string_is_number(lhs->string)) {
                                num = mprVarToNumber(lhs);
                                lhs->allocatedVar = 0;
                                mprDestroyVar(lhs);