diff options
| author | Steve Block <steveblock@google.com> | 2009-10-30 11:49:00 +0000 |
|---|---|---|
| committer | Steve Block <steveblock@google.com> | 2009-11-03 17:23:38 +0000 |
| commit | a7e24c173cf37484693b9abb38e494fa7bd7baeb (patch) | |
| tree | 4aeefe31292fbed0d94f1b93fe86c51849b001c2 /src/string-stream.h | |
| parent | af654c46444383e0baed1cb27a4c1d1bdcac8dd9 (diff) | |
| download | android_external_v8-a7e24c173cf37484693b9abb38e494fa7bd7baeb.tar.gz android_external_v8-a7e24c173cf37484693b9abb38e494fa7bd7baeb.tar.bz2 android_external_v8-a7e24c173cf37484693b9abb38e494fa7bd7baeb.zip | |
Move V8 to external/v8
Change-Id: If68025d67453785a651c5dfb34fad298c16676a4
Diffstat (limited to 'src/string-stream.h')
| -rw-r--r-- | src/string-stream.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/string-stream.h b/src/string-stream.h new file mode 100644 index 00000000..323a6d66 --- /dev/null +++ b/src/string-stream.h @@ -0,0 +1,189 @@ +// Copyright 2006-2008 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef V8_STRING_STREAM_H_ +#define V8_STRING_STREAM_H_ + +namespace v8 { +namespace internal { + + +class StringAllocator { + public: + virtual ~StringAllocator() {} + // Allocate a number of bytes. + virtual char* allocate(unsigned bytes) = 0; + // Allocate a larger number of bytes and copy the old buffer to the new one. + // bytes is an input and output parameter passing the old size of the buffer + // and returning the new size. If allocation fails then we return the old + // buffer and do not increase the size. + virtual char* grow(unsigned* bytes) = 0; +}; + + +// Normal allocator uses new[] and delete[]. +class HeapStringAllocator: public StringAllocator { + public: + ~HeapStringAllocator() { DeleteArray(space_); } + char* allocate(unsigned bytes); + char* grow(unsigned* bytes); + private: + char* space_; +}; + + +// Allocator for use when no new c++ heap allocation is allowed. +// Given a preallocated buffer up front and does no allocation while +// building message. +class NoAllocationStringAllocator: public StringAllocator { + public: + NoAllocationStringAllocator(char* memory, unsigned size); + char* allocate(unsigned bytes) { return space_; } + char* grow(unsigned* bytes); + private: + unsigned size_; + char* space_; +}; + + +class FmtElm { + public: + FmtElm(int value) : type_(INT) { // NOLINT + data_.u_int_ = value; + } + explicit FmtElm(double value) : type_(DOUBLE) { + data_.u_double_ = value; + } + FmtElm(const char* value) : type_(C_STR) { // NOLINT + data_.u_c_str_ = value; + } + FmtElm(const Vector<const uc16>& value) : type_(LC_STR) { // NOLINT + data_.u_lc_str_ = &value; + } + FmtElm(Object* value) : type_(OBJ) { // NOLINT + data_.u_obj_ = value; + } + FmtElm(Handle<Object> value) : type_(HANDLE) { // NOLINT + data_.u_handle_ = value.location(); + } + FmtElm(void* value) : type_(POINTER) { // NOLINT + data_.u_pointer_ = value; + } + private: + friend class StringStream; + enum Type { INT, DOUBLE, C_STR, LC_STR, OBJ, HANDLE, POINTER }; + Type type_; + union { + int u_int_; + double u_double_; + const char* u_c_str_; + const Vector<const uc16>* u_lc_str_; + Object* u_obj_; + Object** u_handle_; + void* u_pointer_; + } data_; +}; + + +class StringStream { + public: + explicit StringStream(StringAllocator* allocator): + allocator_(allocator), + capacity_(kInitialCapacity), + length_(0), + buffer_(allocator_->allocate(kInitialCapacity)) { + buffer_[0] = 0; + } + + ~StringStream() { + } + + bool Put(char c); + bool Put(String* str); + bool Put(String* str, int start, int end); + void Add(Vector<const char> format, Vector<FmtElm> elms); + void Add(const char* format); + void Add(Vector<const char> format); + void Add(const char* format, FmtElm arg0); + void Add(const char* format, FmtElm arg0, FmtElm arg1); + void Add(const char* format, FmtElm arg0, FmtElm arg1, FmtElm arg2); + void Add(const char* format, + FmtElm arg0, + FmtElm arg1, + FmtElm arg2, + FmtElm arg3); + + // Getting the message out. + void OutputToStdOut(); + void Log(); + Handle<String> ToString(); + SmartPointer<const char> ToCString() const; + + // Object printing support. + void PrintName(Object* o); + void PrintFixedArray(FixedArray* array, unsigned int limit); + void PrintByteArray(ByteArray* ba); + void PrintUsingMap(JSObject* js_object); + void PrintPrototype(JSFunction* fun, Object* receiver); + void PrintSecurityTokenIfChanged(Object* function); + // NOTE: Returns the code in the output parameter. + void PrintFunction(Object* function, Object* receiver, Code** code); + + // Reset the stream. + void Reset() { + length_ = 0; + buffer_[0] = 0; + } + + // Mentioned object cache support. + void PrintMentionedObjectCache(); + static void ClearMentionedObjectCache(); +#ifdef DEBUG + static bool IsMentionedObjectCacheClear(); +#endif + + + static const int kInitialCapacity = 16; + + private: + void PrintObject(Object* obj); + + StringAllocator* allocator_; + unsigned capacity_; + unsigned length_; // does not include terminating 0-character + char* buffer_; + + bool full() const { return (capacity_ - length_) == 1; } + int space() const { return capacity_ - length_; } + + DISALLOW_IMPLICIT_CONSTRUCTORS(StringStream); +}; + + +} } // namespace v8::internal + +#endif // V8_STRING_STREAM_H_ |
