pinning revisited
S.
S._member at pathlink.com
Fri Jul 21 11:49:05 PDT 2006
Why does that have to be a template? Can't you deduce the size from the
typeinfo's of the variadic function?
-SC
In article <e9pmt6$20j0$1 at digitaldaemon.com>, Dave says...
>
>Jason O'Brien wrote:
>> It's not that any of us need to pin right now, but that the standard
>> puts anyone using C interop in a hard place: It's not possible to write
>> forward-compatible gc safe code. We want to, but we can't, and so we
>> don't. Noone is right now, and I'm afraid the more broken code we all
>> write the less likely it is a more efficient copying collector will ever
>> be worthwhile, and if it does get done all the more code we have to
>> rewrite.
>>
>> I have a couple of ideas, but whatever we decide on we should do it soon.
>>
>
>The concern is valid and your ideas are good ones IMO. But for now we
>can always get around using the GC by using malloc/free, etc.
>
>Another idea: Why not just make it easier to de/alloc using the crt and
>place those into "auto blocks" (for now).
>
>import std.stdarg, std.c.stdlib : malloc, free;
>extern(C)
>{
> char* strncpy(char*,char*,size_t);
> size_t strlen(char*);
>}
>
>void main()
>{
> size_t len = 100;
> with(new SafeCStr(len,len))
> {
> const char[] str = "abcdefg...";
> char* s = ptrs[0], d = ptrs[1];
> strncpy(s,str,str.length);
> strncpy(d,s,str.length);
> printf("%s: %d\n",d,strlen(d));
> }
>}
>
>auto class CAlloc(T)
>{
> T*[] ptrs;
> this(...)
> {
> for(size_t idx = 0; idx < _arguments.length; idx++)
> {
> if(_arguments[idx] != typeid(int) &&
> _arguments[idx] != typeid(size_t))
> throw new Exception("wrong type of arg");
>
> long len = va_arg!(int)(_argptr);
>
> if(len < 0)
> throw new Exception("invalid allocation length");
>
> ptrs ~= cast(T*)malloc(len * T.sizeof);
>
> if(ptrs[idx] is null)
> throw new Exception("allocation failed");
> }
> }
> ~this()
> {
> foreach(inout ptr; ptrs)
> {
> if(ptr)
> {
> free(ptr);
> ptr = null;
> }
> }
> }
>}
>alias CAlloc!(char) SafeCStr;
More information about the Digitalmars-d
mailing list