Commit 08a85de7 authored by sgjesse@chromium.org's avatar sgjesse@chromium.org

Revert "Support for precise stepping in functions compiled before debugging was started (step 2)"

TBR=kmillikin@chromium.org

BUG=
TEST=

Review URL: http://codereview.chromium.org//8101011

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9502 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b2ebc91f
...@@ -58,6 +58,7 @@ CompilationInfo::CompilationInfo(Handle<Script> script) ...@@ -58,6 +58,7 @@ CompilationInfo::CompilationInfo(Handle<Script> script)
script_(script), script_(script),
extension_(NULL), extension_(NULL),
pre_parse_data_(NULL), pre_parse_data_(NULL),
supports_deoptimization_(false),
osr_ast_id_(AstNode::kNoNumber) { osr_ast_id_(AstNode::kNoNumber) {
Initialize(NONOPT); Initialize(NONOPT);
} }
...@@ -72,6 +73,7 @@ CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info) ...@@ -72,6 +73,7 @@ CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info)
script_(Handle<Script>(Script::cast(shared_info->script()))), script_(Handle<Script>(Script::cast(shared_info->script()))),
extension_(NULL), extension_(NULL),
pre_parse_data_(NULL), pre_parse_data_(NULL),
supports_deoptimization_(false),
osr_ast_id_(AstNode::kNoNumber) { osr_ast_id_(AstNode::kNoNumber) {
Initialize(BASE); Initialize(BASE);
} }
...@@ -87,6 +89,7 @@ CompilationInfo::CompilationInfo(Handle<JSFunction> closure) ...@@ -87,6 +89,7 @@ CompilationInfo::CompilationInfo(Handle<JSFunction> closure)
script_(Handle<Script>(Script::cast(shared_info_->script()))), script_(Handle<Script>(Script::cast(shared_info_->script()))),
extension_(NULL), extension_(NULL),
pre_parse_data_(NULL), pre_parse_data_(NULL),
supports_deoptimization_(false),
osr_ast_id_(AstNode::kNoNumber) { osr_ast_id_(AstNode::kNoNumber) {
Initialize(BASE); Initialize(BASE);
} }
...@@ -305,9 +308,9 @@ static bool MakeCrankshaftCode(CompilationInfo* info) { ...@@ -305,9 +308,9 @@ static bool MakeCrankshaftCode(CompilationInfo* info) {
static bool GenerateCode(CompilationInfo* info) { static bool GenerateCode(CompilationInfo* info) {
return info->IsCompilingForDebugging() || !V8::UseCrankshaft() ? return V8::UseCrankshaft() ?
FullCodeGenerator::MakeCode(info) : MakeCrankshaftCode(info) :
MakeCrankshaftCode(info); FullCodeGenerator::MakeCode(info);
} }
......
...@@ -120,19 +120,6 @@ class CompilationInfo BASE_EMBEDDED { ...@@ -120,19 +120,6 @@ class CompilationInfo BASE_EMBEDDED {
ASSERT(IsOptimizing()); ASSERT(IsOptimizing());
osr_ast_id_ = osr_ast_id; osr_ast_id_ = osr_ast_id;
} }
void MarkCompilingForDebugging(Handle<Code> current_code) {
ASSERT(mode_ != OPTIMIZE);
ASSERT(current_code->kind() == Code::FUNCTION);
flags_ |= IsCompilingForDebugging::encode(true);
if (current_code->is_compiled_optimizable()) {
EnableDeoptimizationSupport();
} else {
mode_ = CompilationInfo::NONOPT;
}
}
bool IsCompilingForDebugging() {
return IsCompilingForDebugging::decode(flags_);
}
bool has_global_object() const { bool has_global_object() const {
return !closure().is_null() && (closure()->context()->global() != NULL); return !closure().is_null() && (closure()->context()->global() != NULL);
...@@ -152,12 +139,10 @@ class CompilationInfo BASE_EMBEDDED { ...@@ -152,12 +139,10 @@ class CompilationInfo BASE_EMBEDDED {
void DisableOptimization(); void DisableOptimization();
// Deoptimization support. // Deoptimization support.
bool HasDeoptimizationSupport() const { bool HasDeoptimizationSupport() const { return supports_deoptimization_; }
return SupportsDeoptimization::decode(flags_);
}
void EnableDeoptimizationSupport() { void EnableDeoptimizationSupport() {
ASSERT(IsOptimizable()); ASSERT(IsOptimizable());
flags_ |= SupportsDeoptimization::encode(true); supports_deoptimization_ = true;
} }
// Determine whether or not we can adaptively optimize. // Determine whether or not we can adaptively optimize.
...@@ -218,11 +203,6 @@ class CompilationInfo BASE_EMBEDDED { ...@@ -218,11 +203,6 @@ class CompilationInfo BASE_EMBEDDED {
class IsNativesSyntaxAllowed: public BitField<bool, 5, 1> {}; class IsNativesSyntaxAllowed: public BitField<bool, 5, 1> {};
// Is this a function from our natives. // Is this a function from our natives.
class IsNative: public BitField<bool, 6, 1> {}; class IsNative: public BitField<bool, 6, 1> {};
// Is this code being compiled with support for deoptimization..
class SupportsDeoptimization: public BitField<bool, 7, 1> {};
// If compiling for debugging produce just full code matching the
// initial mode setting.
class IsCompilingForDebugging: public BitField<bool, 8, 1> {};
unsigned flags_; unsigned flags_;
...@@ -251,6 +231,7 @@ class CompilationInfo BASE_EMBEDDED { ...@@ -251,6 +231,7 @@ class CompilationInfo BASE_EMBEDDED {
// Compilation mode flag and whether deoptimization is allowed. // Compilation mode flag and whether deoptimization is allowed.
Mode mode_; Mode mode_;
bool supports_deoptimization_;
int osr_ast_id_; int osr_ast_id_;
DISALLOW_COPY_AND_ASSIGN(CompilationInfo); DISALLOW_COPY_AND_ASSIGN(CompilationInfo);
......
This diff is collapsed.
...@@ -809,15 +809,11 @@ class Debugger { ...@@ -809,15 +809,11 @@ class Debugger {
} }
void set_compiling_natives(bool compiling_natives) { void set_compiling_natives(bool compiling_natives) {
compiling_natives_ = compiling_natives; Debugger::compiling_natives_ = compiling_natives;
} }
bool compiling_natives() const { return compiling_natives_; } bool compiling_natives() const { return compiling_natives_; }
void set_loading_debugger(bool v) { is_loading_debugger_ = v; } void set_loading_debugger(bool v) { is_loading_debugger_ = v; }
bool is_loading_debugger() const { return is_loading_debugger_; } bool is_loading_debugger() const { return is_loading_debugger_; }
void set_force_debugger_active(bool force_debugger_active) {
force_debugger_active_ = force_debugger_active;
}
bool force_debugger_active() const { return force_debugger_active_; }
bool IsDebuggerActive(); bool IsDebuggerActive();
...@@ -843,7 +839,6 @@ class Debugger { ...@@ -843,7 +839,6 @@ class Debugger {
bool compiling_natives_; // Are we compiling natives? bool compiling_natives_; // Are we compiling natives?
bool is_loading_debugger_; // Are we loading the debugger? bool is_loading_debugger_; // Are we loading the debugger?
bool never_unload_debugger_; // Can we unload the debugger? bool never_unload_debugger_; // Can we unload the debugger?
bool force_debugger_active_; // Activate debugger without event listeners.
v8::Debug::MessageHandler2 message_handler_; v8::Debug::MessageHandler2 message_handler_;
bool debugger_unload_pending_; // Was message handler cleared? bool debugger_unload_pending_; // Was message handler cleared?
v8::Debug::HostDispatchHandler host_dispatch_handler_; v8::Debug::HostDispatchHandler host_dispatch_handler_;
......
...@@ -289,12 +289,11 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info) { ...@@ -289,12 +289,11 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info) {
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
code->set_has_debug_break_slots( code->set_has_debug_break_slots(
info->isolate()->debugger()->IsDebuggerActive()); info->isolate()->debugger()->IsDebuggerActive());
code->set_compiled_optimizable(info->IsOptimizable());
#endif // ENABLE_DEBUGGER_SUPPORT #endif // ENABLE_DEBUGGER_SUPPORT
code->set_allow_osr_at_loop_nesting_level(0); code->set_allow_osr_at_loop_nesting_level(0);
code->set_stack_check_table_offset(table_offset); code->set_stack_check_table_offset(table_offset);
CodeGenerator::PrintCode(code, info); CodeGenerator::PrintCode(code, info);
info->SetCode(code); // May be an empty handle. info->SetCode(code); // may be an empty handle.
#ifdef ENABLE_GDB_JIT_INTERFACE #ifdef ENABLE_GDB_JIT_INTERFACE
if (FLAG_gdbjit && !code.is_null()) { if (FLAG_gdbjit && !code.is_null()) {
GDBJITLineInfo* lineinfo = GDBJITLineInfo* lineinfo =
......
...@@ -216,11 +216,11 @@ int SortedListBSearch( ...@@ -216,11 +216,11 @@ int SortedListBSearch(
int mid = (low + high) / 2; int mid = (low + high) / 2;
T mid_elem = list[mid]; T mid_elem = list[mid];
if (cmp(&mid_elem, &elem) > 0) { if (mid_elem > elem) {
high = mid - 1; high = mid - 1;
continue; continue;
} }
if (cmp(&mid_elem, &elem) < 0) { if (mid_elem < elem) {
low = mid + 1; low = mid + 1;
continue; continue;
} }
......
...@@ -2996,21 +2996,6 @@ void Code::set_has_debug_break_slots(bool value) { ...@@ -2996,21 +2996,6 @@ void Code::set_has_debug_break_slots(bool value) {
} }
bool Code::is_compiled_optimizable() {
ASSERT(kind() == FUNCTION);
byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
return FullCodeFlagsIsCompiledOptimizable::decode(flags);
}
void Code::set_compiled_optimizable(bool value) {
ASSERT(kind() == FUNCTION);
byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
}
int Code::allow_osr_at_loop_nesting_level() { int Code::allow_osr_at_loop_nesting_level() {
ASSERT(kind() == FUNCTION); ASSERT(kind() == FUNCTION);
return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset); return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
......
...@@ -3677,11 +3677,6 @@ class Code: public HeapObject { ...@@ -3677,11 +3677,6 @@ class Code: public HeapObject {
inline bool has_debug_break_slots(); inline bool has_debug_break_slots();
inline void set_has_debug_break_slots(bool value); inline void set_has_debug_break_slots(bool value);
// [compiled_with_optimizing]: For FUNCTION kind, tells if it has
// been compiled with IsOptimizing set to true.
inline bool is_compiled_optimizable();
inline void set_compiled_optimizable(bool value);
// [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for // [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for
// how long the function has been marked for OSR and therefore which // how long the function has been marked for OSR and therefore which
// level of loop nesting we are willing to do on-stack replacement // level of loop nesting we are willing to do on-stack replacement
...@@ -3877,7 +3872,6 @@ class Code: public HeapObject { ...@@ -3877,7 +3872,6 @@ class Code: public HeapObject {
class FullCodeFlagsHasDeoptimizationSupportField: class FullCodeFlagsHasDeoptimizationSupportField:
public BitField<bool, 0, 1> {}; // NOLINT public BitField<bool, 0, 1> {}; // NOLINT
class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {};
class FullCodeFlagsIsCompiledOptimizable: public BitField<bool, 2, 1> {};
static const int kBinaryOpReturnTypeOffset = kBinaryOpTypeOffset + 1; static const int kBinaryOpReturnTypeOffset = kBinaryOpTypeOffset + 1;
......
...@@ -143,16 +143,6 @@ static int PointerValueCompare(const T* a, const T* b) { ...@@ -143,16 +143,6 @@ static int PointerValueCompare(const T* a, const T* b) {
} }
// Compare function to compare the object pointer value of two
// handlified objects. The handles are passed as pointers to the
// handles.
template<typename T> class Handle; // Forward declaration.
template <typename T>
static int HandleObjectPointerCompare(const Handle<T>* a, const Handle<T>* b) {
return Compare<T*>(*(*a), *(*b));
}
// Returns the smallest power of two which is >= x. If you pass in a // Returns the smallest power of two which is >= x. If you pass in a
// number that is already a power of two, it is returned as is. // number that is already a power of two, it is returned as is.
// Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr.,
......
// Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --expose-debug-as debug
// This test tests that full code compiled without debug break slots
// is recompiled with debug break slots when debugging is started.
// Get the Debug object exposed from the debug context global object.
Debug = debug.Debug
var bp;
var done = false;
var step_count = 0;
var set_bp = false
// Debug event listener which steps until the global variable done is true.
function listener(event, exec_state, event_data, data) {
if (event == Debug.DebugEvent.Break) {
if (!done) exec_state.prepareStep(Debug.StepAction.StepNext);
step_count++;
}
};
// Set the global variables state to prpare the stepping test.
function prepare_step_test() {
done = false;
step_count = 0;
}
// Test function to step through.
function f() {
var a = 0;
if (set_bp) { bp = Debug.setBreakPoint(f, 3); }
var i = 1;
var j = 2;
done = true;
};
prepare_step_test();
f();
// Add the debug event listener.
Debug.setListener(listener);
// Make f set a breakpoint with an activation on the stack.
prepare_step_test();
set_bp = true;
f();
assertEquals(4, step_count);
Debug.clearBreakPoint(bp);
// Set a breakpoint on the first var statement (line 1).
set_bp = false;
bp = Debug.setBreakPoint(f, 3);
// Step through the function ensuring that the var statements are hit as well.
prepare_step_test();
f();
assertEquals(4, step_count);
// Clear the breakpoint and check that no stepping happens.
Debug.clearBreakPoint(bp);
prepare_step_test();
f();
assertEquals(0, step_count);
// Get rid of the debug event listener.
Debug.setListener(null);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment