Mercurial > repos > rhope
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 |