[svn:parrot] r41651 - branches/pcc_reapply/src
bacek at svn.parrot.org
bacek at svn.parrot.org
Sat Oct 3 23:01:55 UTC 2009
Author: bacek
Date: Sat Oct 3 23:01:55 2009
New Revision: 41651
URL: https://trac.parrot.org/parrot/changeset/41651
Log:
Rework Parrot_call_method to use new API. There is no tests for this functions and I couldn't find any HLL which uses them.
Modified:
branches/pcc_reapply/src/extend.c
Modified: branches/pcc_reapply/src/extend.c
==============================================================================
--- branches/pcc_reapply/src/extend.c Sat Oct 3 23:01:38 2009 (r41650)
+++ branches/pcc_reapply/src/extend.c Sat Oct 3 23:01:55 2009 (r41651)
@@ -1213,15 +1213,45 @@
Parrot_String method, ARGIN(const char *signature), ...)
{
ASSERT_ARGS(Parrot_call_method)
- void *result;
- va_list ap;
+ va_list args;
+ PMC *sig_object;
+ void *result;
+ char return_sig = signature[0];
+ char *arg_sig = (char*)malloc(strlen(signature)+2);
+ arg_sig[0] = 'P';
+ arg_sig[1] = 'i';
+ arg_sig[2] = 0;
+ strcat(arg_sig, signature + 1);
+
+ va_start(args, signature);
+ sig_object = Parrot_pcc_build_sig_object_from_varargs(interp, obj, arg_sig, args);
+ va_end(args);
+ free(arg_sig);
+
+ /* Add the return argument onto the call signature object (a bit
+ * hackish, added for backward compatibility in deprecated API function,
+ * see TT #XXX). */
+ switch (return_sig) {
+ case 'v':
+ {
+ Parrot_String full_sig = VTABLE_get_string(interp, sig_object);
+ Parrot_str_concat(interp, full_sig,
+ Parrot_str_new_constant(interp, "->"), 0);
+ break;
+ }
+ case 'V':
+ case 'P':
+ {
+ append_result(interp, sig_object, Parrot_str_new_constant(interp, "P"), &result);
+ break;
+ }
+ default:
+ Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
+ "Dispatch: invalid return type %c!", return_sig);
+ }
+
+ Parrot_pcc_invoke_from_sig_object(interp, sub, sig_object);
- PARROT_CALLIN_START(interp);
- va_start(ap, signature);
- result = Parrot_run_meth_fromc_arglist(interp, sub,
- obj, method, signature, ap);
- va_end(ap);
- PARROT_CALLIN_END(interp);
return result;
}
@@ -1245,15 +1275,24 @@
Parrot_PMC obj, Parrot_String method, ARGIN(const char *signature), ...)
{
ASSERT_ARGS(Parrot_call_method_ret_int)
+ va_list args;
+ PMC *sig_object;
Parrot_Int result;
- va_list ap;
-
- PARROT_CALLIN_START(interp);
- va_start(ap, signature);
- result = Parrot_run_meth_fromc_arglist_reti(interp, sub,
- obj, method, signature, ap);
- va_end(ap);
- PARROT_CALLIN_END(interp);
+ char return_sig = signature[0];
+ char *arg_sig = (char*)malloc(strlen(signature)+2);
+ arg_sig[0] = 'P';
+ arg_sig[1] = 'i';
+ arg_sig[2] = 0;
+ strcat(arg_sig, signature + 1);
+
+ va_start(args, signature);
+ sig_object = Parrot_pcc_build_sig_object_from_varargs(interp, obj, arg_sig, args);
+ va_end(args);
+ free(arg_sig);
+
+ append_result(interp, sig_object, Parrot_str_new_constant(interp, "I"), &result);
+ Parrot_pcc_invoke_from_sig_object(interp, sub, sig_object);
+
return result;
}
@@ -1274,15 +1313,24 @@
Parrot_PMC obj, Parrot_String method, ARGIN(const char *signature), ...)
{
ASSERT_ARGS(Parrot_call_method_ret_float)
+ va_list args;
+ PMC *sig_object;
Parrot_Float result;
- va_list ap;
-
- PARROT_CALLIN_START(interp);
- va_start(ap, signature);
- result = Parrot_run_meth_fromc_arglist_retf(interp, sub,
- obj, method, signature, ap);
- va_end(ap);
- PARROT_CALLIN_END(interp);
+ char return_sig = signature[0];
+ char *arg_sig = (char*)malloc(strlen(signature)+2);
+ arg_sig[0] = 'P';
+ arg_sig[1] = 'i';
+ arg_sig[2] = 0;
+ strcat(arg_sig, signature + 1);
+
+ va_start(args, signature);
+ sig_object = Parrot_pcc_build_sig_object_from_varargs(interp, obj, arg_sig, args);
+ va_end(args);
+ free(arg_sig);
+
+ append_result(interp, sig_object, Parrot_str_new_constant(interp, "N"), &result);
+ Parrot_pcc_invoke_from_sig_object(interp, sub, sig_object);
+
return result;
}
More information about the parrot-commits
mailing list