[svn:parrot] r41218 - in trunk/src: . runcore

chromatic at svn.parrot.org chromatic at svn.parrot.org
Fri Sep 11 18:52:29 UTC 2009


Author: chromatic
Date: Fri Sep 11 18:52:19 2009
New Revision: 41218
URL: https://trac.parrot.org/parrot/changeset/41218

Log:
[profiling] Made Parrot_Sub_get_line_from_pc() more correct for the profiling
runcore.

Modified:
   trunk/src/runcore/profiling.c
   trunk/src/sub.c

Modified: trunk/src/runcore/profiling.c
==============================================================================
--- trunk/src/runcore/profiling.c	Fri Sep 11 18:45:39 2009	(r41217)
+++ trunk/src/runcore/profiling.c	Fri Sep 11 18:52:19 2009	(r41218)
@@ -269,7 +269,6 @@
         preop_line = Parrot_Sub_get_line_from_pc(interp,
                 Parrot_pcc_get_sub(interp, CURRENT_CONTEXT(interp)), pc);
 
-
         CONTEXT(interp)->current_pc = pc;
         preop_sub                   = CONTEXT(interp)->current_sub;
         preop_pc                    = pc;

Modified: trunk/src/sub.c
==============================================================================
--- trunk/src/sub.c	Fri Sep 11 18:45:39 2009	(r41217)
+++ trunk/src/sub.c	Fri Sep 11 18:52:19 2009	(r41218)
@@ -286,15 +286,35 @@
 {
     ASSERT_ARGS(Parrot_Sub_get_line_from_pc)
     Parrot_Sub_attributes *sub;
-    int                    position;
+    PackFile_Debug        *debug;
+    opcode_t              *base_pc;
+    size_t                 i, n, offs;
 
     if (!subpmc || !pc)
         return -1;
 
     PMC_get_sub(interp, subpmc, sub);
-    position = pc - sub->seg->base.data;
 
-    return (INTVAL)(sub->seg->debugs->base.data[position]);
+    offs    = pc - sub->seg->base.data;
+    debug   = sub->seg->debugs;
+    base_pc = sub->seg->base.data;
+
+    for (i = n = 0; n < sub->seg->base.size; i++) {
+        op_info_t * const op_info  = &interp->op_info_table[*base_pc];
+        opcode_t          var_args = 0;
+
+        if (i >= debug->base.size)
+            return -1;
+
+        if (n >= offs)
+            return debug->base.data[i];
+
+        ADD_OP_VAR_PART(interp, sub->seg, base_pc, var_args);
+        n       += op_info->op_count + var_args;
+        base_pc += op_info->op_count + var_args;
+    }
+
+    return -1;
 }
 
 


More information about the parrot-commits mailing list