[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