Fix valgrind cleanup of dynamic and queue arrays

This commit is contained in:
Cary R 2015-01-09 15:04:42 -08:00
parent 6310b47538
commit d29a6d134f
1 changed files with 30 additions and 18 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001-2013 Stephen Williams (steve@icarus.com) * Copyright (c) 2001-2015 Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU * and/or modify it in source code form under the terms of the GNU
@ -54,9 +54,9 @@ void port_delete(__vpiHandle*handle);
static void delete_sub_scopes(struct __vpiScope *scope) static void delete_sub_scopes(struct __vpiScope *scope)
{ {
for (unsigned idx = 0; idx < scope->nintern; idx += 1) { for (unsigned idx = 0; idx < scope->nintern; idx += 1) {
struct __vpiScope*lscope = static_cast<__vpiScope*> vpiHandle item = (scope->intern)[idx];
((scope->intern)[idx]); struct __vpiScope*lscope = static_cast<__vpiScope*>(item);
switch(scope->intern[idx]->get_type_code()) { switch(item->get_type_code()) {
case vpiFunction: case vpiFunction:
case vpiTask: case vpiTask:
contexts_delete(lscope); contexts_delete(lscope);
@ -66,18 +66,18 @@ static void delete_sub_scopes(struct __vpiScope *scope)
case vpiNamedFork: case vpiNamedFork:
delete_sub_scopes(lscope); delete_sub_scopes(lscope);
vthreads_delete(lscope); vthreads_delete(lscope);
delete (scope->intern)[idx]; delete item;
break; break;
case vpiMemory: case vpiMemory:
case vpiNetArray: case vpiNetArray:
memory_delete((scope->intern)[idx]); memory_delete(item);
break; break;
case vpiModPath: case vpiModPath:
/* The destination ModPath is cleaned up later. */ /* The destination ModPath is cleaned up later. */
delete (scope->intern)[idx]; delete item;
break; break;
case vpiNamedEvent: case vpiNamedEvent:
named_event_delete((scope->intern)[idx]); named_event_delete(item);
break; break;
case vpiNet: case vpiNet:
case vpiReg: case vpiReg:
@ -87,32 +87,44 @@ static void delete_sub_scopes(struct __vpiScope *scope)
case vpiIntVar: case vpiIntVar:
case vpiByteVar: case vpiByteVar:
case vpiBitVar: case vpiBitVar:
signal_delete((scope->intern)[idx]); signal_delete(item);
break; break;
case vpiParameter: case vpiParameter:
parameter_delete((scope->intern)[idx]); parameter_delete(item);
break; break;
case vpiRealVar: case vpiRealVar:
real_delete((scope->intern)[idx]); real_delete(item);
break; break;
case vpiEnumTypespec: case vpiEnumTypespec:
enum_delete((scope->intern)[idx]); enum_delete(item);
break; break;
case vpiPort: case vpiPort:
port_delete((scope->intern)[idx]); port_delete(item);
break; break;
case vpiStringVar: case vpiStringVar:
string_delete((scope->intern)[idx]); string_delete(item);
break; break;
case vpiClassVar: case vpiClassVar:
class_delete((scope->intern)[idx]); class_delete(item);
break; break;
case vpiRegArray: case vpiArrayVar:
darray_delete((scope->intern)[idx]); switch(item->vpi_get(vpiArrayType)) {
case vpiQueueArray:
queue_delete(item);
break;
case vpiDynamicArray:
darray_delete(item);
break;
default:
fprintf(stderr, "Need support for array type: %d\n",
item->vpi_get(vpiArrayType));
assert(0);
break;
}
break; break;
default: default:
fprintf(stderr, "Need support for type: %d\n", fprintf(stderr, "Need support for type: %d\n",
scope->intern[idx]->get_type_code()); item->get_type_code());
assert(0); assert(0);
break; break;
} }