| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 boilerplate->map()->unused_property_fields()); | 427 boilerplate->map()->unused_property_fields()); |
| 428 } | 428 } |
| 429 | 429 |
| 430 return boilerplate; | 430 return boilerplate; |
| 431 } | 431 } |
| 432 | 432 |
| 433 | 433 |
| 434 static const int kSmiOnlyLiteralMinimumLength = 1024; | 434 static const int kSmiOnlyLiteralMinimumLength = 1024; |
| 435 | 435 |
| 436 | 436 |
| 437 static Handle<Object> CreateArrayLiteralBoilerplate( | 437 // static |
| 438 Handle<Object> Runtime::CreateArrayLiteralBoilerplate( |
| 438 Isolate* isolate, | 439 Isolate* isolate, |
| 439 Handle<FixedArray> literals, | 440 Handle<FixedArray> literals, |
| 440 Handle<FixedArray> elements) { | 441 Handle<FixedArray> elements) { |
| 441 // Create the JSArray. | 442 // Create the JSArray. |
| 442 Handle<JSFunction> constructor( | 443 Handle<JSFunction> constructor( |
| 443 JSFunction::GlobalContextFromLiterals(*literals)->array_function()); | 444 JSFunction::GlobalContextFromLiterals(*literals)->array_function()); |
| 444 Handle<JSArray> object = | 445 Handle<JSArray> object = |
| 445 Handle<JSArray>::cast(isolate->factory()->NewJSObject(constructor)); | 446 Handle<JSArray>::cast(isolate->factory()->NewJSObject(constructor)); |
| 446 | 447 |
| 447 ElementsKind constant_elements_kind = | 448 ElementsKind constant_elements_kind = |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 elements, | 530 elements, |
| 530 true, | 531 true, |
| 531 kHasNoFunctionLiteral); | 532 kHasNoFunctionLiteral); |
| 532 case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: | 533 case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: |
| 533 return CreateObjectLiteralBoilerplate(isolate, | 534 return CreateObjectLiteralBoilerplate(isolate, |
| 534 literals, | 535 literals, |
| 535 elements, | 536 elements, |
| 536 false, | 537 false, |
| 537 kHasNoFunctionLiteral); | 538 kHasNoFunctionLiteral); |
| 538 case CompileTimeValue::ARRAY_LITERAL: | 539 case CompileTimeValue::ARRAY_LITERAL: |
| 539 return CreateArrayLiteralBoilerplate(isolate, literals, elements); | 540 return Runtime::CreateArrayLiteralBoilerplate( |
| 541 isolate, literals, elements); |
| 540 default: | 542 default: |
| 541 UNREACHABLE(); | 543 UNREACHABLE(); |
| 542 return Handle<Object>::null(); | 544 return Handle<Object>::null(); |
| 543 } | 545 } |
| 544 } | 546 } |
| 545 | 547 |
| 546 | 548 |
| 547 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { | 549 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { |
| 548 HandleScope scope(isolate); | 550 HandleScope scope(isolate); |
| 549 ASSERT(args.length() == 4); | 551 ASSERT(args.length() == 4); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { | 601 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { |
| 600 HandleScope scope(isolate); | 602 HandleScope scope(isolate); |
| 601 ASSERT(args.length() == 3); | 603 ASSERT(args.length() == 3); |
| 602 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 604 CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
| 603 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 605 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
| 604 CONVERT_ARG_CHECKED(FixedArray, elements, 2); | 606 CONVERT_ARG_CHECKED(FixedArray, elements, 2); |
| 605 | 607 |
| 606 // Check if boilerplate exists. If not, create it first. | 608 // Check if boilerplate exists. If not, create it first. |
| 607 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 609 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
| 608 if (*boilerplate == isolate->heap()->undefined_value()) { | 610 if (*boilerplate == isolate->heap()->undefined_value()) { |
| 609 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements); | 611 boilerplate = |
| 612 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
| 610 if (boilerplate.is_null()) return Failure::Exception(); | 613 if (boilerplate.is_null()) return Failure::Exception(); |
| 611 // Update the functions literal and return the boilerplate. | 614 // Update the functions literal and return the boilerplate. |
| 612 literals->set(literals_index, *boilerplate); | 615 literals->set(literals_index, *boilerplate); |
| 613 } | 616 } |
| 614 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); | 617 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); |
| 615 } | 618 } |
| 616 | 619 |
| 617 | 620 |
| 618 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { | 621 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { |
| 619 HandleScope scope(isolate); | 622 HandleScope scope(isolate); |
| 620 ASSERT(args.length() == 3); | 623 ASSERT(args.length() == 3); |
| 621 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 624 CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
| 622 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 625 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
| 623 CONVERT_ARG_CHECKED(FixedArray, elements, 2); | 626 CONVERT_ARG_CHECKED(FixedArray, elements, 2); |
| 624 | 627 |
| 625 // Check if boilerplate exists. If not, create it first. | 628 // Check if boilerplate exists. If not, create it first. |
| 626 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 629 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
| 627 if (*boilerplate == isolate->heap()->undefined_value()) { | 630 if (*boilerplate == isolate->heap()->undefined_value()) { |
| 628 ASSERT(*elements != isolate->heap()->empty_fixed_array()); | 631 ASSERT(*elements != isolate->heap()->empty_fixed_array()); |
| 629 boilerplate = CreateArrayLiteralBoilerplate(isolate, literals, elements); | 632 boilerplate = |
| 633 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
| 630 if (boilerplate.is_null()) return Failure::Exception(); | 634 if (boilerplate.is_null()) return Failure::Exception(); |
| 631 // Update the functions literal and return the boilerplate. | 635 // Update the functions literal and return the boilerplate. |
| 632 literals->set(literals_index, *boilerplate); | 636 literals->set(literals_index, *boilerplate); |
| 633 } | 637 } |
| 634 if (JSObject::cast(*boilerplate)->elements()->map() == | 638 if (JSObject::cast(*boilerplate)->elements()->map() == |
| 635 isolate->heap()->fixed_cow_array_map()) { | 639 isolate->heap()->fixed_cow_array_map()) { |
| 636 isolate->counters()->cow_arrays_created_runtime()->Increment(); | 640 isolate->counters()->cow_arrays_created_runtime()->Increment(); |
| 637 } | 641 } |
| 638 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); | 642 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); |
| 639 } | 643 } |
| (...skipping 12941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13581 } else { | 13585 } else { |
| 13582 // Handle last resort GC and make sure to allow future allocations | 13586 // Handle last resort GC and make sure to allow future allocations |
| 13583 // to grow the heap without causing GCs (if possible). | 13587 // to grow the heap without causing GCs (if possible). |
| 13584 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13588 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13585 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13589 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 13586 } | 13590 } |
| 13587 } | 13591 } |
| 13588 | 13592 |
| 13589 | 13593 |
| 13590 } } // namespace v8::internal | 13594 } } // namespace v8::internal |
| OLD | NEW |