v8::Local<v8::Value> ScriptRunner::runCompiledScript(v8::Handle<v8::Script> script, ScriptExecutionContext* context) { if (script.IsEmpty()) return v8::Local<v8::Value>(); V8GCController::checkMemoryUsage(); if (V8RecursionScope::recursionLevel() >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(); if (handleOutOfMemory()) return v8::Local<v8::Value>(); // Run the script and keep track of the current recursion depth. v8::Local<v8::Value> result; { V8RecursionScope recursionScope(context); result = script->Run(); } if (handleOutOfMemory()) ASSERT(result.IsEmpty()); if (result.IsEmpty()) return v8::Local<v8::Value>(); crashIfV8IsDead(); return result; }
v8::Local<v8::Value> ScriptController::callFunctionWithInstrumentation(ScriptExecutionContext* context, v8::Handle<v8::Function> function, v8::Handle<v8::Object> receiver, int argc, v8::Handle<v8::Value> args[]) { V8GCController::checkMemoryUsage(); if (V8RecursionScope::recursionLevel() >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(); InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::timelineAgentEnabled(context)) { String resourceName; int lineNumber; resourceInfo(function, resourceName, lineNumber); cookie = InspectorInstrumentation::willCallFunction(context, resourceName, lineNumber); } v8::Local<v8::Value> result; { TRACE_EVENT1("v8", "v8.callFunction", "callsite", resourceString(function).utf8()); V8RecursionScope recursionScope(context); result = function->Call(receiver, argc, args); } InspectorInstrumentation::didCallFunction(cookie); crashIfV8IsDead(); return result; }
v8::Local<v8::Value> V8Proxy::instrumentedCallFunction(Frame* frame, v8::Handle<v8::Function> function, v8::Handle<v8::Object> receiver, int argc, v8::Handle<v8::Value> args[]) { V8GCController::checkMemoryUsage(); if (V8RecursionScope::recursionLevel() >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(); ScriptExecutionContext* context = frame ? frame->document() : 0; InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::hasFrontends() && context) { String resourceName; int lineNumber; resourceInfo(function, resourceName, lineNumber); cookie = InspectorInstrumentation::willCallFunction(context, resourceName, lineNumber); } v8::Local<v8::Value> result; { #if PLATFORM(CHROMIUM) TRACE_EVENT1("v8", "v8.callFunction", "callsite", resourceString(function).utf8()); #endif V8RecursionScope recursionScope(context); result = function->Call(receiver, argc, args); } InspectorInstrumentation::didCallFunction(cookie); if (v8::V8::IsDead()) handleFatalErrorInV8(); return result; }
v8::Local<v8::Value> V8ScriptRunner::runCompiledScript(v8::Handle<v8::Script> script, ExecutionContext* context, v8::Isolate* isolate) { TRACE_EVENT0("v8", "v8.run"); TRACE_EVENT_SCOPED_SAMPLING_STATE("V8", "V8Execution"); if (script.IsEmpty()) return v8::Local<v8::Value>(); if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(isolate); RELEASE_ASSERT(!context->isIteratingOverObservers()); // Run the script and keep track of the current recursion depth. v8::Local<v8::Value> result; { V8RecursionScope recursionScope(isolate, context); result = script->Run(); } if (result.IsEmpty()) return v8::Local<v8::Value>(); crashIfV8IsDead(); return result; }
v8::Local<v8::Value> V8ScriptRunner::callFunction(v8::Handle<v8::Function> function, ExecutionContext* context, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> args[], v8::Isolate* isolate) { TRACE_EVENT0("v8", "v8.callFunction"); TRACE_EVENT_SCOPED_SAMPLING_STATE("V8", "V8Execution"); if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(isolate); RELEASE_ASSERT(!context->isIteratingOverObservers()); V8RecursionScope recursionScope(isolate, context); v8::Local<v8::Value> result = function->Call(receiver, argc, args); crashIfV8IsDead(); return result; }
v8::Local<v8::Value> V8Proxy::runScript(v8::Handle<v8::Script> script) { if (script.IsEmpty()) return v8::Local<v8::Value>(); V8GCController::checkMemoryUsage(); if (V8RecursionScope::recursionLevel() >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(); if (handleOutOfMemory()) ASSERT(script.IsEmpty()); // Keep Frame (and therefore ScriptController and V8Proxy) alive. RefPtr<Frame> protect(frame()); // Run the script and keep track of the current recursion depth. v8::Local<v8::Value> result; v8::TryCatch tryCatch; tryCatch.SetVerbose(true); { V8RecursionScope recursionScope(frame()->document()); result = script->Run(); } if (handleOutOfMemory()) ASSERT(result.IsEmpty()); // Handle V8 internal error situation (Out-of-memory). if (tryCatch.HasCaught()) { ASSERT(result.IsEmpty()); return v8::Local<v8::Value>(); } if (result.IsEmpty()) return v8::Local<v8::Value>(); if (v8::V8::IsDead()) handleFatalErrorInV8(); return result; }
v8::Local<v8::Value> V8Proxy::instrumentedCallFunction(Frame* frame, v8::Handle<v8::Function> function, v8::Handle<v8::Object> receiver, int argc, v8::Handle<v8::Value> args[]) { V8GCController::checkMemoryUsage(); if (V8RecursionScope::recursionLevel() >= kMaxRecursionDepth) return handleMaxRecursionDepthExceeded(); ScriptExecutionContext* context = frame ? frame->document() : 0; InspectorInstrumentationCookie cookie; if (InspectorInstrumentation::hasFrontends() && context) { String resourceName("undefined"); int lineNumber = 1; v8::ScriptOrigin origin = function->GetScriptOrigin(); if (!origin.ResourceName().IsEmpty()) { resourceName = toWebCoreString(origin.ResourceName()); lineNumber = function->GetScriptLineNumber() + 1; } cookie = InspectorInstrumentation::willCallFunction(context, resourceName, lineNumber); } v8::Local<v8::Value> result; { #if PLATFORM(CHROMIUM) TRACE_EVENT0("v8", "v8.callFunction"); #endif V8RecursionScope recursionScope(context); result = function->Call(receiver, argc, args); } InspectorInstrumentation::didCallFunction(cookie); if (v8::V8::IsDead()) handleFatalErrorInV8(); return result; }