[svn:parrot] r44777 - in branches/pcc_hackathon_6Mar10: include/parrot lib/Parrot/Pmc2c src/call src/pmc
allison at svn.parrot.org
allison at svn.parrot.org
Mon Mar 8 21:58:28 UTC 2010
Author: allison
Date: Mon Mar 8 21:58:24 2010
New Revision: 44777
URL: https://trac.parrot.org/parrot/changeset/44777
Log:
[pcc] Correctly pass return results from generated NCI methods in PMCs. Add
invocant to signature from interp->current_object, rather than passing as an
argument.
Modified:
branches/pcc_hackathon_6Mar10/include/parrot/call.h
branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm
branches/pcc_hackathon_6Mar10/src/call/args.c
branches/pcc_hackathon_6Mar10/src/call/pcc.c
branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc
Modified: branches/pcc_hackathon_6Mar10/include/parrot/call.h
==============================================================================
--- branches/pcc_hackathon_6Mar10/include/parrot/call.h Mon Mar 8 20:23:57 2010 (r44776)
+++ branches/pcc_hackathon_6Mar10/include/parrot/call.h Mon Mar 8 21:58:24 2010 (r44777)
@@ -157,10 +157,19 @@
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PMC* Parrot_pcc_build_call_from_c_args(PARROT_INTERP,
+ ARGIN_NULLOK(PMC *signature),
+ ARGIN(const char *sig),
+ ...)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+
+PARROT_EXPORT
PARROT_WARN_UNUSED_RESULT
PARROT_CANNOT_RETURN_NULL
PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP,
- ARGIN_NULLOK(PMC *obj),
+ ARGIN_NULLOK(PMC *signature),
ARGIN(const char *sig),
ARGMOD(va_list *args))
__attribute__nonnull__(1)
@@ -261,6 +270,10 @@
FUNC_MODIFIES(*arg_sig)
FUNC_MODIFIES(*return_sig);
+#define ASSERT_ARGS_Parrot_pcc_build_call_from_c_args \
+ __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+ PARROT_ASSERT_ARG(interp) \
+ , PARROT_ASSERT_ARG(sig))
#define ASSERT_ARGS_Parrot_pcc_build_call_from_varargs \
__attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
Modified: branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm
==============================================================================
--- branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm Mon Mar 8 20:23:57 2010 (r44776)
+++ branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm Mon Mar 8 21:58:24 2010 (r44777)
@@ -258,7 +258,7 @@
/*BEGIN RETURN $returns */
END
$e->emit( <<"END", __FILE__, __LINE__ + 1 );
- Parrot_pcc_fill_returns_from_c_args(interp, _call_object, "$returns_signature",
+ Parrot_pcc_build_call_from_c_args(interp, _call_object, "$returns_signature",
$returns_varargs);
return;
/*END RETURN $returns */
Modified: branches/pcc_hackathon_6Mar10/src/call/args.c
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/call/args.c Mon Mar 8 20:23:57 2010 (r44776)
+++ branches/pcc_hackathon_6Mar10/src/call/args.c Mon Mar 8 21:58:24 2010 (r44777)
@@ -524,9 +524,10 @@
ASSERT_ARGS(Parrot_pcc_build_sig_object_from_op)
PMC *call_object;
PMC * const ctx = CURRENT_CONTEXT(interp);
+ PMC *new_sig = PMCNULL;
INTVAL *int_array;
INTVAL arg_count;
- INTVAL arg_index;
+ INTVAL arg_index = 0;
if (PMC_IS_NULL(signature))
call_object = Parrot_pmc_new(interp, enum_class_CallContext);
@@ -536,14 +537,33 @@
}
/* this macro is much, much faster than the VTABLE STRING comparisons */
- SETATTR_CallContext_arg_flags(interp, call_object, raw_sig);
GETATTR_FixedIntegerArray_size(interp, raw_sig, arg_count);
GETATTR_FixedIntegerArray_int_array(interp, raw_sig, int_array);
- for (arg_index = 0; arg_index < arg_count; arg_index++) {
+ if (!PMC_IS_NULL(interp->current_object)) {
+ VTABLE_unshift_pmc(interp, call_object, interp->current_object);
+ if (int_array[0] & (PARROT_ARG_PMC | PARROT_ARG_INVOCANT))
+ arg_index++;
+ else {
+ new_sig = Parrot_pmc_new(interp, enum_class_ResizablePMCArray);
+ VTABLE_unshift_integer(interp, new_sig, PARROT_ARG_PMC | PARROT_ARG_INVOCANT);
+ }
+ interp->current_object = NULL;
+ }
+
+ if (PMC_IS_NULL(new_sig)) {
+ SETATTR_CallContext_arg_flags(interp, call_object, raw_sig);
+ }
+ else {
+ SETATTR_CallContext_arg_flags(interp, call_object, new_sig);
+ }
+
+ for (; arg_index < arg_count; arg_index++) {
const INTVAL arg_flags = int_array[arg_index];
const INTVAL constant = PARROT_ARG_CONSTANT_ISSET(arg_flags);
const INTVAL raw_index = raw_args[arg_index + 2];
+ if (!PMC_IS_NULL(new_sig))
+ VTABLE_push_integer(interp, new_sig, arg_flags);
switch (PARROT_ARG_TYPE_MASK_MASK(arg_flags)) {
case PARROT_ARG_INTVAL:
@@ -730,8 +750,37 @@
/*
-=item C<PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP, PMC *obj, const
-char *sig, va_list *args)>
+=item C<PMC* Parrot_pcc_build_call_from_c_args(PARROT_INTERP, PMC *signature,
+const char *sig, ...)>
+
+Converts a variable list of C args into a CallContext PMC. The CallContext
+stores the original short signature string and an array of integer types to
+pass on to the multiple dispatch search.
+
+=cut
+
+*/
+
+PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PMC*
+Parrot_pcc_build_call_from_c_args(PARROT_INTERP,
+ ARGIN_NULLOK(PMC *signature), ARGIN(const char *sig), ...)
+{
+ ASSERT_ARGS(Parrot_pcc_build_call_from_c_args)
+ PMC *call_object;
+ va_list args;
+ va_start(args, sig);
+ call_object = Parrot_pcc_build_call_from_varargs(interp, signature,
+ sig, &args);
+ va_end(args);
+ return call_object;
+}
+
+/*
+
+=item C<PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP, PMC *signature,
+const char *sig, va_list *args)>
Converts a varargs list into a CallContext PMC. The CallContext stores the
original short signature string and an array of integer types to pass on to the
@@ -745,26 +794,34 @@
PARROT_WARN_UNUSED_RESULT
PARROT_CANNOT_RETURN_NULL
PMC*
-Parrot_pcc_build_call_from_varargs(PARROT_INTERP, ARGIN_NULLOK(PMC *obj),
- ARGIN(const char *sig), ARGMOD(va_list *args))
+Parrot_pcc_build_call_from_varargs(PARROT_INTERP,
+ ARGIN_NULLOK(PMC *signature), ARGIN(const char *sig),
+ ARGMOD(va_list *args))
{
ASSERT_ARGS(Parrot_pcc_build_call_from_varargs)
PMC * type_tuple = PMCNULL;
PMC * arg_flags = PMCNULL;
PMC * ignored_flags = PMCNULL;
- PMC * const call_object = Parrot_pmc_new(interp, enum_class_CallContext);
- INTVAL sig_len = strlen(sig);
+ PMC * call_object;
+ INTVAL sig_len = strlen(sig);
INTVAL in_return_sig = 0;
INTVAL i = 0;
int append_pi = 1;
- const INTVAL has_invocant = !PMC_IS_NULL(obj);
+
+ if (PMC_IS_NULL(signature))
+ call_object = Parrot_pmc_new(interp, enum_class_CallContext);
+ else {
+ call_object = signature;
+ VTABLE_morph(interp, call_object, PMCNULL);
+ }
parse_signature_string(interp, sig, &arg_flags);
- if (has_invocant) {
+ if (!PMC_IS_NULL(interp->current_object)) {
VTABLE_unshift_integer(interp, arg_flags, PARROT_ARG_PMC | PARROT_ARG_INVOCANT);
- VTABLE_unshift_pmc(interp, call_object, obj);
+ VTABLE_unshift_pmc(interp, call_object, interp->current_object);
if (sig[0] == 'P' && sig[1] == 'i')
i += 2;
+ interp->current_object = NULL;
}
VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "arg_flags"), arg_flags);
Modified: branches/pcc_hackathon_6Mar10/src/call/pcc.c
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/call/pcc.c Mon Mar 8 20:23:57 2010 (r44776)
+++ branches/pcc_hackathon_6Mar10/src/call/pcc.c Mon Mar 8 21:58:24 2010 (r44777)
@@ -192,8 +192,10 @@
char *arg_sig, *ret_sig;
Parrot_pcc_split_signature_string(interp, signature, &arg_sig, &ret_sig);
+ interp->current_object = pmc;
+
va_start(args, signature);
- call_obj = Parrot_pcc_build_call_from_varargs(interp, pmc, arg_sig, &args);
+ call_obj = Parrot_pcc_build_call_from_varargs(interp, PMCNULL, arg_sig, &args);
/* Find the subroutine object as a named method on pmc */
sub_obj = VTABLE_find_method(interp, pmc, method_name);
@@ -203,10 +205,10 @@
"Method '%Ss' not found", method_name);
/* Invoke the subroutine object with the given CallContext object */
- interp->current_object = pmc;
Parrot_pcc_invoke_from_sig_object(interp, sub_obj, call_obj);
Parrot_pcc_fill_params_from_varargs(interp, call_obj, ret_sig, &args);
va_end(args);
+
}
/*
Modified: branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc Mon Mar 8 20:23:57 2010 (r44776)
+++ branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc Mon Mar 8 21:58:24 2010 (r44777)
@@ -567,6 +567,11 @@
if (!PMC_data(SELF))
return;
+ SET_ATTR_short_sig(INTERP, SELF, NULL);
+ SET_ATTR_arg_flags(INTERP, SELF, PMCNULL);
+ SET_ATTR_return_flags(INTERP, SELF, PMCNULL);
+ SET_ATTR_type_tuple(INTERP, SELF, PMCNULL);
+
GET_ATTR_hash(INTERP, SELF, hash);
GET_ATTR_num_positionals(INTERP, SELF, num_positionals);
More information about the parrot-commits
mailing list