Changeset: 357a46fdd0da for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=357a46fdd0da
Modified Files:
        gdk/gdk.h
        gdk/gdk_atoms.h
Branch: default
Log Message:

Split ATOM{put,replace} into VAR and FIX versions.
This reduces the amount of code after preprocessing and makes that we
don't check the same condition multiple times.


diffs (194 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1183,7 +1183,7 @@ gdk_export bte ATOMelmshift(int sz);
                if ((b)->HT->varsized && (b)->HT->type) {               \
                        var_t _d;                                       \
                        ptr _ptr;                                       \
-                       ATOMput((b)->HT->type, (b)->HT->vheap, &_d, v); \
+                       ATOMputVAR((b)->HT->type, (b)->HT->vheap, &_d, v); \
                        if ((b)->HT->width < SIZEOF_VAR_T &&            \
                            ((b)->HT->width <= 2 ? _d - GDK_VAROFFSET : _d) >= 
((size_t) 1 << (8 * (b)->HT->width))) { \
                                /* doesn't fit in current heap, upgrade it */ \
@@ -1205,8 +1205,9 @@ gdk_export bte ATOMelmshift(int sz);
                                * (var_t *) _ptr = _d;                  \
                                break;                                  \
                        }                                               \
-               } else                                                  \
-                       ATOMput((b)->HT->type, (b)->HT->vheap, (p), v); \
+               } else {                                                \
+                       ATOMputFIX((b)->HT->type, (b)->HT->vheap, (p), v); \
+               }                                                       \
        } while (0)
 #define Hputvalue(b, p, v, copyall)    HTputvalue(b, p, v, copyall, H)
 #define Tputvalue(b, p, v, copyall)    HTputvalue(b, p, v, copyall, T)
@@ -1230,7 +1231,7 @@ gdk_export bte ATOMelmshift(int sz);
                                _d = * (var_t *) _ptr;                  \
                                break;                                  \
                        }                                               \
-                       ATOMreplace((b)->HT->type, (b)->HT->vheap, &_d, v); \
+                       ATOMreplaceVAR((b)->HT->type, (b)->HT->vheap, &_d, v); \
                        if ((b)->HT->width < SIZEOF_VAR_T &&            \
                            ((b)->HT->width <= 2 ? _d - GDK_VAROFFSET : _d) >= 
((size_t) 1 << (8 * (b)->HT->width))) { \
                                /* doesn't fit in current heap, upgrade it */ \
@@ -1252,8 +1253,9 @@ gdk_export bte ATOMelmshift(int sz);
                                * (var_t *) _ptr = _d;                  \
                                break;                                  \
                        }                                               \
-               } else                                                  \
-                       ATOMreplace((b)->HT->type, (b)->HT->vheap, (p), v); \
+               } else {                                                \
+                       ATOMreplaceFIX((b)->HT->type, (b)->HT->vheap, (p), v); \
+               }                                                       \
        } while (0)
 #define Hreplacevalue(b, p, v)         HTreplacevalue(b, p, v, H)
 #define Treplacevalue(b, p, v)         HTreplacevalue(b, p, v, T)
diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h
--- a/gdk/gdk_atoms.h
+++ b/gdk/gdk_atoms.h
@@ -216,77 +216,84 @@ gdk_export const ptr ptr_nil;
  * of BATs but also BATs of ODMG odSet) can never be persistent, as
  * this would make the commit tremendously complicated.
  */
