Repository: lucy-clownfish Updated Branches: refs/heads/master d6276a5ff -> 8316e7c2d
Make PerlSub helpers more flexible. Add an extra argument, `first`, controlling which params to include. Don't force the first argument name to `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/7c1dc695 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/7c1dc695 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/7c1dc695 Branch: refs/heads/master Commit: 7c1dc695c496352a9d44eb1a686d1ecc94b24ee9 Parents: 7a6825d Author: Marvin Humphrey <[email protected]> Authored: Fri May 8 18:06:16 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Mon May 11 17:22:16 2015 -0700 ---------------------------------------------------------------------- compiler/perl/lib/Clownfish/CFC.xs | 5 +++-- compiler/src/CFCPerlConstructor.c | 4 ++-- compiler/src/CFCPerlMethod.c | 6 +++--- compiler/src/CFCPerlSub.c | 19 +++++++++++-------- compiler/src/CFCPerlSub.h | 10 ++++++---- 5 files changed, 25 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7c1dc695/compiler/perl/lib/Clownfish/CFC.xs ---------------------------------------------------------------------- diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs index 090a63d..8e8f0f3 100644 --- a/compiler/perl/lib/Clownfish/CFC.xs +++ b/compiler/perl/lib/Clownfish/CFC.xs @@ -2092,10 +2092,11 @@ CODE: OUTPUT: RETVAL SV* -build_allot_params(self) +build_allot_params(self, first) CFCPerlSub *self; + size_t first; CODE: - RETVAL = S_sv_eat_c_string(CFCPerlSub_build_allot_params(self)); + RETVAL = S_sv_eat_c_string(CFCPerlSub_build_allot_params(self, first)); OUTPUT: RETVAL http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7c1dc695/compiler/src/CFCPerlConstructor.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c index 8004ca4..8c5e875 100644 --- a/compiler/src/CFCPerlConstructor.c +++ b/compiler/src/CFCPerlConstructor.c @@ -94,8 +94,8 @@ 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); - char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); + 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); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7c1dc695/compiler/src/CFCPerlMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c index 0c2861c..c68c5cb 100644 --- a/compiler/src/CFCPerlMethod.c +++ b/compiler/src/CFCPerlMethod.c @@ -233,10 +233,10 @@ 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); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); char *meth_type_c = CFCMethod_full_typedef(method, klass); char *self_assign = S_self_assign_statement(self, self_type); - char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self); + char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self, 1); char *body = S_xsub_body(self, klass); char *retval_decl; @@ -294,7 +294,7 @@ 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); + char *arg_decls = CFCPerlSub_arg_declarations((CFCPerlSub*)self, 1); char *meth_type_c = CFCMethod_full_typedef(method, klass); char *self_assign = S_self_assign_statement(self, self_type); char *body = S_xsub_body(self, klass); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7c1dc695/compiler/src/CFCPerlSub.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlSub.c b/compiler/src/CFCPerlSub.c index 588e569..35f7939 100644 --- a/compiler/src/CFCPerlSub.c +++ b/compiler/src/CFCPerlSub.c @@ -179,14 +179,14 @@ S_allot_params_arg(CFCType *type, const char *label, int required) { } char* -CFCPerlSub_arg_declarations(CFCPerlSub *self) { +CFCPerlSub_arg_declarations(CFCPerlSub *self, size_t first) { CFCParamList *param_list = self->param_list; CFCVariable **arg_vars = CFCParamList_get_variables(param_list); size_t num_vars = CFCParamList_num_vars(param_list); char *decls = CFCUtil_strdup(""); // Declare variables. - for (size_t i = 1; i < num_vars; i++) { + for (size_t i = first; i < num_vars; i++) { CFCVariable *arg_var = arg_vars[i]; CFCType *type = CFCVariable_get_type(arg_var); const char *type_str = CFCType_to_c(type); @@ -203,18 +203,21 @@ CFCPerlSub_arg_name_list(CFCPerlSub *self) { CFCParamList *param_list = self->param_list; CFCVariable **arg_vars = CFCParamList_get_variables(param_list); size_t num_vars = CFCParamList_num_vars(param_list); - char *name_list = CFCUtil_strdup("arg_self"); + char *name_list = CFCUtil_strdup(""); - for (size_t i = 1; i < num_vars; i++) { + for (size_t i = 0; i < num_vars; i++) { const char *var_name = CFCVariable_get_name(arg_vars[i]); - name_list = CFCUtil_cat(name_list, ", arg_", var_name, NULL); + if (i > 0) { + name_list = CFCUtil_cat(name_list, ", ", NULL); + } + name_list = CFCUtil_cat(name_list, "arg_", var_name, NULL); } return name_list; } char* -CFCPerlSub_build_allot_params(CFCPerlSub *self) { +CFCPerlSub_build_allot_params(CFCPerlSub *self, size_t first) { CFCParamList *param_list = self->param_list; CFCVariable **arg_vars = CFCParamList_get_variables(param_list); const char **arg_inits = CFCParamList_get_initial_values(param_list); @@ -222,7 +225,7 @@ CFCPerlSub_build_allot_params(CFCPerlSub *self) { char *allot_params = CFCUtil_strdup(""); // Declare variables and assign default values. - for (size_t i = 1; i < num_vars; i++) { + for (size_t i = first; i < num_vars; i++) { CFCVariable *arg_var = arg_vars[i]; const char *val = arg_inits[i]; const char *var_name = CFCVariable_get_name(arg_var); @@ -241,7 +244,7 @@ CFCPerlSub_build_allot_params(CFCPerlSub *self) { = CFCUtil_cat(allot_params, "args_ok = XSBind_allot_params(aTHX_\n" " &(ST(0)), 1, items,\n", NULL); - for (size_t i = 1; i < num_vars; i++) { + for (size_t i = first; i < num_vars; i++) { CFCVariable *var = arg_vars[i]; const char *val = arg_inits[i]; int required = val ? 0 : 1; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7c1dc695/compiler/src/CFCPerlSub.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlSub.h b/compiler/src/CFCPerlSub.h index 945ad6d..ffb4a2f 100644 --- a/compiler/src/CFCPerlSub.h +++ b/compiler/src/CFCPerlSub.h @@ -72,10 +72,11 @@ CFCPerlSub_destroy(CFCPerlSub *self); char* CFCPerlSub_params_hash_def(CFCPerlSub *self); -/** Generate C declarations for the variables holding the arguments. +/** Generate C declarations for the variables holding the arguments, from + * `first` onwards. */ char* -CFCPerlSub_arg_declarations(CFCPerlSub *self); +CFCPerlSub_arg_declarations(CFCPerlSub *self, size_t first); /** Create a comma-separated list of argument names prefixed by "arg_". */ @@ -83,10 +84,11 @@ char* CFCPerlSub_arg_name_list(CFCPerlSub *self); /** Generate code which will invoke XSBind_allot_params() to parse labeled - * parameters supplied to an XSUB. + * parameters supplied to an XSUB. Parameters from `first` onwards are + * included. */ char* -CFCPerlSub_build_allot_params(CFCPerlSub *self); +CFCPerlSub_build_allot_params(CFCPerlSub *self, size_t first); /** Accessor for param list. */
