/**************************************************************************
*
- * Copyright 2011 Jose Fonseca
+ * Copyright 2011-2012 Jose Fonseca
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
};
+/**
+ * Similar to alloca(), but implemented with malloc.
+ */
+class ScopedAllocator
+{
+private:
+ void *next;
+
+public:
+ ScopedAllocator() :
+ next(NULL) {
+ }
+
+ inline void *
+ alloc(size_t size) {
+ if (!size) {
+ return NULL;
+ }
+
+ void * * buf = static_cast<void **>(malloc(sizeof(void *) + size));
+ if (!buf) {
+ return NULL;
+ }
+
+ *buf = next;
+ next = buf;
+
+ return &buf[1];
+ }
+
+ template< class T >
+ inline T *
+ alloc(size_t n = 1) {
+ return static_cast<T *>(alloc(sizeof(T) * n));
+ }
+
+ inline
+ ~ScopedAllocator() {
+ while (next) {
+ void *temp = *static_cast<void **>(next);
+ free(next);
+ next = temp;
+ }
+ }
+};
+
+
void
addRegion(unsigned long long address, void *buffer, unsigned long long size);
print ' const trace::Array *__a%s = dynamic_cast<const trace::Array *>(&%s);' % (array.tag, rvalue)
print ' if (__a%s) {' % (array.tag)
length = '__a%s->values.size()' % array.tag
- print ' %s = new %s[%s];' % (lvalue, array.type, length)
+ print ' %s = _allocator.alloc<%s>(%s);' % (lvalue, array.type, length)
index = '__j' + array.tag
print ' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
try:
def visitPointer(self, pointer, lvalue, rvalue):
print ' const trace::Array *__a%s = dynamic_cast<const trace::Array *>(&%s);' % (pointer.tag, rvalue)
print ' if (__a%s) {' % (pointer.tag)
- print ' %s = new %s;' % (lvalue, pointer.type)
+ print ' %s = _allocator.alloc<%s>();' % (lvalue, pointer.type)
try:
self.visit(pointer.type, '%s[0]' % (lvalue,), '*__a%s->values[0]' % (pointer.tag,))
finally:
print ' (void)call;'
return
+ print ' retrace::ScopedAllocator _allocator;'
+ print ' (void)_allocator;'
success = True
for arg in function.args:
arg_type = ConstRemover().visit(arg.type)