-#define ATOMput(type, heap, dst, src)                                  \
+#define ATOMputVAR(type, heap, dst, src)                               \
+       do {                                                            \
+               assert(BATatoms[type].atomPut != NULL);                 \
+               if ((*BATatoms[type].atomPut)(heap, dst, src) == 0)     \
+                       goto bunins_failed;                             \
+       } while (0)
+#define ATOMputFIX(type, heap, dst, src)                               \
        do {                                                            \
                int t_ = (type);                                        \
-               ptr d_ = (ptr) (dst);                                   \
-               ptr s_ = (ptr) (src);                                   \
+               void *d_ = (dst);                                       \
+               const void *s_ = (src);                                 \
                                                                        \
-               if (BATatoms[t_].atomPut) {                             \
-                       if ((*BATatoms[t_].atomPut)((heap), (var_t *) d_, s_) 
== 0) \
-                               goto bunins_failed;                     \
-               } else {                                                \
-                       ATOMfix(t_, s_);                                \
-                       switch (BATatoms[t_].size) {                    \
-                       case 0:         /* void */                      \
-                               break;                                  \
-                       case 1:                                         \
-                               * (bte *) d_ = * (bte *) s_;            \
-                               break;                                  \
-                       case 2:                                         \
-                               * (sht *) d_ = * (sht *) s_;            \
-                               break;                                  \
-                       case 4:                                         \
-                               * (int *) d_ = * (int *) s_;            \
-                               break;                                  \
-                       case 8:                                         \
-                               * (lng *) d_ = * (lng *) s_;            \
-                               break;                                  \
-                       default:                                        \
-                               memcpy(d_, s_, (size_t) BATatoms[t_].size); \
-                               break;                                  \
-                       }                                               \
+               assert(BATatoms[t_].atomPut == NULL);                   \
+               ATOMfix(t_, s_);                                        \
+               switch (BATatoms[t_].size) {                            \
+               case 0:         /* void */                              \
+                       break;                                          \
+               case 1:                                                 \
+                       * (bte *) d_ = * (bte *) s_;                    \
+                       break;                                          \
+               case 2:                                                 \
+                       * (sht *) d_ = * (sht *) s_;                    \
+                       break;                                          \
+               case 4:                                                 \
+                       * (int *) d_ = * (int *) s_;                    \
+                       break;                                          \
+               case 8:                                                 \
+                       * (lng *) d_ = * (lng *) s_;                    \
+                       break;                                          \
+               default:                                                \
+                       memcpy(d_, s_, (size_t) BATatoms[t_].size);     \
+                       break;                                          \
                }                                                       \
        } while (0)
 
-#define ATOMreplace(type, heap, dst, src)                              \
+#define ATOMreplaceVAR(type, heap, dst, src)                           \
        do {                                                            \
                int t_ = (type);                                        \
-               ptr d_ = (ptr) (dst);                                   \
-               ptr s_ = (ptr) (src);                                   \
+               var_t *d_ = (var_t *) (dst);                            \
+               const void *s_ = (src);                                 \
+               var_t loc_ = *d_;                                       \
+               Heap *h_ = (heap);                                      \
                                                                        \
-               if (BATatoms[t_].atomPut) {                             \
-                       var_t loc_ = * (var_t *) d_;                    \
-                       Heap *h_ = (heap);                              \
+               assert(BATatoms[t_].atomPut != NULL);                   \
+               if ((*BATatoms[t_].atomPut)(h_, &loc_, s_) == 0)        \
+                       goto bunins_failed;                             \
+               ATOMunfix(t_, d_);                                      \
+               ATOMdel(t_, h_, d_);                                    \
+               *d_ = loc_;                                             \
+               ATOMfix(t_, s_);                                        \
+       } while (0)
+#define ATOMreplaceFIX(type, heap, dst, src)                           \
+       do {                                                            \
+               int t_ = (type);                                        \
+               void *d_ = (dst);                                       \
+               const void *s_ = (src);                                 \
                                                                        \
-                       if ((*BATatoms[t_].atomPut)(h_, &loc_, s_) == 0) \
-                               goto bunins_failed;                     \
-                       ATOMunfix(t_, d_);                              \
-                       ATOMdel(t_, h_, d_);                            \
-                       * (var_t *) d_ = loc_;                          \
-                       ATOMfix(t_, s_);                                \
-               } else {                                                \
-                       ATOMfix(t_, s_);                                \
-                       ATOMunfix(t_, d_);                              \
-                       switch (BATatoms[t_].size) {                    \
-                       case 0:         /* void */                      \
-                               break;                                  \
-                       case 1:                                         \
-                               * (bte *) d_ = * (bte *) s_;            \
-                               break;                                  \
-                       case 2:                                         \
-                               * (sht *) d_ = * (sht *) s_;            \
-                               break;                                  \
-                       case 4:                                         \
-                               * (int *) d_ = * (int *) s_;            \
-                               break;                                  \
-                       case 8:                                         \
-                               * (lng *) d_ = * (lng *) s_;            \
-                               break;                                  \
-                       default:                                        \
-                               memcpy(d_, s_, (size_t) BATatoms[t_].size); \
-                               break;                                  \
-                       }                                               \
+               assert(BATatoms[t_].atomPut == NULL);                   \
+               ATOMfix(t_, s_);                                        \
+               ATOMunfix(t_, d_);                                      \
+               switch (BATatoms[t_].size) {                            \
+               case 0:      /* void */                                 \
+                       break;                                          \
+               case 1:                                                 \
+                       * (bte *) d_ = * (bte *) s_;                    \
+                       break;                                          \
+               case 2:                                                 \
+                       * (sht *) d_ = * (sht *) s_;                    \
+                       break;                                          \
+               case 4:                                                 \
+                       * (int *) d_ = * (int *) s_;                    \
+                       break;                                          \
+               case 8:                                                 \
+                       * (lng *) d_ = * (lng *) s_;                    \
+                       break;                                          \
+               default:                                                \
+                       memcpy(d_, s_, (size_t) BATatoms[t_].size);     \
+                       break;                                          \
                }                                                       \
        } while (0)
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to