On 2014/05/08 12:42:40, Yang wrote:
On 2014/05/08 12:40:48, rmcilroy wrote:
> On 2014/05/08 11:13:33, Yang wrote:
> > On 2014/05/08 10:47:47, Yang wrote:
> > > On 2014/05/08 10:47:11, ulan wrote:
> > > > On 2014/05/08 10:36:53, Yang wrote:
> > > > > On 2014/05/08 10:17:09, ulan wrote:
> > > > > > Here is what happens in debug-multiple-breakpoints.js:
> > > > > >
> > > > > > 1. A hot function is marked for optimization by replacing its
code
> with
> > > > > > CompileOptimized or CompileOptimizedConcurrent builtin.
> > > > > > 2. Debug::PrepareForBreakPoints deoptimizes optimized
functions
but
> > > doesn't
> > > > > > restore code of functions that were marked for optimization.
> > > > > > 3. ASSERT_EQ(Code::FUNCTION, function->code()->kind())
triggers in
> > > > > > Debug::MaybeRecompileFunctionForDebugging
> > > > > >
> > > > > > Yang, is this a bug in Debug::PrepareForBreakPoints that
functions
> > marked
> > > > for
> > > > > > optimization do not get their code restored?
> > > > >
> > > > > No. This seems to be a result of the refactoring in
> > > > >
https://codereview.chromium.org/260423002/diff/40001/src/debug.cc
> > > > >
> > > > > The assertion that is triggering has been newly introduced. I
think
we
> > > should
> > > > > remove it. What should happen there is that if the function is
on
the
> > stack
> > > at
> > > > > the point of Debug::PrepareForBreakPoints, it should be
recompiled
for
> > > > debugging
> > > > > regardless of what it currently is (including being marked by
builtin).
> > The
> > > > only
> > > > > exception to that rule is that if it already has been
recompiled for
> > > > debugging.
> > > > >
> > > > > I will make this easier to understand in the future, but for
now,
just
> > > revert
> > > > > that part of the refactoring there.
> > > >
> > > > Thanks, Yang. So we can just remove the assertions
> > > > 2006 ASSERT_EQ(Code::FUNCTION, function->code()->kind());
> > > > 2007 ASSERT_EQ(function->code(), function->shared()->code());
> > > > in Debug::MaybeRecompileFunctionForDebugging? Because the function
code
> will
> > > be
> > > > replaced anyway.
> > >
> > > Yes.
> >
> > Wait. Please check for (Code::FUNCTION == function->code()->kind())
before
> > checking whether it already has_debug_break_slots(). Otherwise the
latter
may
> > assert. Something like
> > if (Code::FUNCTION == function->code()->kind() &&
> > function->code()->has_debug_break_slots()) return;
>
> Thanks Yang! I guess you mean:
> if (Code::FUNCTION != function->code()->kind() ||
> function->code()->has_debug_break_slots()) return;
> ? I'll give that a go and send out a separate CL if this fixes things.
No! I don't mean that. In MaybeRecompileFunctionForDebugging, what we
want to
do
is to make sure the function code afterwards is unoptimized and contains
debug
break slots. So only if that's already true, we return prematurely. If the
function code kind is not FUNCTION, it could be a builtin, or optimized
code.
In
either of those cases, we want to recompile.
We could actually rename it to EnsureFunctionHasDebugBreakSlots.
https://codereview.chromium.org/271543004/
--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.