LCOV - code coverage report
Current view: top level - src/snapshot - builtin-deserializer.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 28 28 100.0 %
Date: 2017-10-20 Functions: 5 5 100.0 %

          Line data    Source code
       1             : // Copyright 2017 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             : #include "src/snapshot/builtin-deserializer.h"
       6             : 
       7             : #include "src/assembler-inl.h"
       8             : #include "src/objects-inl.h"
       9             : #include "src/snapshot/snapshot.h"
      10             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : 
      14             : // Tracks the builtin currently being deserialized (required for allocation).
      15             : class DeserializingBuiltinScope {
      16             :  public:
      17             :   DeserializingBuiltinScope(BuiltinDeserializer* builtin_deserializer,
      18             :                             int builtin_id)
      19             :       : builtin_deserializer_(builtin_deserializer) {
      20             :     DCHECK_EQ(BuiltinDeserializer::kNoBuiltinId,
      21             :               builtin_deserializer->current_builtin_id_);
      22    25042015 :     builtin_deserializer->current_builtin_id_ = builtin_id;
      23             :   }
      24             : 
      25             :   ~DeserializingBuiltinScope() {
      26             :     builtin_deserializer_->current_builtin_id_ =
      27    25042013 :         BuiltinDeserializer::kNoBuiltinId;
      28             :   }
      29             : 
      30             :  private:
      31             :   BuiltinDeserializer* builtin_deserializer_;
      32             : 
      33             :   DISALLOW_COPY_AND_ASSIGN(DeserializingBuiltinScope)
      34             : };
      35             : 
      36      155730 : BuiltinDeserializer::BuiltinDeserializer(Isolate* isolate,
      37             :                                          const BuiltinSnapshotData* data)
      38      155730 :     : Deserializer(data, false) {
      39      155730 :   builtin_offsets_ = data->BuiltinOffsets();
      40             :   DCHECK_EQ(Builtins::builtin_count, builtin_offsets_.length());
      41             :   DCHECK(std::is_sorted(builtin_offsets_.begin(), builtin_offsets_.end()));
      42             : 
      43      155730 :   Initialize(isolate);
      44      155730 : }
      45             : 
      46       54973 : void BuiltinDeserializer::DeserializeEagerBuiltins() {
      47             :   DCHECK(!AllowHeapAllocation::IsAllowed());
      48             :   DCHECK_EQ(0, source()->position());
      49             : 
      50       54973 :   Builtins* builtins = isolate()->builtins();
      51    38587305 :   for (int i = 0; i < Builtins::builtin_count; i++) {
      52    38532337 :     if (IsLazyDeserializationEnabled() && Builtins::IsLazy(i)) {
      53             :       // Do nothing. These builtins have been replaced by DeserializeLazy in
      54             :       // InitializeBuiltinsTable.
      55             :       DCHECK_EQ(builtins->builtin(Builtins::kDeserializeLazy),
      56             :                 builtins->builtin(i));
      57             :     } else {
      58    24941251 :       builtins->set_builtin(i, DeserializeBuiltinRaw(i));
      59             :     }
      60             :   }
      61             : 
      62             : #ifdef DEBUG
      63             :   for (int i = 0; i < Builtins::builtin_count; i++) {
      64             :     Object* o = builtins->builtin(i);
      65             :     DCHECK(o->IsCode() && Code::cast(o)->is_builtin());
      66             :   }
      67             : #endif
      68       54968 : }
      69             : 
      70      100762 : Code* BuiltinDeserializer::DeserializeBuiltin(int builtin_id) {
      71      100762 :   allocator()->ReserveAndInitializeBuiltinsTableForBuiltin(builtin_id);
      72             :   DisallowHeapAllocation no_gc;
      73      100762 :   return DeserializeBuiltinRaw(builtin_id);
      74             : }
      75             : 
      76    25042015 : Code* BuiltinDeserializer::DeserializeBuiltinRaw(int builtin_id) {
      77             :   DCHECK(!AllowHeapAllocation::IsAllowed());
      78             :   DCHECK(Builtins::IsBuiltinId(builtin_id));
      79             : 
      80             :   DeserializingBuiltinScope scope(this, builtin_id);
      81             : 
      82    50084049 :   const int initial_position = source()->position();
      83    50084030 :   source()->set_position(builtin_offsets_[builtin_id]);
      84             : 
      85    25042015 :   Object* o = ReadDataSingle();
      86             :   DCHECK(o->IsCode() && Code::cast(o)->is_builtin());
      87             : 
      88             :   // Rewind.
      89             :   source()->set_position(initial_position);
      90             : 
      91             :   // Flush the instruction cache.
      92             :   Code* code = Code::cast(o);
      93    25042034 :   Assembler::FlushICache(isolate(), code->instruction_start(),
      94    50084068 :                          code->instruction_size());
      95             : 
      96    25042013 :   return code;
      97             : }
      98             : 
      99    25042063 : uint32_t BuiltinDeserializer::ExtractBuiltinSize(int builtin_id) {
     100             :   DCHECK(Builtins::IsBuiltinId(builtin_id));
     101             : 
     102    25042063 :   const int initial_position = source()->position();
     103             : 
     104             :   // Grab the size of the code object.
     105    50084126 :   source()->set_position(builtin_offsets_[builtin_id]);
     106             :   byte data = source()->Get();
     107             : 
     108             :   USE(data);
     109             :   DCHECK_EQ(kNewObject | kPlain | kStartOfObject | CODE_SPACE, data);
     110    25042063 :   const uint32_t result = source()->GetInt() << kObjectAlignmentBits;
     111             : 
     112             :   // Rewind.
     113             :   source()->set_position(initial_position);
     114             : 
     115    25042053 :   return result;
     116             : }
     117             : 
     118             : }  // namespace internal
     119             : }  // namespace v8

Generated by: LCOV version 1.10