Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: test/cctest/test-weaktypedarrays.cc

Issue 15562008: Recording array buffer views. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added some more tests Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/objects-visiting-inl.h ('K') | « test/cctest/cctest.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 #include <stdlib.h>
29
30 #include "v8.h"
31 #include "api.h"
32 #include "heap.h"
33 #include "objects.h"
34
35 #include "cctest.h"
36
37 using namespace v8::internal;
38
39 static Isolate* GetIsolateFrom(LocalContext* context) {
40 return reinterpret_cast<Isolate*>((*context)->GetIsolate());
41 }
42
43
44 static int CountArrayBuffersInWeakList(Heap* heap) {
45 int count = 0;
46 for (Object* o = heap->array_buffers_list();
47 o != Smi::FromInt(0);
48 o = JSArrayBuffer::cast(o)->weak_next()) {
49 count++;
50 }
51 return count;
52 }
53
54
55 static bool HasArrayBufferInWeakList(Heap* heap, JSArrayBuffer* ab) {
56 for (Object* o = heap->array_buffers_list();
57 o != Smi::FromInt(0);
58 o = JSArrayBuffer::cast(o)->weak_next()) {
59 if (ab == o) return true;
60 }
61 return false;
62 }
63
64
65 static int CountTypedArrays(JSArrayBuffer* array_buffer) {
66 int count = 0;
67 for (Object* o = array_buffer->weak_first_array();
68 o != Smi::FromInt(0);
69 o = JSTypedArray::cast(o)->weak_next()) {
70 count++;
71 }
72
73 return count;
74 }
75
76 static bool HasTypedArrayInWeakList(JSArrayBuffer* array_buffer,
77 JSTypedArray* ta) {
78 for (Object* o = array_buffer->weak_first_array();
79 o != Smi::FromInt(0);
80 o = JSTypedArray::cast(o)->weak_next()) {
81 if (ta == o) return true;
82 }
83 return false;
84 }
85
86
87 TEST(WeakArrayBuffersFromApi) {
88 v8::V8::Initialize();
89 LocalContext context;
90 Isolate* isolate = GetIsolateFrom(&context);
91
92 CHECK_EQ(0, CountArrayBuffersInWeakList(isolate->heap()));
93 {
94 v8::HandleScope s1(context->GetIsolate());
95 v8::Handle<v8::ArrayBuffer> ab1 = v8::ArrayBuffer::New(256);
96 {
97 v8::HandleScope s2(context->GetIsolate());
98 v8::Handle<v8::ArrayBuffer> ab2 = v8::ArrayBuffer::New(128);
99
100 Handle<JSArrayBuffer> iab1 = v8::Utils::OpenHandle(*ab1);
101 Handle<JSArrayBuffer> iab2 = v8::Utils::OpenHandle(*ab2);
102 CHECK_EQ(2, CountArrayBuffersInWeakList(isolate->heap()));
103 CHECK(HasArrayBufferInWeakList(isolate->heap(), *iab1));
104 CHECK(HasArrayBufferInWeakList(isolate->heap(), *iab2));
105 }
106 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
107 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
108 CHECK_EQ(1, CountArrayBuffersInWeakList(isolate->heap()));
109 {
110 HandleScope scope2(isolate);
111 Handle<JSArrayBuffer> iab1 = v8::Utils::OpenHandle(*ab1);
112
113 CHECK(HasArrayBufferInWeakList(isolate->heap(), *iab1));
114 }
115 }
116
117 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
118 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
119 CHECK_EQ(0, CountArrayBuffersInWeakList(isolate->heap()));
120 }
121
122
123 TEST(WeakArrayBuffersFromScript) {
124 v8::V8::Initialize();
125 LocalContext context;
126 Isolate* isolate = GetIsolateFrom(&context);
127 CHECK_EQ(0, CountArrayBuffersInWeakList(isolate->heap()));
128 {
129 v8::HandleScope scope(context->GetIsolate());
130
131 {
132 v8::HandleScope s1(context->GetIsolate());
133 CompileRun("var ab1 = new ArrayBuffer(256);"
134 "var ab2 = new ArrayBuffer(256);");
Hannes Payer (out of office) 2013/06/06 09:33:35 indent
Dmitry Lomov (no reviews) 2013/06/06 13:18:34 Done.
135 v8::Handle<v8::ArrayBuffer> ab1(
136 v8::ArrayBuffer::Cast(*CompileRun("ab1")));
137 v8::Handle<v8::ArrayBuffer> ab2(
138 v8::ArrayBuffer::Cast(*CompileRun("ab2")));
139 CHECK_EQ(2, CountArrayBuffersInWeakList(isolate->heap()));
140 CHECK(HasArrayBufferInWeakList(isolate->heap(),
141 *v8::Utils::OpenHandle(*ab1)));
142 CHECK(HasArrayBufferInWeakList(isolate->heap(),
143 *v8::Utils::OpenHandle(*ab2)));
144 }
145
146 CompileRun("ab2 = null;");
147 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
148 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
149
150 CHECK_EQ(1, CountArrayBuffersInWeakList(isolate->heap()));
151
152 {
153 v8::HandleScope s2(context->GetIsolate());
154 v8::Handle<v8::ArrayBuffer> ab1(
155 v8::ArrayBuffer::Cast(*CompileRun("ab1")));
156 CHECK(HasArrayBufferInWeakList(isolate->heap(),
157 *v8::Utils::OpenHandle(*ab1)));
158 }
159
160 CompileRun("ab1 = null;");
161 }
162
163 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
164 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
165 CHECK_EQ(0, CountArrayBuffersInWeakList(isolate->heap()));
166 }
167
Hannes Payer (out of office) 2013/06/06 09:33:35 Can we add a third typed array to the week list an
Dmitry Lomov (no reviews) 2013/06/06 13:18:34 Done. I have added this to *FromScript tests - it
168 template <typename TypedArray>
169 void TestTypedArrayFromApi() {
170 v8::V8::Initialize();
171 LocalContext context;
172 Isolate* isolate = GetIsolateFrom(&context);
173
174 v8::HandleScope s1(context->GetIsolate());
175 v8::Handle<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(2048);
176 Handle<JSArrayBuffer> iab = v8::Utils::OpenHandle(*ab);
177 {
178 v8::HandleScope s2(context->GetIsolate());
179 v8::Handle<TypedArray> ta1 = TypedArray::New(ab, 0, 256);
180 {
181 v8::HandleScope s3(context->GetIsolate());
182 v8::Handle<TypedArray> ta2 = TypedArray::New(ab, 0, 128);
183
184 Handle<JSTypedArray> ita1 = v8::Utils::OpenHandle(*ta1);
185 Handle<JSTypedArray> ita2 = v8::Utils::OpenHandle(*ta2);
186 CHECK_EQ(2, CountTypedArrays(*iab));
187 CHECK(HasTypedArrayInWeakList(*iab, *ita1));
188 CHECK(HasTypedArrayInWeakList(*iab, *ita2));
189 }
190 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
191 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
192 CHECK_EQ(1, CountTypedArrays(*iab));
193 Handle<JSTypedArray> ita1 = v8::Utils::OpenHandle(*ta1);
194 CHECK(HasTypedArrayInWeakList(*iab, *ita1));
195 }
196 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
197 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
198
199 CHECK_EQ(0, CountTypedArrays(*iab));
200 }
201
202
203 TEST(Uint8ArrayFromApi) {
204 TestTypedArrayFromApi<v8::Uint8Array>();
205 }
206
207
208 TEST(Int8ArrayFromApi) {
209 TestTypedArrayFromApi<v8::Int8Array>();
210 }
211
212
213 TEST(Uint16ArrayFromApi) {
214 TestTypedArrayFromApi<v8::Uint16Array>();
215 }
216
217
218 TEST(Int16ArrayFromApi) {
219 TestTypedArrayFromApi<v8::Int16Array>();
220 }
221
222
223 TEST(Uint32ArrayFromApi) {
224 TestTypedArrayFromApi<v8::Uint32Array>();
225 }
226
227
228 TEST(Int32ArrayFromApi) {
229 TestTypedArrayFromApi<v8::Int32Array>();
230 }
231
232
233 TEST(Float32ArrayFromApi) {
234 TestTypedArrayFromApi<v8::Float32Array>();
235 }
236
237
238 TEST(Float64ArrayFromApi) {
239 TestTypedArrayFromApi<v8::Float64Array>();
240 }
241
242
243 TEST(Uint8ClampedArrayFromApi) {
244 TestTypedArrayFromApi<v8::Uint8ClampedArray>();
245 }
246
247 template <typename TypedArray>
248 static void TestTypedArrayFromScript(const char* constructor) {
249 v8::V8::Initialize();
250 LocalContext context;
251 Isolate* isolate = GetIsolateFrom(&context);
252 v8::HandleScope scope(context->GetIsolate());
253
254 {
255 v8::HandleScope s1(context->GetIsolate());
256 i::ScopedVector<char> source(2048);
257 i::OS::SNPrintF(source,
258 "var ab = new ArrayBuffer(2048);"
259 "var ta1 = new %s(ab);"
260 "var ta2 = new %s(ab);",
261 constructor, constructor);
262
263 CompileRun(source.start());
264 v8::Handle<v8::ArrayBuffer> ab(v8::ArrayBuffer::Cast(*CompileRun("ab")));
265 v8::Handle<TypedArray> ta1(TypedArray::Cast(*CompileRun("ta1")));
266 v8::Handle<TypedArray> ta2(TypedArray::Cast(*CompileRun("ta2")));
267 CHECK_EQ(1, CountArrayBuffersInWeakList(isolate->heap()));
268 Handle<JSArrayBuffer> iab = v8::Utils::OpenHandle(*ab);
269 CHECK_EQ(2, CountTypedArrays(*iab));
270 CHECK(HasTypedArrayInWeakList(*iab, *v8::Utils::OpenHandle(*ta1)));
271 CHECK(HasTypedArrayInWeakList(*iab, *v8::Utils::OpenHandle(*ta2)));
272 }
273
274 CompileRun("ta2 = null;");
275 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
276 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
277
278 CHECK_EQ(1, CountArrayBuffersInWeakList(isolate->heap()));
279
280 {
281 v8::HandleScope s2(context->GetIsolate());
282 v8::Handle<v8::ArrayBuffer> ab(v8::ArrayBuffer::Cast(*CompileRun("ab")));
283 Handle<JSArrayBuffer> iab = v8::Utils::OpenHandle(*ab);
284 v8::Handle<TypedArray> ta1(TypedArray::Cast(*CompileRun("ta1")));
285 CHECK_EQ(1, CountTypedArrays(*iab));
286 CHECK(HasTypedArrayInWeakList(*iab, *v8::Utils::OpenHandle(*ta1)));
287 }
288
289 CompileRun("ta1 = null;");
290 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
291 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
292
293 CHECK_EQ(1, CountArrayBuffersInWeakList(isolate->heap()));
294
295 {
296 v8::HandleScope s3(context->GetIsolate());
297 v8::Handle<v8::ArrayBuffer> ab(v8::ArrayBuffer::Cast(*CompileRun("ab")));
298 Handle<JSArrayBuffer> iab = v8::Utils::OpenHandle(*ab);
299 CHECK_EQ(0, CountTypedArrays(*iab));
300 }
301 }
302
303
304 TEST(Uint8ArrayFromScript) {
305 TestTypedArrayFromScript<v8::Uint8Array>("Uint8Array");
306 }
307
308
309 TEST(Int8ArrayFromScript) {
310 TestTypedArrayFromScript<v8::Int8Array>("Int8Array");
311 }
312
313
314 TEST(Uint16ArrayFromScript) {
315 TestTypedArrayFromScript<v8::Uint16Array>("Uint16Array");
316 }
317
318
319 TEST(Int16ArrayFromScript) {
320 TestTypedArrayFromScript<v8::Int16Array>("Int16Array");
321 }
322
323
324 TEST(Uint32ArrayFromScript) {
325 TestTypedArrayFromScript<v8::Uint32Array>("Uint32Array");
326 }
327
328
329 TEST(Int32ArrayFromScript) {
330 TestTypedArrayFromScript<v8::Int32Array>("Int32Array");
331 }
332
333
334 TEST(Float32ArrayFromScript) {
335 TestTypedArrayFromScript<v8::Float32Array>("Float32Array");
336 }
337
338
339 TEST(Float64ArrayFromScript) {
340 TestTypedArrayFromScript<v8::Float64Array>("Float64Array");
341 }
342
343
344 TEST(Uint8ClampedArrayFromScript) {
345 TestTypedArrayFromScript<v8::Uint8ClampedArray>("Uint8ClampedArray");
346 }
347
OLDNEW
« src/objects-visiting-inl.h ('K') | « test/cctest/cctest.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698