| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 38 class BasicJsonStringifier BASE_EMBEDDED { | 38 class BasicJsonStringifier BASE_EMBEDDED { | 
| 39  public: | 39  public: | 
| 40   explicit BasicJsonStringifier(Isolate* isolate); | 40   explicit BasicJsonStringifier(Isolate* isolate); | 
| 41 | 41 | 
| 42   MaybeObject* Stringify(Handle<Object> object); | 42   MaybeObject* Stringify(Handle<Object> object); | 
| 43 | 43 | 
| 44  private: | 44  private: | 
| 45   static const int kInitialPartLength = 32; | 45   static const int kInitialPartLength = 32; | 
| 46   static const int kMaxPartLength = 16 * 1024; | 46   static const int kMaxPartLength = 16 * 1024; | 
| 47   static const int kPartLengthGrowthFactor = 2; | 47   static const int kPartLengthGrowthFactor = 2; | 
| 48   static const int kStackLimit = 4 * 1024; |  | 
| 49 | 48 | 
| 50   enum Result { UNCHANGED, SUCCESS, BAILOUT, CIRCULAR, STACK_OVERFLOW }; | 49   enum Result { UNCHANGED, SUCCESS, BAILOUT, CIRCULAR, STACK_OVERFLOW }; | 
| 51 | 50 | 
| 52   template <bool is_ascii> void Extend(); | 51   template <bool is_ascii> void Extend(); | 
| 53 | 52 | 
| 54   void ChangeEncoding(); | 53   void ChangeEncoding(); | 
| 55 | 54 | 
| 56   void ShrinkCurrentPart(); | 55   void ShrinkCurrentPart(); | 
| 57 | 56 | 
| 58   template <bool is_ascii, typename Char> | 57   template <bool is_ascii, typename Char> | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 70   } | 69   } | 
| 71 | 70 | 
| 72   INLINE(void Append(const char* chars)) { | 71   INLINE(void Append(const char* chars)) { | 
| 73     if (is_ascii_) { | 72     if (is_ascii_) { | 
| 74       Append_<true>(chars); | 73       Append_<true>(chars); | 
| 75     } else { | 74     } else { | 
| 76       Append_<false>(chars); | 75       Append_<false>(chars); | 
| 77     } | 76     } | 
| 78   } | 77   } | 
| 79 | 78 | 
| 80   INLINE(Handle<Object> GetProperty(Handle<JSObject> object, | 79   Handle<Object> GetProperty(Handle<JSObject> object, | 
| 81                                     Handle<String> key)); | 80                              Handle<String> key); | 
| 82 | 81 | 
| 83   INLINE(bool MayHaveToJsonFunction(Handle<JSObject> object)); | 82   bool MayHaveToJsonFunction(Handle<JSObject> object); | 
| 84 | 83 | 
| 85   INLINE(Result Serialize(Handle<Object> object)) { | 84   INLINE(Result Serialize(Handle<Object> object)) { | 
| 86     return Serialize_<false>(object); | 85     return Serialize_<false>(object); | 
| 87   } | 86   } | 
| 88 | 87 | 
| 89   INLINE(Result SerializeDeferred(Handle<Object> object, | 88   INLINE(Result SerializeDeferred(Handle<Object> object, | 
| 90                            bool deferred_comma, | 89                            bool deferred_comma, | 
| 91                            Handle<String> deferred_key)) { | 90                            Handle<String> deferred_key)) { | 
| 92     ASSERT(!deferred_key.is_null()); | 91     ASSERT(!deferred_key.is_null()); | 
| 93     return Serialize_<true>(object, deferred_comma, deferred_key); | 92     return Serialize_<true>(object, deferred_comma, deferred_key); | 
| 94   } | 93   } | 
| 95 | 94 | 
| 96   template <bool deferred_key> | 95   template <bool deferred_key> | 
| 97   Result Serialize_(Handle<Object> object, | 96   Result Serialize_(Handle<Object> object, | 
| 98                     bool comma = false, | 97                     bool comma = false, | 
| 99                     Handle<String> key = Handle<String>::null()); | 98                     Handle<String> key = Handle<String>::null()); | 
| 100 | 99 | 
| 101   INLINE(void SerializeDeferredKey(bool deferred_comma, | 100   void SerializeDeferredKey(bool deferred_comma, Handle<String> deferred_key) { | 
| 102                                    Handle<String> deferred_key)) { |  | 
| 103     if (deferred_comma) Append(','); | 101     if (deferred_comma) Append(','); | 
| 104     SerializeString(deferred_key); | 102     SerializeString(deferred_key); | 
| 105     Append(':'); | 103     Append(':'); | 
| 106   } | 104   } | 
| 107 | 105 | 
| 108   INLINE(Result SerializeSmi(Smi* object)); | 106   Result SerializeSmi(Smi* object); | 
| 109 | 107 | 
| 110   INLINE(Result SerializeDouble(double number)); | 108   Result SerializeDouble(double number); | 
| 111   INLINE(Result SerializeHeapNumber(Handle<HeapNumber> object)) { | 109   INLINE(Result SerializeHeapNumber(Handle<HeapNumber> object)) { | 
| 112     return SerializeDouble(object->value()); | 110     return SerializeDouble(object->value()); | 
| 113   } | 111   } | 
| 114 | 112 | 
| 115   Result SerializeArray(Handle<JSArray> object); | 113   INLINE(Result SerializeArray(Handle<JSArray> object)); | 
| 116   Result SerializeObject(Handle<JSObject> object); | 114   INLINE(Result SerializeObject(Handle<JSObject> object)); | 
| 117 | 115 | 
| 118   void SerializeString(Handle<String> object); | 116   void SerializeString(Handle<String> object); | 
| 119 | 117 | 
| 120   template <typename SrcChar, typename DestChar> | 118   template <typename SrcChar, typename DestChar> | 
| 121   INLINE(void SerializeStringUnchecked_(const SrcChar* src, | 119   INLINE(void SerializeStringUnchecked_(const SrcChar* src, | 
| 122                                         DestChar* dest, | 120                                         DestChar* dest, | 
| 123                                         int length)); | 121                                         int length)); | 
| 124 | 122 | 
| 125   template <bool is_ascii, typename Char> | 123   template <bool is_ascii, typename Char> | 
| 126   INLINE(void SerializeString_(Vector<const Char> vector, | 124   INLINE(void SerializeString_(Vector<const Char> vector, | 
| 127                                Handle<String> string)); | 125                                Handle<String> string)); | 
| 128 | 126 | 
| 129   template <typename Char> | 127   template <typename Char> | 
| 130   INLINE(bool DoNotEscape(Char c)); | 128   INLINE(bool DoNotEscape(Char c)); | 
| 131 | 129 | 
| 132   template <typename Char> | 130   template <typename Char> | 
| 133   INLINE(Vector<const Char> GetCharVector(Handle<String> string)); | 131   INLINE(Vector<const Char> GetCharVector(Handle<String> string)); | 
| 134 | 132 | 
| 135   INLINE(Result StackPush(Handle<Object> object)); | 133   Result StackPush(Handle<Object> object); | 
| 136   INLINE(void StackPop()); | 134   void StackPop(); | 
| 137 | 135 | 
| 138   INLINE(Handle<String> accumulator()) { | 136   INLINE(Handle<String> accumulator()) { | 
| 139     return Handle<String>(String::cast(accumulator_store_->value())); | 137     return Handle<String>(String::cast(accumulator_store_->value())); | 
| 140   } | 138   } | 
| 141 | 139 | 
| 142   INLINE(void set_accumulator(Handle<String> string)) { | 140   INLINE(void set_accumulator(Handle<String> string)) { | 
| 143     return accumulator_store_->set_value(*string); | 141     return accumulator_store_->set_value(*string); | 
| 144   } | 142   } | 
| 145 | 143 | 
| 146   Isolate* isolate_; | 144   Isolate* isolate_; | 
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 291     default: | 289     default: | 
| 292       return true; | 290       return true; | 
| 293   } | 291   } | 
| 294   ASSERT(!value->IsTheHole()); | 292   ASSERT(!value->IsTheHole()); | 
| 295   return value->IsSpecFunction(); | 293   return value->IsSpecFunction(); | 
| 296 } | 294 } | 
| 297 | 295 | 
| 298 | 296 | 
| 299 BasicJsonStringifier::Result BasicJsonStringifier::StackPush( | 297 BasicJsonStringifier::Result BasicJsonStringifier::StackPush( | 
| 300     Handle<Object> object) { | 298     Handle<Object> object) { | 
|  | 299   StackLimitCheck check(isolate_); | 
|  | 300   if (check.HasOverflowed()) return STACK_OVERFLOW; | 
|  | 301 | 
| 301   int length = Smi::cast(stack_->length())->value(); | 302   int length = Smi::cast(stack_->length())->value(); | 
| 302   if (length > kStackLimit) return STACK_OVERFLOW; |  | 
| 303   FixedArray* elements = FixedArray::cast(stack_->elements()); | 303   FixedArray* elements = FixedArray::cast(stack_->elements()); | 
| 304   for (int i = 0; i < length; i++) { | 304   for (int i = 0; i < length; i++) { | 
| 305     if (elements->get(i) == *object) { | 305     if (elements->get(i) == *object) { | 
| 306       return CIRCULAR; | 306       return CIRCULAR; | 
| 307     } | 307     } | 
| 308   } | 308   } | 
| 309   stack_->EnsureSize(length + 1); | 309   stack_->EnsureSize(length + 1); | 
| 310   FixedArray::cast(stack_->elements())->set(length, *object); | 310   FixedArray::cast(stack_->elements())->set(length, *object); | 
| 311   stack_->set_length(Smi::FromInt(length + 1)); | 311   stack_->set_length(Smi::FromInt(length + 1)); | 
| 312   return SUCCESS; | 312   return SUCCESS; | 
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 466     Handle<JSObject> object) { | 466     Handle<JSObject> object) { | 
| 467   HandleScope handle_scope(isolate_); | 467   HandleScope handle_scope(isolate_); | 
| 468   Result stack_push = StackPush(object); | 468   Result stack_push = StackPush(object); | 
| 469   if (stack_push != SUCCESS) return stack_push; | 469   if (stack_push != SUCCESS) return stack_push; | 
| 470   if (object->IsJSGlobalProxy()) return BAILOUT; | 470   if (object->IsJSGlobalProxy()) return BAILOUT; | 
| 471   bool threw = false; | 471   bool threw = false; | 
| 472   Handle<FixedArray> contents = | 472   Handle<FixedArray> contents = | 
| 473       GetKeysInFixedArrayFor(object, LOCAL_ONLY, &threw); | 473       GetKeysInFixedArrayFor(object, LOCAL_ONLY, &threw); | 
| 474   if (threw) return BAILOUT; | 474   if (threw) return BAILOUT; | 
| 475   Append('{'); | 475   Append('{'); | 
| 476   int length = contents->length(); |  | 
| 477   bool comma = false; | 476   bool comma = false; | 
| 478   for (int i = 0; i < length; i++) { | 477   for (int i = 0; i < contents->length(); i++) { | 
| 479     Object* key = contents->get(i); | 478     Object* key = contents->get(i); | 
| 480     Handle<String> key_handle; | 479     Handle<String> key_handle; | 
| 481     Handle<Object> property; | 480     Handle<Object> property; | 
| 482     if (key->IsString()) { | 481     if (key->IsString()) { | 
| 483       key_handle = Handle<String>(String::cast(key)); | 482       key_handle = Handle<String>(String::cast(key)); | 
| 484       property = GetProperty(object, key_handle); | 483       property = GetProperty(object, key_handle); | 
| 485     } else { | 484     } else { | 
| 486       ASSERT(key->IsNumber()); | 485       ASSERT(key->IsNumber()); | 
| 487       key_handle = isolate_->factory()->NumberToString(Handle<Object>(key)); | 486       key_handle = isolate_->factory()->NumberToString(Handle<Object>(key)); | 
| 488       uint32_t index; | 487       uint32_t index; | 
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 678       SerializeString_<false, char>(flat.ToAsciiVector(), object); | 677       SerializeString_<false, char>(flat.ToAsciiVector(), object); | 
| 679     } else { | 678     } else { | 
| 680       SerializeString_<false, uc16>(flat.ToUC16Vector(), object); | 679       SerializeString_<false, uc16>(flat.ToUC16Vector(), object); | 
| 681     } | 680     } | 
| 682   } | 681   } | 
| 683 } | 682 } | 
| 684 | 683 | 
| 685 } }  // namespace v8::internal | 684 } }  // namespace v8::internal | 
| 686 | 685 | 
| 687 #endif  // V8_JSON_STRINGIFIER_H_ | 686 #endif  // V8_JSON_STRINGIFIER_H_ | 
| OLD | NEW | 
|---|