diff --git a/dom/ipc/SharedMap.cpp b/dom/ipc/SharedMap.cpp index 0b1aec534ad5..deddabdeed55 100644 --- a/dom/ipc/SharedMap.cpp +++ b/dom/ipc/SharedMap.cpp @@ -14,6 +14,7 @@ #include "mozilla/dom/ContentProcessMessageManager.h" #include "mozilla/dom/IPCBlobUtils.h" #include "mozilla/dom/ScriptSettings.h" +#include "mozilla/IOBuffers.h" #include "mozilla/ScriptPreloader.h" using namespace mozilla::loader; diff --git a/js/xpconnect/loader/IOBuffers.h b/js/xpconnect/loader/IOBuffers.h new file mode 100644 index 000000000000..0f1a863360de --- /dev/null +++ b/js/xpconnect/loader/IOBuffers.h @@ -0,0 +1,148 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* 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 IOBuffers_h +#define IOBuffers_h + +#include "mozilla/Assertions.h" +#include "mozilla/CheckedInt.h" +#include "mozilla/EndianUtils.h" +#include "mozilla/EnumSet.h" +#include "mozilla/Range.h" +#include "mozilla/Span.h" +#include "nsString.h" +#include "nsTArray.h" + +namespace mozilla { +namespace loader { + +class OutputBuffer { + public: + OutputBuffer() {} + + uint8_t* write(size_t size) { + auto buf = data.AppendElements(size); + cursor_ += size; + return buf; + } + + void codeUint8(const uint8_t& val) { *write(sizeof val) = val; } + + template + void codeUint8(const EnumSet& val) { + // EnumSets are always represented as uint32_t values, so we need to + // assert that the value actually fits in a uint8 before writing it. + uint32_t value = val.serialize(); + codeUint8(CheckedUint8(value).value()); + } + + void codeUint16(const uint16_t& val) { + LittleEndian::writeUint16(write(sizeof val), val); + } + + void codeUint32(const uint32_t& val) { + LittleEndian::writeUint32(write(sizeof val), val); + } + + void codeString(const nsCString& str) { + auto len = CheckedUint16(str.Length()).value(); + + codeUint16(len); + memcpy(write(len), str.BeginReading(), len); + } + + size_t cursor() const { return cursor_; } + + uint8_t* Get() { return data.Elements(); } + + const uint8_t* Get() const { return data.Elements(); } + + private: + nsTArray data; + size_t cursor_ = 0; +}; + +class InputBuffer { + public: + explicit InputBuffer(const Range& buffer) : data(buffer) {} + + const uint8_t* read(size_t size) { + MOZ_ASSERT(checkCapacity(size)); + + auto buf = &data[cursor_]; + cursor_ += size; + return buf; + } + + bool codeUint8(uint8_t& val) { + if (checkCapacity(sizeof val)) { + val = *read(sizeof val); + } + return !error_; + } + + template + bool codeUint8(EnumSet& val) { + uint8_t value; + if (codeUint8(value)) { + val.deserialize(value); + } + return !error_; + } + + bool codeUint16(uint16_t& val) { + if (checkCapacity(sizeof val)) { + val = LittleEndian::readUint16(read(sizeof val)); + } + return !error_; + } + + bool codeUint32(uint32_t& val) { + if (checkCapacity(sizeof val)) { + val = LittleEndian::readUint32(read(sizeof val)); + } + return !error_; + } + + bool codeString(nsCString& str) { + uint16_t len; + if (codeUint16(len)) { + if (checkCapacity(len)) { + str.SetLength(len); + memcpy(str.BeginWriting(), read(len), len); + } + } + return !error_; + } + + bool error() { return error_; } + + bool finished() { return error_ || !remainingCapacity(); } + + size_t remainingCapacity() { return data.length() - cursor_; } + + size_t cursor() const { return cursor_; } + + const uint8_t* Get() const { return data.begin().get(); } + + private: + bool checkCapacity(size_t size) { + if (size > remainingCapacity()) { + error_ = true; + } + return !error_; + } + + bool error_ = false; + + public: + const Range& data; + size_t cursor_ = 0; +}; + +} // namespace loader +} // namespace mozilla + +#endif // IOBuffers_h diff --git a/js/xpconnect/loader/ScriptPreloader-inl.h b/js/xpconnect/loader/ScriptPreloader-inl.h index c61366c5a68c..4f37580eb2fe 100644 --- a/js/xpconnect/loader/ScriptPreloader-inl.h +++ b/js/xpconnect/loader/ScriptPreloader-inl.h @@ -38,130 +38,6 @@ struct MOZ_RAII AutoSafeJSAPI : public AutoJSAPI { AutoSafeJSAPI() { Init(); } }; -class OutputBuffer { - public: - OutputBuffer() {} - - uint8_t* write(size_t size) { - auto buf = data.AppendElements(size); - cursor_ += size; - return buf; - } - - void codeUint8(const uint8_t& val) { *write(sizeof val) = val; } - - template - void codeUint8(const EnumSet& val) { - // EnumSets are always represented as uint32_t values, so we need to - // assert that the value actually fits in a uint8 before writing it. - uint32_t value = val.serialize(); - codeUint8(CheckedUint8(value).value()); - } - - void codeUint16(const uint16_t& val) { - LittleEndian::writeUint16(write(sizeof val), val); - } - - void codeUint32(const uint32_t& val) { - LittleEndian::writeUint32(write(sizeof val), val); - } - - void codeString(const nsCString& str) { - auto len = CheckedUint16(str.Length()).value(); - - codeUint16(len); - memcpy(write(len), str.BeginReading(), len); - } - - size_t cursor() const { return cursor_; } - - uint8_t* Get() { return data.Elements(); } - - const uint8_t* Get() const { return data.Elements(); } - - private: - nsTArray data; - size_t cursor_ = 0; -}; - -class InputBuffer { - public: - explicit InputBuffer(const Range& buffer) : data(buffer) {} - - const uint8_t* read(size_t size) { - MOZ_ASSERT(checkCapacity(size)); - - auto buf = &data[cursor_]; - cursor_ += size; - return buf; - } - - bool codeUint8(uint8_t& val) { - if (checkCapacity(sizeof val)) { - val = *read(sizeof val); - } - return !error_; - } - - template - bool codeUint8(EnumSet& val) { - uint8_t value; - if (codeUint8(value)) { - val.deserialize(value); - } - return !error_; - } - - bool codeUint16(uint16_t& val) { - if (checkCapacity(sizeof val)) { - val = LittleEndian::readUint16(read(sizeof val)); - } - return !error_; - } - - bool codeUint32(uint32_t& val) { - if (checkCapacity(sizeof val)) { - val = LittleEndian::readUint32(read(sizeof val)); - } - return !error_; - } - - bool codeString(nsCString& str) { - uint16_t len; - if (codeUint16(len)) { - if (checkCapacity(len)) { - str.SetLength(len); - memcpy(str.BeginWriting(), read(len), len); - } - } - return !error_; - } - - bool error() { return error_; } - - bool finished() { return error_ || !remainingCapacity(); } - - size_t remainingCapacity() { return data.length() - cursor_; } - - size_t cursor() const { return cursor_; } - - const uint8_t* Get() const { return data.begin().get(); } - - private: - bool checkCapacity(size_t size) { - if (size > remainingCapacity()) { - error_ = true; - } - return !error_; - } - - bool error_ = false; - - public: - const Range& data; - size_t cursor_ = 0; -}; - template struct Matcher; diff --git a/js/xpconnect/loader/ScriptPreloader.cpp b/js/xpconnect/loader/ScriptPreloader.cpp index bfbb87c4b8bb..cbe09f5c6515 100644 --- a/js/xpconnect/loader/ScriptPreloader.cpp +++ b/js/xpconnect/loader/ScriptPreloader.cpp @@ -14,6 +14,7 @@ #include "mozilla/ClearOnShutdown.h" #include "mozilla/Components.h" #include "mozilla/FileUtils.h" +#include "mozilla/IOBuffers.h" #include "mozilla/Logging.h" #include "mozilla/ScopeExit.h" #include "mozilla/Services.h" diff --git a/js/xpconnect/loader/moz.build b/js/xpconnect/loader/moz.build index 4c7a0165177a..aca9160cce61 100644 --- a/js/xpconnect/loader/moz.build +++ b/js/xpconnect/loader/moz.build @@ -31,6 +31,7 @@ EXPORTS += [ EXPORTS.mozilla += [ 'AutoMemMap.h', + 'IOBuffers.h', 'ScriptPreloader.h', 'URLPreloader.h', ]