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.
  */

Reply via email to