| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 20 matching lines...) Expand all Loading... |
| 31 #include "v8.h" | 31 #include "v8.h" |
| 32 | 32 |
| 33 #include "accessors.h" | 33 #include "accessors.h" |
| 34 #include "api.h" | 34 #include "api.h" |
| 35 #include "arguments.h" | 35 #include "arguments.h" |
| 36 #include "bootstrapper.h" | 36 #include "bootstrapper.h" |
| 37 #include "codegen.h" | 37 #include "codegen.h" |
| 38 #include "compilation-cache.h" | 38 #include "compilation-cache.h" |
| 39 #include "compiler.h" | 39 #include "compiler.h" |
| 40 #include "cpu.h" | 40 #include "cpu.h" |
| 41 #include "cpu-profiler.h" |
| 41 #include "dateparser-inl.h" | 42 #include "dateparser-inl.h" |
| 42 #include "debug.h" | 43 #include "debug.h" |
| 43 #include "deoptimizer.h" | 44 #include "deoptimizer.h" |
| 44 #include "date.h" | 45 #include "date.h" |
| 45 #include "execution.h" | 46 #include "execution.h" |
| 46 #include "full-codegen.h" | 47 #include "full-codegen.h" |
| 47 #include "global-handles.h" | 48 #include "global-handles.h" |
| 48 #include "isolate-inl.h" | 49 #include "isolate-inl.h" |
| 49 #include "jsregexp.h" | 50 #include "jsregexp.h" |
| 50 #include "jsregexp-inl.h" | 51 #include "jsregexp-inl.h" |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; | 460 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; |
| 460 | 461 |
| 461 // Check if boilerplate exists. If not, create it first. | 462 // Check if boilerplate exists. If not, create it first. |
| 462 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 463 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
| 463 if (*boilerplate == isolate->heap()->undefined_value()) { | 464 if (*boilerplate == isolate->heap()->undefined_value()) { |
| 464 boilerplate = CreateObjectLiteralBoilerplate(isolate, | 465 boilerplate = CreateObjectLiteralBoilerplate(isolate, |
| 465 literals, | 466 literals, |
| 466 constant_properties, | 467 constant_properties, |
| 467 should_have_fast_elements, | 468 should_have_fast_elements, |
| 468 has_function_literal); | 469 has_function_literal); |
| 469 if (boilerplate.is_null()) return Failure::Exception(); | 470 RETURN_IF_EMPTY_HANDLE(isolate, boilerplate); |
| 470 // Update the functions literal and return the boilerplate. | 471 // Update the functions literal and return the boilerplate. |
| 471 literals->set(literals_index, *boilerplate); | 472 literals->set(literals_index, *boilerplate); |
| 472 } | 473 } |
| 473 return JSObject::cast(*boilerplate)->DeepCopy(isolate); | 474 return JSObject::cast(*boilerplate)->DeepCopy(isolate); |
| 474 } | 475 } |
| 475 | 476 |
| 476 | 477 |
| 477 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) { | 478 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) { |
| 478 HandleScope scope(isolate); | 479 HandleScope scope(isolate); |
| 479 ASSERT(args.length() == 4); | 480 ASSERT(args.length() == 4); |
| 480 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); | 481 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
| 481 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 482 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
| 482 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); | 483 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); |
| 483 CONVERT_SMI_ARG_CHECKED(flags, 3); | 484 CONVERT_SMI_ARG_CHECKED(flags, 3); |
| 484 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; | 485 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; |
| 485 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; | 486 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; |
| 486 | 487 |
| 487 // Check if boilerplate exists. If not, create it first. | 488 // Check if boilerplate exists. If not, create it first. |
| 488 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 489 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
| 489 if (*boilerplate == isolate->heap()->undefined_value()) { | 490 if (*boilerplate == isolate->heap()->undefined_value()) { |
| 490 boilerplate = CreateObjectLiteralBoilerplate(isolate, | 491 boilerplate = CreateObjectLiteralBoilerplate(isolate, |
| 491 literals, | 492 literals, |
| 492 constant_properties, | 493 constant_properties, |
| 493 should_have_fast_elements, | 494 should_have_fast_elements, |
| 494 has_function_literal); | 495 has_function_literal); |
| 495 if (boilerplate.is_null()) return Failure::Exception(); | 496 RETURN_IF_EMPTY_HANDLE(isolate, boilerplate); |
| 496 // Update the functions literal and return the boilerplate. | 497 // Update the functions literal and return the boilerplate. |
| 497 literals->set(literals_index, *boilerplate); | 498 literals->set(literals_index, *boilerplate); |
| 498 } | 499 } |
| 499 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); | 500 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); |
| 500 } | 501 } |
| 501 | 502 |
| 502 | 503 |
| 504 static Handle<AllocationSite> GetLiteralAllocationSite( |
| 505 Isolate* isolate, |
| 506 Handle<FixedArray> literals, |
| 507 int literals_index, |
| 508 Handle<FixedArray> elements) { |
| 509 // Check if boilerplate exists. If not, create it first. |
| 510 Handle<Object> literal_site(literals->get(literals_index), isolate); |
| 511 Handle<AllocationSite> site; |
| 512 if (*literal_site == isolate->heap()->undefined_value()) { |
| 513 ASSERT(*elements != isolate->heap()->empty_fixed_array()); |
| 514 Handle<Object> boilerplate = |
| 515 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
| 516 if (boilerplate.is_null()) return site; |
| 517 site = isolate->factory()->NewAllocationSite(); |
| 518 site->set_payload(*boilerplate); |
| 519 literals->set(literals_index, *site); |
| 520 } else { |
| 521 site = Handle<AllocationSite>::cast(literal_site); |
| 522 } |
| 523 |
| 524 return site; |
| 525 } |
| 526 |
| 527 |
| 503 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { | 528 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { |
| 504 HandleScope scope(isolate); | 529 HandleScope scope(isolate); |
| 505 ASSERT(args.length() == 3); | 530 ASSERT(args.length() == 3); |
| 506 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); | 531 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
| 507 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 532 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
| 508 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); | 533 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); |
| 509 | 534 |
| 510 // Check if boilerplate exists. If not, create it first. | 535 Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals, |
| 511 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 536 literals_index, elements); |
| 512 if (*boilerplate == isolate->heap()->undefined_value()) { | 537 RETURN_IF_EMPTY_HANDLE(isolate, site); |
| 513 ASSERT(*elements != isolate->heap()->empty_fixed_array()); | 538 |
| 514 boilerplate = | 539 JSObject* boilerplate = JSObject::cast(site->payload()); |
| 515 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); | 540 return boilerplate->DeepCopy(isolate); |
| 516 if (boilerplate.is_null()) return Failure::Exception(); | |
| 517 // Update the functions literal and return the boilerplate. | |
| 518 literals->set(literals_index, *boilerplate); | |
| 519 } | |
| 520 return JSObject::cast(*boilerplate)->DeepCopy(isolate); | |
| 521 } | 541 } |
| 522 | 542 |
| 523 | 543 |
| 524 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { | 544 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { |
| 525 HandleScope scope(isolate); | 545 HandleScope scope(isolate); |
| 526 ASSERT(args.length() == 3); | 546 ASSERT(args.length() == 3); |
| 527 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); | 547 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
| 528 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 548 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
| 529 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); | 549 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); |
| 530 | 550 |
| 531 // Check if boilerplate exists. If not, create it first. | 551 Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals, |
| 532 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 552 literals_index, elements); |
| 533 if (*boilerplate == isolate->heap()->undefined_value()) { | 553 RETURN_IF_EMPTY_HANDLE(isolate, site); |
| 534 ASSERT(*elements != isolate->heap()->empty_fixed_array()); | 554 |
| 535 boilerplate = | 555 JSObject* boilerplate = JSObject::cast(site->payload()); |
| 536 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); | 556 if (boilerplate->elements()->map() == |
| 537 if (boilerplate.is_null()) return Failure::Exception(); | |
| 538 // Update the functions literal and return the boilerplate. | |
| 539 literals->set(literals_index, *boilerplate); | |
| 540 } | |
| 541 if (JSObject::cast(*boilerplate)->elements()->map() == | |
| 542 isolate->heap()->fixed_cow_array_map()) { | 557 isolate->heap()->fixed_cow_array_map()) { |
| 543 isolate->counters()->cow_arrays_created_runtime()->Increment(); | 558 isolate->counters()->cow_arrays_created_runtime()->Increment(); |
| 544 } | 559 } |
| 545 | 560 |
| 546 JSObject* boilerplate_object = JSObject::cast(*boilerplate); | 561 AllocationSiteMode mode = AllocationSite::GetMode( |
| 547 AllocationSiteMode mode = AllocationSiteInfo::GetMode( | 562 boilerplate->GetElementsKind()); |
| 548 boilerplate_object->GetElementsKind()); | |
| 549 if (mode == TRACK_ALLOCATION_SITE) { | 563 if (mode == TRACK_ALLOCATION_SITE) { |
| 550 return isolate->heap()->CopyJSObjectWithAllocationSite(boilerplate_object); | 564 return isolate->heap()->CopyJSObjectWithAllocationSite( |
| 565 boilerplate, *site); |
| 551 } | 566 } |
| 552 | 567 |
| 553 return isolate->heap()->CopyJSObject(boilerplate_object); | 568 return isolate->heap()->CopyJSObject(boilerplate); |
| 554 } | 569 } |
| 555 | 570 |
| 556 | 571 |
| 557 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateSymbol) { | 572 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateSymbol) { |
| 558 HandleScope scope(isolate); | 573 HandleScope scope(isolate); |
| 559 ASSERT(args.length() == 1); | 574 ASSERT(args.length() == 1); |
| 560 Handle<Object> name(args[0], isolate); | 575 Handle<Object> name(args[0], isolate); |
| 561 RUNTIME_ASSERT(name->IsString() || name->IsUndefined()); | 576 RUNTIME_ASSERT(name->IsString() || name->IsUndefined()); |
| 562 Symbol* symbol; | 577 Symbol* symbol; |
| 563 MaybeObject* maybe = isolate->heap()->AllocateSymbol(); | 578 MaybeObject* maybe = isolate->heap()->AllocateSymbol(); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 | 803 |
| 789 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { | 804 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
| 790 HandleScope scope(isolate); | 805 HandleScope scope(isolate); |
| 791 ASSERT(args.length() == 5); | 806 ASSERT(args.length() == 5); |
| 792 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); | 807 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
| 793 CONVERT_SMI_ARG_CHECKED(arrayId, 1); | 808 CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
| 794 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); | 809 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); |
| 795 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); | 810 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); |
| 796 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); | 811 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); |
| 797 | 812 |
| 813 ASSERT(holder->GetInternalFieldCount() == |
| 814 v8::ArrayBufferView::kInternalFieldCount); |
| 815 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
| 816 holder->SetInternalField(i, Smi::FromInt(0)); |
| 817 } |
| 818 |
| 798 ExternalArrayType arrayType; | 819 ExternalArrayType arrayType; |
| 799 size_t elementSize; | 820 size_t elementSize; |
| 800 switch (arrayId) { | 821 switch (arrayId) { |
| 801 case ARRAY_ID_UINT8: | 822 case ARRAY_ID_UINT8: |
| 802 arrayType = kExternalUnsignedByteArray; | 823 arrayType = kExternalUnsignedByteArray; |
| 803 elementSize = 1; | 824 elementSize = 1; |
| 804 break; | 825 break; |
| 805 case ARRAY_ID_INT8: | 826 case ARRAY_ID_INT8: |
| 806 arrayType = kExternalByteArray; | 827 arrayType = kExternalByteArray; |
| 807 elementSize = 1; | 828 elementSize = 1; |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 | 1025 |
| 1005 | 1026 |
| 1006 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) { | 1027 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) { |
| 1007 HandleScope scope(isolate); | 1028 HandleScope scope(isolate); |
| 1008 ASSERT(args.length() == 4); | 1029 ASSERT(args.length() == 4); |
| 1009 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); | 1030 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); |
| 1010 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1); | 1031 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1); |
| 1011 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset, 2); | 1032 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset, 2); |
| 1012 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length, 3); | 1033 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length, 3); |
| 1013 | 1034 |
| 1035 ASSERT(holder->GetInternalFieldCount() == |
| 1036 v8::ArrayBufferView::kInternalFieldCount); |
| 1037 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
| 1038 holder->SetInternalField(i, Smi::FromInt(0)); |
| 1039 } |
| 1040 |
| 1014 holder->set_buffer(*buffer); | 1041 holder->set_buffer(*buffer); |
| 1015 ASSERT(byte_offset->IsNumber()); | 1042 ASSERT(byte_offset->IsNumber()); |
| 1016 ASSERT( | 1043 ASSERT( |
| 1017 NumberToSize(isolate, buffer->byte_length()) >= | 1044 NumberToSize(isolate, buffer->byte_length()) >= |
| 1018 NumberToSize(isolate, *byte_offset) | 1045 NumberToSize(isolate, *byte_offset) |
| 1019 + NumberToSize(isolate, *byte_length)); | 1046 + NumberToSize(isolate, *byte_length)); |
| 1020 holder->set_byte_offset(*byte_offset); | 1047 holder->set_byte_offset(*byte_offset); |
| 1021 ASSERT(byte_length->IsNumber()); | 1048 ASSERT(byte_length->IsNumber()); |
| 1022 holder->set_byte_length(*byte_length); | 1049 holder->set_byte_length(*byte_length); |
| 1023 | 1050 |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 Object* current = receiver->GetPrototype(isolate); | 1470 Object* current = receiver->GetPrototype(isolate); |
| 1444 while (current->IsJSObject() && | 1471 while (current->IsJSObject() && |
| 1445 JSObject::cast(current)->map()->is_hidden_prototype()) { | 1472 JSObject::cast(current)->map()->is_hidden_prototype()) { |
| 1446 current = current->GetPrototype(isolate); | 1473 current = current->GetPrototype(isolate); |
| 1447 } | 1474 } |
| 1448 return current; | 1475 return current; |
| 1449 } | 1476 } |
| 1450 | 1477 |
| 1451 | 1478 |
| 1452 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetPrototype) { | 1479 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetPrototype) { |
| 1453 SealHandleScope shs(isolate); | 1480 HandleScope scope(isolate); |
| 1454 ASSERT(args.length() == 2); | 1481 ASSERT(args.length() == 2); |
| 1455 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 1482 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
| 1456 CONVERT_ARG_CHECKED(Object, prototype, 1); | 1483 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); |
| 1457 if (FLAG_harmony_observation && obj->map()->is_observed()) { | 1484 if (FLAG_harmony_observation && obj->map()->is_observed()) { |
| 1458 HandleScope scope(isolate); | |
| 1459 Handle<JSObject> receiver(obj); | |
| 1460 Handle<Object> value(prototype, isolate); | |
| 1461 Handle<Object> old_value( | 1485 Handle<Object> old_value( |
| 1462 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate); | 1486 GetPrototypeSkipHiddenPrototypes(isolate, *obj), isolate); |
| 1463 | 1487 |
| 1464 MaybeObject* result = receiver->SetPrototype(*value, true); | 1488 Handle<Object> result = JSObject::SetPrototype(obj, prototype, true); |
| 1465 Handle<Object> hresult; | 1489 RETURN_IF_EMPTY_HANDLE(isolate, result); |
| 1466 if (!result->ToHandle(&hresult, isolate)) return result; | |
| 1467 | 1490 |
| 1468 Handle<Object> new_value( | 1491 Handle<Object> new_value( |
| 1469 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate); | 1492 GetPrototypeSkipHiddenPrototypes(isolate, *obj), isolate); |
| 1470 if (!new_value->SameValue(*old_value)) { | 1493 if (!new_value->SameValue(*old_value)) { |
| 1471 JSObject::EnqueueChangeRecord(receiver, "prototype", | 1494 JSObject::EnqueueChangeRecord(obj, "prototype", |
| 1472 isolate->factory()->proto_string(), | 1495 isolate->factory()->proto_string(), |
| 1473 old_value); | 1496 old_value); |
| 1474 } | 1497 } |
| 1475 return *hresult; | 1498 return *result; |
| 1476 } | 1499 } |
| 1477 return obj->SetPrototype(prototype, true); | 1500 Handle<Object> result = JSObject::SetPrototype(obj, prototype, true); |
| 1501 RETURN_IF_EMPTY_HANDLE(isolate, result); |
| 1502 return *result; |
| 1478 } | 1503 } |
| 1479 | 1504 |
| 1480 | 1505 |
| 1481 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) { | 1506 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) { |
| 1482 SealHandleScope shs(isolate); | 1507 SealHandleScope shs(isolate); |
| 1483 ASSERT(args.length() == 2); | 1508 ASSERT(args.length() == 2); |
| 1484 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). | 1509 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). |
| 1485 Object* O = args[0]; | 1510 Object* O = args[0]; |
| 1486 Object* V = args[1]; | 1511 Object* V = args[1]; |
| 1487 while (true) { | 1512 while (true) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 | 1654 |
| 1630 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); | 1655 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); |
| 1631 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); | 1656 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
| 1632 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); | 1657 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); |
| 1633 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(raw_accessors != NULL)); | 1658 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(raw_accessors != NULL)); |
| 1634 | 1659 |
| 1635 if (raw_accessors == NULL) { | 1660 if (raw_accessors == NULL) { |
| 1636 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); | 1661 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); |
| 1637 // GetProperty does access check. | 1662 // GetProperty does access check. |
| 1638 Handle<Object> value = GetProperty(isolate, obj, name); | 1663 Handle<Object> value = GetProperty(isolate, obj, name); |
| 1639 if (value.is_null()) return Failure::Exception(); | 1664 RETURN_IF_EMPTY_HANDLE(isolate, value); |
| 1640 elms->set(VALUE_INDEX, *value); | 1665 elms->set(VALUE_INDEX, *value); |
| 1641 } else { | 1666 } else { |
| 1642 // Access checks are performed for both accessors separately. | 1667 // Access checks are performed for both accessors separately. |
| 1643 // When they fail, the respective field is not set in the descriptor. | 1668 // When they fail, the respective field is not set in the descriptor. |
| 1644 Object* getter = accessors->GetComponent(ACCESSOR_GETTER); | 1669 Object* getter = accessors->GetComponent(ACCESSOR_GETTER); |
| 1645 Object* setter = accessors->GetComponent(ACCESSOR_SETTER); | 1670 Object* setter = accessors->GetComponent(ACCESSOR_SETTER); |
| 1646 if (!getter->IsMap() && CheckPropertyAccess(*obj, *name, v8::ACCESS_GET)) { | 1671 if (!getter->IsMap() && CheckPropertyAccess(*obj, *name, v8::ACCESS_GET)) { |
| 1647 elms->set(GETTER_INDEX, getter); | 1672 elms->set(GETTER_INDEX, getter); |
| 1648 } | 1673 } |
| 1649 if (!setter->IsMap() && CheckPropertyAccess(*obj, *name, v8::ACCESS_SET)) { | 1674 if (!setter->IsMap() && CheckPropertyAccess(*obj, *name, v8::ACCESS_SET)) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1694 | 1719 |
| 1695 | 1720 |
| 1696 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) { | 1721 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) { |
| 1697 HandleScope scope(isolate); | 1722 HandleScope scope(isolate); |
| 1698 ASSERT(args.length() == 3); | 1723 ASSERT(args.length() == 3); |
| 1699 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, re, 0); | 1724 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, re, 0); |
| 1700 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); | 1725 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); |
| 1701 CONVERT_ARG_HANDLE_CHECKED(String, flags, 2); | 1726 CONVERT_ARG_HANDLE_CHECKED(String, flags, 2); |
| 1702 Handle<Object> result = | 1727 Handle<Object> result = |
| 1703 RegExpImpl::Compile(re, pattern, flags); | 1728 RegExpImpl::Compile(re, pattern, flags); |
| 1704 if (result.is_null()) return Failure::Exception(); | 1729 RETURN_IF_EMPTY_HANDLE(isolate, result); |
| 1705 return *result; | 1730 return *result; |
| 1706 } | 1731 } |
| 1707 | 1732 |
| 1708 | 1733 |
| 1709 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) { | 1734 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) { |
| 1710 HandleScope scope(isolate); | 1735 HandleScope scope(isolate); |
| 1711 ASSERT(args.length() == 1); | 1736 ASSERT(args.length() == 1); |
| 1712 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0); | 1737 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0); |
| 1713 return *isolate->factory()->CreateApiFunction(data); | 1738 return *isolate->factory()->CreateApiFunction(data); |
| 1714 } | 1739 } |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 // Strict mode handling not needed (const is disallowed in strict mode). | 2128 // Strict mode handling not needed (const is disallowed in strict mode). |
| 2104 if (lookup.IsField()) { | 2129 if (lookup.IsField()) { |
| 2105 FixedArray* properties = global->properties(); | 2130 FixedArray* properties = global->properties(); |
| 2106 int index = lookup.GetFieldIndex().field_index(); | 2131 int index = lookup.GetFieldIndex().field_index(); |
| 2107 if (properties->get(index)->IsTheHole() || !lookup.IsReadOnly()) { | 2132 if (properties->get(index)->IsTheHole() || !lookup.IsReadOnly()) { |
| 2108 properties->set(index, *value); | 2133 properties->set(index, *value); |
| 2109 } | 2134 } |
| 2110 } else if (lookup.IsNormal()) { | 2135 } else if (lookup.IsNormal()) { |
| 2111 if (global->GetNormalizedProperty(&lookup)->IsTheHole() || | 2136 if (global->GetNormalizedProperty(&lookup)->IsTheHole() || |
| 2112 !lookup.IsReadOnly()) { | 2137 !lookup.IsReadOnly()) { |
| 2113 global->SetNormalizedProperty(&lookup, *value); | 2138 HandleScope scope(isolate); |
| 2139 JSObject::SetNormalizedProperty(Handle<JSObject>(global), &lookup, value); |
| 2114 } | 2140 } |
| 2115 } else { | 2141 } else { |
| 2116 // Ignore re-initialization of constants that have already been | 2142 // Ignore re-initialization of constants that have already been |
| 2117 // assigned a function value. | 2143 // assigned a function value. |
| 2118 ASSERT(lookup.IsReadOnly() && lookup.IsConstantFunction()); | 2144 ASSERT(lookup.IsReadOnly() && lookup.IsConstantFunction()); |
| 2119 } | 2145 } |
| 2120 | 2146 |
| 2121 // Use the set value as the result of the operation. | 2147 // Use the set value as the result of the operation. |
| 2122 return *value; | 2148 return *value; |
| 2123 } | 2149 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2192 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only | 2218 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only |
| 2193 | 2219 |
| 2194 if (lookup.IsField()) { | 2220 if (lookup.IsField()) { |
| 2195 FixedArray* properties = object->properties(); | 2221 FixedArray* properties = object->properties(); |
| 2196 int index = lookup.GetFieldIndex().field_index(); | 2222 int index = lookup.GetFieldIndex().field_index(); |
| 2197 if (properties->get(index)->IsTheHole()) { | 2223 if (properties->get(index)->IsTheHole()) { |
| 2198 properties->set(index, *value); | 2224 properties->set(index, *value); |
| 2199 } | 2225 } |
| 2200 } else if (lookup.IsNormal()) { | 2226 } else if (lookup.IsNormal()) { |
| 2201 if (object->GetNormalizedProperty(&lookup)->IsTheHole()) { | 2227 if (object->GetNormalizedProperty(&lookup)->IsTheHole()) { |
| 2202 object->SetNormalizedProperty(&lookup, *value); | 2228 JSObject::SetNormalizedProperty(object, &lookup, value); |
| 2203 } | 2229 } |
| 2204 } else { | 2230 } else { |
| 2205 // We should not reach here. Any real, named property should be | 2231 // We should not reach here. Any real, named property should be |
| 2206 // either a field or a dictionary slot. | 2232 // either a field or a dictionary slot. |
| 2207 UNREACHABLE(); | 2233 UNREACHABLE(); |
| 2208 } | 2234 } |
| 2209 } else { | 2235 } else { |
| 2210 // The property was found on some other object. Set it if it is not a | 2236 // The property was found on some other object. Set it if it is not a |
| 2211 // read-only property. | 2237 // read-only property. |
| 2212 if ((attributes & READ_ONLY) == 0) { | 2238 if ((attributes & READ_ONLY) == 0) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2244 // length of a string, i.e. it is always a Smi. We check anyway for security. | 2270 // length of a string, i.e. it is always a Smi. We check anyway for security. |
| 2245 CONVERT_SMI_ARG_CHECKED(index, 2); | 2271 CONVERT_SMI_ARG_CHECKED(index, 2); |
| 2246 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); | 2272 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); |
| 2247 RUNTIME_ASSERT(index >= 0); | 2273 RUNTIME_ASSERT(index >= 0); |
| 2248 RUNTIME_ASSERT(index <= subject->length()); | 2274 RUNTIME_ASSERT(index <= subject->length()); |
| 2249 isolate->counters()->regexp_entry_runtime()->Increment(); | 2275 isolate->counters()->regexp_entry_runtime()->Increment(); |
| 2250 Handle<Object> result = RegExpImpl::Exec(regexp, | 2276 Handle<Object> result = RegExpImpl::Exec(regexp, |
| 2251 subject, | 2277 subject, |
| 2252 index, | 2278 index, |
| 2253 last_match_info); | 2279 last_match_info); |
| 2254 if (result.is_null()) return Failure::Exception(); | 2280 RETURN_IF_EMPTY_HANDLE(isolate, result); |
| 2255 return *result; | 2281 return *result; |
| 2256 } | 2282 } |
| 2257 | 2283 |
| 2258 | 2284 |
| 2259 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) { | 2285 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) { |
| 2260 SealHandleScope shs(isolate); | 2286 SealHandleScope shs(isolate); |
| 2261 ASSERT(args.length() == 3); | 2287 ASSERT(args.length() == 3); |
| 2262 CONVERT_SMI_ARG_CHECKED(elements_count, 0); | 2288 CONVERT_SMI_ARG_CHECKED(elements_count, 0); |
| 2263 if (elements_count < 0 || | 2289 if (elements_count < 0 || |
| 2264 elements_count > FixedArray::kMaxLength || | 2290 elements_count > FixedArray::kMaxLength || |
| (...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3593 template<typename ResultSeqString> | 3619 template<typename ResultSeqString> |
| 3594 MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString( | 3620 MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString( |
| 3595 Isolate* isolate, | 3621 Isolate* isolate, |
| 3596 Handle<String> subject, | 3622 Handle<String> subject, |
| 3597 Handle<JSRegExp> pattern_regexp, | 3623 Handle<JSRegExp> pattern_regexp, |
| 3598 Handle<String> replacement, | 3624 Handle<String> replacement, |
| 3599 Handle<JSArray> last_match_info) { | 3625 Handle<JSArray> last_match_info) { |
| 3600 ASSERT(subject->IsFlat()); | 3626 ASSERT(subject->IsFlat()); |
| 3601 ASSERT(replacement->IsFlat()); | 3627 ASSERT(replacement->IsFlat()); |
| 3602 | 3628 |
| 3603 Zone zone(isolate); | 3629 ZoneScope zone_scope(isolate->runtime_zone()); |
| 3604 ZoneList<int> indices(8, &zone); | 3630 ZoneList<int> indices(8, zone_scope.zone()); |
| 3605 ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); | 3631 ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); |
| 3606 String* pattern = | 3632 String* pattern = |
| 3607 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); | 3633 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); |
| 3608 int subject_len = subject->length(); | 3634 int subject_len = subject->length(); |
| 3609 int pattern_len = pattern->length(); | 3635 int pattern_len = pattern->length(); |
| 3610 int replacement_len = replacement->length(); | 3636 int replacement_len = replacement->length(); |
| 3611 | 3637 |
| 3612 FindStringIndicesDispatch( | 3638 FindStringIndicesDispatch( |
| 3613 isolate, *subject, pattern, &indices, 0xffffffff, &zone); | 3639 isolate, *subject, pattern, &indices, 0xffffffff, zone_scope.zone()); |
| 3614 | 3640 |
| 3615 int matches = indices.length(); | 3641 int matches = indices.length(); |
| 3616 if (matches == 0) return *subject; | 3642 if (matches == 0) return *subject; |
| 3617 | 3643 |
| 3618 // Detect integer overflow. | 3644 // Detect integer overflow. |
| 3619 int64_t result_len_64 = | 3645 int64_t result_len_64 = |
| 3620 (static_cast<int64_t>(replacement_len) - | 3646 (static_cast<int64_t>(replacement_len) - |
| 3621 static_cast<int64_t>(pattern_len)) * | 3647 static_cast<int64_t>(pattern_len)) * |
| 3622 static_cast<int64_t>(matches) + | 3648 static_cast<int64_t>(matches) + |
| 3623 static_cast<int64_t>(subject_len); | 3649 static_cast<int64_t>(subject_len); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3679 Handle<JSRegExp> regexp, | 3705 Handle<JSRegExp> regexp, |
| 3680 Handle<String> replacement, | 3706 Handle<String> replacement, |
| 3681 Handle<JSArray> last_match_info) { | 3707 Handle<JSArray> last_match_info) { |
| 3682 ASSERT(subject->IsFlat()); | 3708 ASSERT(subject->IsFlat()); |
| 3683 ASSERT(replacement->IsFlat()); | 3709 ASSERT(replacement->IsFlat()); |
| 3684 | 3710 |
| 3685 int capture_count = regexp->CaptureCount(); | 3711 int capture_count = regexp->CaptureCount(); |
| 3686 int subject_length = subject->length(); | 3712 int subject_length = subject->length(); |
| 3687 | 3713 |
| 3688 // CompiledReplacement uses zone allocation. | 3714 // CompiledReplacement uses zone allocation. |
| 3689 Zone zone(isolate); | 3715 ZoneScope zone_scope(isolate->runtime_zone()); |
| 3690 CompiledReplacement compiled_replacement(&zone); | 3716 CompiledReplacement compiled_replacement(zone_scope.zone()); |
| 3691 bool simple_replace = compiled_replacement.Compile(replacement, | 3717 bool simple_replace = compiled_replacement.Compile(replacement, |
| 3692 capture_count, | 3718 capture_count, |
| 3693 subject_length); | 3719 subject_length); |
| 3694 | 3720 |
| 3695 // Shortcut for simple non-regexp global replacements | 3721 // Shortcut for simple non-regexp global replacements |
| 3696 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) { | 3722 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) { |
| 3697 if (subject->HasOnlyOneByteChars() && | 3723 if (subject->HasOnlyOneByteChars() && |
| 3698 replacement->HasOnlyOneByteChars()) { | 3724 replacement->HasOnlyOneByteChars()) { |
| 3699 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( | 3725 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( |
| 3700 isolate, subject, regexp, replacement, last_match_info); | 3726 isolate, subject, regexp, replacement, last_match_info); |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4062 } | 4088 } |
| 4063 j++; | 4089 j++; |
| 4064 } | 4090 } |
| 4065 if (j == pattern_length) { | 4091 if (j == pattern_length) { |
| 4066 return i; | 4092 return i; |
| 4067 } | 4093 } |
| 4068 } | 4094 } |
| 4069 return -1; | 4095 return -1; |
| 4070 } | 4096 } |
| 4071 | 4097 |
| 4098 |
| 4072 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) { | 4099 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) { |
| 4073 HandleScope scope(isolate); | 4100 HandleScope scope(isolate); |
| 4074 ASSERT(args.length() == 3); | 4101 ASSERT(args.length() == 3); |
| 4075 | 4102 |
| 4076 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); | 4103 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); |
| 4077 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); | 4104 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); |
| 4078 | 4105 |
| 4079 Object* index = args[2]; | 4106 Object* index = args[2]; |
| 4080 uint32_t start_index; | 4107 uint32_t start_index; |
| 4081 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); | 4108 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4213 | 4240 |
| 4214 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); | 4241 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
| 4215 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); | 4242 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); |
| 4216 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); | 4243 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); |
| 4217 | 4244 |
| 4218 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); | 4245 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); |
| 4219 if (global_cache.HasException()) return Failure::Exception(); | 4246 if (global_cache.HasException()) return Failure::Exception(); |
| 4220 | 4247 |
| 4221 int capture_count = regexp->CaptureCount(); | 4248 int capture_count = regexp->CaptureCount(); |
| 4222 | 4249 |
| 4223 Zone zone(isolate); | 4250 ZoneScope zone_scope(isolate->runtime_zone()); |
| 4224 ZoneList<int> offsets(8, &zone); | 4251 ZoneList<int> offsets(8, zone_scope.zone()); |
| 4225 | 4252 |
| 4226 while (true) { | 4253 while (true) { |
| 4227 int32_t* match = global_cache.FetchNext(); | 4254 int32_t* match = global_cache.FetchNext(); |
| 4228 if (match == NULL) break; | 4255 if (match == NULL) break; |
| 4229 offsets.Add(match[0], &zone); // start | 4256 offsets.Add(match[0], zone_scope.zone()); // start |
| 4230 offsets.Add(match[1], &zone); // end | 4257 offsets.Add(match[1], zone_scope.zone()); // end |
| 4231 } | 4258 } |
| 4232 | 4259 |
| 4233 if (global_cache.HasException()) return Failure::Exception(); | 4260 if (global_cache.HasException()) return Failure::Exception(); |
| 4234 | 4261 |
| 4235 if (offsets.length() == 0) { | 4262 if (offsets.length() == 0) { |
| 4236 // Not a single match. | 4263 // Not a single match. |
| 4237 return isolate->heap()->null_value(); | 4264 return isolate->heap()->null_value(); |
| 4238 } | 4265 } |
| 4239 | 4266 |
| 4240 RegExpImpl::SetLastMatchInfo(regexp_info, | 4267 RegExpImpl::SetLastMatchInfo(regexp_info, |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4783 CONVERT_SMI_ARG_CHECKED(unchecked, 4); | 4810 CONVERT_SMI_ARG_CHECKED(unchecked, 4); |
| 4784 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4811 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
| 4785 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | 4812 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); |
| 4786 | 4813 |
| 4787 bool fast = obj->HasFastProperties(); | 4814 bool fast = obj->HasFastProperties(); |
| 4788 JSObject::DefineAccessor(obj, name, getter, setter, attr); | 4815 JSObject::DefineAccessor(obj, name, getter, setter, attr); |
| 4789 if (fast) JSObject::TransformToFastProperties(obj, 0); | 4816 if (fast) JSObject::TransformToFastProperties(obj, 0); |
| 4790 return isolate->heap()->undefined_value(); | 4817 return isolate->heap()->undefined_value(); |
| 4791 } | 4818 } |
| 4792 | 4819 |
| 4820 |
| 4793 // Implements part of 8.12.9 DefineOwnProperty. | 4821 // Implements part of 8.12.9 DefineOwnProperty. |
| 4794 // There are 3 cases that lead here: | 4822 // There are 3 cases that lead here: |
| 4795 // Step 4a - define a new data property. | 4823 // Step 4a - define a new data property. |
| 4796 // Steps 9b & 12 - replace an existing accessor property with a data property. | 4824 // Steps 9b & 12 - replace an existing accessor property with a data property. |
| 4797 // Step 12 - update an existing data property with a data or generic | 4825 // Step 12 - update an existing data property with a data or generic |
| 4798 // descriptor. | 4826 // descriptor. |
| 4799 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { | 4827 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
| 4800 HandleScope scope(isolate); | 4828 HandleScope scope(isolate); |
| 4801 ASSERT(args.length() == 4); | 4829 ASSERT(args.length() == 4); |
| 4802 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); | 4830 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5182 | 5210 |
| 5183 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { | 5211 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { |
| 5184 HandleScope scope(isolate); | 5212 HandleScope scope(isolate); |
| 5185 RUNTIME_ASSERT(args.length() == 5); | 5213 RUNTIME_ASSERT(args.length() == 5); |
| 5186 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 5214 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 5187 CONVERT_SMI_ARG_CHECKED(store_index, 1); | 5215 CONVERT_SMI_ARG_CHECKED(store_index, 1); |
| 5188 Handle<Object> value = args.at<Object>(2); | 5216 Handle<Object> value = args.at<Object>(2); |
| 5189 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3); | 5217 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3); |
| 5190 CONVERT_SMI_ARG_CHECKED(literal_index, 4); | 5218 CONVERT_SMI_ARG_CHECKED(literal_index, 4); |
| 5191 | 5219 |
| 5192 Object* raw_boilerplate_object = literals->get(literal_index); | 5220 Object* raw_literal_cell = literals->get(literal_index); |
| 5193 Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object)); | 5221 JSArray* boilerplate = NULL; |
| 5222 if (raw_literal_cell->IsAllocationSite()) { |
| 5223 AllocationSite* site = AllocationSite::cast(raw_literal_cell); |
| 5224 boilerplate = JSArray::cast(site->payload()); |
| 5225 } else { |
| 5226 boilerplate = JSArray::cast(raw_literal_cell); |
| 5227 } |
| 5228 Handle<JSArray> boilerplate_object(boilerplate); |
| 5194 ElementsKind elements_kind = object->GetElementsKind(); | 5229 ElementsKind elements_kind = object->GetElementsKind(); |
| 5195 ASSERT(IsFastElementsKind(elements_kind)); | 5230 ASSERT(IsFastElementsKind(elements_kind)); |
| 5196 // Smis should never trigger transitions. | 5231 // Smis should never trigger transitions. |
| 5197 ASSERT(!value->IsSmi()); | 5232 ASSERT(!value->IsSmi()); |
| 5198 | 5233 |
| 5199 if (value->IsNumber()) { | 5234 if (value->IsNumber()) { |
| 5200 ASSERT(IsFastSmiElementsKind(elements_kind)); | 5235 ASSERT(IsFastSmiElementsKind(elements_kind)); |
| 5201 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind) | 5236 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind) |
| 5202 ? FAST_HOLEY_DOUBLE_ELEMENTS | 5237 ? FAST_HOLEY_DOUBLE_ELEMENTS |
| 5203 : FAST_DOUBLE_ELEMENTS; | 5238 : FAST_DOUBLE_ELEMENTS; |
| (...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6305 } | 6340 } |
| 6306 | 6341 |
| 6307 // The limit can be very large (0xffffffffu), but since the pattern | 6342 // The limit can be very large (0xffffffffu), but since the pattern |
| 6308 // isn't empty, we can never create more parts than ~half the length | 6343 // isn't empty, we can never create more parts than ~half the length |
| 6309 // of the subject. | 6344 // of the subject. |
| 6310 | 6345 |
| 6311 if (!subject->IsFlat()) FlattenString(subject); | 6346 if (!subject->IsFlat()) FlattenString(subject); |
| 6312 | 6347 |
| 6313 static const int kMaxInitialListCapacity = 16; | 6348 static const int kMaxInitialListCapacity = 16; |
| 6314 | 6349 |
| 6315 Zone zone(isolate); | 6350 ZoneScope zone_scope(isolate->runtime_zone()); |
| 6316 | 6351 |
| 6317 // Find (up to limit) indices of separator and end-of-string in subject | 6352 // Find (up to limit) indices of separator and end-of-string in subject |
| 6318 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit); | 6353 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit); |
| 6319 ZoneList<int> indices(initial_capacity, &zone); | 6354 ZoneList<int> indices(initial_capacity, zone_scope.zone()); |
| 6320 if (!pattern->IsFlat()) FlattenString(pattern); | 6355 if (!pattern->IsFlat()) FlattenString(pattern); |
| 6321 | 6356 |
| 6322 FindStringIndicesDispatch(isolate, *subject, *pattern, | 6357 FindStringIndicesDispatch(isolate, *subject, *pattern, |
| 6323 &indices, limit, &zone); | 6358 &indices, limit, zone_scope.zone()); |
| 6324 | 6359 |
| 6325 if (static_cast<uint32_t>(indices.length()) < limit) { | 6360 if (static_cast<uint32_t>(indices.length()) < limit) { |
| 6326 indices.Add(subject_length, &zone); | 6361 indices.Add(subject_length, zone_scope.zone()); |
| 6327 } | 6362 } |
| 6328 | 6363 |
| 6329 // The list indices now contains the end of each part to create. | 6364 // The list indices now contains the end of each part to create. |
| 6330 | 6365 |
| 6331 // Create JSArray of substrings separated by separator. | 6366 // Create JSArray of substrings separated by separator. |
| 6332 int part_count = indices.length(); | 6367 int part_count = indices.length(); |
| 6333 | 6368 |
| 6334 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count); | 6369 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count); |
| 6335 MaybeObject* maybe_result = result->EnsureCanContainHeapObjectElements(); | 6370 MaybeObject* maybe_result = result->EnsureCanContainHeapObjectElements(); |
| 6336 if (maybe_result->IsFailure()) return maybe_result; | 6371 if (maybe_result->IsFailure()) return maybe_result; |
| (...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7457 | 7492 |
| 7458 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) { | 7493 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) { |
| 7459 SealHandleScope shs(isolate); | 7494 SealHandleScope shs(isolate); |
| 7460 ASSERT(args.length() == 1); | 7495 ASSERT(args.length() == 1); |
| 7461 isolate->counters()->math_log()->Increment(); | 7496 isolate->counters()->math_log()->Increment(); |
| 7462 | 7497 |
| 7463 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7498 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7464 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x); | 7499 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x); |
| 7465 } | 7500 } |
| 7466 | 7501 |
| 7502 |
| 7467 // Slow version of Math.pow. We check for fast paths for special cases. | 7503 // Slow version of Math.pow. We check for fast paths for special cases. |
| 7468 // Used if SSE2/VFP3 is not available. | 7504 // Used if SSE2/VFP3 is not available. |
| 7469 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) { | 7505 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) { |
| 7470 SealHandleScope shs(isolate); | 7506 SealHandleScope shs(isolate); |
| 7471 ASSERT(args.length() == 2); | 7507 ASSERT(args.length() == 2); |
| 7472 isolate->counters()->math_pow()->Increment(); | 7508 isolate->counters()->math_pow()->Increment(); |
| 7473 | 7509 |
| 7474 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7510 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7475 | 7511 |
| 7476 // If the second argument is a smi, it is much faster to call the | 7512 // If the second argument is a smi, it is much faster to call the |
| 7477 // custom powi() function than the generic pow(). | 7513 // custom powi() function than the generic pow(). |
| 7478 if (args[1]->IsSmi()) { | 7514 if (args[1]->IsSmi()) { |
| 7479 int y = args.smi_at(1); | 7515 int y = args.smi_at(1); |
| 7480 return isolate->heap()->NumberFromDouble(power_double_int(x, y)); | 7516 return isolate->heap()->NumberFromDouble(power_double_int(x, y)); |
| 7481 } | 7517 } |
| 7482 | 7518 |
| 7483 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7519 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7484 double result = power_helper(x, y); | 7520 double result = power_helper(x, y); |
| 7485 if (std::isnan(result)) return isolate->heap()->nan_value(); | 7521 if (std::isnan(result)) return isolate->heap()->nan_value(); |
| 7486 return isolate->heap()->AllocateHeapNumber(result); | 7522 return isolate->heap()->AllocateHeapNumber(result); |
| 7487 } | 7523 } |
| 7488 | 7524 |
| 7525 |
| 7489 // Fast version of Math.pow if we know that y is not an integer and y is not | 7526 // Fast version of Math.pow if we know that y is not an integer and y is not |
| 7490 // -0.5 or 0.5. Used as slow case from full codegen. | 7527 // -0.5 or 0.5. Used as slow case from full codegen. |
| 7491 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) { | 7528 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) { |
| 7492 SealHandleScope shs(isolate); | 7529 SealHandleScope shs(isolate); |
| 7493 ASSERT(args.length() == 2); | 7530 ASSERT(args.length() == 2); |
| 7494 isolate->counters()->math_pow()->Increment(); | 7531 isolate->counters()->math_pow()->Increment(); |
| 7495 | 7532 |
| 7496 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7533 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7497 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7534 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7498 if (y == 0) { | 7535 if (y == 0) { |
| (...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8307 | 8344 |
| 8308 return isolate->heap()->undefined_value(); | 8345 return isolate->heap()->undefined_value(); |
| 8309 } | 8346 } |
| 8310 | 8347 |
| 8311 | 8348 |
| 8312 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompleteOptimization) { | 8349 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompleteOptimization) { |
| 8313 HandleScope scope(isolate); | 8350 HandleScope scope(isolate); |
| 8314 ASSERT(args.length() == 1); | 8351 ASSERT(args.length() == 1); |
| 8315 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 8352 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
| 8316 if (FLAG_parallel_recompilation && V8::UseCrankshaft()) { | 8353 if (FLAG_parallel_recompilation && V8::UseCrankshaft()) { |
| 8317 // While function is in optimization pipeline, it is marked with builtins. | 8354 // While function is in optimization pipeline, it is marked accordingly. |
| 8318 while (function->code()->kind() == Code::BUILTIN) { | 8355 // Note that if the debugger is activated during parallel recompilation, |
| 8356 // the function will be marked with the lazy-recompile builtin, which is |
| 8357 // not related to parallel recompilation. |
| 8358 while (function->IsMarkedForParallelRecompilation() || |
| 8359 function->IsInRecompileQueue() || |
| 8360 function->IsMarkedForInstallingRecompiledCode()) { |
| 8319 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); | 8361 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); |
| 8320 OS::Sleep(50); | 8362 OS::Sleep(50); |
| 8321 } | 8363 } |
| 8322 } | 8364 } |
| 8323 return isolate->heap()->undefined_value(); | 8365 return isolate->heap()->undefined_value(); |
| 8324 } | 8366 } |
| 8325 | 8367 |
| 8326 | 8368 |
| 8327 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { | 8369 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { |
| 8328 HandleScope scope(isolate); | 8370 HandleScope scope(isolate); |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8841 // (edx:eax on ia32, r1:r0 on ARM). | 8883 // (edx:eax on ia32, r1:r0 on ARM). |
| 8842 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. | 8884 // In AMD-64 calling convention a struct of two pointers is returned in rdx:rax. |
| 8843 // In Win64 calling convention, a struct of two pointers is returned in memory, | 8885 // In Win64 calling convention, a struct of two pointers is returned in memory, |
| 8844 // allocated by the caller, and passed as a pointer in a hidden first parameter. | 8886 // allocated by the caller, and passed as a pointer in a hidden first parameter. |
| 8845 #ifdef V8_HOST_ARCH_64_BIT | 8887 #ifdef V8_HOST_ARCH_64_BIT |
| 8846 struct ObjectPair { | 8888 struct ObjectPair { |
| 8847 MaybeObject* x; | 8889 MaybeObject* x; |
| 8848 MaybeObject* y; | 8890 MaybeObject* y; |
| 8849 }; | 8891 }; |
| 8850 | 8892 |
| 8893 |
| 8851 static inline ObjectPair MakePair(MaybeObject* x, MaybeObject* y) { | 8894 static inline ObjectPair MakePair(MaybeObject* x, MaybeObject* y) { |
| 8852 ObjectPair result = {x, y}; | 8895 ObjectPair result = {x, y}; |
| 8853 // Pointers x and y returned in rax and rdx, in AMD-x64-abi. | 8896 // Pointers x and y returned in rax and rdx, in AMD-x64-abi. |
| 8854 // In Win64 they are assigned to a hidden first argument. | 8897 // In Win64 they are assigned to a hidden first argument. |
| 8855 return result; | 8898 return result; |
| 8856 } | 8899 } |
| 8857 #else | 8900 #else |
| 8858 typedef uint64_t ObjectPair; | 8901 typedef uint64_t ObjectPair; |
| 8859 static inline ObjectPair MakePair(MaybeObject* x, MaybeObject* y) { | 8902 static inline ObjectPair MakePair(MaybeObject* x, MaybeObject* y) { |
| 8860 return reinterpret_cast<uint32_t>(x) | | 8903 return reinterpret_cast<uint32_t>(x) | |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9366 context->ErrorMessageForCodeGenerationFromStrings(); | 9409 context->ErrorMessageForCodeGenerationFromStrings(); |
| 9367 return isolate->Throw(*isolate->factory()->NewEvalError( | 9410 return isolate->Throw(*isolate->factory()->NewEvalError( |
| 9368 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); | 9411 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); |
| 9369 } | 9412 } |
| 9370 | 9413 |
| 9371 // Compile source string in the native context. | 9414 // Compile source string in the native context. |
| 9372 ParseRestriction restriction = function_literal_only | 9415 ParseRestriction restriction = function_literal_only |
| 9373 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; | 9416 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; |
| 9374 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 9417 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
| 9375 source, context, true, CLASSIC_MODE, restriction, RelocInfo::kNoPosition); | 9418 source, context, true, CLASSIC_MODE, restriction, RelocInfo::kNoPosition); |
| 9376 if (shared.is_null()) return Failure::Exception(); | 9419 RETURN_IF_EMPTY_HANDLE(isolate, shared); |
| 9377 Handle<JSFunction> fun = | 9420 Handle<JSFunction> fun = |
| 9378 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 9421 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, |
| 9379 context, | 9422 context, |
| 9380 NOT_TENURED); | 9423 NOT_TENURED); |
| 9381 return *fun; | 9424 return *fun; |
| 9382 } | 9425 } |
| 9383 | 9426 |
| 9384 | 9427 |
| 9385 static ObjectPair CompileGlobalEval(Isolate* isolate, | 9428 static ObjectPair CompileGlobalEval(Isolate* isolate, |
| 9386 Handle<String> source, | 9429 Handle<String> source, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 9403 | 9446 |
| 9404 // Deal with a normal eval call with a string argument. Compile it | 9447 // Deal with a normal eval call with a string argument. Compile it |
| 9405 // and return the compiled function bound in the local context. | 9448 // and return the compiled function bound in the local context. |
| 9406 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 9449 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
| 9407 source, | 9450 source, |
| 9408 context, | 9451 context, |
| 9409 context->IsNativeContext(), | 9452 context->IsNativeContext(), |
| 9410 language_mode, | 9453 language_mode, |
| 9411 NO_PARSE_RESTRICTION, | 9454 NO_PARSE_RESTRICTION, |
| 9412 scope_position); | 9455 scope_position); |
| 9413 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); | 9456 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, shared, |
| 9457 MakePair(Failure::Exception(), NULL)); |
| 9414 Handle<JSFunction> compiled = | 9458 Handle<JSFunction> compiled = |
| 9415 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 9459 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| 9416 shared, context, NOT_TENURED); | 9460 shared, context, NOT_TENURED); |
| 9417 return MakePair(*compiled, *receiver); | 9461 return MakePair(*compiled, *receiver); |
| 9418 } | 9462 } |
| 9419 | 9463 |
| 9420 | 9464 |
| 9421 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { | 9465 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { |
| 9422 HandleScope scope(isolate); | 9466 HandleScope scope(isolate); |
| 9423 ASSERT(args.length() == 5); | 9467 ASSERT(args.length() == 5); |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10222 CONVERT_ARG_CHECKED(String, string, 0); | 10266 CONVERT_ARG_CHECKED(String, string, 0); |
| 10223 ConsStringIteratorOp op; | 10267 ConsStringIteratorOp op; |
| 10224 StringCharacterStream stream(string, &op); | 10268 StringCharacterStream stream(string, &op); |
| 10225 while (stream.HasMore()) { | 10269 while (stream.HasMore()) { |
| 10226 uint16_t character = stream.GetNext(); | 10270 uint16_t character = stream.GetNext(); |
| 10227 PrintF("%c", character); | 10271 PrintF("%c", character); |
| 10228 } | 10272 } |
| 10229 return string; | 10273 return string; |
| 10230 } | 10274 } |
| 10231 | 10275 |
| 10276 |
| 10232 // Moves all own elements of an object, that are below a limit, to positions | 10277 // Moves all own elements of an object, that are below a limit, to positions |
| 10233 // starting at zero. All undefined values are placed after non-undefined values, | 10278 // starting at zero. All undefined values are placed after non-undefined values, |
| 10234 // and are followed by non-existing element. Does not change the length | 10279 // and are followed by non-existing element. Does not change the length |
| 10235 // property. | 10280 // property. |
| 10236 // Returns the number of non-undefined elements collected. | 10281 // Returns the number of non-undefined elements collected. |
| 10237 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { | 10282 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { |
| 10238 SealHandleScope shs(isolate); | 10283 SealHandleScope shs(isolate); |
| 10239 ASSERT(args.length() == 2); | 10284 ASSERT(args.length() == 2); |
| 10240 CONVERT_ARG_CHECKED(JSObject, object, 0); | 10285 CONVERT_ARG_CHECKED(JSObject, object, 0); |
| 10241 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); | 10286 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); |
| (...skipping 1597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11839 | 11884 |
| 11840 // Fill in scope details. | 11885 // Fill in scope details. |
| 11841 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type())); | 11886 details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type())); |
| 11842 Handle<JSObject> scope_object = it->ScopeObject(); | 11887 Handle<JSObject> scope_object = it->ScopeObject(); |
| 11843 RETURN_IF_EMPTY_HANDLE(isolate, scope_object); | 11888 RETURN_IF_EMPTY_HANDLE(isolate, scope_object); |
| 11844 details->set(kScopeDetailsObjectIndex, *scope_object); | 11889 details->set(kScopeDetailsObjectIndex, *scope_object); |
| 11845 | 11890 |
| 11846 return *isolate->factory()->NewJSArrayWithElements(details); | 11891 return *isolate->factory()->NewJSArrayWithElements(details); |
| 11847 } | 11892 } |
| 11848 | 11893 |
| 11894 |
| 11849 // Return an array with scope details | 11895 // Return an array with scope details |
| 11850 // args[0]: number: break id | 11896 // args[0]: number: break id |
| 11851 // args[1]: number: frame index | 11897 // args[1]: number: frame index |
| 11852 // args[2]: number: inlined frame index | 11898 // args[2]: number: inlined frame index |
| 11853 // args[3]: number: scope index | 11899 // args[3]: number: scope index |
| 11854 // | 11900 // |
| 11855 // The array returned contains the following information: | 11901 // The array returned contains the following information: |
| 11856 // 0: Scope type | 11902 // 0: Scope type |
| 11857 // 1: Scope object | 11903 // 1: Scope object |
| 11858 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { | 11904 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12090 // args[0]: disable break state | 12136 // args[0]: disable break state |
| 12091 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) { | 12137 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) { |
| 12092 HandleScope scope(isolate); | 12138 HandleScope scope(isolate); |
| 12093 ASSERT(args.length() == 1); | 12139 ASSERT(args.length() == 1); |
| 12094 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 0); | 12140 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 0); |
| 12095 isolate->debug()->set_disable_break(disable_break); | 12141 isolate->debug()->set_disable_break(disable_break); |
| 12096 return isolate->heap()->undefined_value(); | 12142 return isolate->heap()->undefined_value(); |
| 12097 } | 12143 } |
| 12098 | 12144 |
| 12099 | 12145 |
| 12146 static bool IsPositionAlignmentCodeCorrect(int alignment) { |
| 12147 return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; |
| 12148 } |
| 12149 |
| 12150 |
| 12100 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) { | 12151 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) { |
| 12101 HandleScope scope(isolate); | 12152 HandleScope scope(isolate); |
| 12102 ASSERT(args.length() == 1); | 12153 ASSERT(args.length() == 2); |
| 12103 | 12154 |
| 12104 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 12155 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
| 12156 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); |
| 12157 |
| 12158 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { |
| 12159 return isolate->ThrowIllegalOperation(); |
| 12160 } |
| 12161 BreakPositionAlignment alignment = |
| 12162 static_cast<BreakPositionAlignment>(statement_aligned_code); |
| 12163 |
| 12105 Handle<SharedFunctionInfo> shared(fun->shared()); | 12164 Handle<SharedFunctionInfo> shared(fun->shared()); |
| 12106 // Find the number of break points | 12165 // Find the number of break points |
| 12107 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared); | 12166 Handle<Object> break_locations = |
| 12167 Debug::GetSourceBreakLocations(shared, alignment); |
| 12108 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); | 12168 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); |
| 12109 // Return array as JS array | 12169 // Return array as JS array |
| 12110 return *isolate->factory()->NewJSArrayWithElements( | 12170 return *isolate->factory()->NewJSArrayWithElements( |
| 12111 Handle<FixedArray>::cast(break_locations)); | 12171 Handle<FixedArray>::cast(break_locations)); |
| 12112 } | 12172 } |
| 12113 | 12173 |
| 12114 | 12174 |
| 12115 // Set a break point in a function. | 12175 // Set a break point in a function. |
| 12116 // args[0]: function | 12176 // args[0]: function |
| 12117 // args[1]: number: break source position (within the function source) | 12177 // args[1]: number: break source position (within the function source) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 12130 | 12190 |
| 12131 return Smi::FromInt(source_position); | 12191 return Smi::FromInt(source_position); |
| 12132 } | 12192 } |
| 12133 | 12193 |
| 12134 | 12194 |
| 12135 // Changes the state of a break point in a script and returns source position | 12195 // Changes the state of a break point in a script and returns source position |
| 12136 // where break point was set. NOTE: Regarding performance see the NOTE for | 12196 // where break point was set. NOTE: Regarding performance see the NOTE for |
| 12137 // GetScriptFromScriptData. | 12197 // GetScriptFromScriptData. |
| 12138 // args[0]: script to set break point in | 12198 // args[0]: script to set break point in |
| 12139 // args[1]: number: break source position (within the script source) | 12199 // args[1]: number: break source position (within the script source) |
| 12140 // args[2]: number: break point object | 12200 // args[2]: number, breakpoint position alignment |
| 12201 // args[3]: number: break point object |
| 12141 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) { | 12202 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) { |
| 12142 HandleScope scope(isolate); | 12203 HandleScope scope(isolate); |
| 12143 ASSERT(args.length() == 3); | 12204 ASSERT(args.length() == 4); |
| 12144 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); | 12205 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); |
| 12145 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 12206 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
| 12146 RUNTIME_ASSERT(source_position >= 0); | 12207 RUNTIME_ASSERT(source_position >= 0); |
| 12147 Handle<Object> break_point_object_arg = args.at<Object>(2); | 12208 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); |
| 12209 Handle<Object> break_point_object_arg = args.at<Object>(3); |
| 12210 |
| 12211 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { |
| 12212 return isolate->ThrowIllegalOperation(); |
| 12213 } |
| 12214 BreakPositionAlignment alignment = |
| 12215 static_cast<BreakPositionAlignment>(statement_aligned_code); |
| 12148 | 12216 |
| 12149 // Get the script from the script wrapper. | 12217 // Get the script from the script wrapper. |
| 12150 RUNTIME_ASSERT(wrapper->value()->IsScript()); | 12218 RUNTIME_ASSERT(wrapper->value()->IsScript()); |
| 12151 Handle<Script> script(Script::cast(wrapper->value())); | 12219 Handle<Script> script(Script::cast(wrapper->value())); |
| 12152 | 12220 |
| 12153 // Set break point. | 12221 // Set break point. |
| 12154 if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg, | 12222 if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg, |
| 12155 &source_position)) { | 12223 &source_position, |
| 12224 alignment)) { |
| 12156 return isolate->heap()->undefined_value(); | 12225 return isolate->heap()->undefined_value(); |
| 12157 } | 12226 } |
| 12158 | 12227 |
| 12159 return Smi::FromInt(source_position); | 12228 return Smi::FromInt(source_position); |
| 12160 } | 12229 } |
| 12161 | 12230 |
| 12162 | 12231 |
| 12163 // Clear a break point | 12232 // Clear a break point |
| 12164 // args[0]: number: break point object | 12233 // args[0]: number: break point object |
| 12165 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearBreakPoint) { | 12234 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearBreakPoint) { |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12380 context = isolate->factory()->NewWithContext(closure, context, extension); | 12449 context = isolate->factory()->NewWithContext(closure, context, extension); |
| 12381 } | 12450 } |
| 12382 | 12451 |
| 12383 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 12452 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
| 12384 source, | 12453 source, |
| 12385 context, | 12454 context, |
| 12386 context->IsNativeContext(), | 12455 context->IsNativeContext(), |
| 12387 CLASSIC_MODE, | 12456 CLASSIC_MODE, |
| 12388 NO_PARSE_RESTRICTION, | 12457 NO_PARSE_RESTRICTION, |
| 12389 RelocInfo::kNoPosition); | 12458 RelocInfo::kNoPosition); |
| 12390 if (shared.is_null()) return Failure::Exception(); | 12459 RETURN_IF_EMPTY_HANDLE(isolate, shared); |
| 12391 | 12460 |
| 12392 Handle<JSFunction> eval_fun = | 12461 Handle<JSFunction> eval_fun = |
| 12393 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 12462 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| 12394 shared, context, NOT_TENURED); | 12463 shared, context, NOT_TENURED); |
| 12395 bool pending_exception; | 12464 bool pending_exception; |
| 12396 Handle<Object> result = Execution::Call( | 12465 Handle<Object> result = Execution::Call( |
| 12397 eval_fun, receiver, 0, NULL, &pending_exception); | 12466 eval_fun, receiver, 0, NULL, &pending_exception); |
| 12398 | 12467 |
| 12399 if (pending_exception) return Failure::Exception(); | 12468 if (pending_exception) return Failure::Exception(); |
| 12400 | 12469 |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12922 continue; | 12991 continue; |
| 12923 } | 12992 } |
| 12924 if (counter < buffer_size) { | 12993 if (counter < buffer_size) { |
| 12925 buffer->set(counter, shared); | 12994 buffer->set(counter, shared); |
| 12926 } | 12995 } |
| 12927 counter++; | 12996 counter++; |
| 12928 } | 12997 } |
| 12929 return counter; | 12998 return counter; |
| 12930 } | 12999 } |
| 12931 | 13000 |
| 13001 |
| 12932 // For a script finds all SharedFunctionInfo's in the heap that points | 13002 // For a script finds all SharedFunctionInfo's in the heap that points |
| 12933 // to this script. Returns JSArray of SharedFunctionInfo wrapped | 13003 // to this script. Returns JSArray of SharedFunctionInfo wrapped |
| 12934 // in OpaqueReferences. | 13004 // in OpaqueReferences. |
| 12935 RUNTIME_FUNCTION(MaybeObject*, | 13005 RUNTIME_FUNCTION(MaybeObject*, |
| 12936 Runtime_LiveEditFindSharedFunctionInfosForScript) { | 13006 Runtime_LiveEditFindSharedFunctionInfosForScript) { |
| 12937 HandleScope scope(isolate); | 13007 HandleScope scope(isolate); |
| 12938 CHECK(isolate->debugger()->live_edit_enabled()); | 13008 CHECK(isolate->debugger()->live_edit_enabled()); |
| 12939 ASSERT(args.length() == 1); | 13009 ASSERT(args.length() == 1); |
| 12940 CONVERT_ARG_CHECKED(JSValue, script_value, 0); | 13010 CONVERT_ARG_CHECKED(JSValue, script_value, 0); |
| 12941 | 13011 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 12967 } | 13037 } |
| 12968 | 13038 |
| 12969 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(array); | 13039 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(array); |
| 12970 result->set_length(Smi::FromInt(number)); | 13040 result->set_length(Smi::FromInt(number)); |
| 12971 | 13041 |
| 12972 LiveEdit::WrapSharedFunctionInfos(result); | 13042 LiveEdit::WrapSharedFunctionInfos(result); |
| 12973 | 13043 |
| 12974 return *result; | 13044 return *result; |
| 12975 } | 13045 } |
| 12976 | 13046 |
| 13047 |
| 12977 // For a script calculates compilation information about all its functions. | 13048 // For a script calculates compilation information about all its functions. |
| 12978 // The script source is explicitly specified by the second argument. | 13049 // The script source is explicitly specified by the second argument. |
| 12979 // The source of the actual script is not used, however it is important that | 13050 // The source of the actual script is not used, however it is important that |
| 12980 // all generated code keeps references to this particular instance of script. | 13051 // all generated code keeps references to this particular instance of script. |
| 12981 // Returns a JSArray of compilation infos. The array is ordered so that | 13052 // Returns a JSArray of compilation infos. The array is ordered so that |
| 12982 // each function with all its descendant is always stored in a continues range | 13053 // each function with all its descendant is always stored in a continues range |
| 12983 // with the function itself going first. The root function is a script function. | 13054 // with the function itself going first. The root function is a script function. |
| 12984 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { | 13055 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { |
| 12985 HandleScope scope(isolate); | 13056 HandleScope scope(isolate); |
| 12986 CHECK(isolate->debugger()->live_edit_enabled()); | 13057 CHECK(isolate->debugger()->live_edit_enabled()); |
| 12987 ASSERT(args.length() == 2); | 13058 ASSERT(args.length() == 2); |
| 12988 CONVERT_ARG_CHECKED(JSValue, script, 0); | 13059 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 12989 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 13060 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
| 12990 | 13061 |
| 12991 RUNTIME_ASSERT(script->value()->IsScript()); | 13062 RUNTIME_ASSERT(script->value()->IsScript()); |
| 12992 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 13063 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 12993 | 13064 |
| 12994 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); | 13065 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); |
| 12995 | 13066 |
| 12996 if (isolate->has_pending_exception()) { | 13067 if (isolate->has_pending_exception()) { |
| 12997 return Failure::Exception(); | 13068 return Failure::Exception(); |
| 12998 } | 13069 } |
| 12999 | 13070 |
| 13000 return result; | 13071 return result; |
| 13001 } | 13072 } |
| 13002 | 13073 |
| 13074 |
| 13003 // Changes the source of the script to a new_source. | 13075 // Changes the source of the script to a new_source. |
| 13004 // If old_script_name is provided (i.e. is a String), also creates a copy of | 13076 // If old_script_name is provided (i.e. is a String), also creates a copy of |
| 13005 // the script with its original source and sends notification to debugger. | 13077 // the script with its original source and sends notification to debugger. |
| 13006 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) { | 13078 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) { |
| 13007 HandleScope scope(isolate); | 13079 HandleScope scope(isolate); |
| 13008 CHECK(isolate->debugger()->live_edit_enabled()); | 13080 CHECK(isolate->debugger()->live_edit_enabled()); |
| 13009 ASSERT(args.length() == 3); | 13081 ASSERT(args.length() == 3); |
| 13010 CONVERT_ARG_CHECKED(JSValue, original_script_value, 0); | 13082 CONVERT_ARG_CHECKED(JSValue, original_script_value, 0); |
| 13011 CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1); | 13083 CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1); |
| 13012 Handle<Object> old_script_name(args[2], isolate); | 13084 Handle<Object> old_script_name(args[2], isolate); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 13040 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) { | 13112 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) { |
| 13041 HandleScope scope(isolate); | 13113 HandleScope scope(isolate); |
| 13042 CHECK(isolate->debugger()->live_edit_enabled()); | 13114 CHECK(isolate->debugger()->live_edit_enabled()); |
| 13043 ASSERT(args.length() == 2); | 13115 ASSERT(args.length() == 2); |
| 13044 CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0); | 13116 CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0); |
| 13045 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1); | 13117 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1); |
| 13046 | 13118 |
| 13047 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); | 13119 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); |
| 13048 } | 13120 } |
| 13049 | 13121 |
| 13122 |
| 13050 // Connects SharedFunctionInfo to another script. | 13123 // Connects SharedFunctionInfo to another script. |
| 13051 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) { | 13124 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) { |
| 13052 HandleScope scope(isolate); | 13125 HandleScope scope(isolate); |
| 13053 CHECK(isolate->debugger()->live_edit_enabled()); | 13126 CHECK(isolate->debugger()->live_edit_enabled()); |
| 13054 ASSERT(args.length() == 2); | 13127 ASSERT(args.length() == 2); |
| 13055 Handle<Object> function_object(args[0], isolate); | 13128 Handle<Object> function_object(args[0], isolate); |
| 13056 Handle<Object> script_object(args[1], isolate); | 13129 Handle<Object> script_object(args[1], isolate); |
| 13057 | 13130 |
| 13058 if (function_object->IsJSValue()) { | 13131 if (function_object->IsJSValue()) { |
| 13059 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); | 13132 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13114 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) { | 13187 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) { |
| 13115 HandleScope scope(isolate); | 13188 HandleScope scope(isolate); |
| 13116 CHECK(isolate->debugger()->live_edit_enabled()); | 13189 CHECK(isolate->debugger()->live_edit_enabled()); |
| 13117 ASSERT(args.length() == 2); | 13190 ASSERT(args.length() == 2); |
| 13118 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); | 13191 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); |
| 13119 CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1); | 13192 CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1); |
| 13120 | 13193 |
| 13121 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); | 13194 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); |
| 13122 } | 13195 } |
| 13123 | 13196 |
| 13197 |
| 13124 // Compares 2 strings line-by-line, then token-wise and returns diff in form | 13198 // Compares 2 strings line-by-line, then token-wise and returns diff in form |
| 13125 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list | 13199 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list |
| 13126 // of diff chunks. | 13200 // of diff chunks. |
| 13127 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) { | 13201 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) { |
| 13128 HandleScope scope(isolate); | 13202 HandleScope scope(isolate); |
| 13129 CHECK(isolate->debugger()->live_edit_enabled()); | 13203 CHECK(isolate->debugger()->live_edit_enabled()); |
| 13130 ASSERT(args.length() == 2); | 13204 ASSERT(args.length() == 2); |
| 13131 CONVERT_ARG_HANDLE_CHECKED(String, s1, 0); | 13205 CONVERT_ARG_HANDLE_CHECKED(String, s1, 0); |
| 13132 CONVERT_ARG_HANDLE_CHECKED(String, s2, 1); | 13206 CONVERT_ARG_HANDLE_CHECKED(String, s2, 1); |
| 13133 | 13207 |
| (...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13758 } else { | 13832 } else { |
| 13759 // Non-smi length argument produces a dictionary | 13833 // Non-smi length argument produces a dictionary |
| 13760 can_use_type_feedback = false; | 13834 can_use_type_feedback = false; |
| 13761 } | 13835 } |
| 13762 } | 13836 } |
| 13763 | 13837 |
| 13764 JSArray* array; | 13838 JSArray* array; |
| 13765 MaybeObject* maybe_array; | 13839 MaybeObject* maybe_array; |
| 13766 if (!type_info.is_null() && | 13840 if (!type_info.is_null() && |
| 13767 *type_info != isolate->heap()->undefined_value() && | 13841 *type_info != isolate->heap()->undefined_value() && |
| 13768 Cell::cast(*type_info)->value()->IsSmi() && | 13842 Cell::cast(*type_info)->value()->IsAllocationSite() && |
| 13769 can_use_type_feedback) { | 13843 can_use_type_feedback) { |
| 13770 Cell* cell = Cell::cast(*type_info); | 13844 Handle<Cell> cell = Handle<Cell>::cast(type_info); |
| 13771 Smi* smi = Smi::cast(cell->value()); | 13845 Handle<AllocationSite> site = Handle<AllocationSite>( |
| 13772 ElementsKind to_kind = static_cast<ElementsKind>(smi->value()); | 13846 AllocationSite::cast(cell->value()), isolate); |
| 13847 ASSERT(!site->IsLiteralSite()); |
| 13848 ElementsKind to_kind = site->GetElementsKindPayload(); |
| 13773 if (holey && !IsFastHoleyElementsKind(to_kind)) { | 13849 if (holey && !IsFastHoleyElementsKind(to_kind)) { |
| 13774 to_kind = GetHoleyElementsKind(to_kind); | 13850 to_kind = GetHoleyElementsKind(to_kind); |
| 13775 // Update the allocation site info to reflect the advice alteration. | 13851 // Update the allocation site info to reflect the advice alteration. |
| 13776 cell->set_value(Smi::FromInt(to_kind)); | 13852 site->SetElementsKindPayload(to_kind); |
| 13777 } | 13853 } |
| 13778 | 13854 |
| 13779 maybe_array = isolate->heap()->AllocateJSObjectWithAllocationSite( | 13855 maybe_array = isolate->heap()->AllocateJSObjectWithAllocationSite( |
| 13780 *constructor, type_info); | 13856 *constructor, site); |
| 13781 if (!maybe_array->To(&array)) return maybe_array; | 13857 if (!maybe_array->To(&array)) return maybe_array; |
| 13782 } else { | 13858 } else { |
| 13783 maybe_array = isolate->heap()->AllocateJSObject(*constructor); | 13859 maybe_array = isolate->heap()->AllocateJSObject(*constructor); |
| 13784 if (!maybe_array->To(&array)) return maybe_array; | 13860 if (!maybe_array->To(&array)) return maybe_array; |
| 13785 // We might need to transition to holey | 13861 // We might need to transition to holey |
| 13786 ElementsKind kind = constructor->initial_map()->elements_kind(); | 13862 ElementsKind kind = constructor->initial_map()->elements_kind(); |
| 13787 if (holey && !IsFastHoleyElementsKind(kind)) { | 13863 if (holey && !IsFastHoleyElementsKind(kind)) { |
| 13788 kind = GetHoleyElementsKind(kind); | 13864 kind = GetHoleyElementsKind(kind); |
| 13789 maybe_array = array->TransitionElementsKind(kind); | 13865 maybe_array = array->TransitionElementsKind(kind); |
| 13790 if (maybe_array->IsFailure()) return maybe_array; | 13866 if (maybe_array->IsFailure()) return maybe_array; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13919 // Handle last resort GC and make sure to allow future allocations | 13995 // Handle last resort GC and make sure to allow future allocations |
| 13920 // to grow the heap without causing GCs (if possible). | 13996 // to grow the heap without causing GCs (if possible). |
| 13921 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13997 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13922 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13998 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 13923 "Runtime::PerformGC"); | 13999 "Runtime::PerformGC"); |
| 13924 } | 14000 } |
| 13925 } | 14001 } |
| 13926 | 14002 |
| 13927 | 14003 |
| 13928 } } // namespace v8::internal | 14004 } } // namespace v8::internal |
| OLD | NEW |