| Index: test/mjsunit/element-kind.js
|
| ===================================================================
|
| --- test/mjsunit/element-kind.js (revision 9531)
|
| +++ test/mjsunit/element-kind.js (working copy)
|
| @@ -25,10 +25,25 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| -// Flags: --allow-natives-syntax
|
| -// Test element kind of objects
|
| +// Flags: --allow-natives-syntax --smi-only-arrays
|
| +// Test element kind of objects.
|
| +// Since --smi-only-arrays affects builtins, its default setting at compile
|
| +// time sticks if built with snapshot. If --smi-only-arrays is deactivated
|
| +// by default, only a no-snapshot build actually has smi-only arrays enabled
|
| +// in this test case. Depending on whether smi-only arrays are actually
|
| +// enabled, this test takes the appropriate code path to check smi-only arrays.
|
|
|
| +
|
| +support_smi_only_arrays = %HasFastSmiOnlyElements([]);
|
| +
|
| +if (support_smi_only_arrays) {
|
| + print("Tests include smi-only arrays.");
|
| +} else {
|
| + print("Tests do NOT include smi-only arrays.");
|
| +}
|
| +
|
| var element_kind = {
|
| + fast_smi_only_elements : 0,
|
| fast_elements : 1,
|
| fast_double_elements : 2,
|
| dictionary_elements : 3,
|
| @@ -44,9 +59,17 @@
|
| }
|
|
|
| // We expect an object to only be of one element kind.
|
| -function assertKind(expected, obj){
|
| - assertEquals(expected == element_kind.fast_elements,
|
| - %HasFastElements(obj));
|
| +function assertKind(expected, obj) {
|
| + if (support_smi_only_arrays) {
|
| + assertEquals(expected == element_kind.fast_smi_only_elements,
|
| + %HasFastSmiOnlyElements(obj));
|
| + assertEquals(expected == element_kind.fast_elements,
|
| + %HasFastElements(obj));
|
| + } else {
|
| + assertEquals(expected == element_kind.fast_elements ||
|
| + expected == element_kind.fast_smi_only_elements,
|
| + %HasFastElements(obj));
|
| + }
|
| assertEquals(expected == element_kind.fast_double_elements,
|
| %HasFastDoubleElements(obj));
|
| assertEquals(expected == element_kind.dictionary_elements,
|
| @@ -80,17 +103,31 @@
|
| me.drink = 0xC0C0A;
|
| assertKind(element_kind.fast_elements, me);
|
|
|
| +var too = [1,2,3];
|
| +assertKind(element_kind.fast_smi_only_elements, too);
|
| +too.dance = 0xD15C0;
|
| +too.drink = 0xC0C0A;
|
| +assertKind(element_kind.fast_smi_only_elements, too);
|
| +
|
| +// Make sure the element kind transitions from smionly when a non-smi is stored.
|
| var you = new Array();
|
| -for(i = 0; i < 1337; i++) {
|
| - you[i] = i;
|
| +assertKind(element_kind.fast_smi_only_elements, you);
|
| +for (var i = 0; i < 1337; i++) {
|
| + var val = i;
|
| + if (i == 1336) {
|
| + assertKind(element_kind.fast_smi_only_elements, you);
|
| + val = new Object();
|
| + }
|
| + you[i] = val;
|
| }
|
| assertKind(element_kind.fast_elements, you);
|
|
|
| -assertKind(element_kind.dictionary_elements, new Array(0xC0C0A));
|
| +assertKind(element_kind.dictionary_elements, new Array(0xDECAF));
|
|
|
| -// fast_double_elements not yet available
|
| +var fast_double_array = new Array(0xDECAF);
|
| +for (var i = 0; i < 0xDECAF; i++) fast_double_array[i] = i / 2;
|
| +assertKind(element_kind.fast_double_elements, fast_double_array);
|
|
|
| -
|
| assertKind(element_kind.external_byte_elements, new Int8Array(9001));
|
| assertKind(element_kind.external_unsigned_byte_elements, new Uint8Array(007));
|
| assertKind(element_kind.external_short_elements, new Int16Array(666));
|
| @@ -100,3 +137,70 @@
|
| assertKind(element_kind.external_float_elements, new Float32Array(7));
|
| assertKind(element_kind.external_double_elements, new Float64Array(0));
|
| assertKind(element_kind.external_pixel_elements, new PixelArray(512));
|
| +
|
| +// Crankshaft support for smi-only array elements.
|
| +function monomorphic(array) {
|
| + for (var i = 0; i < 3; i++) {
|
| + array[i] = i + 10;
|
| + }
|
| + assertKind(element_kind.fast_smi_only_elements, array);
|
| + for (var i = 0; i < 3; i++) {
|
| + var a = array[i];
|
| + assertEquals(i + 10, a);
|
| + }
|
| +}
|
| +var smi_only = [1, 2, 3];
|
| +for (var i = 0; i < 3; i++) monomorphic(smi_only);
|
| +%OptimizeFunctionOnNextCall(monomorphic);
|
| +monomorphic(smi_only);
|
| +function polymorphic(array, expected_kind) {
|
| + array[1] = 42;
|
| + assertKind(expected_kind, array);
|
| + var a = array[1];
|
| + assertEquals(42, a);
|
| +}
|
| +var smis = [1, 2, 3];
|
| +var strings = ["one", "two", "three"];
|
| +var doubles = [0, 0, 0]; doubles[0] = 1.5; doubles[1] = 2.5; doubles[2] = 3.5;
|
| +assertKind(support_smi_only_arrays
|
| + ? element_kind.fast_double_elements
|
| + : element_kind.fast_elements,
|
| + doubles);
|
| +for (var i = 0; i < 3; i++) {
|
| + polymorphic(smis, element_kind.fast_smi_only_elements);
|
| + polymorphic(strings, element_kind.fast_elements);
|
| + polymorphic(doubles, support_smi_only_arrays
|
| + ? element_kind.fast_double_elements
|
| + : element_kind.fast_elements);
|
| +}
|
| +%OptimizeFunctionOnNextCall(polymorphic);
|
| +polymorphic(smis, element_kind.fast_smi_only_elements);
|
| +polymorphic(strings, element_kind.fast_elements);
|
| +polymorphic(doubles, support_smi_only_arrays
|
| + ? element_kind.fast_double_elements
|
| + : element_kind.fast_elements);
|
| +
|
| +// Crankshaft support for smi-only elements in dynamic array literals.
|
| +function get(foo) { return foo; } // Used to generate dynamic values.
|
| +
|
| +//function crankshaft_test(expected_kind) {
|
| +function crankshaft_test() {
|
| + var a = [get(1), get(2), get(3)];
|
| + assertKind(element_kind.fast_smi_only_elements, a);
|
| + var b = [get(1), get(2), get("three")];
|
| + assertKind(element_kind.fast_elements, b);
|
| + var c = [get(1), get(2), get(3.5)];
|
| + // The full code generator doesn't support conversion to fast_double_elements
|
| + // yet. Crankshaft does, but only with --smi-only-arrays support.
|
| + if ((%GetOptimizationStatus(crankshaft_test) & 1) &&
|
| + support_smi_only_arrays) {
|
| + assertKind(element_kind.fast_double_elements, c);
|
| + } else {
|
| + assertKind(element_kind.fast_elements, c);
|
| + }
|
| +}
|
| +for (var i = 0; i < 3; i++) {
|
| + crankshaft_test();
|
| +}
|
| +%OptimizeFunctionOnNextCall(crankshaft_test);
|
| +crankshaft_test();
|
|
|