Eliminate `arg_self` assumptions. Always use real name of first argument rather than assuming that it is `self`.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/1491960d Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/1491960d Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/1491960d Branch: refs/heads/master Commit: 1491960d8134e5e7ba89e993cfca352dacf2f5f4 Parents: ae54c4f Author: Marvin Humphrey <[email protected]> Authored: Sat May 9 16:09:54 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Tue May 12 06:54:51 2015 -0700 ---------------------------------------------------------------------- compiler/src/CFCPerlConstructor.c | 10 +++++----- compiler/src/CFCPerlMethod.c | 27 ++++++++++++++------------- 2 files changed, 19 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1491960d/compiler/src/CFCPerlConstructor.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c index 8c5e875..c1b9839 100644 --- a/compiler/src/CFCPerlConstructor.c +++ b/compiler/src/CFCPerlConstructor.c @@ -94,11 +94,12 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self, CFCClass *klass) { char *name_list = CFCPerlSub_arg_name_list((CFCPerlSub*)self); CFCVariable **arg_vars = CFCParamList_get_variables(param_list); char *func_sym = CFCFunction_full_func_sym(self->init_func, klass); - char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 0); char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self, 1); CFCVariable *self_var = arg_vars[0]; CFCType *self_type = CFCVariable_get_type(self_var); const char *self_type_str = CFCType_to_c(self_type); + const char *self_name = CFCVariable_get_name(self_var); // Compensate for swallowed refcounts. char *refcount_mods = CFCUtil_strdup(""); @@ -117,7 +118,6 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self, CFCClass *klass) { "XS(%s);\n" "XS(%s) {\n" " dXSARGS;\n" - " %s arg_self;\n" "%s" " bool args_ok;\n" " %s retval;\n" @@ -129,7 +129,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self, CFCClass *klass) { " %s\n" // Create "self" last, so that earlier exceptions while fetching // params don't trigger a bad invocation of DESTROY. - " arg_self = (%s)XSBind_new_blank_obj(aTHX_ ST(0));%s\n" + " arg_%s = (%s)XSBind_new_blank_obj(aTHX_ ST(0));%s\n" "\n" " retval = %s(%s);\n" " if (retval) {\n" @@ -143,8 +143,8 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self, CFCClass *klass) { " XSRETURN(1);\n" "}\n\n"; char *xsub_def - = CFCUtil_sprintf(pattern, c_name, c_name, self_type_str, arg_decls, - self_type_str, allot_params, self_type_str, + = CFCUtil_sprintf(pattern, c_name, c_name, arg_decls, self_type_str, + allot_params, self_name, self_type_str, refcount_mods, func_sym, name_list); FREEMEM(refcount_mods); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/1491960d/compiler/src/CFCPerlMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c index c68c5cb..ca5f34e 100644 --- a/compiler/src/CFCPerlMethod.c +++ b/compiler/src/CFCPerlMethod.c @@ -43,7 +43,7 @@ S_xsub_body(CFCPerlMethod *self, CFCClass *klass); // Create an assignment statement for extracting $self from the Perl stack. static char* -S_self_assign_statement(CFCPerlMethod *self, CFCType *type); +S_self_assign_statement(CFCPerlMethod *self); // Return code for an xsub which uses labeled params. static char* @@ -208,16 +208,19 @@ S_xsub_body(CFCPerlMethod *self, CFCClass *klass) { // Create an assignment statement for extracting $self from the Perl stack. static char* -S_self_assign_statement(CFCPerlMethod *self, CFCType *type) { - (void)self; // unused +S_self_assign_statement(CFCPerlMethod *self) { + CFCParamList *param_list = CFCMethod_get_param_list(self->method); + CFCVariable **vars = CFCParamList_get_variables(param_list); + CFCType *type = CFCVariable_get_type(vars[0]); + const char *self_name = CFCVariable_get_name(vars[0]); const char *type_c = CFCType_to_c(type); if (!CFCType_is_object(type)) { CFCUtil_die("Not an object type: %s", type_c); } const char *class_var = CFCType_get_class_var(type); - char pattern[] = "arg_self = (%s)XSBind_sv_to_cfish_obj(" + char pattern[] = "arg_%s = (%s)XSBind_sv_to_cfish_obj(" "aTHX_ ST(0), %s, NULL);"; - char *statement = CFCUtil_sprintf(pattern, type_c, class_var); + char *statement = CFCUtil_sprintf(pattern, self_name, type_c, class_var); return statement; } @@ -233,9 +236,9 @@ S_xsub_def_labeled_params(CFCPerlMethod *self, CFCClass *klass) { CFCType *return_type = CFCMethod_get_return_type(method); const char *self_type_c = CFCType_to_c(self_type); const char *self_name = CFCVariable_get_name(self_var); - char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 0); char *meth_type_c = CFCMethod_full_typedef(method, klass); - char *self_assign = S_self_assign_statement(self, self_type); + char *self_assign = S_self_assign_statement(self); char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self, 1); char *body = S_xsub_body(self, klass); @@ -252,7 +255,6 @@ S_xsub_def_labeled_params(CFCPerlMethod *self, CFCClass *klass) { "XS(%s);\n" "XS(%s) {\n" " dXSARGS;\n" - " %s arg_self;\n" "%s" " %s method;\n" " bool args_ok;\n" @@ -270,7 +272,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self, CFCClass *klass) { " %s\n" "}\n"; char *xsub_def - = CFCUtil_sprintf(pattern, c_name, c_name, self_type_c, arg_decls, + = CFCUtil_sprintf(pattern, c_name, c_name, arg_decls, meth_type_c, retval_decl, self_name, allot_params, self_assign, body); @@ -294,9 +296,9 @@ S_xsub_def_positional_args(CFCPerlMethod *self, CFCClass *klass) { const char *self_type_c = CFCType_to_c(self_type); const char **arg_inits = CFCParamList_get_initial_values(param_list); unsigned num_vars = (unsigned)CFCParamList_num_vars(param_list); - char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 0); char *meth_type_c = CFCMethod_full_typedef(method, klass); - char *self_assign = S_self_assign_statement(self, self_type); + char *self_assign = S_self_assign_statement(self); char *body = S_xsub_body(self, klass); // Determine how many args are truly required and build an error check. @@ -379,7 +381,6 @@ S_xsub_def_positional_args(CFCPerlMethod *self, CFCClass *klass) { "XS(%s);\n" "XS(%s) {\n" " dXSARGS;\n" - " %s arg_self;\n" "%s" " %s method;\n" "%s" @@ -397,7 +398,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self, CFCClass *klass) { "}\n"; char *xsub = CFCUtil_sprintf(pattern, self->sub.c_name, self->sub.c_name, - self_type_c, arg_decls, meth_type_c, retval_decl, + arg_decls, meth_type_c, retval_decl, num_args_check, self_assign, var_assignments, body); FREEMEM(num_args_check);
