OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 26 matching lines...) Expand all Loading... |
37 class ArrayBuffer; | 37 class ArrayBuffer; |
38 class ArrayBufferView; | 38 class ArrayBufferView; |
39 | 39 |
40 class WTF_EXPORT ArrayBuffer : public RefCounted<ArrayBuffer> { | 40 class WTF_EXPORT ArrayBuffer : public RefCounted<ArrayBuffer> { |
41 public: | 41 public: |
42 static inline PassRefPtr<ArrayBuffer> create(unsigned numElements, unsigned
elementByteSize); | 42 static inline PassRefPtr<ArrayBuffer> create(unsigned numElements, unsigned
elementByteSize); |
43 static inline PassRefPtr<ArrayBuffer> create(ArrayBuffer*); | 43 static inline PassRefPtr<ArrayBuffer> create(ArrayBuffer*); |
44 static inline PassRefPtr<ArrayBuffer> create(const void* source, unsigned by
teLength); | 44 static inline PassRefPtr<ArrayBuffer> create(const void* source, unsigned by
teLength); |
45 static inline PassRefPtr<ArrayBuffer> create(ArrayBufferContents&); | 45 static inline PassRefPtr<ArrayBuffer> create(ArrayBufferContents&); |
46 | 46 |
| 47 // Create an ArrayBuffer for an existing piece of memory with no copying. |
| 48 // The ArrayBuffer does not take ownership of the passed-in memory and care |
| 49 // must be taken to not deallocate the data before the ArrayBuffer has been |
| 50 // deallocated. |
| 51 // |
| 52 // FIXME: This should be removed when pointers into the JS/Dart heap can |
| 53 // can be passed directly. |
| 54 static inline PassRefPtr<ArrayBuffer> createNoCopy(void* source, unsigned by
teLength); |
| 55 |
| 56 // Only for use by Uint8ClampedArray::createUninitialized and SharedBuffer::
getAsArrayBuffer. |
47 static inline PassRefPtr<ArrayBuffer> createOrNull(unsigned numElements, uns
igned elementByteSize); | 57 static inline PassRefPtr<ArrayBuffer> createOrNull(unsigned numElements, uns
igned elementByteSize); |
48 | 58 |
49 // Only for use by XMLHttpRequest::responseArrayBuffer and Internals::serial
izeObject | 59 // Only for use by XMLHttpRequest::responseArrayBuffer and Internals::serial
izeObject |
50 // (through DOMArrayBuffer::createUninitialized). | 60 // (through DOMArrayBuffer::createUninitialized). |
51 static inline PassRefPtr<ArrayBuffer> createUninitialized(unsigned numElemen
ts, unsigned elementByteSize); | 61 static inline PassRefPtr<ArrayBuffer> createUninitialized(unsigned numElemen
ts, unsigned elementByteSize); |
52 | 62 |
53 static inline PassRefPtr<ArrayBuffer> createShared(unsigned numElements, uns
igned elementByteSize); | 63 static inline PassRefPtr<ArrayBuffer> createShared(unsigned numElements, uns
igned elementByteSize); |
54 static inline PassRefPtr<ArrayBuffer> createShared(const void* source, unsig
ned byteLength); | 64 static inline PassRefPtr<ArrayBuffer> createShared(const void* source, unsig
ned byteLength); |
55 | 65 |
56 inline void* data(); | 66 inline void* data(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 123 |
114 PassRefPtr<ArrayBuffer> ArrayBuffer::create(const void* source, unsigned byteLen
gth) | 124 PassRefPtr<ArrayBuffer> ArrayBuffer::create(const void* source, unsigned byteLen
gth) |
115 { | 125 { |
116 ArrayBufferContents contents(byteLength, 1, ArrayBufferContents::NotShared,
ArrayBufferContents::ZeroInitialize); | 126 ArrayBufferContents contents(byteLength, 1, ArrayBufferContents::NotShared,
ArrayBufferContents::ZeroInitialize); |
117 RELEASE_ASSERT(contents.data()); | 127 RELEASE_ASSERT(contents.data()); |
118 RefPtr<ArrayBuffer> buffer = adoptRef(new ArrayBuffer(contents)); | 128 RefPtr<ArrayBuffer> buffer = adoptRef(new ArrayBuffer(contents)); |
119 memcpy(buffer->data(), source, byteLength); | 129 memcpy(buffer->data(), source, byteLength); |
120 return buffer.release(); | 130 return buffer.release(); |
121 } | 131 } |
122 | 132 |
| 133 PassRefPtr<ArrayBuffer> ArrayBuffer::createNoCopy(void* source, unsigned byteLen
gth) |
| 134 { |
| 135 // FIXME: What do we pass in for a DeallocationObserver? |
| 136 ArrayBufferContents contents(source, byteLength, ArrayBufferContents::Sharin
gType::NotShared); |
| 137 return adoptRef(new ArrayBuffer(contents)); |
| 138 } |
| 139 |
123 PassRefPtr<ArrayBuffer> ArrayBuffer::create(ArrayBufferContents& contents) | 140 PassRefPtr<ArrayBuffer> ArrayBuffer::create(ArrayBufferContents& contents) |
124 { | 141 { |
125 RELEASE_ASSERT(contents.data()); | 142 RELEASE_ASSERT(contents.data()); |
126 return adoptRef(new ArrayBuffer(contents)); | 143 return adoptRef(new ArrayBuffer(contents)); |
127 } | 144 } |
128 | 145 |
129 PassRefPtr<ArrayBuffer> ArrayBuffer::createOrNull(unsigned numElements, unsigned
elementByteSize) | 146 PassRefPtr<ArrayBuffer> ArrayBuffer::createOrNull(unsigned numElements, unsigned
elementByteSize) |
130 { | 147 { |
131 return createOrNull(numElements, elementByteSize, ArrayBufferContents::ZeroI
nitialize); | 148 return createOrNull(numElements, elementByteSize, ArrayBufferContents::ZeroI
nitialize); |
132 } | 149 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 PassRefPtr<ArrayBuffer> ArrayBuffer::createShared(unsigned numElements, unsigned
elementByteSize, ArrayBufferContents::InitializationPolicy policy) | 185 PassRefPtr<ArrayBuffer> ArrayBuffer::createShared(unsigned numElements, unsigned
elementByteSize, ArrayBufferContents::InitializationPolicy policy) |
169 { | 186 { |
170 ArrayBufferContents contents(numElements, elementByteSize, ArrayBufferConten
ts::Shared, policy); | 187 ArrayBufferContents contents(numElements, elementByteSize, ArrayBufferConten
ts::Shared, policy); |
171 RELEASE_ASSERT(contents.data()); | 188 RELEASE_ASSERT(contents.data()); |
172 return adoptRef(new ArrayBuffer(contents)); | 189 return adoptRef(new ArrayBuffer(contents)); |
173 } | 190 } |
174 | 191 |
175 ArrayBuffer::ArrayBuffer(ArrayBufferContents& contents) | 192 ArrayBuffer::ArrayBuffer(ArrayBufferContents& contents) |
176 : m_firstView(0), m_isNeutered(false) | 193 : m_firstView(0), m_isNeutered(false) |
177 { | 194 { |
178 contents.transfer(m_contents); | 195 if (contents.isShared()) |
| 196 contents.shareWith(m_contents); |
| 197 else |
| 198 contents.transfer(m_contents); |
179 } | 199 } |
180 | 200 |
181 void* ArrayBuffer::data() | 201 void* ArrayBuffer::data() |
182 { | 202 { |
183 return m_contents.data(); | 203 return m_contents.data(); |
184 } | 204 } |
185 | 205 |
186 const void* ArrayBuffer::data() const | 206 const void* ArrayBuffer::data() const |
187 { | 207 { |
188 return m_contents.data(); | 208 return m_contents.data(); |
(...skipping 26 matching lines...) Expand all Loading... |
215 if (index < 0) | 235 if (index < 0) |
216 index = currentLength + index; | 236 index = currentLength + index; |
217 return clampValue(index, 0, currentLength); | 237 return clampValue(index, 0, currentLength); |
218 } | 238 } |
219 | 239 |
220 } // namespace WTF | 240 } // namespace WTF |
221 | 241 |
222 using WTF::ArrayBuffer; | 242 using WTF::ArrayBuffer; |
223 | 243 |
224 #endif // ArrayBuffer_h | 244 #endif // ArrayBuffer_h |
OLD | NEW |