You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2014/07/20 13:01:51 UTC

[1/5] git commit: Declare variables for XS args

Repository: lucy-clownfish
Updated Branches:
  refs/heads/master fc58f3571 -> 5e3a4105c


Declare variables for XS args

Also prefix the variable names with "arg_" to avoid clashes with other
local variable names.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/918e37e3
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/918e37e3
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/918e37e3

Branch: refs/heads/master
Commit: 918e37e317c06cc5e596d7499f223247dc8cacd3
Parents: fc58f35
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jul 19 19:25:59 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jul 19 21:08:03 2014 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerlConstructor.c | 20 +++++---
 compiler/src/CFCPerlMethod.c      | 93 +++++++++++++++++++---------------
 compiler/src/CFCPerlSub.c         | 48 +++++++++++++++---
 compiler/src/CFCPerlSub.h         | 10 ++++
 4 files changed, 117 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/918e37e3/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c
index eeaec24..63db008 100644
--- a/compiler/src/CFCPerlConstructor.c
+++ b/compiler/src/CFCPerlConstructor.c
@@ -91,9 +91,10 @@ char*
 CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
     const char *c_name = self->sub.c_name;
     CFCParamList *param_list = self->sub.param_list;
-    const char   *name_list  = CFCParamList_name_list(param_list);
+    char         *name_list  = CFCPerlSub_arg_name_list((CFCPerlSub*)self);
     CFCVariable **arg_vars   = CFCParamList_get_variables(param_list);
     const char   *func_sym   = CFCFunction_full_func_sym(self->init_func);
+    char *arg_decls    = CFCPerlSub_arg_declarations((CFCPerlSub*)self);
     char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self);
     CFCVariable *self_var       = arg_vars[0];
     CFCType     *self_type      = CFCVariable_get_type(self_var);
@@ -106,8 +107,9 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         CFCType *type = CFCVariable_get_type(var);
         if (CFCType_is_object(type) && CFCType_decremented(type)) {
             const char *name = CFCVariable_micro_sym(var);
-            refcount_mods = CFCUtil_cat(refcount_mods, "\n    CFISH_INCREF(",
-                                        name, ");", NULL);
+            refcount_mods
+                = CFCUtil_cat(refcount_mods, "\n    CFISH_INCREF(arg_", name,
+                              ");", NULL);
         }
     }
 
@@ -115,6 +117,8 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "XS(%s);\n"
         "XS(%s) {\n"
         "    dXSARGS;\n"
