void SVGScriptElement::FreezeExecutionAttrs(nsIDocument* aOwnerDoc) { if (mFrozen) { return; } if (mStringAttributes[HREF].IsExplicitlySet() || mStringAttributes[XLINK_HREF].IsExplicitlySet()) { // variation of this code in nsHTMLScriptElement - check if changes // need to be transferred when modifying bool isHref = false; nsAutoString src; if (mStringAttributes[HREF].IsExplicitlySet()) { mStringAttributes[HREF].GetAnimValue(src, this); isHref = true; } else { mStringAttributes[XLINK_HREF].GetAnimValue(src, this); } // Empty src should be treated as invalid URL. if (!src.IsEmpty()) { nsCOMPtr<nsIURI> baseURI = GetBaseURI(); NS_NewURI(getter_AddRefs(mUri), src, nullptr, baseURI); if (!mUri) { const char16_t* params[] = { isHref ? u"href" : u"xlink:href", src.get() }; nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, NS_LITERAL_CSTRING("SVG"), OwnerDoc(), nsContentUtils::eDOM_PROPERTIES, "ScriptSourceInvalidUri", params, ArrayLength(params), nullptr, EmptyString(), GetScriptLineNumber(), GetScriptColumnNumber()); } } else { const char16_t* params[] = { isHref ? u"href" : u"xlink:href" }; nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, NS_LITERAL_CSTRING("SVG"), OwnerDoc(), nsContentUtils::eDOM_PROPERTIES, "ScriptSourceEmpty", params, ArrayLength(params), nullptr, EmptyString(), GetScriptLineNumber(), GetScriptColumnNumber()); } // At this point mUri will be null for invalid URLs. mExternal = true; } mFrozen = true; }
bool Compiler::CompileLazy(Handle<SharedFunctionInfo> shared, int loop_nesting) { CompilationZoneScope zone_scope(DELETE_ON_EXIT); // The VM is in the COMPILER state until exiting this function. VMState state(COMPILER); // Make sure we have an initial stack limit. StackGuard guard; PostponeInterruptsScope postpone; // Compute name, source code and script data. Handle<String> name(String::cast(shared->name())); Handle<Script> script(Script::cast(shared->script())); int start_position = shared->start_position(); int end_position = shared->end_position(); bool is_expression = shared->is_expression(); Counters::total_compile_size.Increment(end_position - start_position); // Generate the AST for the lazily compiled function. The AST may be // NULL in case of parser stack overflow. FunctionLiteral* lit = MakeLazyAST(script, name, start_position, end_position, is_expression); // Check for parse errors. if (lit == NULL) { ASSERT(Top::has_pending_exception()); return false; } // Update the loop nesting in the function literal. lit->set_loop_nesting(loop_nesting); // Measure how long it takes to do the lazy compilation; only take // the rest of the function into account to avoid overlap with the // lazy parsing statistics. HistogramTimerScope timer(&Counters::compile_lazy); // Compile the code. Handle<Code> code = MakeCode(lit, script, Handle<Context>::null(), false); // Check for stack-overflow exception. if (code.is_null()) { Top::StackOverflow(); return false; } #if defined ENABLE_LOGGING_AND_PROFILING || defined ENABLE_OPROFILE_AGENT // Log the code generation. If source information is available include script // name and line number. Check explicit whether logging is enabled as finding // the line number is not for free. if (Logger::is_logging() || OProfileAgent::is_enabled()) { Handle<String> func_name(name->length() > 0 ? *name : shared->inferred_name()); if (script->name()->IsString()) { int line_num = GetScriptLineNumber(script, start_position) + 1; LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, *code, *func_name, String::cast(script->name()), line_num)); OProfileAgent::CreateNativeCodeRegion(*func_name, String::cast(script->name()), line_num, code->instruction_start(), code->instruction_size()); } else { LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, *code, *func_name)); OProfileAgent::CreateNativeCodeRegion(*func_name, code->instruction_start(), code->instruction_size()); } } #endif // Update the shared function info with the compiled code. shared->set_code(*code); // Set the expected number of properties for instances. SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); // Set the optimication hints after performing lazy compilation, as these are // not set when the function is set up as a lazily compiled function. shared->SetThisPropertyAssignmentsInfo( lit->has_only_this_property_assignments(), lit->has_only_simple_this_property_assignments(), *lit->this_property_assignments()); // Check the function has compiled code. ASSERT(shared->is_compiled()); return true; }