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

Side by Side Diff: src/builtins.cc

Issue 558041: RFC: Try to be much more careful with where we skip the write barrier by:... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 10 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
« no previous file with comments | « no previous file | src/dateparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 // Optimize the case where there are no parameters passed. 240 // Optimize the case where there are no parameters passed.
241 if (args.length() == 1) { 241 if (args.length() == 1) {
242 return array->Initialize(JSArray::kPreallocatedArrayElements); 242 return array->Initialize(JSArray::kPreallocatedArrayElements);
243 } 243 }
244 244
245 // Take the arguments as elements. 245 // Take the arguments as elements.
246 int number_of_elements = args.length() - 1; 246 int number_of_elements = args.length() - 1;
247 Smi* len = Smi::FromInt(number_of_elements); 247 Smi* len = Smi::FromInt(number_of_elements);
248 Object* obj = Heap::AllocateFixedArrayWithHoles(len->value()); 248 Object* obj = Heap::AllocateFixedArrayWithHoles(len->value());
249 if (obj->IsFailure()) return obj; 249 if (obj->IsFailure()) return obj;
250
251 AssertNoAllocation no_gc;
250 FixedArray* elms = FixedArray::cast(obj); 252 FixedArray* elms = FixedArray::cast(obj);
251 WriteBarrierMode mode = elms->GetWriteBarrierMode(); 253 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
252 // Fill in the content 254 // Fill in the content
253 for (int index = 0; index < number_of_elements; index++) { 255 for (int index = 0; index < number_of_elements; index++) {
254 elms->set(index, args[index+1], mode); 256 elms->set(index, args[index+1], mode);
255 } 257 }
256 258
257 // Set length and elements on the array. 259 // Set length and elements on the array.
258 array->set_elements(FixedArray::cast(obj)); 260 array->set_elements(FixedArray::cast(obj));
259 array->set_length(len, SKIP_WRITE_BARRIER); 261 array->set_length(len);
260 262
261 return array; 263 return array;
262 } 264 }
263 265
264 266
265 BUILTIN(ArrayPush) { 267 BUILTIN(ArrayPush) {
266 JSArray* array = JSArray::cast(*args.receiver()); 268 JSArray* array = JSArray::cast(*args.receiver());
267 ASSERT(array->HasFastElements()); 269 ASSERT(array->HasFastElements());
268 270
269 // Make sure we have space for the elements. 271 // Make sure we have space for the elements.
270 int len = Smi::cast(array->length())->value(); 272 int len = Smi::cast(array->length())->value();
271 273
272 // Set new length. 274 // Set new length.
273 int new_length = len + args.length() - 1; 275 int new_length = len + args.length() - 1;
274 FixedArray* elms = FixedArray::cast(array->elements()); 276 FixedArray* elms = FixedArray::cast(array->elements());
275 277
276 if (new_length <= elms->length()) { 278 if (new_length <= elms->length()) {
277 // Backing storage has extra space for the provided values. 279 // Backing storage has extra space for the provided values.
278 for (int index = 0; index < args.length() - 1; index++) { 280 for (int index = 0; index < args.length() - 1; index++) {
279 elms->set(index + len, args[index+1]); 281 elms->set(index + len, args[index+1]);
280 } 282 }
281 } else { 283 } else {
282 // New backing storage is needed. 284 // New backing storage is needed.
283 int capacity = new_length + (new_length >> 1) + 16; 285 int capacity = new_length + (new_length >> 1) + 16;
284 Object* obj = Heap::AllocateFixedArrayWithHoles(capacity); 286 Object* obj = Heap::AllocateFixedArrayWithHoles(capacity);
285 if (obj->IsFailure()) return obj; 287 if (obj->IsFailure()) return obj;
288
289 AssertNoAllocation no_gc;
286 FixedArray* new_elms = FixedArray::cast(obj); 290 FixedArray* new_elms = FixedArray::cast(obj);
287 WriteBarrierMode mode = new_elms->GetWriteBarrierMode(); 291 WriteBarrierMode mode = new_elms->GetWriteBarrierMode(no_gc);
288 // Fill out the new array with old elements. 292 // Fill out the new array with old elements.
289 for (int i = 0; i < len; i++) new_elms->set(i, elms->get(i), mode); 293 for (int i = 0; i < len; i++) new_elms->set(i, elms->get(i), mode);
290 // Add the provided values. 294 // Add the provided values.
291 for (int index = 0; index < args.length() - 1; index++) { 295 for (int index = 0; index < args.length() - 1; index++) {
292 new_elms->set(index + len, args[index+1], mode); 296 new_elms->set(index + len, args[index+1], mode);
293 } 297 }
294 // Set the new backing storage. 298 // Set the new backing storage.
295 array->set_elements(new_elms); 299 array->set_elements(new_elms);
296 } 300 }
297 // Set the length. 301 // Set the length.
298 array->set_length(Smi::FromInt(new_length), SKIP_WRITE_BARRIER); 302 array->set_length(Smi::FromInt(new_length));
299 return array->length(); 303 return array->length();
300 } 304 }
301 305
302 306
303 BUILTIN(ArrayPop) { 307 BUILTIN(ArrayPop) {
304 JSArray* array = JSArray::cast(*args.receiver()); 308 JSArray* array = JSArray::cast(*args.receiver());
305 ASSERT(array->HasFastElements()); 309 ASSERT(array->HasFastElements());
306 Object* undefined = Heap::undefined_value(); 310 Object* undefined = Heap::undefined_value();
307 311
308 int len = Smi::cast(array->length())->value(); 312 int len = Smi::cast(array->length())->value();
309 if (len == 0) return undefined; 313 if (len == 0) return undefined;
310 314
311 // Get top element 315 // Get top element
312 FixedArray* elms = FixedArray::cast(array->elements()); 316 FixedArray* elms = FixedArray::cast(array->elements());
313 Object* top = elms->get(len - 1); 317 Object* top = elms->get(len - 1);
314 318
315 // Set the length. 319 // Set the length.
316 array->set_length(Smi::FromInt(len - 1), SKIP_WRITE_BARRIER); 320 array->set_length(Smi::FromInt(len - 1));
317 321
318 if (!top->IsTheHole()) { 322 if (!top->IsTheHole()) {
319 // Delete the top element. 323 // Delete the top element.
320 elms->set_the_hole(len - 1); 324 elms->set_the_hole(len - 1);
321 return top; 325 return top;
322 } 326 }
323 327
324 // Remember to check the prototype chain. 328 // Remember to check the prototype chain.
325 JSFunction* array_function = 329 JSFunction* array_function =
326 Top::context()->global_context()->array_function(); 330 Top::context()->global_context()->array_function();
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 if (entry->contains(pc)) { 912 if (entry->contains(pc)) {
909 return names_[i]; 913 return names_[i];
910 } 914 }
911 } 915 }
912 } 916 }
913 return NULL; 917 return NULL;
914 } 918 }
915 919
916 920
917 } } // namespace v8::internal 921 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/dateparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698