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> WorkerContextExecutionProxy::runScript(v8::Handle<v8::Script> script) { if (script.IsEmpty()) return v8::Local<v8::Value>(); // Compute the source string and prevent against infinite recursion. if (m_recursion >= kMaxRecursionDepth) { v8::Local<v8::String> code = v8ExternalString("throw RangeError('Recursion too deep')"); script = V8Proxy::compileScript(code, "", 0); } if (V8Proxy::handleOutOfMemory()) ASSERT(script.IsEmpty()); if (script.IsEmpty()) return v8::Local<v8::Value>(); // Run the script and keep track of the current recursion depth. v8::Local<v8::Value> result; { m_recursion++; result = script->Run(); m_recursion--; } // Handle V8 internal error situation (Out-of-memory). if (result.IsEmpty()) return v8::Local<v8::Value>(); 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> V8Proxy::runScriptInternal(v8::Handle<v8::Script> script, bool isInlineCode) #endif { if (script.IsEmpty()) return notHandledByInterceptor(); V8GCController::checkMemoryUsage(); // Compute the source string and prevent against infinite recursion. if (m_recursion >= kMaxRecursionDepth) { v8::Local<v8::String> code = v8ExternalString("throw RangeError('Recursion too deep')"); // FIXME: Ideally, we should be able to re-use the origin of the // script passed to us as the argument instead of using an empty string // and 0 baseLine. script = compileScript(code, "", 0); } if (handleOutOfMemory()) ASSERT(script.IsEmpty()); if (script.IsEmpty()) return notHandledByInterceptor(); // Save the previous value of the inlineCode flag and update the flag for // the duration of the script invocation. bool previousInlineCode = inlineCode(); setInlineCode(isInlineCode); // Run the script and keep track of the current recursion depth. v8::Local<v8::Value> result; { V8ConsoleMessage::Scope scope; // See comment in V8Proxy::callFunction. m_frame->keepAlive(); m_recursion++; result = script->Run(); m_recursion--; } // Release the storage mutex if applicable. releaseStorageMutex(); if (handleOutOfMemory()) ASSERT(result.IsEmpty()); // Handle V8 internal error situation (Out-of-memory). if (result.IsEmpty()) return notHandledByInterceptor(); // Restore inlineCode flag. setInlineCode(previousInlineCode); if (v8::V8::IsDead()) handleFatalErrorInV8(); return result; }
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::Evaluate(const std::string& source, const std::string& filename) { const JsContext context(shared_from_this()); const v8::TryCatch tryCatch; const v8::Handle<v8::Script> script = CompileScript(isolate, source, filename); CheckTryCatch(tryCatch); v8::Local<v8::Value> result = script->Run(); CheckTryCatch(tryCatch); return JsValuePtr(new JsValue(shared_from_this(), result)); }
v8::Handle<v8::Value> run(v8::Handle<v8::Script> script, HandleTryCatch handleTryCatch) { assert(!script.IsEmpty()); assert(v8::Context::InContext()); v8::HandleScope handle_scope; v8::TryCatch try_catch; v8::Handle<v8::Value> result = script->Run(); if (try_catch.HasCaught()) { handleTryCatch(try_catch); } return handle_scope.Close(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; }