Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 732 { | 732 { |
| 733 v8::HandleScope scope(m_isolate); | 733 v8::HandleScope scope(m_isolate); |
| 734 m_writer.writeVersion(); | 734 m_writer.writeVersion(); |
| 735 StateBase* state = doSerialize(value, 0); | 735 StateBase* state = doSerialize(value, 0); |
| 736 while (state) | 736 while (state) |
| 737 state = state->advance(*this); | 737 state = state->advance(*this); |
| 738 return m_status; | 738 return m_status; |
| 739 } | 739 } |
| 740 | 740 |
| 741 // Functions used by serialization states. | 741 // Functions used by serialization states. |
| 742 StateBase* doSerialize(v8::Handle<v8::Value> value, StateBase* next); | 742 StateBase* doSerialize(v8::Handle<v8::Value>, StateBase* next); |
| 743 | |
| 744 // The serializer workhorse, no stack depth check. | |
| 745 StateBase* doSerializeImpl(v8::Handle<v8::Value>, StateBase* next); | |
| 746 | |
| 747 StateBase* doSerializeArrayBuffer(v8::Handle<v8::Value> arrayBuffer, StateBa se* next) | |
| 748 { | |
| 749 return doSerializeImpl(arrayBuffer, next); | |
| 750 } | |
| 743 | 751 |
| 744 StateBase* checkException(StateBase* state) | 752 StateBase* checkException(StateBase* state) |
| 745 { | 753 { |
| 746 return m_tryCatch.HasCaught() ? handleError(JSException, state) : 0; | 754 return m_tryCatch.HasCaught() ? handleError(JSException, state) : 0; |
| 747 } | 755 } |
| 748 | 756 |
| 749 StateBase* reportFailure(StateBase* state) | 757 StateBase* reportFailure(StateBase* state) |
| 750 { | 758 { |
| 751 return handleError(JSFailure, state); | 759 return handleError(JSFailure, state); |
| 752 } | 760 } |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1132 { | 1140 { |
| 1133 ASSERT(!object.IsEmpty()); | 1141 ASSERT(!object.IsEmpty()); |
| 1134 ArrayBufferView* arrayBufferView = V8ArrayBufferView::toNative(object); | 1142 ArrayBufferView* arrayBufferView = V8ArrayBufferView::toNative(object); |
| 1135 if (!arrayBufferView) | 1143 if (!arrayBufferView) |
| 1136 return 0; | 1144 return 0; |
| 1137 if (!arrayBufferView->buffer()) | 1145 if (!arrayBufferView->buffer()) |
| 1138 return handleError(DataCloneError, next); | 1146 return handleError(DataCloneError, next); |
| 1139 v8::Handle<v8::Value> underlyingBuffer = toV8(arrayBufferView->buffer(), v8::Handle<v8::Object>(), m_writer.getIsolate()); | 1147 v8::Handle<v8::Value> underlyingBuffer = toV8(arrayBufferView->buffer(), v8::Handle<v8::Object>(), m_writer.getIsolate()); |
| 1140 if (underlyingBuffer.IsEmpty()) | 1148 if (underlyingBuffer.IsEmpty()) |
| 1141 return handleError(DataCloneError, next); | 1149 return handleError(DataCloneError, next); |
| 1142 StateBase* stateOut = doSerialize(underlyingBuffer, 0); | 1150 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); |
| 1143 if (stateOut) | 1151 if (stateOut) |
| 1144 return handleError(DataCloneError, next); | 1152 return stateOut; |
| 1145 m_writer.writeArrayBufferView(*arrayBufferView); | 1153 m_writer.writeArrayBufferView(*arrayBufferView); |
| 1146 // This should be safe: we serialize something that we know to be a wrap per (see | 1154 // This should be safe: we serialize something that we know to be a wrap per (see |
| 1147 // the toV8 call above), so the call to doSerialize above should neither cause | 1155 // the toV8 call above), hence doSerializeArrayBuffer() will not consume stack |
| 1148 // the stack to overflow nor should it have the potential to reach this | 1156 // (but might fail and unwind our current stack.) |
|
Dmitry Lomov (no reviews)
2013/11/05 10:56:10
Keep the statement "the call to doSerializeArrayBu
| |
| 1149 // ArrayBufferView again. We do need to grey the underlying buffer befor e we grey | 1157 // |
| 1150 // its view, however; ArrayBuffers may be shared, so they need to be giv en reference IDs, | 1158 // We do need to grey the underlying buffer before we grey its view, how ever; |
| 1151 // and an ArrayBufferView cannot be constructed without a corresponding ArrayBuffer | 1159 // ArrayBuffers may be shared, so they need to be given reference IDs, a nd an |
| 1160 // ArrayBufferView cannot be constructed without a corresponding ArrayBu ffer | |
| 1152 // (or without an additional tag that would allow us to do two-stage con struction | 1161 // (or without an additional tag that would allow us to do two-stage con struction |
| 1153 // like we do for Objects and Arrays). | 1162 // like we do for Objects and Arrays). |
| 1154 greyObject(object); | 1163 greyObject(object); |
| 1155 return 0; | 1164 return 0; |
| 1156 } | 1165 } |
| 1157 | 1166 |
| 1158 StateBase* writeArrayBuffer(v8::Handle<v8::Value> value, StateBase* next) | 1167 StateBase* writeArrayBuffer(v8::Handle<v8::Value> value, StateBase* next) |
| 1159 { | 1168 { |
| 1160 ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(value.As<v8::Object>( )); | 1169 ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(value.As<v8::Object>( )); |
| 1161 if (!arrayBuffer) | 1170 if (!arrayBuffer) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1226 Status m_status; | 1235 Status m_status; |
| 1227 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool; | 1236 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool; |
| 1228 ObjectPool m_objectPool; | 1237 ObjectPool m_objectPool; |
| 1229 ObjectPool m_transferredMessagePorts; | 1238 ObjectPool m_transferredMessagePorts; |
| 1230 ObjectPool m_transferredArrayBuffers; | 1239 ObjectPool m_transferredArrayBuffers; |
| 1231 uint32_t m_nextObjectReference; | 1240 uint32_t m_nextObjectReference; |
| 1232 BlobDataHandleMap& m_blobDataHandles; | 1241 BlobDataHandleMap& m_blobDataHandles; |
| 1233 v8::Isolate* m_isolate; | 1242 v8::Isolate* m_isolate; |
| 1234 }; | 1243 }; |
| 1235 | 1244 |
| 1236 Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, Stat eBase* next) | 1245 Serializer::StateBase* Serializer::doSerializeImpl(v8::Handle<v8::Value> value, StateBase* next) |
| 1237 { | 1246 { |
| 1238 if (m_execDepth + (next ? next->execDepth() : 0) > 1) { | |
| 1239 m_writer.writeNull(); | |
| 1240 return 0; | |
| 1241 } | |
| 1242 m_writer.writeReferenceCount(m_nextObjectReference); | 1247 m_writer.writeReferenceCount(m_nextObjectReference); |
| 1243 uint32_t objectReference; | 1248 uint32_t objectReference; |
| 1244 uint32_t arrayBufferIndex; | 1249 uint32_t arrayBufferIndex; |
| 1245 WrapperWorldType currentWorldType = worldType(m_isolate); | 1250 WrapperWorldType currentWorldType = worldType(m_isolate); |
| 1246 if ((value->IsObject() || value->IsDate() || value->IsRegExp()) | 1251 if ((value->IsObject() || value->IsDate() || value->IsRegExp()) |
| 1247 && m_objectPool.tryGet(value.As<v8::Object>(), &objectReference)) { | 1252 && m_objectPool.tryGet(value.As<v8::Object>(), &objectReference)) { |
| 1248 // Note that IsObject() also detects wrappers (eg, it will catch the thi ngs | 1253 // Note that IsObject() also detects wrappers (eg, it will catch the thi ngs |
| 1249 // that we grey and write below). | 1254 // that we grey and write below). |
| 1250 ASSERT(!value->IsString()); | 1255 ASSERT(!value->IsString()); |
| 1251 m_writer.writeObjectReference(objectReference); | 1256 m_writer.writeObjectReference(objectReference); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1309 else if (value->IsObject()) { | 1314 else if (value->IsObject()) { |
| 1310 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError()) | 1315 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError()) |
| 1311 return handleError(DataCloneError, next); | 1316 return handleError(DataCloneError, next); |
| 1312 return startObjectState(jsObject, next); | 1317 return startObjectState(jsObject, next); |
| 1313 } else | 1318 } else |
| 1314 return handleError(DataCloneError, next); | 1319 return handleError(DataCloneError, next); |
| 1315 } | 1320 } |
| 1316 return 0; | 1321 return 0; |
| 1317 } | 1322 } |
| 1318 | 1323 |
| 1324 Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, Stat eBase* next) | |
| 1325 { | |
| 1326 if (m_execDepth + (next ? next->execDepth() : 0) > 1) { | |
| 1327 m_writer.writeNull(); | |
| 1328 return 0; | |
| 1329 } | |
| 1330 return doSerializeImpl(value, next); | |
| 1331 } | |
| 1332 | |
| 1319 // Interface used by Reader to create objects of composite types. | 1333 // Interface used by Reader to create objects of composite types. |
| 1320 class CompositeCreator { | 1334 class CompositeCreator { |
| 1321 public: | 1335 public: |
| 1322 virtual ~CompositeCreator() { } | 1336 virtual ~CompositeCreator() { } |
| 1323 | 1337 |
| 1324 virtual bool consumeTopOfStack(v8::Handle<v8::Value>*) = 0; | 1338 virtual bool consumeTopOfStack(v8::Handle<v8::Value>*) = 0; |
| 1325 virtual uint32_t objectReferenceCount() = 0; | 1339 virtual uint32_t objectReferenceCount() = 0; |
| 1326 virtual void pushObjectReference(const v8::Handle<v8::Value>&) = 0; | 1340 virtual void pushObjectReference(const v8::Handle<v8::Value>&) = 0; |
| 1327 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle< v8::Value>*) = 0; | 1341 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle< v8::Value>*) = 0; |
| 1328 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val ue>*) = 0; | 1342 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val ue>*) = 0; |
| (...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2555 // If the allocated memory was not registered before, then this class is lik ely | 2569 // If the allocated memory was not registered before, then this class is lik ely |
| 2556 // used in a context other then Worker's onmessage environment and the prese nce of | 2570 // used in a context other then Worker's onmessage environment and the prese nce of |
| 2557 // current v8 context is not guaranteed. Avoid calling v8 then. | 2571 // current v8 context is not guaranteed. Avoid calling v8 then. |
| 2558 if (m_externallyAllocatedMemory) { | 2572 if (m_externallyAllocatedMemory) { |
| 2559 ASSERT(v8::Isolate::GetCurrent()); | 2573 ASSERT(v8::Isolate::GetCurrent()); |
| 2560 v8::V8::AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemo ry); | 2574 v8::V8::AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemo ry); |
| 2561 } | 2575 } |
| 2562 } | 2576 } |
| 2563 | 2577 |
| 2564 } // namespace WebCore | 2578 } // namespace WebCore |
| OLD | NEW |