LCOV - code coverage report
Current view: top level - src/snapshot - snapshot.h (source / functions) Hit Total Coverage
Test: app.info Lines: 8 8 100.0 %
Date: 2019-02-19 Functions: 1 2 50.0 %

          Line data    Source code
       1             : // Copyright 2006-2008 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_SNAPSHOT_SNAPSHOT_H_
       6             : #define V8_SNAPSHOT_SNAPSHOT_H_
       7             : 
       8             : #include "src/snapshot/partial-serializer.h"
       9             : #include "src/snapshot/startup-serializer.h"
      10             : 
      11             : #include "src/utils.h"
      12             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : 
      16             : // Forward declarations.
      17             : class Isolate;
      18             : class PartialSerializer;
      19             : class StartupSerializer;
      20             : 
      21             : // Wrapper around reservation sizes and the serialization payload.
      22      151176 : class SnapshotData : public SerializedData {
      23             :  public:
      24             :   // Used when producing.
      25             :   explicit SnapshotData(const Serializer* serializer);
      26             : 
      27             :   // Used when consuming.
      28             :   explicit SnapshotData(const Vector<const byte> snapshot)
      29      211687 :       : SerializedData(const_cast<byte*>(snapshot.begin()), snapshot.length()) {
      30             :   }
      31             : 
      32             :   std::vector<Reservation> Reservations() const;
      33             :   virtual Vector<const byte> Payload() const;
      34             : 
      35             :   Vector<const byte> RawData() const {
      36         748 :     return Vector<const byte>(data_, size_);
      37             :   }
      38             : 
      39             :  protected:
      40             :   // The data header consists of uint32_t-sized entries:
      41             :   // [0] magic number and (internal) external reference count
      42             :   // [1] number of reservation size entries
      43             :   // [2] payload length
      44             :   // ... reservations
      45             :   // ... serialized payload
      46             :   static const uint32_t kNumReservationsOffset =
      47             :       kMagicNumberOffset + kUInt32Size;
      48             :   static const uint32_t kPayloadLengthOffset =
      49             :       kNumReservationsOffset + kUInt32Size;
      50             :   static const uint32_t kHeaderSize = kPayloadLengthOffset + kUInt32Size;
      51             : };
      52             : 
      53             : class Snapshot : public AllStatic {
      54             :  public:
      55             :   // ---------------- Deserialization ----------------
      56             : 
      57             :   // Initialize the Isolate from the internal snapshot. Returns false if no
      58             :   // snapshot could be found.
      59             :   static bool Initialize(Isolate* isolate);
      60             : 
      61             :   // Create a new context using the internal partial snapshot.
      62             :   static MaybeHandle<Context> NewContextFromSnapshot(
      63             :       Isolate* isolate, Handle<JSGlobalProxy> global_proxy,
      64             :       size_t context_index,
      65             :       v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer);
      66             : 
      67             :   // ---------------- Helper methods ----------------
      68             : 
      69             :   static bool HasContextSnapshot(Isolate* isolate, size_t index);
      70             :   static bool EmbedsScript(Isolate* isolate);
      71             : 
      72             :   // To be implemented by the snapshot source.
      73             :   static const v8::StartupData* DefaultSnapshotBlob();
      74             : 
      75             :   static bool VerifyChecksum(const v8::StartupData* data);
      76             : 
      77             :   // ---------------- Serialization ----------------
      78             : 
      79             :   static v8::StartupData CreateSnapshotBlob(
      80             :       const SnapshotData* startup_snapshot,
      81             :       const SnapshotData* read_only_snapshot,
      82             :       const std::vector<SnapshotData*>& context_snapshots,
      83             :       bool can_be_rehashed);
      84             : 
      85             : #ifdef DEBUG
      86             :   static bool SnapshotIsValid(const v8::StartupData* snapshot_blob);
      87             : #endif  // DEBUG
      88             : 
      89             :  private:
      90             :   static uint32_t ExtractNumContexts(const v8::StartupData* data);
      91             :   static uint32_t ExtractContextOffset(const v8::StartupData* data,
      92             :                                        uint32_t index);
      93             :   static bool ExtractRehashability(const v8::StartupData* data);
      94             :   static Vector<const byte> ExtractStartupData(const v8::StartupData* data);
      95             :   static Vector<const byte> ExtractReadOnlyData(const v8::StartupData* data);
      96             :   static Vector<const byte> ExtractContextData(const v8::StartupData* data,
      97             :                                                uint32_t index);
      98             : 
      99             :   static uint32_t GetHeaderValue(const v8::StartupData* data, uint32_t offset) {
     100             :     return ReadLittleEndianValue<uint32_t>(
     101      545049 :         reinterpret_cast<Address>(data->data) + offset);
     102             :   }
     103             :   static void SetHeaderValue(char* data, uint32_t offset, uint32_t value) {
     104        1181 :     WriteLittleEndianValue(reinterpret_cast<Address>(data) + offset, value);
     105             :   }
     106             : 
     107             :   static void CheckVersion(const v8::StartupData* data);
     108             : 
     109             :   // Snapshot blob layout:
     110             :   // [0] number of contexts N
     111             :   // [1] rehashability
     112             :   // [2] checksum part A
     113             :   // [3] checksum part B
     114             :   // [4] (128 bytes) version string
     115             :   // [5] offset to readonly
     116             :   // [6] offset to context 0
     117             :   // [7] offset to context 1
     118             :   // ...
     119             :   // ... offset to context N - 1
     120             :   // ... startup snapshot data
     121             :   // ... read-only snapshot data
     122             :   // ... context 0 snapshot data
     123             :   // ... context 1 snapshot data
     124             : 
     125             :   static const uint32_t kNumberOfContextsOffset = 0;
     126             :   // TODO(yangguo): generalize rehashing, and remove this flag.
     127             :   static const uint32_t kRehashabilityOffset =
     128             :       kNumberOfContextsOffset + kUInt32Size;
     129             :   static const uint32_t kChecksumPartAOffset =
     130             :       kRehashabilityOffset + kUInt32Size;
     131             :   static const uint32_t kChecksumPartBOffset =
     132             :       kChecksumPartAOffset + kUInt32Size;
     133             :   static const uint32_t kVersionStringOffset =
     134             :       kChecksumPartBOffset + kUInt32Size;
     135             :   static const uint32_t kVersionStringLength = 64;
     136             :   static const uint32_t kReadOnlyOffsetOffset =
     137             :       kVersionStringOffset + kVersionStringLength;
     138             :   static const uint32_t kFirstContextOffsetOffset =
     139             :       kReadOnlyOffsetOffset + kUInt32Size;
     140             : 
     141             :   static Vector<const byte> ChecksummedContent(const v8::StartupData* data) {
     142             :     const uint32_t kChecksumStart = kVersionStringOffset;
     143             :     return Vector<const byte>(
     144             :         reinterpret_cast<const byte*>(data->data + kChecksumStart),
     145       61139 :         data->raw_size - kChecksumStart);
     146             :   }
     147             : 
     148             :   static uint32_t StartupSnapshotOffset(int num_contexts) {
     149       61129 :     return POINTER_SIZE_ALIGN(kFirstContextOffsetOffset +
     150             :                               num_contexts * kInt32Size);
     151             :   }
     152             : 
     153             :   static uint32_t ContextSnapshotOffsetOffset(int index) {
     154       89942 :     return kFirstContextOffsetOffset + index * kInt32Size;
     155             :   }
     156             : 
     157             :   DISALLOW_IMPLICIT_CONSTRUCTORS(Snapshot);
     158             : };
     159             : 
     160             : #ifdef V8_USE_EXTERNAL_STARTUP_DATA
     161             : void SetSnapshotFromFile(StartupData* snapshot_blob);
     162             : #endif
     163             : 
     164             : }  // namespace internal
     165             : }  // namespace v8
     166             : 
     167             : #endif  // V8_SNAPSHOT_SNAPSHOT_H_

Generated by: LCOV version 1.10