1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_SNAPSHOT_SNAPSHOT_SOURCE_SINK_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_SNAPSHOT_SNAPSHOT_SOURCE_SINK_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/logging.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Source to read snapshot and builtins files from. 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Note: Memory ownership remains with callee. 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SnapshotByteSource final { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SnapshotByteSource(const char* data, int length) 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : data_(reinterpret_cast<const byte*>(data)), 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier length_(length), 25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position_(0) {} 26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit SnapshotByteSource(Vector<const byte> payload) 28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : data_(payload.start()), length_(payload.length()), position_(0) {} 29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ~SnapshotByteSource() {} 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMore() { return position_ < length_; } 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier byte Get() { 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(position_ < length_); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return data_[position_++]; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Advance(int by) { position_ += by; } 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CopyRaw(byte* to, int number_of_bytes); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int GetInt() { 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This way of decoding variable-length encoded integers does not 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // suffer from branch mispredictions. 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(position_ + 3 < length_); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t answer = data_[position_]; 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch answer |= data_[position_ + 1] << 8; 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch answer |= data_[position_ + 2] << 16; 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch answer |= data_[position_ + 3] << 24; 51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int bytes = (answer & 3) + 1; 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Advance(bytes); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t mask = 0xffffffffu; 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mask >>= 32 - (bytes << 3); 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch answer &= mask; 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch answer >>= 2; 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return answer; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns length. 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int GetBlob(const byte** data); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position() { return position_; } 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const byte* data_; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length_; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position_; 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(SnapshotByteSource); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/** 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Sink to write snapshot files to. 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Subclasses must implement actual storage or i/o. 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch */ 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SnapshotByteSink { 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SnapshotByteSink() {} 82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit SnapshotByteSink(int initial_size) : data_(initial_size) {} 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ~SnapshotByteSink() {} 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Put(byte b, const char* description) { data_.Add(b); } 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PutSection(int b, const char* description) { 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK_LE(b, kMaxUInt8); 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Put(static_cast<byte>(b), description); 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PutInt(uintptr_t integer, const char* description); 94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PutRaw(const byte* data, int number_of_bytes, const char* description); 95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int Position() { return data_.length(); } 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const List<byte>* data() const { return &data_; } 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier List<byte> data_; 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_SNAPSHOT_SNAPSHOT_SOURCE_SINK_H_ 107