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

Side by Side Diff: src/builtins.cc

Issue 1716833002: [runtime] Speed up C++ version of ArrayPush (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: add TODO for Toon's comment Created 4 years, 9 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
« no previous file with comments | « no previous file | src/debug/liveedit.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 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 #include "src/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 isolate->is_initial_array_prototype(JSArray::cast(prototype)) && 231 isolate->is_initial_array_prototype(JSArray::cast(prototype)) &&
232 isolate->IsFastArrayConstructorPrototypeChainIntact()) { 232 isolate->IsFastArrayConstructorPrototypeChainIntact()) {
233 return true; 233 return true;
234 } 234 }
235 235
236 // Slow case. 236 // Slow case.
237 PrototypeIterator iter(isolate, receiver); 237 PrototypeIterator iter(isolate, receiver);
238 return PrototypeHasNoElements(&iter); 238 return PrototypeHasNoElements(&iter);
239 } 239 }
240 240
241 241 // Returns |false| if not applicable.
242 // Returns empty handle if not applicable.
243 MUST_USE_RESULT 242 MUST_USE_RESULT
244 inline MaybeHandle<FixedArrayBase> EnsureJSArrayWithWritableFastElements( 243 inline bool EnsureJSArrayWithWritableFastElements(Isolate* isolate,
245 Isolate* isolate, Handle<Object> receiver, Arguments* args, 244 Handle<Object> receiver,
246 int first_added_arg) { 245 Arguments* args,
247 // We explicitly add a HandleScope to avoid creating several copies of the 246 int first_added_arg) {
248 // same handle which would otherwise cause issue when left-trimming later-on. 247 if (!receiver->IsJSArray()) return false;
249 HandleScope scope(isolate);
250 if (!receiver->IsJSArray()) return MaybeHandle<FixedArrayBase>();
251 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 248 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
252 // If there may be elements accessors in the prototype chain, the fast path 249 // If there may be elements accessors in the prototype chain, the fast path
253 // cannot be used if there arguments to add to the array. 250 // cannot be used if there arguments to add to the array.
254 Heap* heap = isolate->heap(); 251 Heap* heap = isolate->heap();
255 if (args != NULL && !IsJSArrayFastElementMovingAllowed(isolate, *array)) { 252 if (args != NULL && !IsJSArrayFastElementMovingAllowed(isolate, *array)) {
256 return MaybeHandle<FixedArrayBase>(); 253 return false;
257 } 254 }
258 if (array->map()->is_observed()) return MaybeHandle<FixedArrayBase>(); 255 if (array->map()->is_observed()) return false;
259 if (!array->map()->is_extensible()) return MaybeHandle<FixedArrayBase>(); 256 if (!array->map()->is_extensible()) return false;
260 Handle<FixedArrayBase> elms(array->elements(), isolate); 257 Map* map = array->elements()->map();
261 Map* map = elms->map();
262 if (map == heap->fixed_array_map()) { 258 if (map == heap->fixed_array_map()) {
263 if (args == NULL || array->HasFastObjectElements()) { 259 if (args == NULL || array->HasFastObjectElements()) {
264 return scope.CloseAndEscape(elms); 260 return true;
265 } 261 }
266 } else if (map == heap->fixed_cow_array_map()) { 262 } else if (map == heap->fixed_cow_array_map()) {
267 elms = JSObject::EnsureWritableFastElements(array); 263 // Use a short-lived HandleScope to avoid creating several copies of the
264 // elements handle which would cause issues when left-trimming later-on.
265 HandleScope scope(isolate);
266 // TODO(jkummerow/verwaest): Move this call (or this entire function?)
267 // into the ElementsAccessor so it's only done when needed (e.g. ArrayPush
268 // can skip it because it must grow the backing store anyway).
269 JSObject::EnsureWritableFastElements(array);
268 if (args == NULL || array->HasFastObjectElements()) { 270 if (args == NULL || array->HasFastObjectElements()) {
269 return scope.CloseAndEscape(elms); 271 return true;
270 } 272 }
271 } else if (map == heap->fixed_double_array_map()) { 273 } else if (map == heap->fixed_double_array_map()) {
272 if (args == NULL) { 274 if (args == NULL) {
273 return scope.CloseAndEscape(elms); 275 return true;
274 } 276 }
275 } else { 277 } else {
276 return MaybeHandle<FixedArrayBase>(); 278 return false;
277 } 279 }
278 280
279 // Adding elements to the array prototype would break code that makes sure 281 // Adding elements to the array prototype would break code that makes sure
280 // it has no elements. Handle that elsewhere. 282 // it has no elements. Handle that elsewhere.
281 if (isolate->IsAnyInitialArrayPrototype(array)) { 283 if (isolate->IsAnyInitialArrayPrototype(array)) {
282 return MaybeHandle<FixedArrayBase>(); 284 return false;
283 } 285 }
284 286
285 // Need to ensure that the arguments passed in args can be contained in 287 // Need to ensure that the arguments passed in args can be contained in
286 // the array. 288 // the array.
287 int args_length = args->length(); 289 int args_length = args->length();
288 if (first_added_arg >= args_length) { 290 if (first_added_arg >= args_length) {
289 return scope.CloseAndEscape(elms); 291 return true;
290 } 292 }
291 293
292 ElementsKind origin_kind = array->map()->elements_kind(); 294 ElementsKind origin_kind = array->map()->elements_kind();
293 DCHECK(!IsFastObjectElementsKind(origin_kind)); 295 DCHECK(!IsFastObjectElementsKind(origin_kind));
294 ElementsKind target_kind = origin_kind; 296 ElementsKind target_kind = origin_kind;
295 { 297 {
296 DisallowHeapAllocation no_gc; 298 DisallowHeapAllocation no_gc;
297 int arg_count = args_length - first_added_arg; 299 int arg_count = args_length - first_added_arg;
298 Object** arguments = args->arguments() - first_added_arg - (arg_count - 1); 300 Object** arguments = args->arguments() - first_added_arg - (arg_count - 1);
299 for (int i = 0; i < arg_count; i++) { 301 for (int i = 0; i < arg_count; i++) {
300 Object* arg = arguments[i]; 302 Object* arg = arguments[i];
301 if (arg->IsHeapObject()) { 303 if (arg->IsHeapObject()) {
302 if (arg->IsHeapNumber()) { 304 if (arg->IsHeapNumber()) {
303 target_kind = FAST_DOUBLE_ELEMENTS; 305 target_kind = FAST_DOUBLE_ELEMENTS;
304 } else { 306 } else {
305 target_kind = FAST_ELEMENTS; 307 target_kind = FAST_ELEMENTS;
306 break; 308 break;
307 } 309 }
308 } 310 }
309 } 311 }
310 } 312 }
311 if (target_kind != origin_kind) { 313 if (target_kind != origin_kind) {
314 // Use a short-lived HandleScope to avoid creating several copies of the
315 // elements handle which would cause issues when left-trimming later-on.
316 HandleScope scope(isolate);
312 JSObject::TransitionElementsKind(array, target_kind); 317 JSObject::TransitionElementsKind(array, target_kind);
313 elms = handle(array->elements(), isolate);
314 } 318 }
315 return scope.CloseAndEscape(elms); 319 return true;
316 } 320 }
317 321
318 322
319 MUST_USE_RESULT static Object* CallJsIntrinsic( 323 MUST_USE_RESULT static Object* CallJsIntrinsic(
320 Isolate* isolate, Handle<JSFunction> function, 324 Isolate* isolate, Handle<JSFunction> function,
321 BuiltinArguments<BuiltinExtraArguments::kNone> args) { 325 BuiltinArguments<BuiltinExtraArguments::kNone> args) {
322 HandleScope handleScope(isolate); 326 HandleScope handleScope(isolate);
323 int argc = args.length() - 1; 327 int argc = args.length() - 1;
324 ScopedVector<Handle<Object> > argv(argc); 328 ScopedVector<Handle<Object> > argv(argc);
325 for (int i = 0; i < argc; ++i) { 329 for (int i = 0; i < argc; ++i) {
(...skipping 19 matching lines...) Expand all
345 return isolate->heap()->undefined_value(); // Make compiler happy. 349 return isolate->heap()->undefined_value(); // Make compiler happy.
346 } 350 }
347 351
348 352
349 BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); } 353 BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); }
350 354
351 355
352 BUILTIN(ArrayPush) { 356 BUILTIN(ArrayPush) {
353 HandleScope scope(isolate); 357 HandleScope scope(isolate);
354 Handle<Object> receiver = args.receiver(); 358 Handle<Object> receiver = args.receiver();
355 MaybeHandle<FixedArrayBase> maybe_elms_obj = 359 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1)) {
356 EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1);
357 Handle<FixedArrayBase> elms_obj;
358 if (!maybe_elms_obj.ToHandle(&elms_obj)) {
359 return CallJsIntrinsic(isolate, isolate->array_push(), args); 360 return CallJsIntrinsic(isolate, isolate->array_push(), args);
360 } 361 }
361 // Fast Elements Path 362 // Fast Elements Path
362 int push_size = args.length() - 1; 363 int push_size = args.length() - 1;
363 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 364 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
364 int len = Smi::cast(array->length())->value(); 365 int len = Smi::cast(array->length())->value();
365 if (push_size == 0) { 366 if (push_size == 0) {
366 return Smi::FromInt(len); 367 return Smi::FromInt(len);
367 } 368 }
368 if (push_size > 0 && 369 DCHECK(push_size > 0);
369 JSArray::WouldChangeReadOnlyLength(array, len + push_size)) { 370 if (JSArray::HasReadOnlyLength(array)) {
370 return CallJsIntrinsic(isolate, isolate->array_push(), args); 371 return CallJsIntrinsic(isolate, isolate->array_push(), args);
371 } 372 }
372 DCHECK(!array->map()->is_observed()); 373 DCHECK(!array->map()->is_observed());
373 ElementsAccessor* accessor = array->GetElementsAccessor(); 374 ElementsAccessor* accessor = array->GetElementsAccessor();
374 int new_length = accessor->Push(array, elms_obj, &args, push_size); 375 int new_length = accessor->Push(array, handle(array->elements(), isolate),
376 &args, push_size);
375 return Smi::FromInt(new_length); 377 return Smi::FromInt(new_length);
376 } 378 }
377 379
378 380
379 BUILTIN(ArrayPop) { 381 BUILTIN(ArrayPop) {
380 HandleScope scope(isolate); 382 HandleScope scope(isolate);
381 Handle<Object> receiver = args.receiver(); 383 Handle<Object> receiver = args.receiver();
382 MaybeHandle<FixedArrayBase> maybe_elms_obj = 384 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0)) {
383 EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0);
384 Handle<FixedArrayBase> elms_obj;
385 if (!maybe_elms_obj.ToHandle(&elms_obj)) {
386 return CallJsIntrinsic(isolate, isolate->array_pop(), args); 385 return CallJsIntrinsic(isolate, isolate->array_pop(), args);
387 } 386 }
388 387
389 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 388 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
390 DCHECK(!array->map()->is_observed()); 389 DCHECK(!array->map()->is_observed());
391 390
392 uint32_t len = static_cast<uint32_t>(Smi::cast(array->length())->value()); 391 uint32_t len = static_cast<uint32_t>(Smi::cast(array->length())->value());
393 if (len == 0) return isolate->heap()->undefined_value(); 392 if (len == 0) return isolate->heap()->undefined_value();
394 393
395 if (JSArray::HasReadOnlyLength(array)) { 394 if (JSArray::HasReadOnlyLength(array)) {
396 return CallJsIntrinsic(isolate, isolate->array_pop(), args); 395 return CallJsIntrinsic(isolate, isolate->array_pop(), args);
397 } 396 }
398 397
399 Handle<Object> result; 398 Handle<Object> result;
400 if (IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) { 399 if (IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) {
401 // Fast Elements Path 400 // Fast Elements Path
402 result = array->GetElementsAccessor()->Pop(array, elms_obj); 401 result = array->GetElementsAccessor()->Pop(
402 array, handle(array->elements(), isolate));
403 } else { 403 } else {
404 // Use Slow Lookup otherwise 404 // Use Slow Lookup otherwise
405 uint32_t new_length = len - 1; 405 uint32_t new_length = len - 1;
406 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 406 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
407 isolate, result, Object::GetElement(isolate, array, new_length)); 407 isolate, result, Object::GetElement(isolate, array, new_length));
408 JSArray::SetLength(array, new_length); 408 JSArray::SetLength(array, new_length);
409 } 409 }
410 return *result; 410 return *result;
411 } 411 }
412 412
413 413
414 BUILTIN(ArrayShift) { 414 BUILTIN(ArrayShift) {
415 HandleScope scope(isolate); 415 HandleScope scope(isolate);
416 Heap* heap = isolate->heap(); 416 Heap* heap = isolate->heap();
417 Handle<Object> receiver = args.receiver(); 417 Handle<Object> receiver = args.receiver();
418 MaybeHandle<FixedArrayBase> maybe_elms_obj = 418 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0) ||
419 EnsureJSArrayWithWritableFastElements(isolate, receiver, NULL, 0);
420 Handle<FixedArrayBase> elms_obj;
421 if (!maybe_elms_obj.ToHandle(&elms_obj) ||
422 !IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) { 419 !IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) {
423 return CallJsIntrinsic(isolate, isolate->array_shift(), args); 420 return CallJsIntrinsic(isolate, isolate->array_shift(), args);
424 } 421 }
425 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 422 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
426 DCHECK(!array->map()->is_observed()); 423 DCHECK(!array->map()->is_observed());
427 424
428 int len = Smi::cast(array->length())->value(); 425 int len = Smi::cast(array->length())->value();
429 if (len == 0) return heap->undefined_value(); 426 if (len == 0) return heap->undefined_value();
430 427
431 if (JSArray::HasReadOnlyLength(array)) { 428 if (JSArray::HasReadOnlyLength(array)) {
432 return CallJsIntrinsic(isolate, isolate->array_shift(), args); 429 return CallJsIntrinsic(isolate, isolate->array_shift(), args);
433 } 430 }
434 431
435 Handle<Object> first = array->GetElementsAccessor()->Shift(array, elms_obj); 432 Handle<Object> first = array->GetElementsAccessor()->Shift(
433 array, handle(array->elements(), isolate));
436 return *first; 434 return *first;
437 } 435 }
438 436
439 437
440 BUILTIN(ArrayUnshift) { 438 BUILTIN(ArrayUnshift) {
441 HandleScope scope(isolate); 439 HandleScope scope(isolate);
442 Handle<Object> receiver = args.receiver(); 440 Handle<Object> receiver = args.receiver();
443 MaybeHandle<FixedArrayBase> maybe_elms_obj = 441 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1)) {
444 EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1);
445 Handle<FixedArrayBase> elms_obj;
446 if (!maybe_elms_obj.ToHandle(&elms_obj)) {
447 return CallJsIntrinsic(isolate, isolate->array_unshift(), args); 442 return CallJsIntrinsic(isolate, isolate->array_unshift(), args);
448 } 443 }
449 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 444 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
450 DCHECK(!array->map()->is_observed()); 445 DCHECK(!array->map()->is_observed());
451 int to_add = args.length() - 1; 446 int to_add = args.length() - 1;
452 if (to_add == 0) { 447 if (to_add == 0) {
453 return array->length(); 448 return array->length();
454 } 449 }
455 // Currently fixed arrays cannot grow too big, so 450 // Currently fixed arrays cannot grow too big, so
456 // we should never hit this case. 451 // we should never hit this case.
457 DCHECK(to_add <= (Smi::kMaxValue - Smi::cast(array->length())->value())); 452 DCHECK(to_add <= (Smi::kMaxValue - Smi::cast(array->length())->value()));
458 453
459 if (to_add > 0 && JSArray::HasReadOnlyLength(array)) { 454 if (to_add > 0 && JSArray::HasReadOnlyLength(array)) {
460 return CallJsIntrinsic(isolate, isolate->array_unshift(), args); 455 return CallJsIntrinsic(isolate, isolate->array_unshift(), args);
461 } 456 }
462 457
463 ElementsAccessor* accessor = array->GetElementsAccessor(); 458 ElementsAccessor* accessor = array->GetElementsAccessor();
464 int new_length = accessor->Unshift(array, elms_obj, &args, to_add); 459 int new_length = accessor->Unshift(array, handle(array->elements(), isolate),
460 &args, to_add);
465 return Smi::FromInt(new_length); 461 return Smi::FromInt(new_length);
466 } 462 }
467 463
468 464
469 BUILTIN(ArraySlice) { 465 BUILTIN(ArraySlice) {
470 HandleScope scope(isolate); 466 HandleScope scope(isolate);
471 Handle<Object> receiver = args.receiver(); 467 Handle<Object> receiver = args.receiver();
472 Handle<JSObject> object; 468 Handle<JSObject> object;
473 Handle<FixedArrayBase> elms_obj; 469 Handle<FixedArrayBase> elms_obj;
474 int len = -1; 470 int len = -1;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 } 547 }
552 Handle<JSArray> result_array = 548 Handle<JSArray> result_array =
553 accessor->Slice(object, elms_obj, actual_start, actual_end); 549 accessor->Slice(object, elms_obj, actual_start, actual_end);
554 return *result_array; 550 return *result_array;
555 } 551 }
556 552
557 553
558 BUILTIN(ArraySplice) { 554 BUILTIN(ArraySplice) {
559 HandleScope scope(isolate); 555 HandleScope scope(isolate);
560 Handle<Object> receiver = args.receiver(); 556 Handle<Object> receiver = args.receiver();
561 MaybeHandle<FixedArrayBase> maybe_elms_obj = 557 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3) ||
562 EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 3); 558 // If this is a subclass of Array, then call out to JS.
563 Handle<FixedArrayBase> elms_obj;
564 if (!maybe_elms_obj.ToHandle(&elms_obj) ||
565 // If this is a subclass of Array, then call out to JS
566 !JSArray::cast(*receiver)->map()->new_target_is_base() || 559 !JSArray::cast(*receiver)->map()->new_target_is_base() ||
567 // If anything with @@species has been messed with, call out to JS 560 // If anything with @@species has been messed with, call out to JS.
568 !isolate->IsArraySpeciesLookupChainIntact()) { 561 !isolate->IsArraySpeciesLookupChainIntact()) {
569 return CallJsIntrinsic(isolate, isolate->array_splice(), args); 562 return CallJsIntrinsic(isolate, isolate->array_splice(), args);
570 } 563 }
571 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 564 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
572 DCHECK(!array->map()->is_observed()); 565 DCHECK(!array->map()->is_observed());
573 566
574 int argument_count = args.length() - 1; 567 int argument_count = args.length() - 1;
575 int relative_start = 0; 568 int relative_start = 0;
576 if (argument_count > 0) { 569 if (argument_count > 0) {
577 DisallowHeapAllocation no_gc; 570 DisallowHeapAllocation no_gc;
(...skipping 28 matching lines...) Expand all
606 } 599 }
607 600
608 int add_count = (argument_count > 1) ? (argument_count - 2) : 0; 601 int add_count = (argument_count > 1) ? (argument_count - 2) : 0;
609 int new_length = len - actual_delete_count + add_count; 602 int new_length = len - actual_delete_count + add_count;
610 603
611 if (new_length != len && JSArray::HasReadOnlyLength(array)) { 604 if (new_length != len && JSArray::HasReadOnlyLength(array)) {
612 AllowHeapAllocation allow_allocation; 605 AllowHeapAllocation allow_allocation;
613 return CallJsIntrinsic(isolate, isolate->array_splice(), args); 606 return CallJsIntrinsic(isolate, isolate->array_splice(), args);
614 } 607 }
615 ElementsAccessor* accessor = array->GetElementsAccessor(); 608 ElementsAccessor* accessor = array->GetElementsAccessor();
616 Handle<JSArray> result_array = accessor->Splice( 609 Handle<JSArray> result_array =
617 array, elms_obj, actual_start, actual_delete_count, &args, add_count); 610 accessor->Splice(array, handle(array->elements(), isolate), actual_start,
611 actual_delete_count, &args, add_count);
618 return *result_array; 612 return *result_array;
619 } 613 }
620 614
621 615
622 // Array Concat ------------------------------------------------------------- 616 // Array Concat -------------------------------------------------------------
623 617
624 namespace { 618 namespace {
625 619
626 /** 620 /**
627 * A simple visitor visits every element of Array's. 621 * A simple visitor visits every element of Array's.
(...skipping 3822 matching lines...) Expand 10 before | Expand all | Expand 10 after
4450 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 4444 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
4451 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 4445 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
4452 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4446 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4453 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4447 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4454 #undef DEFINE_BUILTIN_ACCESSOR_C 4448 #undef DEFINE_BUILTIN_ACCESSOR_C
4455 #undef DEFINE_BUILTIN_ACCESSOR_A 4449 #undef DEFINE_BUILTIN_ACCESSOR_A
4456 4450
4457 4451
4458 } // namespace internal 4452 } // namespace internal
4459 } // namespace v8 4453 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/debug/liveedit.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698