[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