1// Copyright 2011 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_PARSING_DUPLICATE_FINDER_H_
6#define V8_PARSING_DUPLICATE_FINDER_H_
7
8#include "src/base/hashmap.h"
9#include "src/collector.h"
10
11namespace v8 {
12namespace internal {
13
14class UnicodeCache;
15
16// DuplicateFinder discovers duplicate symbols.
17class DuplicateFinder {
18 public:
19  explicit DuplicateFinder(UnicodeCache* constants)
20      : unicode_constants_(constants), backing_store_(16), map_(&Match) {}
21
22  int AddOneByteSymbol(Vector<const uint8_t> key, int value);
23  int AddTwoByteSymbol(Vector<const uint16_t> key, int value);
24  // Add a a number literal by converting it (if necessary)
25  // to the string that ToString(ToNumber(literal)) would generate.
26  // and then adding that string with AddOneByteSymbol.
27  // This string is the actual value used as key in an object literal,
28  // and the one that must be different from the other keys.
29  int AddNumber(Vector<const uint8_t> key, int value);
30
31 private:
32  int AddSymbol(Vector<const uint8_t> key, bool is_one_byte, int value);
33  // Backs up the key and its length in the backing store.
34  // The backup is stored with a base 127 encoding of the
35  // length (plus a bit saying whether the string is one byte),
36  // followed by the bytes of the key.
37  uint8_t* BackupKey(Vector<const uint8_t> key, bool is_one_byte);
38
39  // Compare two encoded keys (both pointing into the backing store)
40  // for having the same base-127 encoded lengths and representation.
41  // and then having the same 'length' bytes following.
42  static bool Match(void* first, void* second);
43  // Creates a hash from a sequence of bytes.
44  static uint32_t Hash(Vector<const uint8_t> key, bool is_one_byte);
45  // Checks whether a string containing a JS number is its canonical
46  // form.
47  static bool IsNumberCanonical(Vector<const uint8_t> key);
48
49  // Size of buffer. Sufficient for using it to call DoubleToCString in
50  // from conversions.h.
51  static const int kBufferSize = 100;
52
53  UnicodeCache* unicode_constants_;
54  // Backing store used to store strings used as hashmap keys.
55  SequenceCollector<unsigned char> backing_store_;
56  base::CustomMatcherHashMap map_;
57  // Buffer used for string->number->canonical string conversions.
58  char number_buffer_[kBufferSize];
59};
60
61}  // namespace internal
62}  // namespace v8
63
64#endif  // V8_PARSING_DUPLICATE_FINDER_H_
65