diff --git a/libs/core/pxt.cpp b/libs/core/pxt.cpp index 4f6188d4..af031013 100644 --- a/libs/core/pxt.cpp +++ b/libs/core/pxt.cpp @@ -79,7 +79,7 @@ namespace pxt { intcheck(vtable->methods[0] == &RefRecord_destroy, ERR_SIZE, 3); intcheck(vtable->methods[1] == &RefRecord_print, ERR_SIZE, 4); - + void *ptr = ::operator new(vtable->numbytes); RefRecord *r = new (ptr) RefRecord(PXT_VTABLE_TO_INT(vtable)); memset(r->fields, 0, vtable->numbytes - sizeof(RefRecord)); @@ -117,7 +117,6 @@ namespace pxt { void RefObject::destroy() { ((RefObjectMethod)getVTable()->methods[0])(this); - delete this; } void RefObject::print() { @@ -132,6 +131,9 @@ namespace pxt { if (refmask[i]) decr(r->fields[i]); r->fields[i] = 0; } + //RefRecord is allocated using placement new + r->~RefRecord(); + ::operator delete(r); } void RefRecord_print(RefRecord *r) @@ -242,6 +244,7 @@ namespace pxt { this->data[i] = 0; } this->data.resize(0); + delete this; } void RefCollection::print() @@ -258,6 +261,9 @@ namespace pxt { decr(fields[i]); fields[i] = 0; } + //RefAction is allocated using placement new + this->~RefAction(); + ::operator delete(this); } void RefAction::print() @@ -272,6 +278,7 @@ namespace pxt { void RefLocal::destroy() { + delete this; } PXT_VTABLE_CTOR(RefLocal) { @@ -290,6 +297,7 @@ namespace pxt { void RefRefLocal::destroy() { decr(v); + delete this; } PXT_VTABLE_BEGIN(RefMap, 0, RefMapMarker) @@ -304,6 +312,7 @@ namespace pxt { data[i].val = 0; } data.resize(0); + delete this; } int RefMap::findIdx(uint32_t key) { @@ -328,7 +337,7 @@ namespace pxt { for(std::set::iterator itr = allptrs.begin();itr!=allptrs.end();itr++) { (*itr)->print(); - } + } printf("\n"); } #else @@ -341,16 +350,16 @@ namespace pxt { // --------------------------------------------------------------------------- map, Action> handlersMap; - + MicroBitEvent lastEvent; // We have the invariant that if [dispatchEvent] is registered against the DAL // for a given event, then [handlersMap] contains a valid entry for that // event. void dispatchEvent(MicroBitEvent e) { - + lastEvent = e; - + Action curr = handlersMap[{ e.source, e.value }]; if (curr) runAction1(curr, e.value); @@ -383,7 +392,7 @@ namespace pxt { create_fiber((void(*)(void*))runAction0, (void*)a, fiberDone); } } - + void error(ERROR code, int subcode) { @@ -435,10 +444,10 @@ namespace pxt { // unique group for radio based on source hash // ::touch_develop::micro_bit::radioDefaultGroup = programHash(); - + // repeat error 4 times and restart as needed microbit_panic_timeout(4); - + int32_t ver = *pc++; checkStr(ver == 0x4209, ":( Bad runtime version"); @@ -467,6 +476,6 @@ namespace pxt { { exec_binary((int32_t*)functionsAndBytecode); } -} +} // vim: ts=2 sw=2 expandtab