comparison runtime/array.c @ 97:fa437d23bb24

fix memory corruption bug
author Mike Pavone <pavone@retrodev.com>
date Tue, 03 Aug 2010 22:38:25 -0400
parents 5a08705f7610
children 7428aa5d6ade
comparison
equal deleted inserted replaced
96:5a08705f7610 97:fa437d23bb24
1 #include "integer.h" 1 #include "integer.h"
2 #include "object.h" 2 #include "object.h"
3 #include <stdio.h>
3 4
4 void _internal_array_copyout(object * array, int32_t index, object * dest) 5 void _internal_array_copyout(object * array, int32_t index, object * dest)
5 { 6 {
6 t_Array * arr = (t_Array *)array; 7 t_Array * arr = (t_Array *)array;
7 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size); 8 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size);
74 } 75 }
75 76
76 object * _internal_array_allocnakedcopy(object * osource, int32_t size) 77 object * _internal_array_allocnakedcopy(object * osource, int32_t size)
77 { 78 {
78 int32_t tocopy,idx; 79 int32_t tocopy,idx;
79 object *cur; 80 char *cur;
80 t_Array * ret, *source = (t_Array *)osource; 81 t_Array * ret, *source = (t_Array *)osource;
81 t_Blueprint * bp = source->payload.Eltype; 82 t_Blueprint * bp = source->payload.Eltype;
82 83
83 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); 84 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
84 ret->payload.Length = 0; 85 ret->payload.Length = 0;
85 ret->payload.Storage = size; 86 ret->payload.Storage = size;
86 add_ref((object *)bp); 87 add_ref((object *)bp);
87 ret->payload.Eltype = bp; 88 ret->payload.Eltype = bp;
88 tocopy = size < source->payload.Length ? size : source->payload.Length; 89 tocopy = size < source->payload.Length ? size : source->payload.Length;
89
90 memcpy(ret+1, source+1, tocopy*bp->bp->size); 90 memcpy(ret+1, source+1, tocopy*bp->bp->size);
91 //Lower type IDs don't have any reference params so we can safely skip this for those 91 //Lower type IDs don't have any reference params so we can safely skip this for those
92 if(bp->bp->type_id >= TYPE_ARRAY) 92 if(bp->bp->type_id >= TYPE_ARRAY)
93 { 93 {
94 //Ugly hack 94 //Ugly hack
97 { 97 {
98 bp->bp->copy((object *)cur); 98 bp->bp->copy((object *)cur);
99 cur += bp->bp->size; 99 cur += bp->bp->size;
100 } 100 }
101 } 101 }
102 fflush(stdout);
102 release_ref(osource); 103 release_ref(osource);
103 104
104 return (object *)ret; 105 return (object *)ret;
105 } 106 }
106 107