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
