Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 // Defined when linking against shared lib on Windows. | 6 // Defined when linking against shared lib on Windows. |
| 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) | 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) |
| 8 #define V8_SHARED | 8 #define V8_SHARED |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1526 if (thread_ == NULL) return; | 1526 if (thread_ == NULL) return; |
| 1527 if (Shell::options.last_run) { | 1527 if (Shell::options.last_run) { |
| 1528 thread_->Join(); | 1528 thread_->Join(); |
| 1529 } else { | 1529 } else { |
| 1530 done_semaphore_.Wait(); | 1530 done_semaphore_.Wait(); |
| 1531 } | 1531 } |
| 1532 } | 1532 } |
| 1533 | 1533 |
| 1534 | 1534 |
| 1535 SerializationData::~SerializationData() { | 1535 SerializationData::~SerializationData() { |
| 1536 // Any ArrayBuffer::Contents are owned by this SerializationData object. | 1536 // Any ArrayBuffer::Contents are owned by this SerializationData object if |
| 1537 // SharedArrayBuffer::Contents may be used by other threads, so must be | 1537 // ownership hasn't been transferred out via ReadArrayBufferContents. |
| 1538 // SharedArrayBuffer::Contents may be used by multiple threads, so must be | |
| 1538 // cleaned up by the main thread in Shell::CleanupWorkers(). | 1539 // cleaned up by the main thread in Shell::CleanupWorkers(). |
| 1539 for (int i = 0; i < array_buffer_contents.length(); ++i) { | 1540 for (int i = 0; i < array_buffer_contents_.length(); ++i) { |
| 1540 ArrayBuffer::Contents& contents = array_buffer_contents[i]; | 1541 ArrayBuffer::Contents& contents = array_buffer_contents_[i]; |
| 1541 Shell::array_buffer_allocator->Free(contents.Data(), contents.ByteLength()); | 1542 if (contents.Data()) { |
|
jochen (gone - plz use gerrit)
2015/07/03 14:29:37
how can data ever be null?
Jarin
2015/07/06 05:04:19
As the comment above says, ReadArrayBufferContents
binji
2015/07/06 06:23:27
Yes, that's correct.
| |
| 1543 Shell::array_buffer_allocator->Free(contents.Data(), | |
| 1544 contents.ByteLength()); | |
| 1545 } | |
| 1542 } | 1546 } |
| 1543 } | 1547 } |
| 1544 | 1548 |
| 1545 | 1549 |
| 1546 void SerializationData::WriteTag(SerializationTag tag) { data.Add(tag); } | 1550 void SerializationData::WriteTag(SerializationTag tag) { data_.Add(tag); } |
| 1547 | 1551 |
| 1548 | 1552 |
| 1549 void SerializationData::WriteMemory(const void* p, int length) { | 1553 void SerializationData::WriteMemory(const void* p, int length) { |
| 1550 if (length > 0) { | 1554 if (length > 0) { |
| 1551 i::Vector<uint8_t> block = data.AddBlock(0, length); | 1555 i::Vector<uint8_t> block = data_.AddBlock(0, length); |
| 1552 memcpy(&block[0], p, length); | 1556 memcpy(&block[0], p, length); |
| 1553 } | 1557 } |
| 1554 } | 1558 } |
| 1555 | 1559 |
| 1556 | 1560 |
| 1557 void SerializationData::WriteArrayBufferContents( | 1561 void SerializationData::WriteArrayBufferContents( |
| 1558 const ArrayBuffer::Contents& contents) { | 1562 const ArrayBuffer::Contents& contents) { |
| 1559 array_buffer_contents.Add(contents); | 1563 array_buffer_contents_.Add(contents); |
| 1560 WriteTag(kSerializationTagTransferredArrayBuffer); | 1564 WriteTag(kSerializationTagTransferredArrayBuffer); |
| 1561 int index = array_buffer_contents.length() - 1; | 1565 int index = array_buffer_contents_.length() - 1; |
| 1562 Write(index); | 1566 Write(index); |
| 1563 } | 1567 } |
| 1564 | 1568 |
| 1565 | 1569 |
| 1566 void SerializationData::WriteSharedArrayBufferContents( | 1570 void SerializationData::WriteSharedArrayBufferContents( |
| 1567 const SharedArrayBuffer::Contents& contents) { | 1571 const SharedArrayBuffer::Contents& contents) { |
| 1568 shared_array_buffer_contents.Add(contents); | 1572 shared_array_buffer_contents_.Add(contents); |
| 1569 WriteTag(kSerializationTagTransferredSharedArrayBuffer); | 1573 WriteTag(kSerializationTagTransferredSharedArrayBuffer); |
| 1570 int index = shared_array_buffer_contents.length() - 1; | 1574 int index = shared_array_buffer_contents_.length() - 1; |
| 1571 Write(index); | 1575 Write(index); |
| 1572 } | 1576 } |
| 1573 | 1577 |
| 1574 | 1578 |
| 1575 SerializationTag SerializationData::ReadTag(int* offset) const { | 1579 SerializationTag SerializationData::ReadTag(int* offset) const { |
| 1576 return static_cast<SerializationTag>(Read<uint8_t>(offset)); | 1580 return static_cast<SerializationTag>(Read<uint8_t>(offset)); |
| 1577 } | 1581 } |
| 1578 | 1582 |
| 1579 | 1583 |
| 1580 void SerializationData::ReadMemory(void* p, int length, int* offset) const { | 1584 void SerializationData::ReadMemory(void* p, int length, int* offset) const { |
| 1581 if (length > 0) { | 1585 if (length > 0) { |
| 1582 memcpy(p, &data[*offset], length); | 1586 memcpy(p, &data_[*offset], length); |
| 1583 (*offset) += length; | 1587 (*offset) += length; |
| 1584 } | 1588 } |
| 1585 } | 1589 } |
| 1586 | 1590 |
| 1587 | 1591 |
| 1588 void SerializationData::ReadArrayBufferContents(ArrayBuffer::Contents* contents, | 1592 void SerializationData::ReadArrayBufferContents(ArrayBuffer::Contents* contents, |
| 1589 int* offset) const { | 1593 int* offset) const { |
| 1590 int index = Read<int>(offset); | 1594 int index = Read<int>(offset); |
| 1591 DCHECK(index < array_buffer_contents.length()); | 1595 DCHECK(index < array_buffer_contents_.length()); |
| 1592 *contents = array_buffer_contents[index]; | 1596 *contents = array_buffer_contents_[index]; |
| 1597 // Ownership of this ArrayBuffer::Contents is passed to the caller. Neuter | |
| 1598 // our copy so it won't be double-free'd when this SerializationData is | |
| 1599 // destroyed. | |
| 1600 array_buffer_contents_[index] = ArrayBuffer::Contents(); | |
| 1593 } | 1601 } |
| 1594 | 1602 |
| 1595 | 1603 |
| 1596 void SerializationData::ReadSharedArrayBufferContents( | 1604 void SerializationData::ReadSharedArrayBufferContents( |
| 1597 SharedArrayBuffer::Contents* contents, int* offset) const { | 1605 SharedArrayBuffer::Contents* contents, int* offset) const { |
| 1598 int index = Read<int>(offset); | 1606 int index = Read<int>(offset); |
| 1599 DCHECK(index < shared_array_buffer_contents.length()); | 1607 DCHECK(index < shared_array_buffer_contents_.length()); |
| 1600 *contents = shared_array_buffer_contents[index]; | 1608 *contents = shared_array_buffer_contents_[index]; |
| 1601 } | 1609 } |
| 1602 | 1610 |
| 1603 | 1611 |
| 1604 void SerializationDataQueue::Enqueue(SerializationData* data) { | 1612 void SerializationDataQueue::Enqueue(SerializationData* data) { |
| 1605 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 1613 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 1606 data_.Add(data); | 1614 data_.Add(data); |
| 1607 } | 1615 } |
| 1608 | 1616 |
| 1609 | 1617 |
| 1610 bool SerializationDataQueue::Dequeue(SerializationData** data) { | 1618 bool SerializationDataQueue::Dequeue(SerializationData** data) { |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2033 return false; | 2041 return false; |
| 2034 } | 2042 } |
| 2035 seen_objects->Add(array_buffer); | 2043 seen_objects->Add(array_buffer); |
| 2036 if (FindInObjectList(array_buffer, to_transfer)) { | 2044 if (FindInObjectList(array_buffer, to_transfer)) { |
| 2037 // Transfer ArrayBuffer | 2045 // Transfer ArrayBuffer |
| 2038 if (!array_buffer->IsNeuterable()) { | 2046 if (!array_buffer->IsNeuterable()) { |
| 2039 Throw(isolate, "Attempting to transfer an un-neuterable ArrayBuffer"); | 2047 Throw(isolate, "Attempting to transfer an un-neuterable ArrayBuffer"); |
| 2040 return false; | 2048 return false; |
| 2041 } | 2049 } |
| 2042 | 2050 |
| 2043 ArrayBuffer::Contents contents = array_buffer->Externalize(); | 2051 ArrayBuffer::Contents contents = array_buffer->IsExternal() |
| 2052 ? array_buffer->GetContents() | |
| 2053 : array_buffer->Externalize(); | |
| 2044 array_buffer->Neuter(); | 2054 array_buffer->Neuter(); |
| 2045 out_data->WriteArrayBufferContents(contents); | 2055 out_data->WriteArrayBufferContents(contents); |
| 2046 } else { | 2056 } else { |
| 2047 ArrayBuffer::Contents contents = array_buffer->GetContents(); | 2057 ArrayBuffer::Contents contents = array_buffer->GetContents(); |
| 2048 // Clone ArrayBuffer | 2058 // Clone ArrayBuffer |
| 2049 if (contents.ByteLength() > i::kMaxUInt32) { | 2059 if (contents.ByteLength() > i::kMaxUInt32) { |
| 2050 Throw(isolate, "ArrayBuffer is too big to clone"); | 2060 Throw(isolate, "ArrayBuffer is too big to clone"); |
| 2051 return false; | 2061 return false; |
| 2052 } | 2062 } |
| 2053 | 2063 |
| 2054 int byte_length = static_cast<int>(contents.ByteLength()); | 2064 int byte_length = static_cast<int>(contents.ByteLength()); |
| 2055 out_data->WriteTag(kSerializationTagArrayBuffer); | 2065 out_data->WriteTag(kSerializationTagArrayBuffer); |
| 2056 out_data->Write(byte_length); | 2066 out_data->Write(byte_length); |
| 2057 out_data->WriteMemory(contents.Data(), | 2067 out_data->WriteMemory(contents.Data(), |
| 2058 static_cast<int>(contents.ByteLength())); | 2068 static_cast<int>(contents.ByteLength())); |
| 2059 } | 2069 } |
| 2060 } else if (value->IsSharedArrayBuffer()) { | 2070 } else if (value->IsSharedArrayBuffer()) { |
| 2061 Handle<SharedArrayBuffer> sab = Handle<SharedArrayBuffer>::Cast(value); | 2071 Handle<SharedArrayBuffer> sab = Handle<SharedArrayBuffer>::Cast(value); |
| 2062 if (FindInObjectList(sab, *seen_objects)) { | 2072 if (FindInObjectList(sab, *seen_objects)) { |
| 2063 Throw(isolate, "Duplicated shared array buffers not supported"); | 2073 Throw(isolate, "Duplicated shared array buffers not supported"); |
| 2064 return false; | 2074 return false; |
| 2065 } | 2075 } |
| 2066 seen_objects->Add(sab); | 2076 seen_objects->Add(sab); |
| 2067 if (!FindInObjectList(sab, to_transfer)) { | 2077 if (!FindInObjectList(sab, to_transfer)) { |
| 2068 Throw(isolate, "SharedArrayBuffer must be transferred"); | 2078 Throw(isolate, "SharedArrayBuffer must be transferred"); |
| 2069 return false; | 2079 return false; |
| 2070 } | 2080 } |
| 2071 | 2081 |
| 2072 SharedArrayBuffer::Contents contents = sab->Externalize(); | 2082 SharedArrayBuffer::Contents contents; |
| 2083 if (sab->IsExternal()) { | |
| 2084 contents = sab->GetContents(); | |
| 2085 } else { | |
| 2086 contents = sab->Externalize(); | |
| 2087 externalized_shared_contents_.Add(contents); | |
| 2088 } | |
| 2073 out_data->WriteSharedArrayBufferContents(contents); | 2089 out_data->WriteSharedArrayBufferContents(contents); |
| 2074 externalized_shared_contents_.Add(contents); | |
| 2075 } else if (value->IsObject()) { | 2090 } else if (value->IsObject()) { |
| 2076 Handle<Object> object = Handle<Object>::Cast(value); | 2091 Handle<Object> object = Handle<Object>::Cast(value); |
| 2077 if (FindInObjectList(object, *seen_objects)) { | 2092 if (FindInObjectList(object, *seen_objects)) { |
| 2078 Throw(isolate, "Duplicated objects not supported"); | 2093 Throw(isolate, "Duplicated objects not supported"); |
| 2079 return false; | 2094 return false; |
| 2080 } | 2095 } |
| 2081 seen_objects->Add(object); | 2096 seen_objects->Add(object); |
| 2082 Local<Array> property_names; | 2097 Local<Array> property_names; |
| 2083 if (!object->GetOwnPropertyNames(context).ToLocal(&property_names)) { | 2098 if (!object->GetOwnPropertyNames(context).ToLocal(&property_names)) { |
| 2084 Throw(isolate, "Unable to get property names"); | 2099 Throw(isolate, "Unable to get property names"); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2180 Handle<ArrayBuffer> array_buffer = ArrayBuffer::New(isolate, byte_length); | 2195 Handle<ArrayBuffer> array_buffer = ArrayBuffer::New(isolate, byte_length); |
| 2181 ArrayBuffer::Contents contents = array_buffer->GetContents(); | 2196 ArrayBuffer::Contents contents = array_buffer->GetContents(); |
| 2182 DCHECK(static_cast<size_t>(byte_length) == contents.ByteLength()); | 2197 DCHECK(static_cast<size_t>(byte_length) == contents.ByteLength()); |
| 2183 data.ReadMemory(contents.Data(), byte_length, offset); | 2198 data.ReadMemory(contents.Data(), byte_length, offset); |
| 2184 result = array_buffer; | 2199 result = array_buffer; |
| 2185 break; | 2200 break; |
| 2186 } | 2201 } |
| 2187 case kSerializationTagTransferredArrayBuffer: { | 2202 case kSerializationTagTransferredArrayBuffer: { |
| 2188 ArrayBuffer::Contents contents; | 2203 ArrayBuffer::Contents contents; |
| 2189 data.ReadArrayBufferContents(&contents, offset); | 2204 data.ReadArrayBufferContents(&contents, offset); |
| 2190 result = | 2205 result = ArrayBuffer::New(isolate, contents.Data(), contents.ByteLength(), |
| 2191 ArrayBuffer::New(isolate, contents.Data(), contents.ByteLength()); | 2206 ArrayBufferCreationMode::kInternalized); |
| 2192 break; | 2207 break; |
| 2193 } | 2208 } |
| 2194 case kSerializationTagTransferredSharedArrayBuffer: { | 2209 case kSerializationTagTransferredSharedArrayBuffer: { |
| 2195 SharedArrayBuffer::Contents contents; | 2210 SharedArrayBuffer::Contents contents; |
| 2196 data.ReadSharedArrayBufferContents(&contents, offset); | 2211 data.ReadSharedArrayBufferContents(&contents, offset); |
| 2197 result = SharedArrayBuffer::New(isolate, contents.Data(), | 2212 result = SharedArrayBuffer::New(isolate, contents.Data(), |
| 2198 contents.ByteLength()); | 2213 contents.ByteLength()); |
| 2199 break; | 2214 break; |
| 2200 } | 2215 } |
| 2201 default: | 2216 default: |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2430 } | 2445 } |
| 2431 | 2446 |
| 2432 } // namespace v8 | 2447 } // namespace v8 |
| 2433 | 2448 |
| 2434 | 2449 |
| 2435 #ifndef GOOGLE3 | 2450 #ifndef GOOGLE3 |
| 2436 int main(int argc, char* argv[]) { | 2451 int main(int argc, char* argv[]) { |
| 2437 return v8::Shell::Main(argc, argv); | 2452 return v8::Shell::Main(argc, argv); |
| 2438 } | 2453 } |
| 2439 #endif | 2454 #endif |
| OLD | NEW |