Commit d1fecbf9512471ad2bb0ab46cd931a37c7cdc2d5
1 parent
e0e05bf8
add ability to call interface methods with return value
Showing
1 changed file
with
22 additions
and
13 deletions
| ... | ... | @@ -40,19 +40,28 @@ |
| 40 | 40 | * @TODO: actually i use gcc feature ## for variadoc... think about |
| 41 | 41 | * a way to make this standard. |
| 42 | 42 | */ |
| 43 | -#define CALL(object,_iface,method,...) \ | |
| 44 | - do { \ | |
| 45 | - class_ptr class = class_getClass((object)); \ | |
| 46 | - struct i_##_iface * iface; \ | |
| 47 | - if (class->init) class->init(); \ | |
| 48 | - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
| 49 | - while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ | |
| 50 | - class = class->parent; \ | |
| 51 | - if (class->init) class->init(); \ | |
| 52 | - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
| 53 | - }; \ | |
| 54 | - assert(NULL != iface->method); \ | |
| 55 | - iface->method(object, ##__VA_ARGS__); \ | |
| 43 | +#define _CALL(object,_iface,method,...) \ | |
| 44 | + class_ptr class = class_getClass((object)); \ | |
| 45 | + struct i_##_iface * iface; \ | |
| 46 | + if (class->init) class->init(); \ | |
| 47 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
| 48 | + while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ | |
| 49 | + class = class->parent; \ | |
| 50 | + if (class->init) class->init(); \ | |
| 51 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
| 52 | + }; \ | |
| 53 | + assert(NULL != iface->method); | |
| 54 | + | |
| 55 | +#define CALL(object,_iface,method,...) \ | |
| 56 | + do { \ | |
| 57 | + _CALL(object, _iface, method, ##__VA_ARGS__); \ | |
| 58 | + iface->method(object, ##__VA_ARGS__); \ | |
| 59 | + } while(0) | |
| 60 | + | |
| 61 | +#define RETCALL(object,_iface,method,ret,...) \ | |
| 62 | + do { \ | |
| 63 | + _CALL(object, _iface, method, ##__VA_ARGS__); \ | |
| 64 | + ret = iface->method(object, ##__VA_ARGS__); \ | |
| 56 | 65 | } while(0) |
| 57 | 66 | |
| 58 | 67 | ... | ... |
Please
register
or
login
to post a comment