86a5f3144f2d — Vesa Norilo 5 years ago
avoid tricky in-place new to eliminate source of memory clobbering
1 files changed, 14 insertions(+), 14 deletions(-)

M Pure-Data/pd.cpp
M Pure-Data/pd.cpp +14 -14
@@ 62,7 62,7 @@ struct t_wrapper {
 	t_object x_obj;
 	float reserved;
 	Class* cls;
-	Instance inst;
+	Instance* inst = nullptr;
 };
 
 class Class : public IConfigurator {

          
@@ 167,9 167,9 @@ class Class : public IConfigurator {
 		auto scratch = (const char* const)alloca(p.ksym->size);
 		auto writePtr = scratch;
 		PdToBlob(p.ksym->type_descriptor, writePtr, argc, argv);
-		*k->var(w->inst.kstate.get(), p.slot) = (void*)scratch;
+		*k->var(w->inst->kstate.get(), p.slot) = (void*)scratch;
 		if (p.ksym->process) {
-			p.ksym->process(w->inst.kstate.get(), outScratch.get(), 1);
+			p.ksym->process(w->inst->kstate.get(), outScratch.get(), 1);
 		}
 	}
 

          
@@ 216,7 216,7 @@ class Class : public IConfigurator {
 	}
 
 	static void PdResetProc(t_wrapper* w, t_symbol*, int, t_atom*) {
-		w->cls->K()->construct(w->inst.kstate.get(), nullptr);
+		w->cls->K()->construct(w->inst->kstate.get(), nullptr);
 	}
 
 public:

          
@@ 255,13 255,13 @@ public:
 
 	void AddConnections(t_wrapper* wrap) {
 		for (int i = 1; i < signalSlots.size(); ++i) {
-			wrap->inst.inlets.emplace_front(
+			wrap->inst->inlets.emplace_front(
 				signalinlet_new(&wrap->x_obj, wrap->reserved),
 				inlet_free);
 		}
 
 		for (auto& p : parameters) {
-			wrap->inst.inlets.emplace_front(
+			wrap->inst->inlets.emplace_front(
 				inlet_new(&wrap->x_obj, &wrap->x_obj.ob_pd,
 						  p.dim > 1 ? &s_list : &s_float,
 						  p.pdsym),

          
@@ 269,7 269,7 @@ public:
 		}
 
 		for (int i = 0; i < numOutChannels; ++i) {
-			wrap->inst.outlets.emplace_front(
+			wrap->inst->outlets.emplace_front(
 				outlet_new(&wrap->x_obj, &s_signal),
 				outlet_free);
 		}

          
@@ 279,8 279,8 @@ public:
 		CONSOLE("Constructing %s (%i args)", name.c_str(), argc);
 		t_wrapper* wrap = (t_wrapper*)pd_new(Pd());
 		wrap->cls = this;
-		new (&wrap->inst) Instance();
-		wrap->inst.kstate = ConstructInstance();
+		wrap->inst = new Instance;
+		wrap->inst->kstate = ConstructInstance();
 		AddConnections(wrap);
 
 		// constructor args

          
@@ 296,21 296,21 @@ public:
 	}
 
 	void Perform(t_wrapper* wrap, t_signal** sig) {
-		auto ki = wrap->inst.kstate.get();
+		auto ki = wrap->inst->kstate.get();
 		for (int i = 0; i < signalSlots.size(); ++i) {
 			float* ptr = sig[i]->s_vec;
 			*k->var(ki, signalSlots[i].kslot) = ptr;
 		}
 
 		if (audioClock) {
-			audioClock(ki, wrap->inst.outBuffer.data(), sig[0]->s_n);
+			audioClock(ki, wrap->inst->outBuffer.data(), sig[0]->s_n);
 
 			float** outChannels = (float**)alloca(sizeof(float*) * numOutChannels);
 			
 			for (int i = 0; i < numOutChannels; ++i) {
 				outChannels[i] = sig[signalSlots.size() + i]->s_vec;
 			}
-			Deinterleave(outChannels, wrap->inst.outBuffer.data(), sig[0]->s_n, numOutChannels);
+			Deinterleave(outChannels, wrap->inst->outBuffer.data(), sig[0]->s_n, numOutChannels);
 		}		
 	}
 

          
@@ 326,7 326,7 @@ public:
 		std::vector<t_int> signals(1); 
 		signals[0] = (t_int)wrap;
 
-		wrap->inst.outBuffer.resize(sys_getblksize() * numOutChannels);
+		wrap->inst->outBuffer.resize(sys_getblksize() * numOutChannels);
 
 		for (auto& s : signalSlots) {
 			signals.emplace_back((t_int)*sp++);

          
@@ 350,7 350,7 @@ public:
 };
 
 void Destructor(t_wrapper* wrap) {
-	wrap->inst.~Instance();
+	delete wrap->inst;
 }
 
 t_class* Declare(std::string name, krt_class* k, t_newmethod constructor) {