12f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 22f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 32f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_STRING_STREAM_H_ 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_STRING_STREAM_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/handles.h" 92f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 1071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass StringAllocator { 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 152f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org virtual ~StringAllocator() { } 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a number of bytes. 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual char* allocate(unsigned bytes) = 0; 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a larger number of bytes and copy the old buffer to the new one. 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // bytes is an input and output parameter passing the old size of the buffer 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and returning the new size. If allocation fails then we return the old 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // buffer and do not increase the size. 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual char* grow(unsigned* bytes) = 0; 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Normal allocator uses new[] and delete[]. 27ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass HeapStringAllocator FINAL : public StringAllocator { 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ~HeapStringAllocator() { DeleteArray(space_); } 30ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual char* allocate(unsigned bytes) OVERRIDE; 31ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual char* grow(unsigned* bytes) OVERRIDE; 322f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char* space_; 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FmtElm FINAL { 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 409085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org FmtElm(int value) : type_(INT) { // NOLINT 419085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_int_ = value; 429085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 439085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org explicit FmtElm(double value) : type_(DOUBLE) { 449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_double_ = value; 459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 469085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org FmtElm(const char* value) : type_(C_STR) { // NOLINT 479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_c_str_ = value; 489085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 499085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org FmtElm(const Vector<const uc16>& value) : type_(LC_STR) { // NOLINT 509085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_lc_str_ = &value; 519085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 529085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org FmtElm(Object* value) : type_(OBJ) { // NOLINT 539085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_obj_ = value; 549085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 559085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org FmtElm(Handle<Object> value) : type_(HANDLE) { // NOLINT 569085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org data_.u_handle_ = value.location(); 579085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 58b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org FmtElm(void* value) : type_(POINTER) { // NOLINT 59b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org data_.u_pointer_ = value; 609085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 6183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen friend class StringStream; 64b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org enum Type { INT, DOUBLE, C_STR, LC_STR, OBJ, HANDLE, POINTER }; 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Type type_; 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen union { 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int u_int_; 683bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org double u_double_; 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* u_c_str_; 70a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const Vector<const uc16>* u_lc_str_; 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* u_obj_; 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object** u_handle_; 73b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org void* u_pointer_; 7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } data_; 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass StringStream FINAL { 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen explicit StringStream(StringAllocator* allocator): 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen allocator_(allocator), 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen capacity_(kInitialCapacity), 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen length_(0), 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer_(allocator_->allocate(kInitialCapacity)) { 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer_[0] = 0; 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Put(char c); 8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Put(String* str); 9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Put(String* str, int start, int end); 91a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void Add(Vector<const char> format, Vector<FmtElm> elms); 9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Add(const char* format); 93a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void Add(Vector<const char> format); 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Add(const char* format, FmtElm arg0); 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Add(const char* format, FmtElm arg0, FmtElm arg1); 9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Add(const char* format, FmtElm arg0, FmtElm arg1, FmtElm arg2); 97a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void Add(const char* format, 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FmtElm arg0, 99a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FmtElm arg1, 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FmtElm arg2, 101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FmtElm arg3); 102a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org void Add(const char* format, 103a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org FmtElm arg0, 104a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org FmtElm arg1, 105a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org FmtElm arg2, 106a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org FmtElm arg3, 107a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org FmtElm arg4); 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Getting the message out. 110023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org void OutputToFile(FILE* out); 111023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org void OutputToStdOut() { OutputToFile(stdout); } 112e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org void Log(Isolate* isolate); 1133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Handle<String> ToString(Isolate* isolate); 11483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<const char> ToCString() const; 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int length() const { return length_; } 11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Object printing support. 11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintName(Object* o); 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintFixedArray(FixedArray* array, unsigned int limit); 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintByteArray(ByteArray* ba); 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintUsingMap(JSObject* js_object); 12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintPrototype(JSFunction* fun, Object* receiver); 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintSecurityTokenIfChanged(Object* function); 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // NOTE: Returns the code in the output parameter. 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintFunction(Object* function, Object* receiver, Code** code); 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Reset the stream. 12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Reset() { 12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen length_ = 0; 13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer_[0] = 0; 13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Mentioned object cache support. 1343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org void PrintMentionedObjectCache(Isolate* isolate); 1353d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void ClearMentionedObjectCache(Isolate* isolate); 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 1373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static bool IsMentionedObjectCacheClear(Isolate* isolate); 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kInitialCapacity = 16; 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintObject(Object* obj); 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen StringAllocator* allocator_; 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned capacity_; 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned length_; // does not include terminating 0-character 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char* buffer_; 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org bool full() const { return (capacity_ - length_) == 1; } 15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int space() const { return capacity_ - length_; } 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(StringStream); 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_STRING_STREAM_H_ 159