char* CFCPyMethod_constructor_wrapper(CFCFunction *init_func, CFCClass *invoker) { CFCParamList *param_list = CFCFunction_get_param_list(init_func); const char *self_type = CFCType_to_c(CFCFunction_get_return_type(init_func)); char *func_sym = CFCFunction_full_func_sym(init_func, invoker); char *decs = S_gen_decs(param_list, 1); char *increfs = S_gen_arg_increfs(param_list, 1); char *decrefs = S_gen_decrefs(param_list, 1); const char *class_var = CFCClass_full_class_var(invoker); const char *struct_sym = CFCClass_full_struct_sym(invoker); char *error = NULL; char *arg_parsing = S_gen_arg_parsing(param_list, 1, &error); if (error) { CFCUtil_die("%s in constructor for %s", error, CFCClass_get_name(invoker)); } if (!arg_parsing) { CFCUtil_die("Unexpected arg parsing error for %s", CFCClass_get_name(invoker)); } char *first_arg = CFCUtil_sprintf("(%s)CFISH_Class_Make_Obj(%s)", self_type, class_var); char *arg_list = S_gen_arg_list(param_list, first_arg); char pattern[] = "static PyObject*\n" "S_%s_PY_NEW(PyTypeObject *type, PyObject *args, PyObject *kwargs) {\n" "%s" // decs "%s" // arg_parsing "%s" // increfs " %s self = NULL;\n" " CFBIND_TRY(self = %s(%s));\n" "%s" // decrefs " if (CFBind_migrate_cferr()) {\n" " return NULL;\n" " }\n" " return (PyObject*)self;\n" "}\n" ; char *wrapper = CFCUtil_sprintf(pattern, struct_sym, decs, arg_parsing, increfs, self_type, func_sym, arg_list, decrefs); FREEMEM(arg_list); FREEMEM(first_arg); FREEMEM(func_sym); FREEMEM(decrefs); FREEMEM(increfs); FREEMEM(decs); FREEMEM(arg_parsing); return wrapper; }
char* CFCGoClass_gen_ctors(CFCGoClass *self) { CFCFunction *ctor_func = CFCClass_function(self->client, "new"); if (self->suppress_ctor || !ctor_func || !CFCFunction_can_be_bound(ctor_func) ) { return CFCUtil_strdup(""); } CFCParcel *parcel = CFCClass_get_parcel(self->client); CFCParamList *param_list = CFCFunction_get_param_list(ctor_func); CFCType *ret_type = CFCFunction_get_return_type(ctor_func); const char *struct_sym = CFCClass_get_struct_sym(self->client); char *name = CFCUtil_sprintf("New%s", struct_sym); char *cfunc = CFCFunction_full_func_sym(ctor_func, self->client); char *cfargs = CFCGoFunc_ctor_cfargs(parcel, param_list); char *first_line = CFCGoFunc_ctor_start(parcel, name, param_list, ret_type); char *ret_statement = CFCGoFunc_return_statement(parcel, ret_type, "retvalCF"); char pattern[] = "%s" "\tretvalCF := C.%s(%s)\n" "%s" "}\n" ; char *content = CFCUtil_sprintf(pattern, first_line, cfunc, cfargs, ret_statement); FREEMEM(ret_statement); FREEMEM(cfargs); FREEMEM(cfunc); FREEMEM(first_line); FREEMEM(name); return content; }
CFCType* CFCMethod_get_return_type(CFCMethod *self) { return CFCFunction_get_return_type((CFCFunction*)self); }