Revision: 11796
Author: [email protected]
Date: Wed Jun 13 04:26:34 2012
Log: Revert r11782, r11783 and r11790 due to Webkit failures.
[email protected]
Review URL: https://chromiumcodereview.appspot.com/10536142
http://code.google.com/p/v8/source/detail?r=11796
Deleted:
/branches/bleeding_edge/test/mjsunit/debug-script-breakpoints-nested.js
Modified:
/branches/bleeding_edge/src/ast.cc
/branches/bleeding_edge/src/ast.h
/branches/bleeding_edge/src/compiler.cc
/branches/bleeding_edge/src/debug.cc
/branches/bleeding_edge/src/debug.h
/branches/bleeding_edge/src/full-codegen.cc
/branches/bleeding_edge/src/objects-inl.h
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/parser.cc
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/src/scopes.cc
/branches/bleeding_edge/src/scopes.h
/branches/bleeding_edge/test/cctest/test-debug.cc
/branches/bleeding_edge/test/cctest/test-heap.cc
=======================================
--- /branches/bleeding_edge/test/mjsunit/debug-script-breakpoints-nested.js
Tue Jun 12 08:57:50 2012
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 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
-// Get the Debug object exposed from the debug context global object.
-Debug = debug.Debug
-
-// Simple debug event handler which just counts the number of break points
hit.
-var break_point_hit_count = 0;
-
-function listener(event, exec_state, event_data, data) {
- if (event == Debug.DebugEvent.Break) {
- break_point_hit_count++;
- }
-};
-
-// Add the debug event listener.
-Debug.setListener(listener);
-
-eval(
- "var inner;\n" +
- "function outer() {\n" + // Non-trivial outer closure.
- " var x = 5;\n" +
- " function a() {\n" +
- " var foo = 0, y = 7;\n" +
- " function b() {\n" +
- " var bar = 0, baz = 0, z = 11;\n" +
- " function c() {\n" +
- " return x + y + z;\n" + // Breakpoint line ( #8 )
- " }\n" +
- " inner = c;\n" +
- " return c();\n" +
- " }\n" +
- " return b();\n" +
- " }\n" +
- " return a();\n" +
- "}"
-);
-
-var script = Debug.findScript(outer);
-
-// The debugger triggers compilation of inner closures.
-assertEquals(0, Debug.scriptBreakPoints().length);
-var sbp = Debug.setScriptBreakPointById(script.id, 8);
-assertEquals(1, Debug.scriptBreakPoints().length);
-
-// The compiled outer closure should behave correctly.
-assertEquals(23, outer());
-assertEquals(1, break_point_hit_count);
-
-// The compiled inner closure should behave correctly.
-assertEquals(23, inner());
-assertEquals(2, break_point_hit_count);
-
-// Remove script break point.
-assertEquals(1, Debug.scriptBreakPoints().length);
-Debug.clearBreakPoint(sbp);
-assertEquals(0, Debug.scriptBreakPoints().length);
=======================================
--- /branches/bleeding_edge/src/ast.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/ast.cc Wed Jun 13 04:26:34 2012
@@ -154,11 +154,6 @@
bool FunctionLiteral::AllowsLazyCompilation() {
return scope()->AllowsLazyCompilation();
}
-
-
-bool FunctionLiteral::AllowsLazyCompilationWithoutContext() {
- return scope()->AllowsLazyCompilationWithoutContext();
-}
int FunctionLiteral::start_position() const {
=======================================
--- /branches/bleeding_edge/src/ast.h Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/ast.h Wed Jun 13 04:26:34 2012
@@ -2065,7 +2065,6 @@
int parameter_count() { return parameter_count_; }
bool AllowsLazyCompilation();
- bool AllowsLazyCompilationWithoutContext();
Handle<String> debug_name() const {
if (name_->length() > 0) return name_;
=======================================
--- /branches/bleeding_edge/src/compiler.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/compiler.cc Wed Jun 13 04:26:34 2012
@@ -118,7 +118,7 @@
FLAG_crankshaft &&
!function()->flags()->Contains(kDontSelfOptimize) &&
!function()->flags()->Contains(kDontOptimize) &&
- function()->scope()->AllowsLazyCompilation() &&
+ function()->scope()->AllowsLazyRecompilation() &&
(shared_info().is_null() || !shared_info()->optimization_disabled());
}
@@ -137,8 +137,9 @@
// all. However crankshaft support recompilation of functions, so in this
case
// the full compiler need not be be used if a debugger is attached, but
only if
// break points has actually been set.
-static bool IsDebuggerActive(Isolate* isolate) {
+static bool is_debugging_active() {
#ifdef ENABLE_DEBUGGER_SUPPORT
+ Isolate* isolate = Isolate::Current();
return V8::UseCrankshaft() ?
isolate->debug()->has_break_points() :
isolate->debugger()->IsDebuggerActive();
@@ -148,8 +149,8 @@
}
-static bool AlwaysFullCompiler(Isolate* isolate) {
- return FLAG_always_full_compiler || IsDebuggerActive(isolate);
+static bool AlwaysFullCompiler() {
+ return FLAG_always_full_compiler || is_debugging_active();
}
@@ -204,7 +205,7 @@
// Fall back to using the full code generator if it's not possible
// to use the Hydrogen-based optimizing compiler. We already have
// generated code for this from the shared function object.
- if (AlwaysFullCompiler(info->isolate())) {
+ if (AlwaysFullCompiler()) {
info->SetCode(code);
return true;
}
@@ -718,14 +719,8 @@
// builtins cannot be handled lazily by the parser, since we have to know
// if a function uses the special natives syntax, which is something the
// parser records.
- // If the debugger requests compilation for break points, we cannot be
- // aggressive about lazy compilation, because it might trigger
compilation
- // of functions without an outer context when setting a breakpoint
through
- // Runtime::FindSharedFunctionInfoInScript.
- bool allow_lazy_without_ctx =
literal->AllowsLazyCompilationWithoutContext();
bool allow_lazy = literal->AllowsLazyCompilation() &&
- !LiveEditFunctionTracker::IsActive(info.isolate()) &&
- (!info.isolate()->DebuggerHasBreakPoints() ||
allow_lazy_without_ctx);
+ !LiveEditFunctionTracker::IsActive(info.isolate());
Handle<ScopeInfo> scope_info(ScopeInfo::Empty());
@@ -750,7 +745,6 @@
SetFunctionInfo(result, literal, false, script);
RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result);
result->set_allows_lazy_compilation(allow_lazy);
-
result->set_allows_lazy_compilation_without_context(allow_lazy_without_ctx);
// Set the expected number of properties for instances and return
// the resulting function.
@@ -783,8 +777,6 @@
lit->has_only_simple_this_property_assignments(),
*lit->this_property_assignments());
function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation());
- function_info->set_allows_lazy_compilation_without_context(
- lit->AllowsLazyCompilationWithoutContext());
function_info->set_language_mode(lit->language_mode());
function_info->set_uses_arguments(lit->scope()->arguments() != NULL);
function_info->set_has_duplicate_parameters(lit->has_duplicate_parameters());
=======================================
--- /branches/bleeding_edge/src/debug.cc Tue Jun 12 09:53:15 2012
+++ /branches/bleeding_edge/src/debug.cc Wed Jun 13 04:26:34 2012
@@ -1170,16 +1170,14 @@
}
-void Debug::SetBreakPoint(Handle<JSFunction> function,
+void Debug::SetBreakPoint(Handle<SharedFunctionInfo> shared,
Handle<Object> break_point_object,
int* source_position) {
HandleScope scope(isolate_);
PrepareForBreakPoints();
- // Make sure the function is compiled and has set up the debug info.
- Handle<SharedFunctionInfo> shared(function->shared());
- if (!EnsureDebugInfo(shared, function)) {
+ if (!EnsureDebugInfo(shared)) {
// Return if retrieving debug info failed.
return;
}
@@ -1198,51 +1196,6 @@
// At least one active break point now.
ASSERT(debug_info->GetBreakPointCount() > 0);
}
-
-
-bool Debug::SetBreakPointForScript(Handle<Script> script,
- Handle<Object> break_point_object,
- int* source_position) {
- HandleScope scope(isolate_);
-
- // No need to call PrepareForBreakPoints because it will be called
- // implicitly by Runtime::FindSharedFunctionInfoInScript.
- Object* result = Runtime::FindSharedFunctionInfoInScript(isolate_,
- script,
-
*source_position);
- if (result->IsUndefined()) return false;
-
- // Make sure the function has set up the debug info.
- Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result));
- if (!EnsureDebugInfo(shared, Handle<JSFunction>::null())) {
- // Return if retrieving debug info failed.
- return false;
- }
-
- // Find position within function. The script position might be before the
- // source position of the first function.
- int position;
- if (shared->start_position() > *source_position) {
- position = 0;
- } else {
- position = *source_position - shared->start_position();
- }
-
- Handle<DebugInfo> debug_info = GetDebugInfo(shared);
- // Source positions starts with zero.
- ASSERT(position >= 0);
-
- // Find the break point and change it.
- BreakLocationIterator it(debug_info, SOURCE_BREAK_LOCATIONS);
- it.FindBreakLocationFromPosition(position);
- it.SetBreakPoint(break_point_object);
-
- *source_position = it.position() + shared->start_position();
-
- // At least one active break point now.
- ASSERT(debug_info->GetBreakPointCount() > 0);
- return true;
-}
void Debug::ClearBreakPoint(Handle<Object> break_point_object) {
@@ -1296,12 +1249,10 @@
}
-void Debug::FloodWithOneShot(Handle<JSFunction> function) {
+void Debug::FloodWithOneShot(Handle<SharedFunctionInfo> shared) {
PrepareForBreakPoints();
-
- // Make sure the function is compiled and has set up the debug info.
- Handle<SharedFunctionInfo> shared(function->shared());
- if (!EnsureDebugInfo(shared, function)) {
+ // Make sure the function has set up the debug info.
+ if (!EnsureDebugInfo(shared)) {
// Return if we failed to retrieve the debug info.
return;
}
@@ -1321,8 +1272,8 @@
if (!bindee.is_null() && bindee->IsJSFunction() &&
!JSFunction::cast(*bindee)->IsBuiltin()) {
- Handle<JSFunction> bindee_function(JSFunction::cast(*bindee));
- Debug::FloodWithOneShot(bindee_function);
+ Handle<SharedFunctionInfo>
shared_info(JSFunction::cast(*bindee)->shared());
+ Debug::FloodWithOneShot(shared_info);
}
}
@@ -1337,9 +1288,11 @@
for (JavaScriptFrameIterator it(isolate_, id); !it.done(); it.Advance())
{
JavaScriptFrame* frame = it.frame();
if (frame->HasHandler()) {
+ Handle<SharedFunctionInfo> shared =
+ Handle<SharedFunctionInfo>(
+ JSFunction::cast(frame->function())->shared());
// Flood the function with the catch block with break points
- JSFunction* function = JSFunction::cast(frame->function());
- FloodWithOneShot(Handle<JSFunction>(function));
+ FloodWithOneShot(shared);
return;
}
}
@@ -1406,14 +1359,14 @@
frames_it.Advance();
// Fill the function to return to with one-shot break points.
JSFunction* function = JSFunction::cast(frames_it.frame()->function());
- FloodWithOneShot(Handle<JSFunction>(function));
+ FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
return;
}
// Get the debug info (create it if it does not exist).
- Handle<JSFunction> function(JSFunction::cast(frame->function()));
- Handle<SharedFunctionInfo> shared(function->shared());
- if (!EnsureDebugInfo(shared, function)) {
+ Handle<SharedFunctionInfo> shared =
+
Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
+ if (!EnsureDebugInfo(shared)) {
// Return if ensuring debug info failed.
return;
}
@@ -1483,7 +1436,7 @@
if (!frames_it.done()) {
// Fill the function to return to with one-shot break points.
JSFunction* function =
JSFunction::cast(frames_it.frame()->function());
- FloodWithOneShot(Handle<JSFunction>(function));
+ FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
// Set target frame pointer.
ActivateStepOut(frames_it.frame());
}
@@ -1493,7 +1446,7 @@
// Step next or step min.
// Fill the current function with one-shot break points.
- FloodWithOneShot(function);
+ FloodWithOneShot(shared);
// Remember source position and frame to handle step next.
thread_local_.last_statement_position_ =
@@ -1505,7 +1458,9 @@
if (is_at_restarted_function) {
Handle<JSFunction> restarted_function(
JSFunction::cast(*thread_local_.restarter_frame_function_pointer_));
- FloodWithOneShot(restarted_function);
+ Handle<SharedFunctionInfo> restarted_shared(
+ restarted_function->shared());
+ FloodWithOneShot(restarted_shared);
} else if (!call_function_stub.is_null()) {
// If it's CallFunction stub ensure target function is compiled and
flood
// it with one shot breakpoints.
@@ -1547,7 +1502,7 @@
} else if (!js_function->IsBuiltin()) {
// Don't step into builtins.
// It will also compile target function if it's not compiled yet.
- FloodWithOneShot(js_function);
+
FloodWithOneShot(Handle<SharedFunctionInfo>(js_function->shared()));
}
}
}
@@ -1556,7 +1511,7 @@
// a call target as the function called might be a native function for
// which step in will not stop. It also prepares for stepping in
// getters/setters.
- FloodWithOneShot(function);
+ FloodWithOneShot(shared);
if (is_load_or_store) {
// Remember source position and frame to handle step in
getter/setter. If
@@ -1756,11 +1711,12 @@
// function.
if (!holder.is_null() && holder->IsJSFunction() &&
!JSFunction::cast(*holder)->IsBuiltin()) {
- Handle<JSFunction> js_function =
Handle<JSFunction>::cast(holder);
- Debug::FloodWithOneShot(js_function);
+ Handle<SharedFunctionInfo> shared_info(
+ JSFunction::cast(*holder)->shared());
+ Debug::FloodWithOneShot(shared_info);
}
} else {
- Debug::FloodWithOneShot(function);
+
Debug::FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared()));
}
}
}
@@ -2000,9 +1956,6 @@
Handle<Code> lazy_compile =
Handle<Code>(isolate_->builtins()->builtin(Builtins::kLazyCompile));
- // There will be at least one break point when we are done.
- has_break_points_ = true;
-
// Keep the list of activated functions in a handlified list as it
// is used both in GC and non-GC code.
List<Handle<JSFunction> > active_functions(100);
@@ -2110,20 +2063,15 @@
// Ensures the debug information is present for shared.
-bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
- Handle<JSFunction> function) {
+bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared) {
// Return if we already have the debug info for shared.
if (HasDebugInfo(shared)) {
ASSERT(shared->is_compiled());
return true;
}
- // There will be at least one break point when we are done.
- has_break_points_ = true;
-
- // Ensure function is compiled. Return false if this failed.
- if (!function.is_null() &&
- !JSFunction::EnsureCompiled(function, CLEAR_EXCEPTION)) {
+ // Ensure shared in compiled. Return false if this failed.
+ if (!SharedFunctionInfo::EnsureCompiled(shared, CLEAR_EXCEPTION)) {
return false;
}
@@ -2135,6 +2083,9 @@
node->set_next(debug_info_list_);
debug_info_list_ = node;
+ // Now there is at least one break point.
+ has_break_points_ = true;
+
return true;
}
@@ -2176,9 +2127,9 @@
PrepareForBreakPoints();
// Get the executing function in which the debug break occurred.
- Handle<JSFunction> function(JSFunction::cast(frame->function()));
- Handle<SharedFunctionInfo> shared(function->shared());
- if (!EnsureDebugInfo(shared, function)) {
+ Handle<SharedFunctionInfo> shared =
+
Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
+ if (!EnsureDebugInfo(shared)) {
// Return if we failed to retrieve the debug info.
return;
}
@@ -2268,9 +2219,9 @@
PrepareForBreakPoints();
// Get the executing function in which the debug break occurred.
- Handle<JSFunction> function(JSFunction::cast(frame->function()));
- Handle<SharedFunctionInfo> shared(function->shared());
- if (!EnsureDebugInfo(shared, function)) {
+ Handle<SharedFunctionInfo> shared =
+
Handle<SharedFunctionInfo>(JSFunction::cast(frame->function())->shared());
+ if (!EnsureDebugInfo(shared)) {
// Return if we failed to retrieve the debug info.
return false;
}
=======================================
--- /branches/bleeding_edge/src/debug.h Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/debug.h Wed Jun 13 04:26:34 2012
@@ -239,15 +239,12 @@
int count,
int end));
Object* Break(Arguments args);
- void SetBreakPoint(Handle<JSFunction> function,
+ void SetBreakPoint(Handle<SharedFunctionInfo> shared,
Handle<Object> break_point_object,
int* source_position);
- bool SetBreakPointForScript(Handle<Script> script,
- Handle<Object> break_point_object,
- int* source_position);
void ClearBreakPoint(Handle<Object> break_point_object);
void ClearAllBreakPoints();
- void FloodWithOneShot(Handle<JSFunction> function);
+ void FloodWithOneShot(Handle<SharedFunctionInfo> shared);
void FloodBoundFunctionWithOneShot(Handle<JSFunction> function);
void FloodHandlerWithOneShot();
void ChangeBreakOnException(ExceptionBreakType type, bool enable);
@@ -263,11 +260,8 @@
void PrepareForBreakPoints();
- // Returns whether the operation succeeded. Compilation can only be
triggered
- // if a valid closure is passed as the second argument, otherwise the
shared
- // function needs to be compiled already.
- bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
- Handle<JSFunction> function);
+ // Returns whether the operation succeeded.
+ bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared);
// Returns true if the current stub call is patched to call the debugger.
static bool IsDebugBreak(Address addr);
=======================================
--- /branches/bleeding_edge/src/full-codegen.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/full-codegen.cc Wed Jun 13 04:26:34 2012
@@ -315,7 +315,7 @@
Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info);
code->set_optimizable(info->IsOptimizable() &&
!info->function()->flags()->Contains(kDontOptimize)
&&
-
info->function()->scope()->AllowsLazyCompilation());
+
info->function()->scope()->AllowsLazyRecompilation());
cgen.PopulateDeoptimizationData(code);
cgen.PopulateTypeFeedbackInfo(code);
cgen.PopulateTypeFeedbackCells(code);
=======================================
--- /branches/bleeding_edge/src/objects-inl.h Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/objects-inl.h Wed Jun 13 04:26:34 2012
@@ -3697,10 +3697,6 @@
kAllowLazyCompilation)
BOOL_ACCESSORS(SharedFunctionInfo,
compiler_hints,
- allows_lazy_compilation_without_context,
- kAllowLazyCompilationWithoutContext)
-BOOL_ACCESSORS(SharedFunctionInfo,
- compiler_hints,
uses_arguments,
kUsesArguments)
BOOL_ACCESSORS(SharedFunctionInfo,
=======================================
--- /branches/bleeding_edge/src/objects.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/objects.cc Wed Jun 13 04:26:34 2012
@@ -7433,6 +7433,12 @@
Builtins* builtins = GetIsolate()->builtins();
ReplaceCode(builtins->builtin(Builtins::kLazyRecompile));
}
+
+
+bool SharedFunctionInfo::EnsureCompiled(Handle<SharedFunctionInfo> shared,
+ ClearExceptionFlag flag) {
+ return shared->is_compiled() || CompileLazy(shared, flag);
+}
static bool CompileLazyHelper(CompilationInfo* info,
@@ -7451,7 +7457,6 @@
bool SharedFunctionInfo::CompileLazy(Handle<SharedFunctionInfo> shared,
ClearExceptionFlag flag) {
- ASSERT(shared->allows_lazy_compilation_without_context());
CompilationInfo info(shared);
return CompileLazyHelper(&info, flag);
}
@@ -7464,7 +7469,6 @@
function->ReplaceCode(function->shared()->code());
function->shared()->set_code_age(0);
} else {
- ASSERT(function->shared()->allows_lazy_compilation());
CompilationInfo info(function);
result = CompileLazyHelper(&info, flag);
ASSERT(!result || function->is_compiled());
@@ -7480,12 +7484,6 @@
info.SetOptimizing(osr_ast_id);
return CompileLazyHelper(&info, flag);
}
-
-
-bool JSFunction::EnsureCompiled(Handle<JSFunction> function,
- ClearExceptionFlag flag) {
- return function->is_compiled() || CompileLazy(function, flag);
-}
bool JSFunction::IsInlineable() {
=======================================
--- /branches/bleeding_edge/src/objects.h Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/objects.h Wed Jun 13 04:26:34 2012
@@ -5439,12 +5439,6 @@
// when doing GC if we expect that the function will no longer be used.
DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation)
- // Indicates if this function can be lazy compiled without a context.
- // This is used to determine if we can force compilation without reaching
- // the function through program execution but through other means (e.g.
heap
- // iteration by the debugger).
- DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation_without_context)
-
// Indicates how many full GCs this function has survived with assigned
// code object. Used to determine when it is relatively safe to flush
// this code object and replace it with lazy compilation stub.
@@ -5591,9 +5585,10 @@
void ResetForNewContext(int new_ic_age);
- // Helper to compile the shared code. Returns true on success, false on
- // failure (e.g., stack overflow during compilation). This is only used
by
- // the debugger, it is not possible to compile without a context
otherwise.
+ // Helpers to compile the shared code. Returns true on success, false on
+ // failure (e.g., stack overflow during compilation).
+ static bool EnsureCompiled(Handle<SharedFunctionInfo> shared,
+ ClearExceptionFlag flag);
static bool CompileLazy(Handle<SharedFunctionInfo> shared,
ClearExceptionFlag flag);
@@ -5727,7 +5722,6 @@
enum CompilerHints {
kHasOnlySimpleThisPropertyAssignments,
kAllowLazyCompilation,
- kAllowLazyCompilationWithoutContext,
kLiveObjectsMayExist,
kCodeAgeShift,
kOptimizationDisabled = kCodeAgeShift + kCodeAgeSize,
@@ -5876,8 +5870,6 @@
// Helpers to compile this function. Returns true on success, false on
// failure (e.g., stack overflow during compilation).
- static bool EnsureCompiled(Handle<JSFunction> function,
- ClearExceptionFlag flag);
static bool CompileLazy(Handle<JSFunction> function,
ClearExceptionFlag flag);
static bool CompileOptimized(Handle<JSFunction> function,
=======================================
--- /branches/bleeding_edge/src/parser.cc Wed Jun 13 02:10:16 2012
+++ /branches/bleeding_edge/src/parser.cc Wed Jun 13 04:26:34 2012
@@ -4521,6 +4521,7 @@
// The heuristics are:
// - It must not have been prohibited by the caller to Parse (some
callers
// need a full AST).
+ // - The outer scope must be trivial (only global variables in scope).
// - The function mustn't be a function expression with an open
parenthesis
// before; we consider that a hint that the function will be called
// immediately, and it would be a waste of time to make it lazily
@@ -4528,6 +4529,8 @@
// These are all things we can know at this point, without looking at
the
// function itself.
bool is_lazily_compiled = (mode() == PARSE_LAZILY &&
+
top_scope_->outer_scope()->is_global_scope() &&
+ top_scope_->HasTrivialOuterContext() &&
!parenthesized_function_);
parenthesized_function_ = false; // The bit was set for this function
only.
=======================================
--- /branches/bleeding_edge/src/runtime.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/runtime.cc Wed Jun 13 04:26:34 2012
@@ -2183,7 +2183,8 @@
Handle<SharedFunctionInfo> target_shared(target->shared());
Handle<SharedFunctionInfo> source_shared(source->shared());
- if (!JSFunction::EnsureCompiled(source, KEEP_EXCEPTION)) {
+ if (!source->is_compiled() &&
+ !JSFunction::CompileLazy(source, KEEP_EXCEPTION)) {
return Failure::Exception();
}
@@ -4854,13 +4855,14 @@
RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrepareStepInIfStepping) {
Debug* debug = isolate->debug();
if (!debug->IsStepping()) return NULL;
- CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0);
+ CONVERT_ARG_CHECKED(Object, callback, 0);
HandleScope scope(isolate);
+ Handle<SharedFunctionInfo>
shared_info(JSFunction::cast(callback)->shared());
// When leaving the callback, step out has been activated, but not
performed
// if we do not leave the builtin. To be able to step into the callback
// again, we need to clear the step out at this point.
debug->ClearStepOut();
- debug->FloodWithOneShot(callback);
+ debug->FloodWithOneShot(shared_info);
return NULL;
}
@@ -8138,8 +8140,12 @@
}
// The function should be compiled for the optimization hints to be
- // available.
- JSFunction::EnsureCompiled(function, CLEAR_EXCEPTION);
+ // available. We cannot use EnsureCompiled because that forces a
+ // compilation through the shared function info which makes it
+ // impossible for us to optimize.
+ if (!function->is_compiled()) {
+ JSFunction::CompileLazy(function, CLEAR_EXCEPTION);
+ }
Handle<SharedFunctionInfo> shared(function->shared(), isolate);
if (!function->has_initial_map() &&
@@ -11149,7 +11155,7 @@
}
// Get the debug info (create it if it does not exist).
- if (!isolate->debug()->EnsureDebugInfo(shared_info, function_)) {
+ if (!isolate->debug()->EnsureDebugInfo(shared_info)) {
// Return if ensuring debug info failed.
return;
}
@@ -11670,16 +11676,32 @@
return *isolate->factory()->NewJSArrayWithElements(
Handle<FixedArray>::cast(break_locations));
}
+
+
+// Set a break point in a function
+// args[0]: function
+// args[1]: number: break source position (within the function source)
+// args[2]: number: break point object
+RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) {
+ HandleScope scope(isolate);
+ ASSERT(args.length() == 3);
+ CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
+ Handle<SharedFunctionInfo> shared(fun->shared());
+ CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
+ RUNTIME_ASSERT(source_position >= 0);
+ Handle<Object> break_point_object_arg = args.at<Object>(2);
+
+ // Set break point.
+ isolate->debug()->SetBreakPoint(shared, break_point_object_arg,
+ &source_position);
+
+ return Smi::FromInt(source_position);
+}
Object* Runtime::FindSharedFunctionInfoInScript(Isolate* isolate,
Handle<Script> script,
int position) {
- // The below fix-point iteration depends on all functions that cannot be
- // compiled lazily without a context to not be compiled at all.
Compilation
- // will be triggered at points where we do not need a context.
- isolate->debug()->PrepareForBreakPoints();
-
// Iterate the heap looking for SharedFunctionInfo generated from the
// script. The inner most SharedFunctionInfo containing the source
position
// for the requested break point is found.
@@ -11701,12 +11723,6 @@
obj != NULL; obj = iterator.next()) {
if (obj->IsSharedFunctionInfo()) {
Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(obj));
- if (!shared->allows_lazy_compilation_without_context() &&
- !shared->is_compiled()) {
- // Skip functions that we cannot compile lazily without a
context,
- // which is not available here.
- continue;
- }
if (shared->script() == *script) {
// If the SharedFunctionInfo found has the requested script
data and
// contains the source position it is a candidate.
@@ -11751,40 +11767,19 @@
return isolate->heap()->undefined_value();
}
- // If the candidate found is compiled we are done.
+ // If the candidate found is compiled we are done. NOTE: when lazy
+ // compilation of inner functions is introduced some additional
checking
+ // needs to be done here to compile inner functions.
done = target->is_compiled();
if (!done) {
- // If the candidate is not compiled, compile it to reveal any inner
- // functions which might contain the requested source position. This
- // will compile all inner functions that cannot be compiled without a
- // context, because Compiler::BuildFunctionInfo checks whether the
- // debugger is active.
+ // If the candidate is not compiled compile it to reveal any inner
+ // functions which might contain the requested source position.
SharedFunctionInfo::CompileLazy(target, KEEP_EXCEPTION);
}
} // End while loop.
return *target;
}
-
-
-// Set a break point in a function.
-// args[0]: function
-// args[1]: number: break source position (within the function source)
-// args[2]: number: break point object
-RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) {
- HandleScope scope(isolate);
- ASSERT(args.length() == 3);
- CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
- CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
- RUNTIME_ASSERT(source_position >= 0);
- Handle<Object> break_point_object_arg = args.at<Object>(2);
-
- // Set break point.
- isolate->debug()->SetBreakPoint(function, break_point_object_arg,
- &source_position);
-
- return Smi::FromInt(source_position);
-}
// Changes the state of a break point in a script and returns source
position
@@ -11805,13 +11800,23 @@
RUNTIME_ASSERT(wrapper->value()->IsScript());
Handle<Script> script(Script::cast(wrapper->value()));
- // Set break point.
- if (!isolate->debug()->SetBreakPointForScript(script,
break_point_object_arg,
- &source_position)) {
- return isolate->heap()->undefined_value();
- }
-
- return Smi::FromInt(source_position);
+ Object* result = Runtime::FindSharedFunctionInfoInScript(
+ isolate, script, source_position);
+ if (!result->IsUndefined()) {
+ Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result));
+ // Find position within function. The script position might be before
the
+ // source position of the first function.
+ int position;
+ if (shared->start_position() > source_position) {
+ position = 0;
+ } else {
+ position = source_position - shared->start_position();
+ }
+ isolate->debug()->SetBreakPoint(shared, break_point_object_arg,
&position);
+ position += shared->start_position();
+ return Smi::FromInt(position);
+ }
+ return isolate->heap()->undefined_value();
}
@@ -12535,7 +12540,7 @@
ASSERT(args.length() == 1);
// Get the function and make sure it is compiled.
CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0);
- if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) {
+ if (!JSFunction::CompileLazy(func, KEEP_EXCEPTION)) {
return Failure::Exception();
}
func->code()->PrintLn();
@@ -12550,7 +12555,7 @@
ASSERT(args.length() == 1);
// Get the function and make sure it is compiled.
CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0);
- if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) {
+ if (!JSFunction::CompileLazy(func, KEEP_EXCEPTION)) {
return Failure::Exception();
}
func->shared()->construct_stub()->PrintLn();
=======================================
--- /branches/bleeding_edge/src/scopes.cc Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/scopes.cc Wed Jun 13 04:26:34 2012
@@ -635,6 +635,11 @@
return true;
}
+
+
+bool Scope::AllowsLazyCompilation() const {
+ return !force_eager_compilation_ && HasTrivialOuterContext();
+}
bool Scope::HasTrivialContext() const {
@@ -661,15 +666,10 @@
}
-bool Scope::AllowsLazyCompilation() const {
+bool Scope::AllowsLazyRecompilation() const {
return !force_eager_compilation_ &&
!TrivialDeclarationScopesBeforeWithScope();
}
-
-
-bool Scope::AllowsLazyCompilationWithoutContext() const {
- return !force_eager_compilation_ && HasTrivialOuterContext();
-}
bool Scope::TrivialDeclarationScopesBeforeWithScope() const {
=======================================
--- /branches/bleeding_edge/src/scopes.h Tue Jun 12 08:57:50 2012
+++ /branches/bleeding_edge/src/scopes.h Wed Jun 13 04:26:34 2012
@@ -374,8 +374,8 @@
// Determine if we can use lazy compilation for this scope.
bool AllowsLazyCompilation() const;
- // Determine if we can use lazy compilation for this scope without a
context.
- bool AllowsLazyCompilationWithoutContext() const;
+ // True if we can lazily recompile functions with this scope.
+ bool AllowsLazyRecompilation() const;
// True if the outer context of this scope is always the global context.
bool HasTrivialOuterContext() const;
=======================================
--- /branches/bleeding_edge/test/cctest/test-debug.cc Tue Jun 12 08:57:50
2012
+++ /branches/bleeding_edge/test/cctest/test-debug.cc Wed Jun 13 04:26:34
2012
@@ -197,9 +197,10 @@
// number.
static int SetBreakPoint(Handle<v8::internal::JSFunction> fun, int
position) {
static int break_point = 0;
+ Handle<v8::internal::SharedFunctionInfo> shared(fun->shared());
v8::internal::Debug* debug = v8::internal::Isolate::Current()->debug();
debug->SetBreakPoint(
- fun,
+ shared,
Handle<Object>(v8::internal::Smi::FromInt(++break_point)),
&position);
return break_point;
@@ -514,7 +515,7 @@
// there
ClearBreakPoint(bp);
CHECK(!debug->HasDebugInfo(shared));
- CHECK(debug->EnsureDebugInfo(shared, fun));
+ CHECK(debug->EnsureDebugInfo(shared));
TestBreakLocationIterator it2(Debug::GetDebugInfo(shared));
it2.FindBreakLocationFromPosition(position);
actual_mode = it2.it()->rinfo()->rmode();
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap.cc Tue Jun 12 08:57:50
2012
+++ /branches/bleeding_edge/test/cctest/test-heap.cc Wed Jun 13 04:26:34
2012
@@ -1198,7 +1198,6 @@
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
- HEAP->CollectAllGarbage(Heap::kNoGCFlags);
CHECK(HEAP->old_pointer_space()->IsSweepingComplete());
int initial_size = static_cast<int>(HEAP->SizeOfObjects());
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev