| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/runtime/dart_snapshot_buffer.h" |
| |
| #include <utility> |
| |
| #include "flutter/fml/mapping.h" |
| |
| namespace flutter { |
| |
| class NativeLibrarySnapshotBuffer final : public DartSnapshotBuffer { |
| public: |
| NativeLibrarySnapshotBuffer(fml::RefPtr<fml::NativeLibrary> library, |
| const char* symbol_name) |
| : library_(std::move(library)) { |
| if (library_) { |
| symbol_ = library_->ResolveSymbol(symbol_name); |
| } |
| } |
| |
| const uint8_t* GetSnapshotPointer() const override { return symbol_; } |
| |
| size_t GetSnapshotSize() const override { return 0; } |
| |
| private: |
| fml::RefPtr<fml::NativeLibrary> library_; |
| const uint8_t* symbol_ = nullptr; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(NativeLibrarySnapshotBuffer); |
| }; |
| |
| class MappingBuffer final : public DartSnapshotBuffer { |
| public: |
| MappingBuffer(std::unique_ptr<fml::Mapping> mapping) |
| : mapping_(std::move(mapping)) { |
| FML_DCHECK(mapping_); |
| } |
| |
| const uint8_t* GetSnapshotPointer() const override { |
| return mapping_->GetMapping(); |
| } |
| |
| size_t GetSnapshotSize() const override { return mapping_->GetSize(); } |
| |
| private: |
| std::unique_ptr<fml::Mapping> mapping_; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(MappingBuffer); |
| }; |
| |
| class UnmanagedAllocation final : public DartSnapshotBuffer { |
| public: |
| UnmanagedAllocation(const uint8_t* allocation) : allocation_(allocation) {} |
| |
| const uint8_t* GetSnapshotPointer() const override { return allocation_; } |
| |
| size_t GetSnapshotSize() const override { return 0; } |
| |
| private: |
| const uint8_t* allocation_; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(UnmanagedAllocation); |
| }; |
| |
| std::unique_ptr<DartSnapshotBuffer> |
| DartSnapshotBuffer::CreateWithSymbolInLibrary( |
| fml::RefPtr<fml::NativeLibrary> library, |
| const char* symbol_name) { |
| auto source = std::make_unique<NativeLibrarySnapshotBuffer>( |
| std::move(library), symbol_name); |
| return source->GetSnapshotPointer() == nullptr ? nullptr : std::move(source); |
| } |
| |
| std::unique_ptr<DartSnapshotBuffer> |
| DartSnapshotBuffer::CreateWithContentsOfFile( |
| const fml::UniqueFD& fd, |
| std::initializer_list<fml::FileMapping::Protection> protection) { |
| return CreateWithMapping(std::make_unique<fml::FileMapping>(fd, protection)); |
| } |
| |
| std::unique_ptr<DartSnapshotBuffer> DartSnapshotBuffer::CreateWithMapping( |
| std::unique_ptr<fml::Mapping> mapping) { |
| if (mapping == nullptr || mapping->GetSize() == 0 || |
| mapping->GetMapping() == nullptr) { |
| return nullptr; |
| } |
| return std::make_unique<MappingBuffer>(std::move(mapping)); |
| } |
| |
| std::unique_ptr<DartSnapshotBuffer> |
| DartSnapshotBuffer::CreateWithUnmanagedAllocation(const uint8_t* allocation) { |
| if (allocation == nullptr) { |
| return nullptr; |
| } |
| return std::make_unique<UnmanagedAllocation>(allocation); |
| } |
| |
| DartSnapshotBuffer::~DartSnapshotBuffer() = default; |
| |
| } // namespace flutter |