Skip to content

Commit

Permalink
Fix new/delete operators
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulStoffregen committed Nov 17, 2013
1 parent e435d02 commit ee66b4f
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 23 deletions.
3 changes: 3 additions & 0 deletions teensy/Printable.h
Expand Up @@ -21,6 +21,8 @@
#ifndef Printable_h
#define Printable_h

#ifdef __cplusplus

#include "new.h"

class Print;
Expand All @@ -38,3 +40,4 @@ class Printable

#endif
#endif
#endif
22 changes: 16 additions & 6 deletions teensy/new.cpp
@@ -1,18 +1,28 @@
#include <new.h>
#include "new.h"

void * operator new(size_t size)
{
return malloc(size);
}

void * operator new[](size_t size)
{
return malloc(size);
}

void operator delete(void * ptr)
{
free(ptr);
}
}

void operator delete[](void * ptr)
{
free(ptr);
}

int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
void __cxa_guard_abort (__guard *) {};
//int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
//void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
//void __cxa_guard_abort (__guard *) {};

void __cxa_pure_virtual(void) {};
//void __cxa_pure_virtual(void) {};

10 changes: 7 additions & 3 deletions teensy/new.h
Expand Up @@ -5,18 +5,22 @@
#ifndef NEW_H
#define NEW_H

#ifdef __cplusplus

#include <stdlib.h>

void * operator new(size_t size);
void operator delete(void * ptr);
void * operator new[](size_t size);
void operator delete(void * ptr);
void operator delete[](void * ptr);

__extension__ typedef int __guard __attribute__((mode (__DI__)));

extern "C" int __cxa_guard_acquire(__guard *);
extern "C" void __cxa_guard_release (__guard *);
extern "C" void __cxa_guard_abort (__guard *);

extern "C" void __cxa_pure_virtual(void);

#endif
#endif // __cplusplus

#endif
15 changes: 1 addition & 14 deletions teensy3/Printable.h
Expand Up @@ -22,20 +22,7 @@

#ifdef __cplusplus

#include <stdlib.h>

inline void * operator new(unsigned int size) __attribute__((always_inline, unused));
inline void * operator new(unsigned int size)
{
return malloc(size);
}

inline void operator delete(void * ptr) __attribute__((always_inline, unused));
inline void operator delete(void * ptr)
{
free(ptr);
}

#include "new.h"

class Print;

Expand Down
28 changes: 28 additions & 0 deletions teensy3/new.cpp
@@ -0,0 +1,28 @@
#include "new.h"

void * operator new(size_t size)
{
return malloc(size);
}

void * operator new[](size_t size)
{
return malloc(size);
}

void operator delete(void * ptr)
{
free(ptr);
}

void operator delete[](void * ptr)
{
free(ptr);
}

//int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
//void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
//void __cxa_guard_abort (__guard *) {};

//void __cxa_pure_virtual(void) {};

26 changes: 26 additions & 0 deletions teensy3/new.h
@@ -0,0 +1,26 @@
/* Header to define new/delete operators as they aren't provided by avr-gcc by default
Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
*/

#ifndef NEW_H
#define NEW_H

#ifdef __cplusplus

#include <stdlib.h>

void * operator new(size_t size);
void * operator new[](size_t size);
void operator delete(void * ptr);
void operator delete[](void * ptr);

__extension__ typedef int __guard __attribute__((mode (__DI__)));

extern "C" int __cxa_guard_acquire(__guard *);
extern "C" void __cxa_guard_release (__guard *);
extern "C" void __cxa_guard_abort (__guard *);
extern "C" void __cxa_pure_virtual(void);

#endif // __cplusplus

#endif

0 comments on commit ee66b4f

Please sign in to comment.