| 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 13489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13500 static void CheckElementValue(i::Isolate* isolate, | 13500 static void CheckElementValue(i::Isolate* isolate, |
| 13501 int expected, | 13501 int expected, |
| 13502 i::Handle<i::Object> obj, | 13502 i::Handle<i::Object> obj, |
| 13503 int offset) { | 13503 int offset) { |
| 13504 i::Object* element = | 13504 i::Object* element = |
| 13505 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked(); | 13505 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked(); |
| 13506 CHECK_EQ(expected, i::Smi::cast(element)->value()); | 13506 CHECK_EQ(expected, i::Smi::cast(element)->value()); |
| 13507 } | 13507 } |
| 13508 | 13508 |
| 13509 | 13509 |
| 13510 THREADED_TEST(PixelArray) { | |
| 13511 LocalContext context; | |
| 13512 i::Isolate* isolate = CcTest::i_isolate(); | |
| 13513 i::Factory* factory = isolate->factory(); | |
| 13514 v8::HandleScope scope(context->GetIsolate()); | |
| 13515 const int kElementCount = 260; | |
| 13516 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount)); | |
| 13517 i::Handle<i::ExternalUint8ClampedArray> pixels = | |
| 13518 i::Handle<i::ExternalUint8ClampedArray>::cast( | |
| 13519 factory->NewExternalArray(kElementCount, | |
| 13520 v8::kExternalUint8ClampedArray, | |
| 13521 pixel_data)); | |
| 13522 // Force GC to trigger verification. | |
| 13523 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | |
| 13524 for (int i = 0; i < kElementCount; i++) { | |
| 13525 pixels->set(i, i % 256); | |
| 13526 } | |
| 13527 // Force GC to trigger verification. | |
| 13528 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | |
| 13529 for (int i = 0; i < kElementCount; i++) { | |
| 13530 CHECK_EQ(i % 256, pixels->get_scalar(i)); | |
| 13531 CHECK_EQ(i % 256, pixel_data[i]); | |
| 13532 } | |
| 13533 | |
| 13534 v8::Handle<v8::Object> obj = v8::Object::New(context->GetIsolate()); | |
| 13535 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); | |
| 13536 // Set the elements to be the pixels. | |
| 13537 // jsobj->set_elements(*pixels); | |
| 13538 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount); | |
| 13539 CheckElementValue(isolate, 1, jsobj, 1); | |
| 13540 obj->Set(v8_str("field"), v8::Int32::New(CcTest::isolate(), 1503)); | |
| 13541 context->Global()->Set(v8_str("pixels"), obj); | |
| 13542 v8::Handle<v8::Value> result = CompileRun("pixels.field"); | |
| 13543 CHECK_EQ(1503, result->Int32Value()); | |
| 13544 result = CompileRun("pixels[1]"); | |
| 13545 CHECK_EQ(1, result->Int32Value()); | |
| 13546 | |
| 13547 result = CompileRun("var sum = 0;" | |
| 13548 "for (var i = 0; i < 8; i++) {" | |
| 13549 " sum += pixels[i] = pixels[i] = -i;" | |
| 13550 "}" | |
| 13551 "sum;"); | |
| 13552 CHECK_EQ(-28, result->Int32Value()); | |
| 13553 | |
| 13554 result = CompileRun("var sum = 0;" | |
| 13555 "for (var i = 0; i < 8; i++) {" | |
| 13556 " sum += pixels[i] = pixels[i] = 0;" | |
| 13557 "}" | |
| 13558 "sum;"); | |
| 13559 CHECK_EQ(0, result->Int32Value()); | |
| 13560 | |
| 13561 result = CompileRun("var sum = 0;" | |
| 13562 "for (var i = 0; i < 8; i++) {" | |
| 13563 " sum += pixels[i] = pixels[i] = 255;" | |
| 13564 "}" | |
| 13565 "sum;"); | |
| 13566 CHECK_EQ(8 * 255, result->Int32Value()); | |
| 13567 | |
| 13568 result = CompileRun("var sum = 0;" | |
| 13569 "for (var i = 0; i < 8; i++) {" | |
| 13570 " sum += pixels[i] = pixels[i] = 256 + i;" | |
| 13571 "}" | |
| 13572 "sum;"); | |
| 13573 CHECK_EQ(2076, result->Int32Value()); | |
| 13574 | |
| 13575 result = CompileRun("var sum = 0;" | |
| 13576 "for (var i = 0; i < 8; i++) {" | |
| 13577 " sum += pixels[i] = pixels[i] = i;" | |
| 13578 "}" | |
| 13579 "sum;"); | |
| 13580 CHECK_EQ(28, result->Int32Value()); | |
| 13581 | |
| 13582 result = CompileRun("var sum = 0;" | |
| 13583 "for (var i = 0; i < 8; i++) {" | |
| 13584 " sum += pixels[i];" | |
| 13585 "}" | |
| 13586 "sum;"); | |
| 13587 CHECK_EQ(28, result->Int32Value()); | |
| 13588 | |
| 13589 i::Handle<i::Smi> value(i::Smi::FromInt(2), | |
| 13590 reinterpret_cast<i::Isolate*>(context->GetIsolate())); | |
| 13591 i::Handle<i::Object> no_failure; | |
| 13592 no_failure = i::JSObject::SetElement( | |
| 13593 jsobj, 1, value, NONE, i::SLOPPY).ToHandleChecked(); | |
| 13594 DCHECK(!no_failure.is_null()); | |
| 13595 USE(no_failure); | |
| 13596 CheckElementValue(isolate, 2, jsobj, 1); | |
| 13597 *value.location() = i::Smi::FromInt(256); | |
| 13598 no_failure = i::JSObject::SetElement( | |
| 13599 jsobj, 1, value, NONE, i::SLOPPY).ToHandleChecked(); | |
| 13600 DCHECK(!no_failure.is_null()); | |
| 13601 USE(no_failure); | |
| 13602 CheckElementValue(isolate, 255, jsobj, 1); | |
| 13603 *value.location() = i::Smi::FromInt(-1); | |
| 13604 no_failure = i::JSObject::SetElement( | |
| 13605 jsobj, 1, value, NONE, i::SLOPPY).ToHandleChecked(); | |
| 13606 DCHECK(!no_failure.is_null()); | |
| 13607 USE(no_failure); | |
| 13608 CheckElementValue(isolate, 0, jsobj, 1); | |
| 13609 | |
| 13610 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13611 " pixels[i] = (i * 65) - 109;" | |
| 13612 "}" | |
| 13613 "pixels[1] + pixels[6];"); | |
| 13614 CHECK_EQ(255, result->Int32Value()); | |
| 13615 CheckElementValue(isolate, 0, jsobj, 0); | |
| 13616 CheckElementValue(isolate, 0, jsobj, 1); | |
| 13617 CheckElementValue(isolate, 21, jsobj, 2); | |
| 13618 CheckElementValue(isolate, 86, jsobj, 3); | |
| 13619 CheckElementValue(isolate, 151, jsobj, 4); | |
| 13620 CheckElementValue(isolate, 216, jsobj, 5); | |
| 13621 CheckElementValue(isolate, 255, jsobj, 6); | |
| 13622 CheckElementValue(isolate, 255, jsobj, 7); | |
| 13623 result = CompileRun("var sum = 0;" | |
| 13624 "for (var i = 0; i < 8; i++) {" | |
| 13625 " sum += pixels[i];" | |
| 13626 "}" | |
| 13627 "sum;"); | |
| 13628 CHECK_EQ(984, result->Int32Value()); | |
| 13629 | |
| 13630 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13631 " pixels[i] = (i * 1.1);" | |
| 13632 "}" | |
| 13633 "pixels[1] + pixels[6];"); | |
| 13634 CHECK_EQ(8, result->Int32Value()); | |
| 13635 CheckElementValue(isolate, 0, jsobj, 0); | |
| 13636 CheckElementValue(isolate, 1, jsobj, 1); | |
| 13637 CheckElementValue(isolate, 2, jsobj, 2); | |
| 13638 CheckElementValue(isolate, 3, jsobj, 3); | |
| 13639 CheckElementValue(isolate, 4, jsobj, 4); | |
| 13640 CheckElementValue(isolate, 6, jsobj, 5); | |
| 13641 CheckElementValue(isolate, 7, jsobj, 6); | |
| 13642 CheckElementValue(isolate, 8, jsobj, 7); | |
| 13643 | |
| 13644 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13645 " pixels[7] = undefined;" | |
| 13646 "}" | |
| 13647 "pixels[7];"); | |
| 13648 CHECK_EQ(0, result->Int32Value()); | |
| 13649 CheckElementValue(isolate, 0, jsobj, 7); | |
| 13650 | |
| 13651 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13652 " pixels[6] = '2.3';" | |
| 13653 "}" | |
| 13654 "pixels[6];"); | |
| 13655 CHECK_EQ(2, result->Int32Value()); | |
| 13656 CheckElementValue(isolate, 2, jsobj, 6); | |
| 13657 | |
| 13658 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13659 " pixels[5] = NaN;" | |
| 13660 "}" | |
| 13661 "pixels[5];"); | |
| 13662 CHECK_EQ(0, result->Int32Value()); | |
| 13663 CheckElementValue(isolate, 0, jsobj, 5); | |
| 13664 | |
| 13665 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13666 " pixels[8] = Infinity;" | |
| 13667 "}" | |
| 13668 "pixels[8];"); | |
| 13669 CHECK_EQ(255, result->Int32Value()); | |
| 13670 CheckElementValue(isolate, 255, jsobj, 8); | |
| 13671 | |
| 13672 result = CompileRun("for (var i = 0; i < 8; i++) {" | |
| 13673 " pixels[9] = -Infinity;" | |
| 13674 "}" | |
| 13675 "pixels[9];"); | |
| 13676 CHECK_EQ(0, result->Int32Value()); | |
| 13677 CheckElementValue(isolate, 0, jsobj, 9); | |
| 13678 | |
| 13679 result = CompileRun("pixels[3] = 33;" | |
| 13680 "delete pixels[3];" | |
| 13681 "pixels[3];"); | |
| 13682 CHECK_EQ(33, result->Int32Value()); | |
| 13683 | |
| 13684 result = CompileRun("pixels[0] = 10; pixels[1] = 11;" | |
| 13685 "pixels[2] = 12; pixels[3] = 13;" | |
| 13686 "pixels.__defineGetter__('2'," | |
| 13687 "function() { return 120; });" | |
| 13688 "pixels[2];"); | |
| 13689 CHECK_EQ(12, result->Int32Value()); | |
| 13690 | |
| 13691 result = CompileRun("var js_array = new Array(40);" | |
| 13692 "js_array[0] = 77;" | |
| 13693 "js_array;"); | |
| 13694 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); | |
| 13695 | |
| 13696 result = CompileRun("pixels[1] = 23;" | |
| 13697 "pixels.__proto__ = [];" | |
| 13698 "js_array.__proto__ = pixels;" | |
| 13699 "js_array.concat(pixels);"); | |
| 13700 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); | |
| 13701 CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value()); | |
| 13702 | |
| 13703 result = CompileRun("pixels[1] = 23;"); | |
| 13704 CHECK_EQ(23, result->Int32Value()); | |
| 13705 | |
| 13706 // Test for index greater than 255. Regression test for: | |
| 13707 // http://code.google.com/p/chromium/issues/detail?id=26337. | |
| 13708 result = CompileRun("pixels[256] = 255;"); | |
| 13709 CHECK_EQ(255, result->Int32Value()); | |
| 13710 result = CompileRun("var i = 0;" | |
| 13711 "for (var j = 0; j < 8; j++) { i = pixels[256]; }" | |
| 13712 "i"); | |
| 13713 CHECK_EQ(255, result->Int32Value()); | |
| 13714 | |
| 13715 // Make sure that pixel array ICs recognize when a non-pixel array | |
| 13716 // is passed to it. | |
| 13717 result = CompileRun("function pa_load(p) {" | |
| 13718 " var sum = 0;" | |
| 13719 " for (var j = 0; j < 256; j++) { sum += p[j]; }" | |
| 13720 " return sum;" | |
| 13721 "}" | |
| 13722 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13723 "for (var i = 0; i < 10; ++i) { pa_load(pixels); }" | |
| 13724 "just_ints = new Object();" | |
| 13725 "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" | |
| 13726 "for (var i = 0; i < 10; ++i) {" | |
| 13727 " result = pa_load(just_ints);" | |
| 13728 "}" | |
| 13729 "result"); | |
| 13730 CHECK_EQ(32640, result->Int32Value()); | |
| 13731 | |
| 13732 // Make sure that pixel array ICs recognize out-of-bound accesses. | |
| 13733 result = CompileRun("function pa_load(p, start) {" | |
| 13734 " var sum = 0;" | |
| 13735 " for (var j = start; j < 256; j++) { sum += p[j]; }" | |
| 13736 " return sum;" | |
| 13737 "}" | |
| 13738 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13739 "for (var i = 0; i < 10; ++i) { pa_load(pixels,0); }" | |
| 13740 "for (var i = 0; i < 10; ++i) {" | |
| 13741 " result = pa_load(pixels,-10);" | |
| 13742 "}" | |
| 13743 "result"); | |
| 13744 CHECK_EQ(0, result->Int32Value()); | |
| 13745 | |
| 13746 // Make sure that generic ICs properly handles a pixel array. | |
| 13747 result = CompileRun("function pa_load(p) {" | |
| 13748 " var sum = 0;" | |
| 13749 " for (var j = 0; j < 256; j++) { sum += p[j]; }" | |
| 13750 " return sum;" | |
| 13751 "}" | |
| 13752 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13753 "just_ints = new Object();" | |
| 13754 "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" | |
| 13755 "for (var i = 0; i < 10; ++i) { pa_load(just_ints); }" | |
| 13756 "for (var i = 0; i < 10; ++i) {" | |
| 13757 " result = pa_load(pixels);" | |
| 13758 "}" | |
| 13759 "result"); | |
| 13760 CHECK_EQ(32640, result->Int32Value()); | |
| 13761 | |
| 13762 // Make sure that generic load ICs recognize out-of-bound accesses in | |
| 13763 // pixel arrays. | |
| 13764 result = CompileRun("function pa_load(p, start) {" | |
| 13765 " var sum = 0;" | |
| 13766 " for (var j = start; j < 256; j++) { sum += p[j]; }" | |
| 13767 " return sum;" | |
| 13768 "}" | |
| 13769 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13770 "just_ints = new Object();" | |
| 13771 "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" | |
| 13772 "for (var i = 0; i < 10; ++i) { pa_load(just_ints,0); }" | |
| 13773 "for (var i = 0; i < 10; ++i) { pa_load(pixels,0); }" | |
| 13774 "for (var i = 0; i < 10; ++i) {" | |
| 13775 " result = pa_load(pixels,-10);" | |
| 13776 "}" | |
| 13777 "result"); | |
| 13778 CHECK_EQ(0, result->Int32Value()); | |
| 13779 | |
| 13780 // Make sure that generic ICs properly handles other types than pixel | |
| 13781 // arrays (that the inlined fast pixel array test leaves the right information | |
| 13782 // in the right registers). | |
| 13783 result = CompileRun("function pa_load(p) {" | |
| 13784 " var sum = 0;" | |
| 13785 " for (var j = 0; j < 256; j++) { sum += p[j]; }" | |
| 13786 " return sum;" | |
| 13787 "}" | |
| 13788 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13789 "just_ints = new Object();" | |
| 13790 "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" | |
| 13791 "for (var i = 0; i < 10; ++i) { pa_load(just_ints); }" | |
| 13792 "for (var i = 0; i < 10; ++i) { pa_load(pixels); }" | |
| 13793 "sparse_array = new Object();" | |
| 13794 "for (var i = 0; i < 256; ++i) { sparse_array[i] = i; }" | |
| 13795 "sparse_array[1000000] = 3;" | |
| 13796 "for (var i = 0; i < 10; ++i) {" | |
| 13797 " result = pa_load(sparse_array);" | |
| 13798 "}" | |
| 13799 "result"); | |
| 13800 CHECK_EQ(32640, result->Int32Value()); | |
| 13801 | |
| 13802 // Make sure that pixel array store ICs clamp values correctly. | |
| 13803 result = CompileRun("function pa_store(p) {" | |
| 13804 " for (var j = 0; j < 256; j++) { p[j] = j * 2; }" | |
| 13805 "}" | |
| 13806 "pa_store(pixels);" | |
| 13807 "var sum = 0;" | |
| 13808 "for (var j = 0; j < 256; j++) { sum += pixels[j]; }" | |
| 13809 "sum"); | |
| 13810 CHECK_EQ(48896, result->Int32Value()); | |
| 13811 | |
| 13812 // Make sure that pixel array stores correctly handle accesses outside | |
| 13813 // of the pixel array.. | |
| 13814 result = CompileRun("function pa_store(p,start) {" | |
| 13815 " for (var j = 0; j < 256; j++) {" | |
| 13816 " p[j+start] = j * 2;" | |
| 13817 " }" | |
| 13818 "}" | |
| 13819 "pa_store(pixels,0);" | |
| 13820 "pa_store(pixels,-128);" | |
| 13821 "var sum = 0;" | |
| 13822 "for (var j = 0; j < 256; j++) { sum += pixels[j]; }" | |
| 13823 "sum"); | |
| 13824 CHECK_EQ(65280, result->Int32Value()); | |
| 13825 | |
| 13826 // Make sure that the generic store stub correctly handle accesses outside | |
| 13827 // of the pixel array.. | |
| 13828 result = CompileRun("function pa_store(p,start) {" | |
| 13829 " for (var j = 0; j < 256; j++) {" | |
| 13830 " p[j+start] = j * 2;" | |
| 13831 " }" | |
| 13832 "}" | |
| 13833 "pa_store(pixels,0);" | |
| 13834 "just_ints = new Object();" | |
| 13835 "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" | |
| 13836 "pa_store(just_ints, 0);" | |
| 13837 "pa_store(pixels,-128);" | |
| 13838 "var sum = 0;" | |
| 13839 "for (var j = 0; j < 256; j++) { sum += pixels[j]; }" | |
| 13840 "sum"); | |
| 13841 CHECK_EQ(65280, result->Int32Value()); | |
| 13842 | |
| 13843 // Make sure that the generic keyed store stub clamps pixel array values | |
| 13844 // correctly. | |
| 13845 result = CompileRun("function pa_store(p) {" | |
| 13846 " for (var j = 0; j < 256; j++) { p[j] = j * 2; }" | |
| 13847 "}" | |
| 13848 "pa_store(pixels);" | |
| 13849 "just_ints = new Object();" | |
| 13850 "pa_store(just_ints);" | |
| 13851 "pa_store(pixels);" | |
| 13852 "var sum = 0;" | |
| 13853 "for (var j = 0; j < 256; j++) { sum += pixels[j]; }" | |
| 13854 "sum"); | |
| 13855 CHECK_EQ(48896, result->Int32Value()); | |
| 13856 | |
| 13857 // Make sure that pixel array loads are optimized by crankshaft. | |
| 13858 result = CompileRun("function pa_load(p) {" | |
| 13859 " var sum = 0;" | |
| 13860 " for (var i=0; i<256; ++i) {" | |
| 13861 " sum += p[i];" | |
| 13862 " }" | |
| 13863 " return sum; " | |
| 13864 "}" | |
| 13865 "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" | |
| 13866 "for (var i = 0; i < 5000; ++i) {" | |
| 13867 " result = pa_load(pixels);" | |
| 13868 "}" | |
| 13869 "result"); | |
| 13870 CHECK_EQ(32640, result->Int32Value()); | |
| 13871 | |
| 13872 // Make sure that pixel array stores are optimized by crankshaft. | |
| 13873 result = CompileRun("function pa_init(p) {" | |
| 13874 "for (var i = 0; i < 256; ++i) { p[i] = i; }" | |
| 13875 "}" | |
| 13876 "function pa_load(p) {" | |
| 13877 " var sum = 0;" | |
| 13878 " for (var i=0; i<256; ++i) {" | |
| 13879 " sum += p[i];" | |
| 13880 " }" | |
| 13881 " return sum; " | |
| 13882 "}" | |
| 13883 "for (var i = 0; i < 5000; ++i) {" | |
| 13884 " pa_init(pixels);" | |
| 13885 "}" | |
| 13886 "result = pa_load(pixels);" | |
| 13887 "result"); | |
| 13888 CHECK_EQ(32640, result->Int32Value()); | |
| 13889 | |
| 13890 free(pixel_data); | |
| 13891 } | |
| 13892 | |
| 13893 | |
| 13894 THREADED_TEST(PixelArrayInfo) { | |
| 13895 LocalContext context; | |
| 13896 v8::HandleScope scope(context->GetIsolate()); | |
| 13897 for (int size = 0; size < 100; size += 10) { | |
| 13898 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(size)); | |
| 13899 v8::Handle<v8::Object> obj = v8::Object::New(context->GetIsolate()); | |
| 13900 obj->SetIndexedPropertiesToPixelData(pixel_data, size); | |
| 13901 CHECK(obj->HasIndexedPropertiesInPixelData()); | |
| 13902 CHECK_EQ(pixel_data, obj->GetIndexedPropertiesPixelData()); | |
| 13903 CHECK_EQ(size, obj->GetIndexedPropertiesPixelDataLength()); | |
| 13904 free(pixel_data); | |
| 13905 } | |
| 13906 } | |
| 13907 | |
| 13908 | |
| 13909 static void NotHandledIndexedPropertyGetter( | |
| 13910 uint32_t index, | |
| 13911 const v8::PropertyCallbackInfo<v8::Value>& info) { | |
| 13912 ApiTestFuzzer::Fuzz(); | |
| 13913 } | |
| 13914 | |
| 13915 | |
| 13916 static void NotHandledIndexedPropertySetter( | |
| 13917 uint32_t index, | |
| 13918 Local<Value> value, | |
| 13919 const v8::PropertyCallbackInfo<v8::Value>& info) { | |
| 13920 ApiTestFuzzer::Fuzz(); | |
| 13921 } | |
| 13922 | |
| 13923 | |
| 13924 THREADED_TEST(PixelArrayWithInterceptor) { | |
| 13925 LocalContext context; | |
| 13926 i::Factory* factory = CcTest::i_isolate()->factory(); | |
| 13927 v8::Isolate* isolate = context->GetIsolate(); | |
| 13928 v8::HandleScope scope(isolate); | |
| 13929 const int kElementCount = 260; | |
| 13930 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount)); | |
| 13931 i::Handle<i::ExternalUint8ClampedArray> pixels = | |
| 13932 i::Handle<i::ExternalUint8ClampedArray>::cast( | |
| 13933 factory->NewExternalArray(kElementCount, | |
| 13934 v8::kExternalUint8ClampedArray, | |
| 13935 pixel_data)); | |
| 13936 for (int i = 0; i < kElementCount; i++) { | |
| 13937 pixels->set(i, i % 256); | |
| 13938 } | |
| 13939 v8::Handle<v8::ObjectTemplate> templ = | |
| 13940 v8::ObjectTemplate::New(context->GetIsolate()); | |
| 13941 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( | |
| 13942 NotHandledIndexedPropertyGetter, NotHandledIndexedPropertySetter)); | |
| 13943 v8::Handle<v8::Object> obj = templ->NewInstance(); | |
| 13944 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount); | |
| 13945 context->Global()->Set(v8_str("pixels"), obj); | |
| 13946 v8::Handle<v8::Value> result = CompileRun("pixels[1]"); | |
| 13947 CHECK_EQ(1, result->Int32Value()); | |
| 13948 result = CompileRun("var sum = 0;" | |
| 13949 "for (var i = 0; i < 8; i++) {" | |
| 13950 " sum += pixels[i] = pixels[i] = -i;" | |
| 13951 "}" | |
| 13952 "sum;"); | |
| 13953 CHECK_EQ(-28, result->Int32Value()); | |
| 13954 result = CompileRun("pixels.hasOwnProperty('1')"); | |
| 13955 CHECK(result->BooleanValue()); | |
| 13956 free(pixel_data); | |
| 13957 } | |
| 13958 | |
| 13959 | |
| 13960 static int ExternalArrayElementSize(v8::ExternalArrayType array_type) { | |
| 13961 switch (array_type) { | |
| 13962 case v8::kExternalInt8Array: | |
| 13963 case v8::kExternalUint8Array: | |
| 13964 case v8::kExternalUint8ClampedArray: | |
| 13965 return 1; | |
| 13966 break; | |
| 13967 case v8::kExternalInt16Array: | |
| 13968 case v8::kExternalUint16Array: | |
| 13969 return 2; | |
| 13970 break; | |
| 13971 case v8::kExternalInt32Array: | |
| 13972 case v8::kExternalUint32Array: | |
| 13973 case v8::kExternalFloat32Array: | |
| 13974 return 4; | |
| 13975 break; | |
| 13976 case v8::kExternalFloat64Array: | |
| 13977 return 8; | |
| 13978 break; | |
| 13979 default: | |
| 13980 UNREACHABLE(); | |
| 13981 return -1; | |
| 13982 } | |
| 13983 UNREACHABLE(); | |
| 13984 return -1; | |
| 13985 } | |
| 13986 | |
| 13987 | |
| 13988 template <class ExternalArrayClass, class ElementType> | 13510 template <class ExternalArrayClass, class ElementType> |
| 13989 static void ObjectWithExternalArrayTestHelper( | 13511 static void ObjectWithExternalArrayTestHelper(Handle<Context> context, |
| 13990 Handle<Context> context, | 13512 v8::Handle<Object> obj, |
| 13991 v8::Handle<Object> obj, | 13513 int element_count, |
| 13992 int element_count, | 13514 i::ExternalArrayType array_type, |
| 13993 v8::ExternalArrayType array_type, | 13515 int64_t low, int64_t high) { |
| 13994 int64_t low, int64_t high) { | |
| 13995 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); | 13516 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); |
| 13996 i::Isolate* isolate = jsobj->GetIsolate(); | 13517 i::Isolate* isolate = jsobj->GetIsolate(); |
| 13997 obj->Set(v8_str("field"), | 13518 obj->Set(v8_str("field"), |
| 13998 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503)); | 13519 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503)); |
| 13999 context->Global()->Set(v8_str("ext_array"), obj); | 13520 context->Global()->Set(v8_str("ext_array"), obj); |
| 14000 v8::Handle<v8::Value> result = CompileRun("ext_array.field"); | 13521 v8::Handle<v8::Value> result = CompileRun("ext_array.field"); |
| 14001 CHECK_EQ(1503, result->Int32Value()); | 13522 CHECK_EQ(1503, result->Int32Value()); |
| 14002 result = CompileRun("ext_array[1]"); | 13523 result = CompileRun("ext_array[1]"); |
| 14003 CHECK_EQ(1, result->Int32Value()); | 13524 CHECK_EQ(1, result->Int32Value()); |
| 14004 | 13525 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14128 element_count); | 13649 element_count); |
| 14129 result = CompileRun(test_buf.start()); | 13650 result = CompileRun(test_buf.start()); |
| 14130 CHECK_EQ(false, result->BooleanValue()); | 13651 CHECK_EQ(false, result->BooleanValue()); |
| 14131 | 13652 |
| 14132 // Check other boundary conditions, values and operations. | 13653 // Check other boundary conditions, values and operations. |
| 14133 result = CompileRun("for (var i = 0; i < 8; i++) {" | 13654 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 14134 " ext_array[7] = undefined;" | 13655 " ext_array[7] = undefined;" |
| 14135 "}" | 13656 "}" |
| 14136 "ext_array[7];"); | 13657 "ext_array[7];"); |
| 14137 CHECK_EQ(0, result->Int32Value()); | 13658 CHECK_EQ(0, result->Int32Value()); |
| 14138 if (array_type == v8::kExternalFloat64Array || | 13659 if (array_type == i::kExternalFloat64Array || |
| 14139 array_type == v8::kExternalFloat32Array) { | 13660 array_type == i::kExternalFloat32Array) { |
| 14140 CHECK(std::isnan( | 13661 CHECK(std::isnan( |
| 14141 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number())); | 13662 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number())); |
| 14142 } else { | 13663 } else { |
| 14143 CheckElementValue(isolate, 0, jsobj, 7); | 13664 CheckElementValue(isolate, 0, jsobj, 7); |
| 14144 } | 13665 } |
| 14145 | 13666 |
| 14146 result = CompileRun("for (var i = 0; i < 8; i++) {" | 13667 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 14147 " ext_array[6] = '2.3';" | 13668 " ext_array[6] = '2.3';" |
| 14148 "}" | 13669 "}" |
| 14149 "ext_array[6];"); | 13670 "ext_array[6];"); |
| 14150 CHECK_EQ(2, result->Int32Value()); | 13671 CHECK_EQ(2, result->Int32Value()); |
| 14151 CHECK_EQ(2, | 13672 CHECK_EQ(2, |
| 14152 static_cast<int>( | 13673 static_cast<int>( |
| 14153 i::Object::GetElement( | 13674 i::Object::GetElement( |
| 14154 isolate, jsobj, 6).ToHandleChecked()->Number())); | 13675 isolate, jsobj, 6).ToHandleChecked()->Number())); |
| 14155 | 13676 |
| 14156 if (array_type != v8::kExternalFloat32Array && | 13677 if (array_type != i::kExternalFloat32Array && |
| 14157 array_type != v8::kExternalFloat64Array) { | 13678 array_type != i::kExternalFloat64Array) { |
| 14158 // Though the specification doesn't state it, be explicit about | 13679 // Though the specification doesn't state it, be explicit about |
| 14159 // converting NaNs and +/-Infinity to zero. | 13680 // converting NaNs and +/-Infinity to zero. |
| 14160 result = CompileRun("for (var i = 0; i < 8; i++) {" | 13681 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 14161 " ext_array[i] = 5;" | 13682 " ext_array[i] = 5;" |
| 14162 "}" | 13683 "}" |
| 14163 "for (var i = 0; i < 8; i++) {" | 13684 "for (var i = 0; i < 8; i++) {" |
| 14164 " ext_array[i] = NaN;" | 13685 " ext_array[i] = NaN;" |
| 14165 "}" | 13686 "}" |
| 14166 "ext_array[5];"); | 13687 "ext_array[5];"); |
| 14167 CHECK_EQ(0, result->Int32Value()); | 13688 CHECK_EQ(0, result->Int32Value()); |
| 14168 CheckElementValue(isolate, 0, jsobj, 5); | 13689 CheckElementValue(isolate, 0, jsobj, 5); |
| 14169 | 13690 |
| 14170 result = CompileRun("for (var i = 0; i < 8; i++) {" | 13691 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 14171 " ext_array[i] = 5;" | 13692 " ext_array[i] = 5;" |
| 14172 "}" | 13693 "}" |
| 14173 "for (var i = 0; i < 8; i++) {" | 13694 "for (var i = 0; i < 8; i++) {" |
| 14174 " ext_array[i] = Infinity;" | 13695 " ext_array[i] = Infinity;" |
| 14175 "}" | 13696 "}" |
| 14176 "ext_array[5];"); | 13697 "ext_array[5];"); |
| 14177 int expected_value = | 13698 int expected_value = |
| 14178 (array_type == v8::kExternalUint8ClampedArray) ? 255 : 0; | 13699 (array_type == i::kExternalUint8ClampedArray) ? 255 : 0; |
| 14179 CHECK_EQ(expected_value, result->Int32Value()); | 13700 CHECK_EQ(expected_value, result->Int32Value()); |
| 14180 CheckElementValue(isolate, expected_value, jsobj, 5); | 13701 CheckElementValue(isolate, expected_value, jsobj, 5); |
| 14181 | 13702 |
| 14182 result = CompileRun("for (var i = 0; i < 8; i++) {" | 13703 result = CompileRun("for (var i = 0; i < 8; i++) {" |
| 14183 " ext_array[i] = 5;" | 13704 " ext_array[i] = 5;" |
| 14184 "}" | 13705 "}" |
| 14185 "for (var i = 0; i < 8; i++) {" | 13706 "for (var i = 0; i < 8; i++) {" |
| 14186 " ext_array[i] = -Infinity;" | 13707 " ext_array[i] = -Infinity;" |
| 14187 "}" | 13708 "}" |
| 14188 "ext_array[5];"); | 13709 "ext_array[5];"); |
| 14189 CHECK_EQ(0, result->Int32Value()); | 13710 CHECK_EQ(0, result->Int32Value()); |
| 14190 CheckElementValue(isolate, 0, jsobj, 5); | 13711 CheckElementValue(isolate, 0, jsobj, 5); |
| 14191 | 13712 |
| 14192 // Check truncation behavior of integral arrays. | 13713 // Check truncation behavior of integral arrays. |
| 14193 const char* unsigned_data = | 13714 const char* unsigned_data = |
| 14194 "var source_data = [0.6, 10.6];" | 13715 "var source_data = [0.6, 10.6];" |
| 14195 "var expected_results = [0, 10];"; | 13716 "var expected_results = [0, 10];"; |
| 14196 const char* signed_data = | 13717 const char* signed_data = |
| 14197 "var source_data = [0.6, 10.6, -0.6, -10.6];" | 13718 "var source_data = [0.6, 10.6, -0.6, -10.6];" |
| 14198 "var expected_results = [0, 10, 0, -10];"; | 13719 "var expected_results = [0, 10, 0, -10];"; |
| 14199 const char* pixel_data = | 13720 const char* pixel_data = |
| 14200 "var source_data = [0.6, 10.6];" | 13721 "var source_data = [0.6, 10.6];" |
| 14201 "var expected_results = [1, 11];"; | 13722 "var expected_results = [1, 11];"; |
| 14202 bool is_unsigned = | 13723 bool is_unsigned = (array_type == i::kExternalUint8Array || |
| 14203 (array_type == v8::kExternalUint8Array || | 13724 array_type == i::kExternalUint16Array || |
| 14204 array_type == v8::kExternalUint16Array || | 13725 array_type == i::kExternalUint32Array); |
| 14205 array_type == v8::kExternalUint32Array); | 13726 bool is_pixel_data = array_type == i::kExternalUint8ClampedArray; |
| 14206 bool is_pixel_data = array_type == v8::kExternalUint8ClampedArray; | |
| 14207 | 13727 |
| 14208 i::SNPrintF(test_buf, | 13728 i::SNPrintF(test_buf, |
| 14209 "%s" | 13729 "%s" |
| 14210 "var all_passed = true;" | 13730 "var all_passed = true;" |
| 14211 "for (var i = 0; i < source_data.length; i++) {" | 13731 "for (var i = 0; i < source_data.length; i++) {" |
| 14212 " for (var j = 0; j < 8; j++) {" | 13732 " for (var j = 0; j < 8; j++) {" |
| 14213 " ext_array[j] = source_data[i];" | 13733 " ext_array[j] = source_data[i];" |
| 14214 " }" | 13734 " }" |
| 14215 " all_passed = all_passed &&" | 13735 " all_passed = all_passed &&" |
| 14216 " (ext_array[5] == expected_results[i]);" | 13736 " (ext_array[5] == expected_results[i]);" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14281 "js_array.__proto__ = ext_array;" | 13801 "js_array.__proto__ = ext_array;" |
| 14282 "js_array.concat(ext_array);"); | 13802 "js_array.concat(ext_array);"); |
| 14283 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); | 13803 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); |
| 14284 CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value()); | 13804 CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value()); |
| 14285 | 13805 |
| 14286 result = CompileRun("ext_array[1] = 23;"); | 13806 result = CompileRun("ext_array[1] = 23;"); |
| 14287 CHECK_EQ(23, result->Int32Value()); | 13807 CHECK_EQ(23, result->Int32Value()); |
| 14288 } | 13808 } |
| 14289 | 13809 |
| 14290 | 13810 |
| 14291 template <class FixedTypedArrayClass, | 13811 template <class FixedTypedArrayClass, i::ElementsKind elements_kind, |
| 14292 i::ElementsKind elements_kind, | |
| 14293 class ElementType> | 13812 class ElementType> |
| 14294 static void FixedTypedArrayTestHelper( | 13813 static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type, |
| 14295 v8::ExternalArrayType array_type, | 13814 ElementType low, ElementType high) { |
| 14296 ElementType low, | |
| 14297 ElementType high) { | |
| 14298 i::FLAG_allow_natives_syntax = true; | 13815 i::FLAG_allow_natives_syntax = true; |
| 14299 LocalContext context; | 13816 LocalContext context; |
| 14300 i::Isolate* isolate = CcTest::i_isolate(); | 13817 i::Isolate* isolate = CcTest::i_isolate(); |
| 14301 i::Factory* factory = isolate->factory(); | 13818 i::Factory* factory = isolate->factory(); |
| 14302 v8::HandleScope scope(context->GetIsolate()); | 13819 v8::HandleScope scope(context->GetIsolate()); |
| 14303 const int kElementCount = 260; | 13820 const int kElementCount = 260; |
| 14304 i::Handle<FixedTypedArrayClass> fixed_array = | 13821 i::Handle<FixedTypedArrayClass> fixed_array = |
| 14305 i::Handle<FixedTypedArrayClass>::cast( | 13822 i::Handle<FixedTypedArrayClass>::cast( |
| 14306 factory->NewFixedTypedArray(kElementCount, array_type)); | 13823 factory->NewFixedTypedArray(kElementCount, array_type)); |
| 14307 CHECK_EQ(FixedTypedArrayClass::kInstanceType, | 13824 CHECK_EQ(FixedTypedArrayClass::kInstanceType, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 14326 | 13843 |
| 14327 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>( | 13844 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>( |
| 14328 context.local(), obj, kElementCount, array_type, | 13845 context.local(), obj, kElementCount, array_type, |
| 14329 static_cast<int64_t>(low), | 13846 static_cast<int64_t>(low), |
| 14330 static_cast<int64_t>(high)); | 13847 static_cast<int64_t>(high)); |
| 14331 } | 13848 } |
| 14332 | 13849 |
| 14333 | 13850 |
| 14334 THREADED_TEST(FixedUint8Array) { | 13851 THREADED_TEST(FixedUint8Array) { |
| 14335 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>( | 13852 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>( |
| 14336 v8::kExternalUint8Array, | 13853 i::kExternalUint8Array, 0x0, 0xFF); |
| 14337 0x0, 0xFF); | |
| 14338 } | 13854 } |
| 14339 | 13855 |
| 14340 | 13856 |
| 14341 THREADED_TEST(FixedUint8ClampedArray) { | 13857 THREADED_TEST(FixedUint8ClampedArray) { |
| 14342 FixedTypedArrayTestHelper<i::FixedUint8ClampedArray, | 13858 FixedTypedArrayTestHelper<i::FixedUint8ClampedArray, |
| 14343 i::UINT8_CLAMPED_ELEMENTS, uint8_t>( | 13859 i::UINT8_CLAMPED_ELEMENTS, uint8_t>( |
| 14344 v8::kExternalUint8ClampedArray, | 13860 i::kExternalUint8ClampedArray, 0x0, 0xFF); |
| 14345 0x0, 0xFF); | |
| 14346 } | 13861 } |
| 14347 | 13862 |
| 14348 | 13863 |
| 14349 THREADED_TEST(FixedInt8Array) { | 13864 THREADED_TEST(FixedInt8Array) { |
| 14350 FixedTypedArrayTestHelper<i::FixedInt8Array, i::INT8_ELEMENTS, int8_t>( | 13865 FixedTypedArrayTestHelper<i::FixedInt8Array, i::INT8_ELEMENTS, int8_t>( |
| 14351 v8::kExternalInt8Array, | 13866 i::kExternalInt8Array, -0x80, 0x7F); |
| 14352 -0x80, 0x7F); | |
| 14353 } | 13867 } |
| 14354 | 13868 |
| 14355 | 13869 |
| 14356 THREADED_TEST(FixedUint16Array) { | 13870 THREADED_TEST(FixedUint16Array) { |
| 14357 FixedTypedArrayTestHelper<i::FixedUint16Array, i::UINT16_ELEMENTS, uint16_t>( | 13871 FixedTypedArrayTestHelper<i::FixedUint16Array, i::UINT16_ELEMENTS, uint16_t>( |
| 14358 v8::kExternalUint16Array, | 13872 i::kExternalUint16Array, 0x0, 0xFFFF); |
| 14359 0x0, 0xFFFF); | |
| 14360 } | 13873 } |
| 14361 | 13874 |
| 14362 | 13875 |
| 14363 THREADED_TEST(FixedInt16Array) { | 13876 THREADED_TEST(FixedInt16Array) { |
| 14364 FixedTypedArrayTestHelper<i::FixedInt16Array, i::INT16_ELEMENTS, int16_t>( | 13877 FixedTypedArrayTestHelper<i::FixedInt16Array, i::INT16_ELEMENTS, int16_t>( |
| 14365 v8::kExternalInt16Array, | 13878 i::kExternalInt16Array, -0x8000, 0x7FFF); |
| 14366 -0x8000, 0x7FFF); | |
| 14367 } | 13879 } |
| 14368 | 13880 |
| 14369 | 13881 |
| 14370 THREADED_TEST(FixedUint32Array) { | 13882 THREADED_TEST(FixedUint32Array) { |
| 14371 FixedTypedArrayTestHelper<i::FixedUint32Array, i::UINT32_ELEMENTS, uint32_t>( | 13883 FixedTypedArrayTestHelper<i::FixedUint32Array, i::UINT32_ELEMENTS, uint32_t>( |
| 14372 v8::kExternalUint32Array, | 13884 i::kExternalUint32Array, 0x0, UINT_MAX); |
| 14373 0x0, UINT_MAX); | |
| 14374 } | 13885 } |
| 14375 | 13886 |
| 14376 | 13887 |
| 14377 THREADED_TEST(FixedInt32Array) { | 13888 THREADED_TEST(FixedInt32Array) { |
| 14378 FixedTypedArrayTestHelper<i::FixedInt32Array, i::INT32_ELEMENTS, int32_t>( | 13889 FixedTypedArrayTestHelper<i::FixedInt32Array, i::INT32_ELEMENTS, int32_t>( |
| 14379 v8::kExternalInt32Array, | 13890 i::kExternalInt32Array, INT_MIN, INT_MAX); |
| 14380 INT_MIN, INT_MAX); | |
| 14381 } | 13891 } |
| 14382 | 13892 |
| 14383 | 13893 |
| 14384 THREADED_TEST(FixedFloat32Array) { | 13894 THREADED_TEST(FixedFloat32Array) { |
| 14385 FixedTypedArrayTestHelper<i::FixedFloat32Array, i::FLOAT32_ELEMENTS, float>( | 13895 FixedTypedArrayTestHelper<i::FixedFloat32Array, i::FLOAT32_ELEMENTS, float>( |
| 14386 v8::kExternalFloat32Array, | 13896 i::kExternalFloat32Array, -500, 500); |
| 14387 -500, 500); | |
| 14388 } | 13897 } |
| 14389 | 13898 |
| 14390 | 13899 |
| 14391 THREADED_TEST(FixedFloat64Array) { | 13900 THREADED_TEST(FixedFloat64Array) { |
| 14392 FixedTypedArrayTestHelper<i::FixedFloat64Array, i::FLOAT64_ELEMENTS, float>( | 13901 FixedTypedArrayTestHelper<i::FixedFloat64Array, i::FLOAT64_ELEMENTS, float>( |
| 14393 v8::kExternalFloat64Array, | 13902 i::kExternalFloat64Array, -500, 500); |
| 14394 -500, 500); | |
| 14395 } | 13903 } |
| 14396 | 13904 |
| 14397 | 13905 |
| 14398 template <class ExternalArrayClass, class ElementType> | 13906 template <typename ElementType, typename TypedArray, class ExternalArrayClass> |
| 14399 static void ExternalArrayTestHelper(v8::ExternalArrayType array_type, | 13907 void TypedArrayTestHelper(i::ExternalArrayType array_type, int64_t low, |
| 14400 int64_t low, | 13908 int64_t high) { |
| 14401 int64_t high) { | |
| 14402 LocalContext context; | |
| 14403 i::Isolate* isolate = CcTest::i_isolate(); | |
| 14404 i::Factory* factory = isolate->factory(); | |
| 14405 v8::HandleScope scope(context->GetIsolate()); | |
| 14406 const int kElementCount = 40; | |
| 14407 int element_size = ExternalArrayElementSize(array_type); | |
| 14408 ElementType* array_data = | |
| 14409 static_cast<ElementType*>(malloc(kElementCount * element_size)); | |
| 14410 i::Handle<ExternalArrayClass> array = | |
| 14411 i::Handle<ExternalArrayClass>::cast( | |
| 14412 factory->NewExternalArray(kElementCount, array_type, array_data)); | |
| 14413 // Force GC to trigger verification. | |
| 14414 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | |
| 14415 for (int i = 0; i < kElementCount; i++) { | |
| 14416 array->set(i, static_cast<ElementType>(i)); | |
| 14417 } | |
| 14418 // Force GC to trigger verification. | |
| 14419 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | |
| 14420 for (int i = 0; i < kElementCount; i++) { | |
| 14421 CHECK_EQ(static_cast<int64_t>(i), | |
| 14422 static_cast<int64_t>(array->get_scalar(i))); | |
| 14423 CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(array_data[i])); | |
| 14424 } | |
| 14425 | |
| 14426 v8::Handle<v8::Object> obj = v8::Object::New(context->GetIsolate()); | |
| 14427 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); | |
| 14428 // Set the elements to be the external array. | |
| 14429 obj->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14430 array_type, | |
| 14431 kElementCount); | |
| 14432 CHECK_EQ(1, | |
| 14433 static_cast<int>( | |
| 14434 i::Object::GetElement( | |
| 14435 isolate, jsobj, 1).ToHandleChecked()->Number())); | |
| 14436 | |
| 14437 ObjectWithExternalArrayTestHelper<ExternalArrayClass, ElementType>( | |
| 14438 context.local(), obj, kElementCount, array_type, low, high); | |
| 14439 | |
| 14440 v8::Handle<v8::Value> result; | |
| 14441 | |
| 14442 // Test more complex manipulations which cause eax to contain values | |
| 14443 // that won't be completely overwritten by loads from the arrays. | |
| 14444 // This catches bugs in the instructions used for the KeyedLoadIC | |
| 14445 // for byte and word types. | |
| 14446 { | |
| 14447 const int kXSize = 300; | |
| 14448 const int kYSize = 300; | |
| 14449 const int kLargeElementCount = kXSize * kYSize * 4; | |
| 14450 ElementType* large_array_data = | |
| 14451 static_cast<ElementType*>(malloc(kLargeElementCount * element_size)); | |
| 14452 v8::Handle<v8::Object> large_obj = v8::Object::New(context->GetIsolate()); | |
| 14453 // Set the elements to be the external array. | |
| 14454 large_obj->SetIndexedPropertiesToExternalArrayData(large_array_data, | |
| 14455 array_type, | |
| 14456 kLargeElementCount); | |
| 14457 context->Global()->Set(v8_str("large_array"), large_obj); | |
| 14458 // Initialize contents of a few rows. | |
| 14459 for (int x = 0; x < 300; x++) { | |
| 14460 int row = 0; | |
| 14461 int offset = row * 300 * 4; | |
| 14462 large_array_data[offset + 4 * x + 0] = (ElementType) 127; | |
| 14463 large_array_data[offset + 4 * x + 1] = (ElementType) 0; | |
| 14464 large_array_data[offset + 4 * x + 2] = (ElementType) 0; | |
| 14465 large_array_data[offset + 4 * x + 3] = (ElementType) 127; | |
| 14466 row = 150; | |
| 14467 offset = row * 300 * 4; | |
| 14468 large_array_data[offset + 4 * x + 0] = (ElementType) 127; | |
| 14469 large_array_data[offset + 4 * x + 1] = (ElementType) 0; | |
| 14470 large_array_data[offset + 4 * x + 2] = (ElementType) 0; | |
| 14471 large_array_data[offset + 4 * x + 3] = (ElementType) 127; | |
| 14472 row = 298; | |
| 14473 offset = row * 300 * 4; | |
| 14474 large_array_data[offset + 4 * x + 0] = (ElementType) 127; | |
| 14475 large_array_data[offset + 4 * x + 1] = (ElementType) 0; | |
| 14476 large_array_data[offset + 4 * x + 2] = (ElementType) 0; | |
| 14477 large_array_data[offset + 4 * x + 3] = (ElementType) 127; | |
| 14478 } | |
| 14479 // The goal of the code below is to make "offset" large enough | |
| 14480 // that the computation of the index (which goes into eax) has | |
| 14481 // high bits set which will not be overwritten by a byte or short | |
| 14482 // load. | |
| 14483 result = CompileRun("var failed = false;" | |
| 14484 "var offset = 0;" | |
| 14485 "for (var i = 0; i < 300; i++) {" | |
| 14486 " if (large_array[4 * i] != 127 ||" | |
| 14487 " large_array[4 * i + 1] != 0 ||" | |
| 14488 " large_array[4 * i + 2] != 0 ||" | |
| 14489 " large_array[4 * i + 3] != 127) {" | |
| 14490 " failed = true;" | |
| 14491 " }" | |
| 14492 "}" | |
| 14493 "offset = 150 * 300 * 4;" | |
| 14494 "for (var i = 0; i < 300; i++) {" | |
| 14495 " if (large_array[offset + 4 * i] != 127 ||" | |
| 14496 " large_array[offset + 4 * i + 1] != 0 ||" | |
| 14497 " large_array[offset + 4 * i + 2] != 0 ||" | |
| 14498 " large_array[offset + 4 * i + 3] != 127) {" | |
| 14499 " failed = true;" | |
| 14500 " }" | |
| 14501 "}" | |
| 14502 "offset = 298 * 300 * 4;" | |
| 14503 "for (var i = 0; i < 300; i++) {" | |
| 14504 " if (large_array[offset + 4 * i] != 127 ||" | |
| 14505 " large_array[offset + 4 * i + 1] != 0 ||" | |
| 14506 " large_array[offset + 4 * i + 2] != 0 ||" | |
| 14507 " large_array[offset + 4 * i + 3] != 127) {" | |
| 14508 " failed = true;" | |
| 14509 " }" | |
| 14510 "}" | |
| 14511 "!failed;"); | |
| 14512 CHECK_EQ(true, result->BooleanValue()); | |
| 14513 free(large_array_data); | |
| 14514 } | |
| 14515 | |
| 14516 // The "" property descriptor is overloaded to store information about | |
| 14517 // the external array. Ensure that setting and accessing the "" property | |
| 14518 // works (it should overwrite the information cached about the external | |
| 14519 // array in the DescriptorArray) in various situations. | |
| 14520 result = CompileRun("ext_array[''] = 23; ext_array['']"); | |
| 14521 CHECK_EQ(23, result->Int32Value()); | |
| 14522 | |
| 14523 // Property "" set after the external array is associated with the object. | |
| 14524 { | |
| 14525 v8::Handle<v8::Object> obj2 = v8::Object::New(context->GetIsolate()); | |
| 14526 obj2->Set(v8_str("ee_test_field"), | |
| 14527 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14528 obj2->Set(v8_str(""), v8::Int32::New(context->GetIsolate(), 1503)); | |
| 14529 // Set the elements to be the external array. | |
| 14530 obj2->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14531 array_type, | |
| 14532 kElementCount); | |
| 14533 context->Global()->Set(v8_str("ext_array"), obj2); | |
| 14534 result = CompileRun("ext_array['']"); | |
| 14535 CHECK_EQ(1503, result->Int32Value()); | |
| 14536 } | |
| 14537 | |
| 14538 // Property "" set after the external array is associated with the object. | |
| 14539 { | |
| 14540 v8::Handle<v8::Object> obj2 = v8::Object::New(context->GetIsolate()); | |
| 14541 obj2->Set(v8_str("ee_test_field_2"), | |
| 14542 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14543 // Set the elements to be the external array. | |
| 14544 obj2->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14545 array_type, | |
| 14546 kElementCount); | |
| 14547 obj2->Set(v8_str(""), v8::Int32::New(context->GetIsolate(), 1503)); | |
| 14548 context->Global()->Set(v8_str("ext_array"), obj2); | |
| 14549 result = CompileRun("ext_array['']"); | |
| 14550 CHECK_EQ(1503, result->Int32Value()); | |
| 14551 } | |
| 14552 | |
| 14553 // Should reuse the map from previous test. | |
| 14554 { | |
| 14555 v8::Handle<v8::Object> obj2 = v8::Object::New(context->GetIsolate()); | |
| 14556 obj2->Set(v8_str("ee_test_field_2"), | |
| 14557 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14558 // Set the elements to be the external array. Should re-use the map | |
| 14559 // from previous test. | |
| 14560 obj2->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14561 array_type, | |
| 14562 kElementCount); | |
| 14563 context->Global()->Set(v8_str("ext_array"), obj2); | |
| 14564 result = CompileRun("ext_array['']"); | |
| 14565 } | |
| 14566 | |
| 14567 // Property "" is a constant function that shouldn't not be interfered with | |
| 14568 // when an external array is set. | |
| 14569 { | |
| 14570 v8::Handle<v8::Object> obj2 = v8::Object::New(context->GetIsolate()); | |
| 14571 // Start | |
| 14572 obj2->Set(v8_str("ee_test_field3"), | |
| 14573 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14574 | |
| 14575 // Add a constant function to an object. | |
| 14576 context->Global()->Set(v8_str("ext_array"), obj2); | |
| 14577 result = CompileRun("ext_array[''] = function() {return 1503;};" | |
| 14578 "ext_array['']();"); | |
| 14579 | |
| 14580 // Add an external array transition to the same map that | |
| 14581 // has the constant transition. | |
| 14582 v8::Handle<v8::Object> obj3 = v8::Object::New(context->GetIsolate()); | |
| 14583 obj3->Set(v8_str("ee_test_field3"), | |
| 14584 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14585 obj3->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14586 array_type, | |
| 14587 kElementCount); | |
| 14588 context->Global()->Set(v8_str("ext_array"), obj3); | |
| 14589 } | |
| 14590 | |
| 14591 // If a external array transition is in the map, it should get clobbered | |
| 14592 // by a constant function. | |
| 14593 { | |
| 14594 // Add an external array transition. | |
| 14595 v8::Handle<v8::Object> obj3 = v8::Object::New(context->GetIsolate()); | |
| 14596 obj3->Set(v8_str("ee_test_field4"), | |
| 14597 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14598 obj3->SetIndexedPropertiesToExternalArrayData(array_data, | |
| 14599 array_type, | |
| 14600 kElementCount); | |
| 14601 | |
| 14602 // Add a constant function to the same map that just got an external array | |
| 14603 // transition. | |
| 14604 v8::Handle<v8::Object> obj2 = v8::Object::New(context->GetIsolate()); | |
| 14605 obj2->Set(v8_str("ee_test_field4"), | |
| 14606 v8::Int32::New(context->GetIsolate(), 256)); | |
| 14607 context->Global()->Set(v8_str("ext_array"), obj2); | |
| 14608 result = CompileRun("ext_array[''] = function() {return 1503;};" | |
| 14609 "ext_array['']();"); | |
| 14610 } | |
| 14611 | |
| 14612 free(array_data); | |
| 14613 } | |
| 14614 | |
| 14615 | |
| 14616 THREADED_TEST(ExternalInt8Array) { | |
| 14617 ExternalArrayTestHelper<i::ExternalInt8Array, int8_t>( | |
| 14618 v8::kExternalInt8Array, | |
| 14619 -128, | |
| 14620 127); | |
| 14621 } | |
| 14622 | |
| 14623 | |
| 14624 THREADED_TEST(ExternalUint8Array) { | |
| 14625 ExternalArrayTestHelper<i::ExternalUint8Array, uint8_t>( | |
| 14626 v8::kExternalUint8Array, | |
| 14627 0, | |
| 14628 255); | |
| 14629 } | |
| 14630 | |
| 14631 | |
| 14632 THREADED_TEST(ExternalUint8ClampedArray) { | |
| 14633 ExternalArrayTestHelper<i::ExternalUint8ClampedArray, uint8_t>( | |
| 14634 v8::kExternalUint8ClampedArray, | |
| 14635 0, | |
| 14636 255); | |
| 14637 } | |
| 14638 | |
| 14639 | |
| 14640 THREADED_TEST(ExternalInt16Array) { | |
| 14641 ExternalArrayTestHelper<i::ExternalInt16Array, int16_t>( | |
| 14642 v8::kExternalInt16Array, | |
| 14643 -32768, | |
| 14644 32767); | |
| 14645 } | |
| 14646 | |
| 14647 | |
| 14648 THREADED_TEST(ExternalUint16Array) { | |
| 14649 ExternalArrayTestHelper<i::ExternalUint16Array, uint16_t>( | |
| 14650 v8::kExternalUint16Array, | |
| 14651 0, | |
| 14652 65535); | |
| 14653 } | |
| 14654 | |
| 14655 | |
| 14656 THREADED_TEST(ExternalInt32Array) { | |
| 14657 ExternalArrayTestHelper<i::ExternalInt32Array, int32_t>( | |
| 14658 v8::kExternalInt32Array, | |
| 14659 INT_MIN, // -2147483648 | |
| 14660 INT_MAX); // 2147483647 | |
| 14661 } | |
| 14662 | |
| 14663 | |
| 14664 THREADED_TEST(ExternalUint32Array) { | |
| 14665 ExternalArrayTestHelper<i::ExternalUint32Array, uint32_t>( | |
| 14666 v8::kExternalUint32Array, | |
| 14667 0, | |
| 14668 UINT_MAX); // 4294967295 | |
| 14669 } | |
| 14670 | |
| 14671 | |
| 14672 THREADED_TEST(ExternalFloat32Array) { | |
| 14673 ExternalArrayTestHelper<i::ExternalFloat32Array, float>( | |
| 14674 v8::kExternalFloat32Array, | |
| 14675 -500, | |
| 14676 500); | |
| 14677 } | |
| 14678 | |
| 14679 | |
| 14680 THREADED_TEST(ExternalFloat64Array) { | |
| 14681 ExternalArrayTestHelper<i::ExternalFloat64Array, double>( | |
| 14682 v8::kExternalFloat64Array, | |
| 14683 -500, | |
| 14684 500); | |
| 14685 } | |
| 14686 | |
| 14687 | |
| 14688 THREADED_TEST(ExternalArrays) { | |
| 14689 TestExternalInt8Array(); | |
| 14690 TestExternalUint8Array(); | |
| 14691 TestExternalInt16Array(); | |
| 14692 TestExternalUint16Array(); | |
| 14693 TestExternalInt32Array(); | |
| 14694 TestExternalUint32Array(); | |
| 14695 TestExternalFloat32Array(); | |
| 14696 } | |
| 14697 | |
| 14698 | |
| 14699 void ExternalArrayInfoTestHelper(v8::ExternalArrayType array_type) { | |
| 14700 LocalContext context; | |
| 14701 v8::HandleScope scope(context->GetIsolate()); | |
| 14702 for (int size = 0; size < 100; size += 10) { | |
| 14703 int element_size = ExternalArrayElementSize(array_type); | |
| 14704 void* external_data = malloc(size * element_size); | |
| 14705 v8::Handle<v8::Object> obj = v8::Object::New(context->GetIsolate()); | |
| 14706 obj->SetIndexedPropertiesToExternalArrayData( | |
| 14707 external_data, array_type, size); | |
| 14708 CHECK(obj->HasIndexedPropertiesInExternalArrayData()); | |
| 14709 CHECK_EQ(external_data, obj->GetIndexedPropertiesExternalArrayData()); | |
| 14710 CHECK_EQ(array_type, obj->GetIndexedPropertiesExternalArrayDataType()); | |
| 14711 CHECK_EQ(size, obj->GetIndexedPropertiesExternalArrayDataLength()); | |
| 14712 free(external_data); | |
| 14713 } | |
| 14714 } | |
| 14715 | |
| 14716 | |
| 14717 THREADED_TEST(ExternalArrayInfo) { | |
| 14718 ExternalArrayInfoTestHelper(v8::kExternalInt8Array); | |
| 14719 ExternalArrayInfoTestHelper(v8::kExternalUint8Array); | |
| 14720 ExternalArrayInfoTestHelper(v8::kExternalInt16Array); | |
| 14721 ExternalArrayInfoTestHelper(v8::kExternalUint16Array); | |
| 14722 ExternalArrayInfoTestHelper(v8::kExternalInt32Array); | |
| 14723 ExternalArrayInfoTestHelper(v8::kExternalUint32Array); | |
| 14724 ExternalArrayInfoTestHelper(v8::kExternalFloat32Array); | |
| 14725 ExternalArrayInfoTestHelper(v8::kExternalFloat64Array); | |
| 14726 ExternalArrayInfoTestHelper(v8::kExternalUint8ClampedArray); | |
| 14727 } | |
| 14728 | |
| 14729 | |
| 14730 void ExtArrayLimitsHelper(v8::Isolate* isolate, | |
| 14731 v8::ExternalArrayType array_type, | |
| 14732 int size) { | |
| 14733 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | |
| 14734 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | |
| 14735 last_location = last_message = NULL; | |
| 14736 obj->SetIndexedPropertiesToExternalArrayData(NULL, array_type, size); | |
| 14737 CHECK(!obj->HasIndexedPropertiesInExternalArrayData()); | |
| 14738 CHECK(last_location); | |
| 14739 CHECK(last_message); | |
| 14740 } | |
| 14741 | |
| 14742 | |
| 14743 TEST(ExternalArrayLimits) { | |
| 14744 LocalContext context; | |
| 14745 v8::Isolate* isolate = context->GetIsolate(); | |
| 14746 v8::HandleScope scope(isolate); | |
| 14747 ExtArrayLimitsHelper(isolate, v8::kExternalInt8Array, 0x40000000); | |
| 14748 ExtArrayLimitsHelper(isolate, v8::kExternalInt8Array, 0xffffffff); | |
| 14749 ExtArrayLimitsHelper(isolate, v8::kExternalUint8Array, 0x40000000); | |
| 14750 ExtArrayLimitsHelper(isolate, v8::kExternalUint8Array, 0xffffffff); | |
| 14751 ExtArrayLimitsHelper(isolate, v8::kExternalInt16Array, 0x40000000); | |
| 14752 ExtArrayLimitsHelper(isolate, v8::kExternalInt16Array, 0xffffffff); | |
| 14753 ExtArrayLimitsHelper(isolate, v8::kExternalUint16Array, 0x40000000); | |
| 14754 ExtArrayLimitsHelper(isolate, v8::kExternalUint16Array, 0xffffffff); | |
| 14755 ExtArrayLimitsHelper(isolate, v8::kExternalInt32Array, 0x40000000); | |
| 14756 ExtArrayLimitsHelper(isolate, v8::kExternalInt32Array, 0xffffffff); | |
| 14757 ExtArrayLimitsHelper(isolate, v8::kExternalUint32Array, 0x40000000); | |
| 14758 ExtArrayLimitsHelper(isolate, v8::kExternalUint32Array, 0xffffffff); | |
| 14759 ExtArrayLimitsHelper(isolate, v8::kExternalFloat32Array, 0x40000000); | |
| 14760 ExtArrayLimitsHelper(isolate, v8::kExternalFloat32Array, 0xffffffff); | |
| 14761 ExtArrayLimitsHelper(isolate, v8::kExternalFloat64Array, 0x40000000); | |
| 14762 ExtArrayLimitsHelper(isolate, v8::kExternalFloat64Array, 0xffffffff); | |
| 14763 ExtArrayLimitsHelper(isolate, v8::kExternalUint8ClampedArray, 0x40000000); | |
| 14764 ExtArrayLimitsHelper(isolate, v8::kExternalUint8ClampedArray, 0xffffffff); | |
| 14765 } | |
| 14766 | |
| 14767 | |
| 14768 template <typename ElementType, typename TypedArray, | |
| 14769 class ExternalArrayClass> | |
| 14770 void TypedArrayTestHelper(v8::ExternalArrayType array_type, | |
| 14771 int64_t low, int64_t high) { | |
| 14772 const int kElementCount = 50; | 13909 const int kElementCount = 50; |
| 14773 | 13910 |
| 14774 i::ScopedVector<ElementType> backing_store(kElementCount+2); | 13911 i::ScopedVector<ElementType> backing_store(kElementCount+2); |
| 14775 | 13912 |
| 14776 LocalContext env; | 13913 LocalContext env; |
| 14777 v8::Isolate* isolate = env->GetIsolate(); | 13914 v8::Isolate* isolate = env->GetIsolate(); |
| 14778 v8::HandleScope handle_scope(isolate); | 13915 v8::HandleScope handle_scope(isolate); |
| 14779 | 13916 |
| 14780 Local<v8::ArrayBuffer> ab = | 13917 Local<v8::ArrayBuffer> ab = |
| 14781 v8::ArrayBuffer::New(isolate, backing_store.start(), | 13918 v8::ArrayBuffer::New(isolate, backing_store.start(), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 14793 data[i] = static_cast<ElementType>(i); | 13930 data[i] = static_cast<ElementType>(i); |
| 14794 } | 13931 } |
| 14795 | 13932 |
| 14796 ObjectWithExternalArrayTestHelper<ExternalArrayClass, ElementType>( | 13933 ObjectWithExternalArrayTestHelper<ExternalArrayClass, ElementType>( |
| 14797 env.local(), ta, kElementCount, array_type, low, high); | 13934 env.local(), ta, kElementCount, array_type, low, high); |
| 14798 } | 13935 } |
| 14799 | 13936 |
| 14800 | 13937 |
| 14801 THREADED_TEST(Uint8Array) { | 13938 THREADED_TEST(Uint8Array) { |
| 14802 TypedArrayTestHelper<uint8_t, v8::Uint8Array, i::ExternalUint8Array>( | 13939 TypedArrayTestHelper<uint8_t, v8::Uint8Array, i::ExternalUint8Array>( |
| 14803 v8::kExternalUint8Array, 0, 0xFF); | 13940 i::kExternalUint8Array, 0, 0xFF); |
| 14804 } | 13941 } |
| 14805 | 13942 |
| 14806 | 13943 |
| 14807 THREADED_TEST(Int8Array) { | 13944 THREADED_TEST(Int8Array) { |
| 14808 TypedArrayTestHelper<int8_t, v8::Int8Array, i::ExternalInt8Array>( | 13945 TypedArrayTestHelper<int8_t, v8::Int8Array, i::ExternalInt8Array>( |
| 14809 v8::kExternalInt8Array, -0x80, 0x7F); | 13946 i::kExternalInt8Array, -0x80, 0x7F); |
| 14810 } | 13947 } |
| 14811 | 13948 |
| 14812 | 13949 |
| 14813 THREADED_TEST(Uint16Array) { | 13950 THREADED_TEST(Uint16Array) { |
| 14814 TypedArrayTestHelper<uint16_t, | 13951 TypedArrayTestHelper<uint16_t, v8::Uint16Array, i::ExternalUint16Array>( |
| 14815 v8::Uint16Array, | 13952 i::kExternalUint16Array, 0, 0xFFFF); |
| 14816 i::ExternalUint16Array>( | |
| 14817 v8::kExternalUint16Array, 0, 0xFFFF); | |
| 14818 } | 13953 } |
| 14819 | 13954 |
| 14820 | 13955 |
| 14821 THREADED_TEST(Int16Array) { | 13956 THREADED_TEST(Int16Array) { |
| 14822 TypedArrayTestHelper<int16_t, v8::Int16Array, i::ExternalInt16Array>( | 13957 TypedArrayTestHelper<int16_t, v8::Int16Array, i::ExternalInt16Array>( |
| 14823 v8::kExternalInt16Array, -0x8000, 0x7FFF); | 13958 i::kExternalInt16Array, -0x8000, 0x7FFF); |
| 14824 } | 13959 } |
| 14825 | 13960 |
| 14826 | 13961 |
| 14827 THREADED_TEST(Uint32Array) { | 13962 THREADED_TEST(Uint32Array) { |
| 14828 TypedArrayTestHelper<uint32_t, v8::Uint32Array, i::ExternalUint32Array>( | 13963 TypedArrayTestHelper<uint32_t, v8::Uint32Array, i::ExternalUint32Array>( |
| 14829 v8::kExternalUint32Array, 0, UINT_MAX); | 13964 i::kExternalUint32Array, 0, UINT_MAX); |
| 14830 } | 13965 } |
| 14831 | 13966 |
| 14832 | 13967 |
| 14833 THREADED_TEST(Int32Array) { | 13968 THREADED_TEST(Int32Array) { |
| 14834 TypedArrayTestHelper<int32_t, v8::Int32Array, i::ExternalInt32Array>( | 13969 TypedArrayTestHelper<int32_t, v8::Int32Array, i::ExternalInt32Array>( |
| 14835 v8::kExternalInt32Array, INT_MIN, INT_MAX); | 13970 i::kExternalInt32Array, INT_MIN, INT_MAX); |
| 14836 } | 13971 } |
| 14837 | 13972 |
| 14838 | 13973 |
| 14839 THREADED_TEST(Float32Array) { | 13974 THREADED_TEST(Float32Array) { |
| 14840 TypedArrayTestHelper<float, v8::Float32Array, i::ExternalFloat32Array>( | 13975 TypedArrayTestHelper<float, v8::Float32Array, i::ExternalFloat32Array>( |
| 14841 v8::kExternalFloat32Array, -500, 500); | 13976 i::kExternalFloat32Array, -500, 500); |
| 14842 } | 13977 } |
| 14843 | 13978 |
| 14844 | 13979 |
| 14845 THREADED_TEST(Float64Array) { | 13980 THREADED_TEST(Float64Array) { |
| 14846 TypedArrayTestHelper<double, v8::Float64Array, i::ExternalFloat64Array>( | 13981 TypedArrayTestHelper<double, v8::Float64Array, i::ExternalFloat64Array>( |
| 14847 v8::kExternalFloat64Array, -500, 500); | 13982 i::kExternalFloat64Array, -500, 500); |
| 14848 } | 13983 } |
| 14849 | 13984 |
| 14850 | 13985 |
| 14851 THREADED_TEST(Uint8ClampedArray) { | 13986 THREADED_TEST(Uint8ClampedArray) { |
| 14852 TypedArrayTestHelper<uint8_t, | 13987 TypedArrayTestHelper<uint8_t, v8::Uint8ClampedArray, |
| 14853 v8::Uint8ClampedArray, i::ExternalUint8ClampedArray>( | 13988 i::ExternalUint8ClampedArray>( |
| 14854 v8::kExternalUint8ClampedArray, 0, 0xFF); | 13989 i::kExternalUint8ClampedArray, 0, 0xFF); |
| 14855 } | 13990 } |
| 14856 | 13991 |
| 14857 | 13992 |
| 14858 THREADED_TEST(DataView) { | 13993 THREADED_TEST(DataView) { |
| 14859 const int kSize = 50; | 13994 const int kSize = 50; |
| 14860 | 13995 |
| 14861 i::ScopedVector<uint8_t> backing_store(kSize+2); | 13996 i::ScopedVector<uint8_t> backing_store(kSize+2); |
| 14862 | 13997 |
| 14863 LocalContext env; | 13998 LocalContext env; |
| 14864 v8::Isolate* isolate = env->GetIsolate(); | 13999 v8::Isolate* isolate = env->GetIsolate(); |
| (...skipping 4711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19576 SetterWhichSetsYOnThisTo23); | 18711 SetterWhichSetsYOnThisTo23); |
| 19577 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 18712 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 19578 | 18713 |
| 19579 CompileRun("function load(x) { return x.foo; }" | 18714 CompileRun("function load(x) { return x.foo; }" |
| 19580 "var o = Object.create(obj);" | 18715 "var o = Object.create(obj);" |
| 19581 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" | 18716 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" |
| 19582 "load(o); load(o); load(o); load(o);"); | 18717 "load(o); load(o); load(o); load(o);"); |
| 19583 } | 18718 } |
| 19584 | 18719 |
| 19585 | 18720 |
| 19586 THREADED_TEST(Regress3337) { | |
| 19587 LocalContext context; | |
| 19588 v8::Isolate* isolate = context->GetIsolate(); | |
| 19589 v8::HandleScope scope(isolate); | |
| 19590 Local<v8::Object> o1 = Object::New(isolate); | |
| 19591 Local<v8::Object> o2 = Object::New(isolate); | |
| 19592 i::Handle<i::JSObject> io1 = v8::Utils::OpenHandle(*o1); | |
| 19593 i::Handle<i::JSObject> io2 = v8::Utils::OpenHandle(*o2); | |
| 19594 CHECK(io1->map() == io2->map()); | |
| 19595 o1->SetIndexedPropertiesToExternalArrayData( | |
| 19596 NULL, v8::kExternalUint32Array, 0); | |
| 19597 o2->SetIndexedPropertiesToExternalArrayData( | |
| 19598 NULL, v8::kExternalUint32Array, 0); | |
| 19599 CHECK(io1->map() == io2->map()); | |
| 19600 } | |
| 19601 | |
| 19602 | |
| 19603 THREADED_TEST(Regress137496) { | 18721 THREADED_TEST(Regress137496) { |
| 19604 i::FLAG_expose_gc = true; | 18722 i::FLAG_expose_gc = true; |
| 19605 LocalContext context; | 18723 LocalContext context; |
| 19606 v8::HandleScope scope(context->GetIsolate()); | 18724 v8::HandleScope scope(context->GetIsolate()); |
| 19607 | 18725 |
| 19608 // Compile a try-finally clause where the finally block causes a GC | 18726 // Compile a try-finally clause where the finally block causes a GC |
| 19609 // while there still is a message pending for external reporting. | 18727 // while there still is a message pending for external reporting. |
| 19610 TryCatch try_catch; | 18728 TryCatch try_catch; |
| 19611 try_catch.SetVerbose(true); | 18729 try_catch.SetVerbose(true); |
| 19612 CompileRun("try { throw new Error(); } finally { gc(); }"); | 18730 CompileRun("try { throw new Error(); } finally { gc(); }"); |
| (...skipping 2287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21900 | 21018 |
| 21901 { | 21019 { |
| 21902 v8::HandleScope handle_scope(isolate); | 21020 v8::HandleScope handle_scope(isolate); |
| 21903 | 21021 |
| 21904 // Should work | 21022 // Should work |
| 21905 v8::Local<v8::Object> obj = v8::Object::New(isolate); | 21023 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
| 21906 | 21024 |
| 21907 USE(obj); | 21025 USE(obj); |
| 21908 } | 21026 } |
| 21909 } | 21027 } |
| OLD | NEW |