| Index: src/scanner.h
|
| diff --git a/src/scanner.h b/src/scanner.h
|
| index d7328085b79245d97b807ff6f7e248d7a6ed207d..3cefc833ac3323c536ca98015fdfbee1522060d5 100644
|
| --- a/src/scanner.h
|
| +++ b/src/scanner.h
|
| @@ -34,6 +34,8 @@
|
| #include "char-predicates.h"
|
| #include "checks.h"
|
| #include "globals.h"
|
| +#include "hashmap.h"
|
| +#include "list.h"
|
| #include "token.h"
|
| #include "unicode-inl.h"
|
| #include "utils.h"
|
| @@ -121,9 +123,10 @@ class Utf16CharacterStream {
|
| };
|
|
|
|
|
| -class UnicodeCache {
|
| // ---------------------------------------------------------------------
|
| // Caching predicates used by scanners.
|
| +
|
| +class UnicodeCache {
|
| public:
|
| UnicodeCache() {}
|
| typedef unibrow::Utf8Decoder<512> Utf8Decoder;
|
| @@ -148,6 +151,56 @@ class UnicodeCache {
|
| };
|
|
|
|
|
| +// ---------------------------------------------------------------------
|
| +// DuplicateFinder discovers duplicate symbols.
|
| +
|
| +class DuplicateFinder {
|
| + public:
|
| + explicit DuplicateFinder(UnicodeCache* constants)
|
| + : unicode_constants_(constants),
|
| + backing_store_(16),
|
| + map_(&Match) { }
|
| +
|
| + int AddAsciiSymbol(Vector<const char> key, int value);
|
| + int AddUtf16Symbol(Vector<const uint16_t> key, int value);
|
| + // Add a a number literal by converting it (if necessary)
|
| + // to the string that ToString(ToNumber(literal)) would generate.
|
| + // and then adding that string with AddAsciiSymbol.
|
| + // This string is the actual value used as key in an object literal,
|
| + // and the one that must be different from the other keys.
|
| + int AddNumber(Vector<const char> key, int value);
|
| +
|
| + private:
|
| + int AddSymbol(Vector<const byte> key, bool is_ascii, int value);
|
| + // Backs up the key and its length in the backing store.
|
| + // The backup is stored with a base 127 encoding of the
|
| + // length (plus a bit saying whether the string is ASCII),
|
| + // followed by the bytes of the key.
|
| + byte* BackupKey(Vector<const byte> key, bool is_ascii);
|
| +
|
| + // Compare two encoded keys (both pointing into the backing store)
|
| + // for having the same base-127 encoded lengths and ASCII-ness,
|
| + // and then having the same 'length' bytes following.
|
| + static bool Match(void* first, void* second);
|
| + // Creates a hash from a sequence of bytes.
|
| + static uint32_t Hash(Vector<const byte> key, bool is_ascii);
|
| + // Checks whether a string containing a JS number is its canonical
|
| + // form.
|
| + static bool IsNumberCanonical(Vector<const char> key);
|
| +
|
| + // Size of buffer. Sufficient for using it to call DoubleToCString in
|
| + // from conversions.h.
|
| + static const int kBufferSize = 100;
|
| +
|
| + UnicodeCache* unicode_constants_;
|
| + // Backing store used to store strings used as hashmap keys.
|
| + SequenceCollector<unsigned char> backing_store_;
|
| + HashMap map_;
|
| + // Buffer used for string->number->canonical string conversions.
|
| + char number_buffer_[kBufferSize];
|
| +};
|
| +
|
| +
|
| // ----------------------------------------------------------------------------
|
| // LiteralBuffer - Collector of chars of literals.
|
|
|
|
|