Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_htmlaccel_htmlaccelNotInline_h
#define mozilla_htmlaccel_htmlaccelNotInline_h
#include "mozilla/Attributes.h"
namespace mozilla::htmlaccel {
// True iff the buffer contains less-than, ampersand, carriage return,
// or U+0000.
//
// This one could probably be inline without LLVM issues when SIMD
// acceleration is statically enabled, but it's probably not worth
// the complexity to do that.
MOZ_NEVER_INLINE bool ContainsMarkup(const char16_t* aPtr,
const char16_t* aEnd);
// HTML Serializer functions
// NOTE! The SkipNonEscaped functions only skip full SIMD strides, but the
// CountEscaped functions also handle the tail that doesn't fit in a SIMD
// stride.
/// Returns the length of the prefix that does not contain less-than,
/// greater-than, ampersand, or no-break space.
/// Examines the input in multiples of 16 code units and does not examine
/// the tail that is left over.
MOZ_NEVER_INLINE size_t SkipNonEscapedInTextNode(const char16_t* aPtr,
const char16_t* aEnd);
/// Returns the length of the prefix that does not contain less-than,
/// greater-than, ampersand, or no-break space.
/// Examines the input in multiples of 16 code units and does not examine
/// the tail that is left over.
MOZ_NEVER_INLINE size_t SkipNonEscapedInTextNode(const char* aPtr,
const char* aEnd);
/// Returns the length of the prefix that does not contain less-than,
/// greater-than, ampersand, no-break space, or double quote.
/// Examines the input in multiples of 16 code units and does not examine
/// the tail that is left over.
MOZ_NEVER_INLINE size_t SkipNonEscapedInAttributeValue(const char16_t* aPtr,
const char16_t* aEnd);
/// Count occurrences of less-than, greater-than, ampersand, and no-break space.
MOZ_NEVER_INLINE uint32_t CountEscapedInTextNode(const char16_t* aPtr,
const char16_t* aEnd);
/// Count occurrences of less-than, greater-than, ampersand, and no-break space.
MOZ_NEVER_INLINE uint32_t CountEscapedInTextNode(const char* aPtr,
const char* aEnd);
/// Count occurrences of less-than, greater-than, ampersand, no-break space, and
/// double quote.
MOZ_NEVER_INLINE uint32_t CountEscapedInAttributeValue(const char16_t* aPtr,
const char16_t* aEnd);
// HTML Tokenizer functions
// Logically these should be MOZ_ALWAYS_INLINE_EVEN_DEBUG if LLVM was working
// as expected. However, these are MOZ_NEVER_INLINE to work around
// a little bit of LICM for the SIMD constants that need to be loaded
// from the constant pool instead of getting materialized by splatting
// an immediate. Once the LLVM bug is fixed, these should be changed
// to MOZ_ALWAYS_INLINE_EVEN_DEBUG to allow the constants to move further
// up to the top of nsHtml5Tokenizer::stateLoop.
/// The innerHTML / DOMParser case for the data state in the HTML parser
MOZ_NEVER_INLINE int32_t AccelerateDataFastest(const char16_t* aPtr,
const char16_t* aEnd);
/// View Source case for the data state in the HTML parser
MOZ_NEVER_INLINE int32_t AccelerateDataViewSource(const char16_t* aPtr,
const char16_t* aEnd);
/// Normal network case for the data state in the HTML parser
MOZ_NEVER_INLINE int32_t AccelerateDataLineCol(const char16_t* aPtr,
const char16_t* aEnd);
} // namespace mozilla::htmlaccel
#endif // mozilla_htmlaccel_htmlaccelNotInline_h