Changeset: c04da1211cf0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c04da1211cf0
Modified Files:
        gdk/gdk_atoms.c
Branch: resultset
Log Message:

Squeeze some CPU cycles.
Avoid work by looking at the expected input first.


diffs (143 lines):

diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -591,6 +591,19 @@ batWrite(const bat *a, stream *s, size_t
  * incorrect syntax (not a number) result in the function returning 0
  * and setting the destination to nil.
  */
+#define parseNum() \
+       do {\
+               if (base > maxdiv10 ||\
+                   (base == maxdiv10 && base10(*p) > maxmod10)) {\
+                       /* overflow */\
+                       memcpy(*dst, ATOMnilptr(tp), sz);\
+                       return 0;\
+               }\
+               base = 10 * base + base10(*p);\
+               p++;\
+       } while (num10(*p));\
+       base *= sign;
+
 static int
 numFromStr(const char *src, int *len, void **dst, int tp)
 {
@@ -609,69 +622,59 @@ numFromStr(const char *src, int *len, vo
        atommem(void, sz);
        while (GDKisspace(*p))
                p++;
-       memcpy(*dst, ATOMnilptr(tp), sz);
-       if (p[0] == 'n' && p[1] == 'i' && p[2] == 'l') {
-               p += 3;
-               return (int) (p - src);
-       }
-       if (*p == '-') {
-               sign = -1;
-               p++;
-       } else if (*p == '+') {
-               p++;
-       }
        if (!num10(*p)) {
+               if (*p == '-') {
+                       sign = -1;
+                       p++;
+                       if (!num10(*p)) {
+                               memcpy(*dst, ATOMnilptr(tp), sz);
+                               return 0;
+                       }
+                       goto parsenum;
+               } 
+               if (*p == '+') {
+                       p++;
+                       if (!num10(*p)) {
+                               memcpy(*dst, ATOMnilptr(tp), sz);
+                               return 0;
+                       }
+                       goto parsenum;
+               }
+               memcpy(*dst, ATOMnilptr(tp), sz);
+               if (p[0] == 'n' && p[1] == 'i' && p[2] == 'l') {
+                       p += 3;
+                       return (int) (p - src);
+               }
                /* not a number */
                return 0;
        }
-       switch (sz) {
-       case 1:
-               maxdiv10 = 12/*7*/;
-               break;
-       case 2:
-               maxdiv10 = 3276/*7*/;
-               break;
-       case 4:
-               maxdiv10 = 214748364/*7*/;
-               break;
-       case 8:
-               maxdiv10 = LL_CONSTANT(922337203685477580)/*7*/;
-               break;
-#ifdef HAVE_HGE
-       case 16:
-               maxdiv10 = GDK_hge_max / 10;
-               //         17014118346046923173168730371588410572/*7*/;
-               break;
-#endif
-       }
-       do {
-               if (base > maxdiv10 ||
-                   (base == maxdiv10 && base10(*p) > maxmod10)) {
-                       /* overflow */
-                       return 0;
-               }
-               base = 10 * base + base10(*p);
-               p++;
-       } while (num10(*p));
-       base *= sign;
+parsenum:
        switch (sz) {
        case 1: {
                bte **dstbte = (bte **) dst;
+               maxdiv10 = 12/*7*/;
+               parseNum();
                **dstbte = (bte) base;
                break;
        }
        case 2: {
                sht **dstsht = (sht **) dst;
+               maxdiv10 = 3276/*7*/;
+               parseNum();
                **dstsht = (sht) base;
                break;
        }
        case 4: {
                int **dstint = (int **) dst;
+               maxdiv10 = 214748364/*7*/;
+               parseNum();
                **dstint = (int) base;
                break;
        }
        case 8: {
                lng **dstlng = (lng **) dst;
+               maxdiv10 = LL_CONSTANT(922337203685477580)/*7*/;
+               parseNum();
                **dstlng = (lng) base;
                if (p[0] == 'L' && p[1] == 'L')
                        p += 2;
@@ -680,12 +683,18 @@ numFromStr(const char *src, int *len, vo
 #ifdef HAVE_HGE
        case 16: {
                hge **dsthge = (hge **) dst;
+               maxdiv10 = GDK_hge_max / 10;
+               //         17014118346046923173168730371588410572/*7*/;
+               parseNum();
                **dsthge = (hge) base;
                if (p[0] == 'L' && p[1] == 'L')
                        p += 2;
                break;
        }
 #endif
+       default:
+               memcpy(*dst, ATOMnilptr(tp), sz);
+               parseNum();
        }
        while (GDKisspace(*p))
                p++;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to