From 6e85fad37a9d40cb02a71196fe5e6981cf255d6e Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Thu, 8 Mar 2012 17:13:32 +0100 Subject: [PATCH] Copy vector values in vpi_put_value. Like it's done for strings. --- vvp/vpi_priv.cc | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index 0d82b55..be04b31 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -948,15 +948,31 @@ void vpip_put_value_event::run_run() case vpiStringVal: free(value.value.str); break; + case vpiVectorVal: + free(value.value.vector); + break; /* If these are ever copied then free them too. */ case vpiTimeVal: - case vpiVectorVal: case vpiStrengthVal: default: break; } } +static t_vpi_vecval *copy_vector_for(vpiHandle obj, t_vpi_vecval *source) +{ + int size; + int nbytes; + t_vpi_vecval *r; + + size = vpi_get(vpiSize, obj); + nbytes = ((size + 31)/32)*sizeof(t_vpi_vecval); + r = (t_vpi_vecval *)malloc(nbytes); + assert(r); + memcpy(r, source, nbytes); + return r; +} + vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp, s_vpi_time*when, PLI_INT32 flags) { @@ -1008,9 +1024,11 @@ vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp, case vpiStringVal: put->value.value.str = strdup(put->value.value.str); break; + case vpiVectorVal: + put->value.value.vector = copy_vector_for(obj, put->value.value.vector); + break; /* Do these also need to be copied? */ case vpiTimeVal: - case vpiVectorVal: case vpiStrengthVal: default: break; -- 1.7.7.6