diff options
| author | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-05-25 16:37:58 +0000 |
|---|---|---|
| committer | ttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-05-25 16:37:58 +0000 |
| commit | 0444600dcb708e8c8f97da88118e51424859d2e7 (patch) | |
| tree | 1f9cf93122e8968c2ee84d07b376fbed0b2005af /ext/dl/ptr.c | |
| parent | f9fb87a0fc28e906e4d50482ff5da037c915c41c (diff) | |
| download | ruby-0444600dcb708e8c8f97da88118e51424859d2e7.tar.gz ruby-0444600dcb708e8c8f97da88118e51424859d2e7.tar.xz ruby-0444600dcb708e8c8f97da88118e51424859d2e7.zip | |
* fixed the problems described in [ruby-dev:28665].
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@10191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl/ptr.c')
| -rw-r--r-- | ext/dl/ptr.c | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/ext/dl/ptr.c b/ext/dl/ptr.c index 32f78c4de..59de4d8c9 100644 --- a/ext/dl/ptr.c +++ b/ext/dl/ptr.c @@ -753,32 +753,32 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self) switch (data->ctype) { case DLPTR_CTYPE_STRUCT: for (i=0; i < data->ids_num; i++) { + switch (data->stype[i]) { + case 'I': + DLALIGN(data->ptr,offset,INT_ALIGN); + break; + case 'L': + DLALIGN(data->ptr,offset,LONG_ALIGN); + break; + case 'P': + case 'S': + DLALIGN(data->ptr,offset,VOIDP_ALIGN); + break; + case 'F': + DLALIGN(data->ptr,offset,FLOAT_ALIGN); + break; + case 'D': + DLALIGN(data->ptr,offset,DOUBLE_ALIGN); + break; + case 'C': + break; + case 'H': + DLALIGN(data->ptr,offset,SHORT_ALIGN); + break; + default: + rb_raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]); + } if (data->ids[i] == id) { - switch (data->stype[i]) { - case 'I': - DLALIGN(data->ptr,offset,INT_ALIGN); - break; - case 'L': - DLALIGN(data->ptr,offset,LONG_ALIGN); - break; - case 'P': - case 'S': - DLALIGN(data->ptr,offset,VOIDP_ALIGN); - break; - case 'F': - DLALIGN(data->ptr,offset,FLOAT_ALIGN); - break; - case 'D': - DLALIGN(data->ptr,offset,DOUBLE_ALIGN); - break; - case 'C': - break; - case 'H': - DLALIGN(data->ptr,offset,SHORT_ALIGN); - break; - default: - rb_raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]); - } return cary2ary((char *)data->ptr + offset, data->stype[i], data->ssize[i]); } switch (data->stype[i]) { @@ -883,34 +883,35 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self) case DLPTR_CTYPE_STRUCT: offset = 0; for (i=0; i < data->ids_num; i++) { + switch (data->stype[i]) { + case 'I': + DLALIGN(data->ptr,offset,INT_ALIGN); + break; + case 'L': + DLALIGN(data->ptr,offset,LONG_ALIGN); + break; + case 'P': + case 'S': + DLALIGN(data->ptr,offset,VOIDP_ALIGN); + break; + case 'D': + DLALIGN(data->ptr,offset,DOUBLE_ALIGN); + break; + case 'F': + DLALIGN(data->ptr,offset,FLOAT_ALIGN); + break; + case 'C': + break; + case 'H': + DLALIGN(data->ptr,offset,SHORT_ALIGN); + break; + default: + rb_raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]); + } if (data->ids[i] == id) { - switch (data->stype[i]) { - case 'I': - DLALIGN(data->ptr,offset,INT_ALIGN); - break; - case 'L': - DLALIGN(data->ptr,offset,LONG_ALIGN); - break; - case 'P': - case 'S': - DLALIGN(data->ptr,offset,VOIDP_ALIGN); - break; - case 'D': - DLALIGN(data->ptr,offset,DOUBLE_ALIGN); - break; - case 'F': - DLALIGN(data->ptr,offset,FLOAT_ALIGN); - break; - case 'C': - break; - case 'H': - DLALIGN(data->ptr,offset,SHORT_ALIGN); - break; - default: - rb_raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]); - } memimg = ary2cary(data->stype[i], val, &memsize); memcpy((char *)data->ptr + offset, memimg, memsize); + dlfree(memimg); return val; } switch (data->stype[i]) { @@ -981,6 +982,7 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self) } memimg = ary2cary(data->stype[i], val, NULL); memcpy(data->ptr, memimg, memsize); + dlfree(memimg); } } return val; |
