Commit f0c1aee1 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Try to avoid unnecessary tuple zero-initialization

parent 3763b7b3
...@@ -126,8 +126,7 @@ int BoxedTuple::Resize(BoxedTuple** pv, size_t newsize) noexcept { ...@@ -126,8 +126,7 @@ int BoxedTuple::Resize(BoxedTuple** pv, size_t newsize) noexcept {
return 0; return 0;
} }
BoxedTuple* resized = new (newsize) BoxedTuple* resized = new (newsize) BoxedTuple();
BoxedTuple(newsize); // we want an uninitialized tuple, but this will memset it with 0.
memmove(resized->elts, t->elts, sizeof(Box*) * t->size()); memmove(resized->elts, t->elts, sizeof(Box*) * t->size());
*pv = resized; *pv = resized;
......
...@@ -566,32 +566,36 @@ public: ...@@ -566,32 +566,36 @@ public:
class BoxedTuple : public BoxVar { class BoxedTuple : public BoxVar {
public: public:
static BoxedTuple* create(int64_t size) { return new (size) BoxedTuple(size); } static BoxedTuple* create(int64_t size) {
BoxedTuple* rtn = new (size) BoxedTuple();
memset(rtn->elts, 0, size * sizeof(Box*)); // TODO not all callers want this (but some do)
return rtn;
}
static BoxedTuple* create(int64_t nelts, Box** elts) { static BoxedTuple* create(int64_t nelts, Box** elts) {
BoxedTuple* rtn = new (nelts) BoxedTuple(nelts); BoxedTuple* rtn = new (nelts) BoxedTuple();
memmove(&rtn->elts[0], elts, sizeof(Box*) * nelts); memmove(&rtn->elts[0], elts, sizeof(Box*) * nelts);
return rtn; return rtn;
} }
static BoxedTuple* create1(Box* elt0) { static BoxedTuple* create1(Box* elt0) {
BoxedTuple* rtn = new (1) BoxedTuple(1); BoxedTuple* rtn = new (1) BoxedTuple();
rtn->elts[0] = elt0; rtn->elts[0] = elt0;
return rtn; return rtn;
} }
static BoxedTuple* create2(Box* elt0, Box* elt1) { static BoxedTuple* create2(Box* elt0, Box* elt1) {
BoxedTuple* rtn = new (2) BoxedTuple(2); BoxedTuple* rtn = new (2) BoxedTuple();
rtn->elts[0] = elt0; rtn->elts[0] = elt0;
rtn->elts[1] = elt1; rtn->elts[1] = elt1;
return rtn; return rtn;
} }
static BoxedTuple* create3(Box* elt0, Box* elt1, Box* elt2) { static BoxedTuple* create3(Box* elt0, Box* elt1, Box* elt2) {
BoxedTuple* rtn = new (3) BoxedTuple(3); BoxedTuple* rtn = new (3) BoxedTuple();
rtn->elts[0] = elt0; rtn->elts[0] = elt0;
rtn->elts[1] = elt1; rtn->elts[1] = elt1;
rtn->elts[2] = elt2; rtn->elts[2] = elt2;
return rtn; return rtn;
} }
static BoxedTuple* create4(Box* elt0, Box* elt1, Box* elt2, Box* elt3) { static BoxedTuple* create4(Box* elt0, Box* elt1, Box* elt2, Box* elt3) {
BoxedTuple* rtn = new (4) BoxedTuple(4); BoxedTuple* rtn = new (4) BoxedTuple();
rtn->elts[0] = elt0; rtn->elts[0] = elt0;
rtn->elts[1] = elt1; rtn->elts[1] = elt1;
rtn->elts[2] = elt2; rtn->elts[2] = elt2;
...@@ -599,7 +603,7 @@ public: ...@@ -599,7 +603,7 @@ public:
return rtn; return rtn;
} }
static BoxedTuple* create5(Box* elt0, Box* elt1, Box* elt2, Box* elt3, Box* elt4) { static BoxedTuple* create5(Box* elt0, Box* elt1, Box* elt2, Box* elt3, Box* elt4) {
BoxedTuple* rtn = new (5) BoxedTuple(5); BoxedTuple* rtn = new (5) BoxedTuple();
rtn->elts[0] = elt0; rtn->elts[0] = elt0;
rtn->elts[1] = elt1; rtn->elts[1] = elt1;
rtn->elts[2] = elt2; rtn->elts[2] = elt2;
...@@ -610,17 +614,20 @@ public: ...@@ -610,17 +614,20 @@ public:
static BoxedTuple* create(std::initializer_list<Box*> members) { return new (members.size()) BoxedTuple(members); } static BoxedTuple* create(std::initializer_list<Box*> members) { return new (members.size()) BoxedTuple(members); }
static BoxedTuple* create(int64_t size, BoxedClass* cls) { static BoxedTuple* create(int64_t size, BoxedClass* cls) {
BoxedTuple* rtn;
if (cls == tuple_cls) if (cls == tuple_cls)
return new (size) BoxedTuple(size); rtn = new (size) BoxedTuple();
else else
return new (cls, size) BoxedTuple(size); rtn = new (cls, size) BoxedTuple();
memset(rtn->elts, 0, size * sizeof(Box*)); // TODO not all callers want this (but some do)
return rtn;
} }
static BoxedTuple* create(int64_t nelts, Box** elts, BoxedClass* cls) { static BoxedTuple* create(int64_t nelts, Box** elts, BoxedClass* cls) {
BoxedTuple* rtn; BoxedTuple* rtn;
if (cls == tuple_cls) if (cls == tuple_cls)
rtn = new (nelts) BoxedTuple(nelts); rtn = new (nelts) BoxedTuple();
else else
rtn = new (cls, nelts) BoxedTuple(nelts); rtn = new (cls, nelts) BoxedTuple();
memmove(&rtn->elts[0], elts, sizeof(Box*) * nelts); memmove(&rtn->elts[0], elts, sizeof(Box*) * nelts);
return rtn; return rtn;
} }
...@@ -666,7 +673,7 @@ public: ...@@ -666,7 +673,7 @@ public:
} }
private: private:
BoxedTuple(size_t size) { memset(elts, 0, sizeof(Box*) * size); } BoxedTuple() {}
BoxedTuple(std::initializer_list<Box*>& members) { BoxedTuple(std::initializer_list<Box*>& members) {
// by the time we make it here elts[] is big enough to contain members // by the time we make it here elts[] is big enough to contain members
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment