Commit 0d6e5db80a7adf84b972d8eadd3ba7a2a1c52b99

Authored by Georg Hopp
1 parent 5897c437

add function to create an object with a va_list pointer instead of its argument …

…list. Obviously the va_list must contain the correct values for the class constructor.
@@ -52,6 +52,13 @@ extern void * classClone(void *); @@ -52,6 +52,13 @@ extern void * classClone(void *);
52 #define delete(object) classDelete((void **)&(object)) 52 #define delete(object) classDelete((void **)&(object))
53 #define clone(object) classClone((void *)(object)) 53 #define clone(object) classClone((void *)(object))
54 54
  55 +/**
  56 + * With this one we can create a new instance via a
  57 + * intermidiary that gets the arguments.
  58 + */
  59 +extern void * classNewParams(class_ptr, va_list *);
  60 +#define newParams(class,args) classNewParams(_##class, args)
  61 +
55 #endif // __CLASS_INTERFACE_CLASS_H__ 62 #endif // __CLASS_INTERFACE_CLASS_H__
56 63
57 // vim: set ts=4 sw=4: 64 // vim: set ts=4 sw=4:
@@ -37,18 +37,15 @@ struct interface i_Class = { @@ -37,18 +37,15 @@ struct interface i_Class = {
37 }; 37 };
38 38
39 void * 39 void *
40 -classNew(class_ptr class, ...) 40 +classNewParams(class_ptr class, va_list * params)
41 { 41 {
42 void * object = memCalloc(1, class->object_size + sizeof(void*)); 42 void * object = memCalloc(1, class->object_size + sizeof(void*));
43 - va_list params;  
44 int ret; 43 int ret;
45 44
46 * (class_ptr *)object = class; 45 * (class_ptr *)object = class;
47 object += sizeof(void*); 46 object += sizeof(void*);
48 47
49 - va_start(params, class);  
50 - RETCALL(object, Class, ctor, ret, &params);  
51 - va_end(params); 48 + RETCALL(object, Class, ctor, ret, params);
52 49
53 if (-1 == ret) { 50 if (-1 == ret) {
54 classDelete(&object); 51 classDelete(&object);
@@ -57,6 +54,19 @@ classNew(class_ptr class, ...) @@ -57,6 +54,19 @@ classNew(class_ptr class, ...)
57 return object; 54 return object;
58 } 55 }
59 56
  57 +void *
  58 +classNew(class_ptr class, ...)
  59 +{
  60 + va_list params;
  61 + void * object;
  62 +
  63 + va_start(params, class);
  64 + object = classNewParams(class, &params);
  65 + va_end(params);
  66 +
  67 + return object;
  68 +}
  69 +
60 void 70 void
61 classDelete(void ** object) 71 classDelete(void ** object)
62 { 72 {
Please register or login to post a comment