+        "    %s arg_self;\n"
+        "%s"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(class_name, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"
@@ -122,7 +126,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "    %s\n"
         // Create "self" last, so that earlier exceptions while fetching
         // params don't trigger a bad invocation of DESTROY.
-        "    %s self = (%s)XSBind_new_blank_obj(ST(0));%s\n"
+        "    arg_self = (%s)XSBind_new_blank_obj(ST(0));%s\n"
         "\n"
         "    %s retval = %s(%s);\n"
         "    if (retval) {\n"
@@ -136,12 +140,14 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "    XSRETURN(1);\n"
         "}\n\n";
     char *xsub_def
-        = CFCUtil_sprintf(pattern, c_name, c_name, allot_params, self_type_str,
-                          self_type_str, refcount_mods, self_type_str,
-                          func_sym, name_list);
+        = CFCUtil_sprintf(pattern, c_name, c_name, self_type_str, arg_decls,
+                          allot_params, self_type_str, refcount_mods,
+                          self_type_str, func_sym, name_list);
 
     FREEMEM(refcount_mods);
+    FREEMEM(arg_decls);
     FREEMEM(allot_params);
+    FREEMEM(name_list);
 
     return xsub_def;
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/918e37e3/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index d9d8255..a574b93 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -153,11 +153,11 @@ CFCPerlMethod_xsub_def(CFCPerlMethod *self) {
 
 static char*
 S_xsub_body(CFCPerlMethod *self) {
-    CFCMethod    *method        = self->method;
-    CFCParamList *param_list    = CFCMethod_get_param_list(method);
-    CFCVariable **arg_vars      = CFCParamList_get_variables(param_list);
-    const char   *name_list     = CFCParamList_name_list(param_list);
-    char *body = CFCUtil_strdup("");
+    CFCMethod    *method     = self->method;
+    CFCParamList *param_list = CFCMethod_get_param_list(method);
+    CFCVariable **arg_vars   = CFCParamList_get_variables(param_list);
+    char         *name_list  = CFCPerlSub_arg_name_list((CFCPerlSub*)self);
+    char         *body       = CFCUtil_strdup("");
 
     CFCParcel *parcel = CFCMethod_get_parcel(method);
     const char *class_name = CFCMethod_get_class_name(method);
@@ -183,7 +183,7 @@ S_xsub_body(CFCPerlMethod *self) {
         CFCVariable *var = arg_vars[i];
         CFCType     *type = CFCVariable_get_type(var);
         if (CFCType_is_object(type) && CFCType_decremented(type)) {
-            body = CFCUtil_cat(body, "CFISH_INCREF(",
+            body = CFCUtil_cat(body, "CFISH_INCREF(arg_",
                                CFCVariable_micro_sym(var), ");\n    ", NULL);
         }
     }
@@ -214,6 +214,8 @@ S_xsub_body(CFCPerlMethod *self) {
         FREEMEM(assignment);
     }
 
+    FREEMEM(name_list);
+
     return body;
 }
 
@@ -226,8 +228,8 @@ S_self_assign_statement(CFCPerlMethod *self, CFCType *type) {
         CFCUtil_die("Not an object type: %s", type_c);
     }
     const char *class_var = CFCType_get_class_var(type);
-    char pattern[] = "%s self = (%s)XSBind_sv_to_cfish_obj(ST(0), %s, NULL);";
-    char *statement = CFCUtil_sprintf(pattern, type_c, type_c, class_var);
+    char pattern[] = "arg_self = (%s)XSBind_sv_to_cfish_obj(ST(0), %s, NULL);";
+    char *statement = CFCUtil_sprintf(pattern, type_c, class_var);
 
     return statement;
 }
@@ -239,15 +241,19 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
     CFCVariable **arg_vars   = CFCParamList_get_variables(param_list);
     CFCVariable *self_var    = arg_vars[0];
     CFCType     *self_type   = CFCVariable_get_type(self_var);
+    const char  *self_type_c    = CFCType_to_c(self_type);
     const char  *self_micro_sym = CFCVariable_micro_sym(self_var);
-    char *self_assign = S_self_assign_statement(self, self_type);
+    char *arg_decls    = CFCPerlSub_arg_declarations((CFCPerlSub*)self);
+    char *self_assign  = S_self_assign_statement(self, self_type);
     char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self);
-    char *body = S_xsub_body(self);
+    char *body         = S_xsub_body(self);
 
     char pattern[] =
         "XS(%s);\n"
         "XS(%s) {\n"
         "    dXSARGS;\n"
+        "    %s arg_self;\n"
+        "%s"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"
@@ -260,9 +266,10 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "    %s\n"
         "}\n";
     char *xsub_def
-        = CFCUtil_sprintf(pattern, c_name, c_name, self_micro_sym,
-                          allot_params, self_assign, body);
+        = CFCUtil_sprintf(pattern, c_name, c_name, self_type_c, arg_decls,
+                          self_micro_sym, allot_params, self_assign, body);
 
+    FREEMEM(arg_decls);
     FREEMEM(self_assign);
     FREEMEM(allot_params);
     FREEMEM(body);
@@ -274,9 +281,14 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
     CFCMethod *method = self->method;
     CFCParamList *param_list = CFCMethod_get_param_list(method);
     CFCVariable **arg_vars = CFCParamList_get_variables(param_list);
+    CFCVariable *self_var    = arg_vars[0];
+    CFCType     *self_type   = CFCVariable_get_type(self_var);
+    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 *body = S_xsub_body(self);
+    char *arg_decls   = CFCPerlSub_arg_declarations((CFCPerlSub*)self);
+    char *self_assign = S_self_assign_statement(self, self_type);
+    char *body        = S_xsub_body(self);
 
     // Determine how many args are truly required and build an error check.
     unsigned min_required = 0;
@@ -312,65 +324,64 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
 
     // Var assignments.
     char *var_assignments = CFCUtil_strdup("");
-    for (unsigned i = 0; i < num_vars; i++) {
+    for (unsigned i = 1; i < num_vars; i++) {
         CFCVariable *var = arg_vars[i];
         const char  *val = arg_inits[i];
         const char  *var_name = CFCVariable_micro_sym(var);
         CFCType     *var_type = CFCVariable_get_type(var);
         const char  *type_c   = CFCType_to_c(var_type);
 
-        if (i == 0) {    // self
-            char *statement = S_self_assign_statement(self, var_type);
-            var_assignments = CFCUtil_cat(var_assignments, statement, NULL);
+        char perl_stack_var[30];
+        sprintf(perl_stack_var, "ST(%u)", i);
+        char *conversion
+            = CFCPerlTypeMap_from_perl(var_type, perl_stack_var);
+        if (!conversion) {
+            CFCUtil_die("Can't map type '%s'", type_c);
+        }
+        if (val) {
+            char pattern[] =
+                "\n    arg_%s = ( items >= %u && XSBind_sv_defined(ST(%u)) )"
+                " ? %s : %s;";
+            char *statement = CFCUtil_sprintf(pattern, var_name, i, i,
+                                              conversion, val);
+            var_assignments
+                = CFCUtil_cat(var_assignments, statement, NULL);
             FREEMEM(statement);
         }
         else {
-            char perl_stack_var[30];
-            sprintf(perl_stack_var, "ST(%u)", i);
-            char *conversion
-                = CFCPerlTypeMap_from_perl(var_type, perl_stack_var);
-            if (!conversion) {
-                CFCUtil_die("Can't map type '%s'", type_c);
-            }
-            if (val) {
-                char pattern[] =
-                    "\n    %s %s = ( items >= %u && XSBind_sv_defined(ST(%u)) )"
-                    " ? %s : %s;";
-                char *statement = CFCUtil_sprintf(pattern, type_c, var_name, i,
-                                                  i, conversion, val);
-                var_assignments
-                    = CFCUtil_cat(var_assignments, statement, NULL);
-                FREEMEM(statement);
-            }
-            else {
-                var_assignments
-                    = CFCUtil_cat(var_assignments, "\n    ", type_c, " ",
-                                  var_name, " = ", conversion, ";", NULL);
-            }
-            FREEMEM(conversion);
+            var_assignments
+                = CFCUtil_cat(var_assignments, "\n    arg_", var_name, " = ",
+                              conversion, ";", NULL);
         }
+        FREEMEM(conversion);
     }
 
     char pattern[] =
         "XS(%s);\n"
         "XS(%s) {\n"
         "    dXSARGS;\n"
+        "    %s arg_self;\n"
+        "%s"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    SP -= items;\n"
         "    %s;\n"
         "\n"
         "    /* Extract vars from Perl stack. */\n"
         "    %s\n"
+        "    %s\n"
         "\n"
         "    /* Execute */\n"
         "    %s\n"
         "}\n";
     char *xsub
         = CFCUtil_sprintf(pattern, self->sub.c_name, self->sub.c_name,
-                          num_args_check, var_assignments, body);
+                          self_type_c, arg_decls, num_args_check, self_assign,
+                          var_assignments, body);
 
     FREEMEM(num_args_check);
     FREEMEM(var_assignments);
+    FREEMEM(arg_decls);
+    FREEMEM(self_assign);
     FREEMEM(body);
     return xsub;
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/918e37e3/compiler/src/CFCPerlSub.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlSub.c b/compiler/src/CFCPerlSub.c
index ba5e84d..48afd34 100644
--- a/compiler/src/CFCPerlSub.c
+++ b/compiler/src/CFCPerlSub.c
@@ -155,7 +155,7 @@ S_allot_params_arg(CFCType *type, const char *label, int required) {
         const char *allocation = use_sv_buffer
                                  ? "alloca(cfish_SStr_size())"
                                  : "NULL";
-        const char pattern[] = "ALLOT_OBJ(&%s, \"%s\", %u, %s, %s, %s)";
+        const char pattern[] = "ALLOT_OBJ(&arg_%s, \"%s\", %u, %s, %s, %s)";
         char *arg = CFCUtil_sprintf(pattern, label, label, label_len,
                                     req_string, class_var, allocation);
         return arg;
@@ -165,7 +165,7 @@ S_allot_params_arg(CFCType *type, const char *label, int required) {
             const char *prim_type = prim_type_to_allot_macro[i].prim_type;
             if (strcmp(prim_type, type_c_string) == 0) {
                 const char *allot = prim_type_to_allot_macro[i].allot_macro;
-                char pattern[] = "%s(&%s, \"%s\", %u, %s)";
+                char pattern[] = "%s(&arg_%s, \"%s\", %u, %s)";
                 char *arg = CFCUtil_sprintf(pattern, allot, label, label,
                                             label_len, req_string);
                 return arg;
@@ -178,6 +178,42 @@ S_allot_params_arg(CFCType *type, const char *label, int required) {
 }
 
 char*
+CFCPerlSub_arg_declarations(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         *decls      = CFCUtil_strdup("");
+
+    // Declare variables.
+    for (size_t i = 1; 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);
+        const char  *var_name = CFCVariable_micro_sym(arg_var);
+        decls = CFCUtil_cat(decls, "    ", type_str, " arg_", var_name,
+                            ";\n", NULL);
+    }
+
+    return decls;
+}
+
+char*
+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");
+
+    for (int i = 1; i < num_vars; i++) {
+        CFCVariable *arg_var  = arg_vars[i];
+        const char  *var_name = CFCVariable_micro_sym(arg_vars[i]);
+        name_list = CFCUtil_cat(name_list, ", arg_", var_name, NULL);
+    }
+
+    return name_list;
+}
+
+char*
 CFCPerlSub_build_allot_params(CFCPerlSub *self) {
     CFCParamList *param_list = self->param_list;
     CFCVariable **arg_vars   = CFCParamList_get_variables(param_list);
@@ -187,16 +223,16 @@ CFCPerlSub_build_allot_params(CFCPerlSub *self) {
 
     // Declare variables and assign default values.
     for (size_t i = 1; i < num_vars; i++) {
-        CFCVariable *arg_var = arg_vars[i];
-        const char  *val     = arg_inits[i];
-        const char  *local_c = CFCVariable_local_c(arg_var);
+        CFCVariable *arg_var  = arg_vars[i];
+        const char  *val      = arg_inits[i];
+        const char  *var_name = CFCVariable_micro_sym(arg_var);
         if (val == NULL) {
             CFCType *arg_type = CFCVariable_get_type(arg_var);
             val = CFCType_is_object(arg_type)
                   ? "NULL"
                   : "0";
         }
-        allot_params = CFCUtil_cat(allot_params, local_c, " = ", val,
+        allot_params = CFCUtil_cat(allot_params, "arg_", var_name, " = ", val,
                                    ";\n    ", NULL);
     }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/918e37e3/compiler/src/CFCPerlSub.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlSub.h b/compiler/src/CFCPerlSub.h
index 6bc846c..54d1917 100644
--- a/compiler/src/CFCPerlSub.h
+++ b/compiler/src/CFCPerlSub.h
@@ -71,6 +71,16 @@ CFCPerlSub_destroy(CFCPerlSub *self);
 char*
 CFCPerlSub_params_hash_def(CFCPerlSub *self);
 
+/** Generate C declarations for the variables holding the arguments.
+ */
+char*
+CFCPerlSub_arg_declarations(CFCPerlSub *self);
+
+/** Create a comma-separated list of argument names prefixed by "arg_".
+ */
+char*
+CFCPerlSub_arg_name_list(CFCPerlSub *self);
+
 /** Generate code which will invoke XSBind_allot_params() to parse labeled
  * parameters supplied to an XSUB.
  */


[2/5] git commit: Declare 'args_ok' variable in XS

Posted by nw...@apache.org.
Declare 'args_ok' variable in XS


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/19bec9d0
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/19bec9d0
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/19bec9d0

Branch: refs/heads/master
Commit: 19bec9d0b4cb71716d5bb7e2a50b9e37d2a9dc10
Parents: 918e37e
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Jul 20 10:50:14 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jul 20 10:50:14 2014 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerlConstructor.c | 1 +
 compiler/src/CFCPerlMethod.c      | 1 +
 compiler/src/CFCPerlSub.c         | 2 +-
 3 files changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/19bec9d0/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c
index 63db008..634b37f 100644
--- a/compiler/src/CFCPerlConstructor.c
+++ b/compiler/src/CFCPerlConstructor.c
@@ -119,6 +119,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "    dXSARGS;\n"
         "    %s arg_self;\n"
         "%s"
+        "    bool args_ok;\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(class_name, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/19bec9d0/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index a574b93..ca80351 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -254,6 +254,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "    dXSARGS;\n"
         "    %s arg_self;\n"
         "%s"
+        "    bool args_ok;\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/19bec9d0/compiler/src/CFCPerlSub.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlSub.c b/compiler/src/CFCPerlSub.c
index 48afd34..226d15a 100644
--- a/compiler/src/CFCPerlSub.c
+++ b/compiler/src/CFCPerlSub.c
@@ -239,7 +239,7 @@ CFCPerlSub_build_allot_params(CFCPerlSub *self) {
     // Iterate over args in param list.
     allot_params
         = CFCUtil_cat(allot_params,
-                      "bool args_ok = XSBind_allot_params(\n"
+                      "args_ok = XSBind_allot_params(\n"
                       "        &(ST(0)), 1, items, ", NULL);
     for (size_t i = 1; i < num_vars; i++) {
         CFCVariable *var = arg_vars[i];


[4/5] git commit: Declare 'retval' variable in XS

Posted by nw...@apache.org.
Declare 'retval' variable in XS


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/ad9f9bb7
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/ad9f9bb7
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/ad9f9bb7

Branch: refs/heads/master
Commit: ad9f9bb7aeedb184d5b9f454c6293098afffd97a
Parents: 89fc7c2
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Jul 20 12:14:48 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jul 20 12:14:48 2014 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerlConstructor.c |  7 +++---
 compiler/src/CFCPerlMethod.c      | 42 ++++++++++++++++++++++++++--------
 2 files changed, 37 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ad9f9bb7/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c
index 634b37f..8679502 100644
--- a/compiler/src/CFCPerlConstructor.c
+++ b/compiler/src/CFCPerlConstructor.c
@@ -120,6 +120,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "    %s arg_self;\n"
         "%s"
         "    bool args_ok;\n"
+        "    %s retval;\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(class_name, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"
@@ -129,7 +130,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         // params don't trigger a bad invocation of DESTROY.
         "    arg_self = (%s)XSBind_new_blank_obj(ST(0));%s\n"
         "\n"
-        "    %s retval = %s(%s);\n"
+        "    retval = %s(%s);\n"
         "    if (retval) {\n"
         "        ST(0) = (SV*)CFISH_Obj_To_Host((cfish_Obj*)retval);\n"
         "        CFISH_Obj_Dec_RefCount((cfish_Obj*)retval);\n"
@@ -142,8 +143,8 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "}\n\n";
     char *xsub_def
         = CFCUtil_sprintf(pattern, c_name, c_name, self_type_str, arg_decls,
-                          allot_params, self_type_str, refcount_mods,
-                          self_type_str, func_sym, name_list);
+                          self_type_str, allot_params, self_type_str,
+                          refcount_mods, func_sym, name_list);
 
     FREEMEM(refcount_mods);
     FREEMEM(arg_decls);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ad9f9bb7/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index d5de00a..d3d53bb 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -193,14 +193,13 @@ S_xsub_body(CFCPerlMethod *self) {
     else {
         // Return a value for method invoked in a scalar context.
         CFCType *return_type = CFCMethod_get_return_type(method);
-        const char *type_str = CFCType_to_c(return_type);
         char *assignment = CFCPerlTypeMap_to_perl(return_type, "retval");
         if (!assignment) {
+            const char *type_str = CFCType_to_c(return_type);
             CFCUtil_die("Can't find typemap for '%s'", type_str);
         }
-        body = CFCUtil_cat(body, type_str, " retval = method(",
-                           name_list, ");\n    ST(0) = ", assignment, ";",
-                           NULL);
+        body = CFCUtil_cat(body, "retval = method(", name_list,
+                           ");\n    ST(0) = ", assignment, ";", NULL);
         if (CFCType_is_object(return_type)
             && CFCType_incremented(return_type)
            ) {
@@ -233,19 +232,30 @@ S_self_assign_statement(CFCPerlMethod *self, CFCType *type) {
 
 static char*
 S_xsub_def_labeled_params(CFCPerlMethod *self) {
+    CFCMethod *method = self->method;
     const char *c_name = self->sub.c_name;
     CFCParamList *param_list = self->sub.param_list;
     CFCVariable **arg_vars   = CFCParamList_get_variables(param_list);
     CFCVariable *self_var    = arg_vars[0];
     CFCType     *self_type   = CFCVariable_get_type(self_var);
+    CFCType     *return_type = CFCMethod_get_return_type(method);
     const char  *self_type_c    = CFCType_to_c(self_type);
     const char  *self_micro_sym = CFCVariable_micro_sym(self_var);
     char *arg_decls    = CFCPerlSub_arg_declarations((CFCPerlSub*)self);
-    char *meth_type_c  = CFCMethod_full_typedef(self->method, NULL);
+    char *meth_type_c  = CFCMethod_full_typedef(method, NULL);
     char *self_assign  = S_self_assign_statement(self, self_type);
     char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self);
     char *body         = S_xsub_body(self);
 
+    char *retval_decl;
+    if (CFCType_is_void(return_type)) {
+        retval_decl = CFCUtil_strdup("");
+    }
+    else {
+        const char *return_type_c = CFCType_to_c(return_type);
+        retval_decl = CFCUtil_sprintf("    %s retval;\n", return_type_c);
+    }
+
     char pattern[] =
         "XS(%s);\n"
         "XS(%s) {\n"
@@ -254,6 +264,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "%s"
         "    %s method;\n"
         "    bool args_ok;\n"
+        "%s"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"
@@ -267,14 +278,15 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "}\n";
     char *xsub_def
         = CFCUtil_sprintf(pattern, c_name, c_name, self_type_c, arg_decls,
-                          meth_type_c, self_micro_sym, allot_params,
-                          self_assign, body);
+                          meth_type_c, retval_decl, self_micro_sym,
+                          allot_params, self_assign, body);
 
     FREEMEM(arg_decls);
     FREEMEM(meth_type_c);
     FREEMEM(self_assign);
     FREEMEM(allot_params);
     FREEMEM(body);
+    FREEMEM(retval_decl);
     return xsub_def;
 }
 
@@ -285,6 +297,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
     CFCVariable **arg_vars = CFCParamList_get_variables(param_list);
     CFCVariable *self_var    = arg_vars[0];
     CFCType     *self_type   = CFCVariable_get_type(self_var);
+    CFCType     *return_type = CFCMethod_get_return_type(method);
     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);
@@ -359,6 +372,15 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         FREEMEM(conversion);
     }
 
+    char *retval_decl;
+    if (CFCType_is_void(return_type)) {
+        retval_decl = CFCUtil_strdup("");
+    }
+    else {
+        const char *return_type_c = CFCType_to_c(return_type);
+        retval_decl = CFCUtil_sprintf("    %s retval;\n", return_type_c);
+    }
+
     char pattern[] =
         "XS(%s);\n"
         "XS(%s) {\n"
@@ -366,6 +388,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "    %s arg_self;\n"
         "%s"
         "    %s method;\n"
+        "%s"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    SP -= items;\n"
         "    %s;\n"
@@ -379,8 +402,8 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "}\n";
     char *xsub
         = CFCUtil_sprintf(pattern, self->sub.c_name, self->sub.c_name,
-                          self_type_c, arg_decls, meth_type_c, num_args_check,
-                          self_assign, var_assignments, body);
+                          self_type_c, arg_decls, meth_type_c, retval_decl,
+                          num_args_check, self_assign, var_assignments, body);
 
     FREEMEM(num_args_check);
     FREEMEM(var_assignments);
@@ -388,6 +411,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
     FREEMEM(meth_type_c);
     FREEMEM(self_assign);
     FREEMEM(body);
+    FREEMEM(retval_decl);
     return xsub;
 }
 


[3/5] git commit: Declare 'method' variable in XS

Posted by nw...@apache.org.
Declare 'method' variable in XS


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/89fc7c29
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/89fc7c29
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/89fc7c29

Branch: refs/heads/master
Commit: 89fc7c298098af4dd388779f3d585ad8e02e8e86
Parents: 19bec9d
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Jul 20 11:53:34 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jul 20 11:53:34 2014 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerlMethod.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/89fc7c29/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index ca80351..d5de00a 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -167,14 +167,11 @@ S_xsub_body(CFCPerlMethod *self) {
     }
 
     // Extract the method function pointer.
-    char *full_typedef = CFCMethod_full_typedef(method, klass);
-    char *full_meth    = CFCMethod_full_method_sym(method, klass);
+    char *full_meth = CFCMethod_full_method_sym(method, klass);
     char *method_ptr
-        = CFCUtil_sprintf("%s method = CFISH_METHOD_PTR(%s, %s);\n    ",
-                          full_typedef, CFCClass_full_class_var(klass),
-                          full_meth);
+        = CFCUtil_sprintf("method = CFISH_METHOD_PTR(%s, %s);\n    ",
+                          CFCClass_full_class_var(klass), full_meth);
     body = CFCUtil_cat(body, method_ptr, NULL);
-    FREEMEM(full_typedef);
     FREEMEM(full_meth);
     FREEMEM(method_ptr);
 
@@ -244,6 +241,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
     const char  *self_type_c    = CFCType_to_c(self_type);
     const char  *self_micro_sym = CFCVariable_micro_sym(self_var);
     char *arg_decls    = CFCPerlSub_arg_declarations((CFCPerlSub*)self);
+    char *meth_type_c  = CFCMethod_full_typedef(self->method, NULL);
     char *self_assign  = S_self_assign_statement(self, self_type);
     char *allot_params = CFCPerlSub_build_allot_params((CFCPerlSub*)self);
     char *body         = S_xsub_body(self);
@@ -254,6 +252,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "    dXSARGS;\n"
         "    %s arg_self;\n"
         "%s"
+        "    %s method;\n"
         "    bool args_ok;\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s, ...)\",  GvNAME(CvGV(cv))); }\n"
@@ -268,9 +267,11 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "}\n";
     char *xsub_def
         = CFCUtil_sprintf(pattern, c_name, c_name, self_type_c, arg_decls,
-                          self_micro_sym, allot_params, self_assign, body);
+                          meth_type_c, self_micro_sym, allot_params,
+                          self_assign, body);
 
     FREEMEM(arg_decls);
+    FREEMEM(meth_type_c);
     FREEMEM(self_assign);
     FREEMEM(allot_params);
     FREEMEM(body);
@@ -288,6 +289,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
     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 *meth_type_c = CFCMethod_full_typedef(method, NULL);
     char *self_assign = S_self_assign_statement(self, self_type);
     char *body        = S_xsub_body(self);
 
@@ -363,6 +365,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "    dXSARGS;\n"
         "    %s arg_self;\n"
         "%s"
+        "    %s method;\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    SP -= items;\n"
         "    %s;\n"
@@ -376,12 +379,13 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "}\n";
     char *xsub
         = CFCUtil_sprintf(pattern, self->sub.c_name, self->sub.c_name,
-                          self_type_c, arg_decls, num_args_check, self_assign,
-                          var_assignments, body);
+                          self_type_c, arg_decls, meth_type_c, num_args_check,
+                          self_assign, var_assignments, body);
 
     FREEMEM(num_args_check);
     FREEMEM(var_assignments);
     FREEMEM(arg_decls);
+    FREEMEM(meth_type_c);
     FREEMEM(self_assign);
     FREEMEM(body);
     return xsub;


[5/5] git commit: Whitespace in generated XS

Posted by nw...@apache.org.
Whitespace in generated XS


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5e3a4105
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5e3a4105
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5e3a4105

Branch: refs/heads/master
Commit: 5e3a4105c206f97ec69d594018f6283a4eacb58a
Parents: ad9f9bb
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sun Jul 20 12:51:54 2014 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jul 20 12:51:54 2014 +0200

----------------------------------------------------------------------
 compiler/src/CFCPerlConstructor.c | 1 +
 compiler/src/CFCPerlMethod.c      | 2 ++
 compiler/src/CFCPerlSub.c         | 2 +-
 3 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5e3a4105/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c
index 8679502..e03487a 100644
--- a/compiler/src/CFCPerlConstructor.c
+++ b/compiler/src/CFCPerlConstructor.c
@@ -121,6 +121,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "%s"
         "    bool args_ok;\n"
         "    %s retval;\n"
+        "\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(class_name, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5e3a4105/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlMethod.c b/compiler/src/CFCPerlMethod.c
index d3d53bb..dd2a5ca 100644
--- a/compiler/src/CFCPerlMethod.c
+++ b/compiler/src/CFCPerlMethod.c
@@ -265,6 +265,7 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "    %s method;\n"
         "    bool args_ok;\n"
         "%s"
+        "\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    if (items < 1) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s, ...)\",  GvNAME(CvGV(cv))); }\n"
         "    SP -= items;\n"
@@ -389,6 +390,7 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "%s"
         "    %s method;\n"
         "%s"
+        "\n"
         "    CFISH_UNUSED_VAR(cv);\n"
         "    SP -= items;\n"
         "    %s;\n"

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5e3a4105/compiler/src/CFCPerlSub.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlSub.c b/compiler/src/CFCPerlSub.c
index 226d15a..063d59a 100644
--- a/compiler/src/CFCPerlSub.c
+++ b/compiler/src/CFCPerlSub.c
@@ -240,7 +240,7 @@ CFCPerlSub_build_allot_params(CFCPerlSub *self) {
     allot_params
         = CFCUtil_cat(allot_params,
                       "args_ok = XSBind_allot_params(\n"
-                      "        &(ST(0)), 1, items, ", NULL);
+                      "        &(ST(0)), 1, items,\n", NULL);
     for (size_t i = 1; i < num_vars; i++) {
         CFCVariable *var = arg_vars[i];
         const char  *val = arg_inits[i];