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];