[svn:parrot] r45194 - in trunk/src: . call
chromatic at svn.parrot.org
chromatic at svn.parrot.org
Sat Mar 27 01:02:22 UTC 2010
Author: chromatic
Date: Sat Mar 27 01:02:22 2010
New Revision: 45194
URL: https://trac.parrot.org/parrot/changeset/45194
Log:
[PCC] Made Parrot_pcc_split_signature_string() *not* allocate memory for the
args/returns signatures, so now nothing has to free that memory and none of
that memory can ever leak. This makes the API simpler, removes code, *and*
improves PCC speed.
Modified:
trunk/src/call/args.c
trunk/src/call/pcc.c
trunk/src/extend.c
trunk/src/multidispatch.c
Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c Sat Mar 27 00:35:33 2010 (r45193)
+++ trunk/src/call/args.c Sat Mar 27 01:02:22 2010 (r45194)
@@ -674,10 +674,8 @@
PMC * arg_flags = PMCNULL;
PMC * ignored_flags = PMCNULL;
PMC * call_object;
- INTVAL sig_len = strlen(sig);
- INTVAL in_return_sig = 0;
+ const INTVAL sig_len = strlen(sig);
INTVAL i = 0;
- int append_pi = 1;
if (PMC_IS_NULL(signature))
call_object = Parrot_pmc_new(interp, enum_class_CallContext);
@@ -730,7 +728,7 @@
break;
}
case '-':
- in_return_sig = 1;
+ return call_object;
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -1461,30 +1459,14 @@
{
ASSERT_ARGS(Parrot_pcc_split_signature_string)
const char *cur;
- int arg_len = 0;
- int ret_len = 0;
- char *arg_tmp;
- char *ret_tmp;
for (cur = signature; *cur != '\0'; cur++) {
if (*cur == '-')
break;
- else
- arg_len++;
}
- ret_len = strlen(signature) - arg_len - 2;
- if (ret_len < 1)
- ret_len = 0;
-
- arg_tmp = (char *) malloc(arg_len + 1);
- ret_tmp = (char *) malloc(ret_len + 1);
- strncpy(arg_tmp, signature, arg_len);
- strncpy(ret_tmp, cur + 2, ret_len);
- arg_tmp[arg_len] = '\0';
- ret_tmp[ret_len] = '\0';
- *arg_sig = arg_tmp;
- *return_sig = ret_tmp;
+ *arg_sig = signature;
+ *return_sig = cur + 2;
}
/*
@@ -1518,9 +1500,9 @@
for (x = signature; *x != '\0'; x++) {
/* detect -> separator */
- if (*x == '-') {
+ if (*x == '-')
break;
- }
+
/* parse arg type */
else if (isupper((unsigned char)*x)) {
/* Starting a new argument, so store the previous argument,
@@ -1593,8 +1575,6 @@
parse_signature_string(interp, arg_sig, arg_flags);
parse_signature_string(interp, ret_sig, return_flags);
Parrot_str_free_cstring(s);
- Parrot_str_free_cstring(arg_sig);
- Parrot_str_free_cstring(ret_sig);
}
/*
Modified: trunk/src/call/pcc.c
==============================================================================
--- trunk/src/call/pcc.c Sat Mar 27 00:35:33 2010 (r45193)
+++ trunk/src/call/pcc.c Sat Mar 27 01:02:22 2010 (r45194)
@@ -92,8 +92,6 @@
PARROT_ERRORS_RESULT_COUNT_FLAG);
va_end(args);
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_call_obj);
- mem_sys_free(arg_sig);
- mem_sys_free(ret_sig);
}
@@ -242,12 +240,9 @@
/* Find the subroutine object as a named method on pmc */
sub_obj = VTABLE_find_method(interp, pmc, method_name);
- if (PMC_IS_NULL(sub_obj)) {
- mem_sys_free(arg_sig);
- mem_sys_free(ret_sig);
+ if (PMC_IS_NULL(sub_obj))
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_METHOD_NOT_FOUND,
"Method '%Ss' not found", method_name);
- }
/* Invoke the subroutine object with the given CallContext object */
Parrot_pcc_invoke_from_sig_object(interp, sub_obj, call_obj);
@@ -256,8 +251,6 @@
PARROT_ERRORS_RESULT_COUNT_FLAG);
va_end(args);
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_call_obj);
- mem_sys_free(arg_sig);
- mem_sys_free(ret_sig);
}
Modified: trunk/src/extend.c
==============================================================================
--- trunk/src/extend.c Sat Mar 27 00:35:33 2010 (r45193)
+++ trunk/src/extend.c Sat Mar 27 01:02:22 2010 (r45194)
@@ -1064,8 +1064,6 @@
PARROT_ERRORS_RESULT_COUNT_FLAG);
va_end(args);
Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), old_call_obj);
- mem_gc_free(interp, arg_sig);
- mem_gc_free(interp, ret_sig);
}
Modified: trunk/src/multidispatch.c
==============================================================================
--- trunk/src/multidispatch.c Sat Mar 27 00:35:33 2010 (r45193)
+++ trunk/src/multidispatch.c Sat Mar 27 01:02:22 2010 (r45194)
@@ -272,8 +272,6 @@
va_start(args, sig);
call_obj = Parrot_pcc_build_call_from_varargs(interp, PMCNULL, arg_sig, &args);
- mem_gc_free(interp, arg_sig);
-
/* Check the cache. */
sub = Parrot_mmd_cache_lookup_by_types(interp, interp->op_mmd_cache, name,
VTABLE_get_pmc(interp, call_obj));
@@ -287,12 +285,10 @@
VTABLE_get_pmc(interp, call_obj), sub);
}
- if (PMC_IS_NULL(sub)) {
- mem_gc_free(interp, ret_sig);
+ if (PMC_IS_NULL(sub))
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_METHOD_NOT_FOUND,
"Multiple Dispatch: No suitable candidate found for '%s',"
" with signature '%s'", name, sig);
- }
#if MMD_DEBUG
Parrot_io_eprintf(interp, "candidate found for '%s', with signature '%s'\n",
@@ -305,7 +301,6 @@
call_obj = Parrot_pcc_get_signature(interp, CURRENT_CONTEXT(interp));
Parrot_pcc_fill_params_from_varargs(interp, call_obj, ret_sig, &args,
PARROT_ERRORS_RESULT_COUNT_FLAG);
- mem_gc_free(interp, ret_sig);
va_end(args);
}
More information about the parrot-commits
mailing list