Repository: lucy-clownfish Updated Branches: refs/heads/master ac9fc2bb5 -> fd74182c1
Add return value to generated Perl code samples Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5f6a9cb5 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5f6a9cb5 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5f6a9cb5 Branch: refs/heads/master Commit: 5f6a9cb5a63571123233f9e216281a30bcc5e7b0 Parents: ac9fc2b Author: Nick Wellnhofer <[email protected]> Authored: Thu Feb 11 13:58:00 2016 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Fri Feb 26 12:10:27 2016 +0100 ---------------------------------------------------------------------- compiler/src/CFCPerlPod.c | 66 ++++++++++++-------- .../perl/buildlib/Clownfish/Build/Binding.pm | 26 ++------ 2 files changed, 45 insertions(+), 47 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5f6a9cb5/compiler/src/CFCPerlPod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlPod.c b/compiler/src/CFCPerlPod.c index 632eb35..ec0bf87 100644 --- a/compiler/src/CFCPerlPod.c +++ b/compiler/src/CFCPerlPod.c @@ -71,15 +71,15 @@ S_gen_code_sample(CFCCallable *func, const char *alias, CFCClass *klass, int is_constructor); static char* -S_gen_positional_sample(const char *invocant, const char *alias, - CFCParamList *param_list, size_t start); +S_gen_positional_sample(const char *prologue, CFCParamList *param_list, + size_t start); static char* -S_gen_labeled_sample(const char *invocant, const char *alias, - CFCParamList *param_list, size_t start); +S_gen_labeled_sample(const char *prologue, CFCParamList *param_list, + size_t start); static char* -S_perl_var_name(CFCVariable *var); +S_perl_var_name(CFCType *type); static char* S_camel_to_lower(const char *camel); @@ -392,38 +392,54 @@ CFCPerlPod_gen_subroutine_pod(CFCCallable *func, static char* S_gen_code_sample(CFCCallable *func, const char *alias, CFCClass *klass, int is_constructor) { - char *invocant = NULL; + char *prologue = CFCUtil_sprintf(""); + + CFCType *ret_type = CFCCallable_get_return_type(func); + if (!CFCType_is_void(ret_type)) { + if (is_constructor) { + char *ret_name = S_perl_var_name(ret_type); + prologue = CFCUtil_cat(prologue, "my $", ret_name, " = ", NULL); + FREEMEM(ret_name); + } + else { + prologue = CFCUtil_cat(prologue, "my $retval = ", NULL); + } + } if (is_constructor) { - invocant = CFCUtil_strdup(CFCClass_get_name(klass)); + const char *invocant = CFCClass_get_name(klass); + prologue = CFCUtil_cat(prologue, invocant, NULL); } else { char *lower = S_camel_to_lower(CFCClass_get_struct_sym(klass)); - invocant = CFCUtil_sprintf("$%s", lower); + prologue = CFCUtil_cat(prologue, "$", lower, NULL); FREEMEM(lower); } + prologue = CFCUtil_cat(prologue, "->", alias, NULL); + CFCParamList *param_list = CFCCallable_get_param_list(func); size_t num_vars = CFCParamList_num_vars(param_list); size_t start = is_constructor ? 0 : 1; char *sample = NULL; if (start == num_vars) { - sample = CFCUtil_sprintf(" %s->%s();\n", invocant, alias); + sample = CFCUtil_sprintf(" %s();\n", prologue); } else if (is_constructor || num_vars - start >= 2) { - sample = S_gen_labeled_sample(invocant, alias, param_list, start); + sample = S_gen_labeled_sample(prologue, param_list, start); } else { - sample = S_gen_positional_sample(invocant, alias, param_list, start); + sample = S_gen_positional_sample(prologue, param_list, start); } + FREEMEM(prologue); return sample; } static char* -S_gen_positional_sample(const char *invocant, const char *alias, - CFCParamList *param_list, size_t start) { +S_gen_positional_sample(const char *prologue, CFCParamList *param_list, + size_t start) { size_t num_vars = CFCParamList_num_vars(param_list); CFCVariable **vars = CFCParamList_get_variables(param_list); const char **inits = CFCParamList_get_initial_values(param_list); @@ -434,14 +450,13 @@ S_gen_positional_sample(const char *invocant, const char *alias, } const char *name = CFCVariable_get_name(vars[start]); - char *sample - = CFCUtil_sprintf(" %s->%s($%s);\n", invocant, alias, name); + char *sample = CFCUtil_sprintf(" %s($%s);\n", prologue, name); const char *init = inits[start]; if (init) { if (strcmp(init, "NULL") == 0) { init = "undef"; } - char *def_sample = CFCUtil_sprintf(" %s->%s(); # default: %s\n", - invocant, alias, init); + char *def_sample = CFCUtil_sprintf(" %s(); # default: %s\n", + prologue, init); sample = CFCUtil_cat(sample, def_sample, NULL); FREEMEM(def_sample); } @@ -450,8 +465,8 @@ S_gen_positional_sample(const char *invocant, const char *alias, } static char* -S_gen_labeled_sample(const char *invocant, const char *alias, - CFCParamList *param_list, size_t start) { +S_gen_labeled_sample(const char *prologue, CFCParamList *param_list, + size_t start) { size_t num_vars = CFCParamList_num_vars(param_list); CFCVariable **vars = CFCParamList_get_variables(param_list); const char **inits = CFCParamList_get_initial_values(param_list); @@ -467,7 +482,8 @@ S_gen_labeled_sample(const char *invocant, const char *alias, size_t label_len = strlen(label); if (label_len > max_label_len) { max_label_len = label_len; } - char *perl_var = S_perl_var_name(var); + CFCType *type = CFCVariable_get_type(var); + char *perl_var = S_perl_var_name(type); size_t perl_var_len = strlen(perl_var); if (perl_var_len > max_var_len) { max_var_len = perl_var_len; } FREEMEM(perl_var); @@ -478,7 +494,8 @@ S_gen_labeled_sample(const char *invocant, const char *alias, for (size_t i = start; i < num_vars; i++) { CFCVariable *var = vars[i]; const char *label = CFCVariable_get_name(var); - char *perl_var = S_perl_var_name(var); + CFCType *type = CFCVariable_get_type(var); + char *perl_var = S_perl_var_name(type); perl_var = CFCUtil_cat(perl_var, ",", NULL); char *comment = NULL; @@ -503,18 +520,17 @@ S_gen_labeled_sample(const char *invocant, const char *alias, } const char pattern[] = - " %s->%s(\n" + " %s(\n" "%s" " );\n"; - char *sample = CFCUtil_sprintf(pattern, invocant, alias, params); + char *sample = CFCUtil_sprintf(pattern, prologue, params); FREEMEM(params); return sample; } static char* -S_perl_var_name(CFCVariable *var) { - CFCType *type = CFCVariable_get_type(var); +S_perl_var_name(CFCType *type) { const char *specifier = CFCType_get_specifier(type); char *perl_name = NULL; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5f6a9cb5/runtime/perl/buildlib/Clownfish/Build/Binding.pm ---------------------------------------------------------------------- diff --git a/runtime/perl/buildlib/Clownfish/Build/Binding.pm b/runtime/perl/buildlib/Clownfish/Build/Binding.pm index b58205a..1c5cb58 100644 --- a/runtime/perl/buildlib/Clownfish/Build/Binding.pm +++ b/runtime/perl/buildlib/Clownfish/Build/Binding.pm @@ -269,11 +269,8 @@ sub bind_charbuf { $buf->cat_char(ord("\n")); print $buf->to_string; END_SYNOPSIS - my $constructor = <<'END_CONSTRUCTOR'; - my $buf = Clownfish::CharBuf->new( capacity => 256 ); -END_CONSTRUCTOR $pod_spec->set_synopsis($synopsis); - $pod_spec->add_constructor( sample => $constructor ); + $pod_spec->add_constructor(); my $binding = Clownfish::CFC::Binding::Perl::Class->new( parcel => "Clownfish", @@ -487,9 +484,6 @@ sub bind_hash { $hash->store($key, $value); my $value = $hash->fetch($key); END_SYNOPSIS - my $constructor = <<'END_CONSTRUCTOR'; - my $hash = Clownfish::Hash->new( capacity => 256 ); -END_CONSTRUCTOR my $store_pod = <<'END_POD'; =head2 store @@ -498,7 +492,7 @@ END_CONSTRUCTOR Store a key-value pair. END_POD $pod_spec->set_synopsis($synopsis); - $pod_spec->add_constructor( sample => $constructor ); + $pod_spec->add_constructor(); $pod_spec->add_method( method => 'Store', alias => 'store', @@ -836,9 +830,6 @@ sub bind_vector { $vector->store($tick, $value); my $value = $vector->fetch($tick); END_SYNOPSIS - my $constructor = <<'END_CONSTRUCTOR'; - my $vector = Clownfish::Vector->new( capacity => 256 ); -END_CONSTRUCTOR my $store_pod = <<'END_POD'; =head2 store @@ -847,7 +838,7 @@ END_CONSTRUCTOR Store an element at index C<tick>, possibly displacing an existing element. END_POD $pod_spec->set_synopsis($synopsis); - $pod_spec->add_constructor( sample => $constructor ); + $pod_spec->add_constructor(); $pod_spec->add_method( method => 'Store', alias => 'store', @@ -912,21 +903,12 @@ END_SYNOPSIS my $fetch_class_sample = <<'END_CONSTRUCTOR'; my $class = Clownfish::Class->fetch_class($class_name); END_CONSTRUCTOR - my $singleton_sample = <<'END_CONSTRUCTOR'; - my $class = Clownfish::Class->singleton( - class_name => $class_name, - parent => $parent, - ); -END_CONSTRUCTOR $pod_spec->set_synopsis($synopsis); $pod_spec->add_constructor( alias => 'fetch_class', sample => $fetch_class_sample, ); - $pod_spec->add_constructor( - alias => 'singleton', - sample => $singleton_sample, - ); + $pod_spec->add_constructor( alias => 'singleton' ); my $xs_code = <<'END_XS_CODE'; MODULE = Clownfish PACKAGE = Clownfish::Class
