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