mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-03 21:24:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			306 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
function assert(b) {
 | 
						|
    if (!b)
 | 
						|
        throw new Error("Bad!");
 | 
						|
}
 | 
						|
 | 
						|
function test1() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getInt32(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getInt32(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getInt32(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Int32Array(ab);
 | 
						|
    ta[0] = 0x01020304;
 | 
						|
    let dv = new DataView(ab);
 | 
						|
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0x04030201);
 | 
						|
        assert(littleEndian(dv, 0) === 0x01020304);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0x01020304);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0x04030201);
 | 
						|
    }
 | 
						|
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0x04030201);
 | 
						|
        assert(littleEndian(dv, 0) === 0x01020304);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0x01020304);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0x04030201);
 | 
						|
    }
 | 
						|
 | 
						|
    // Make sure we get the right sign.
 | 
						|
    ta[0] = -32361386; // 0xfe123456
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0x563412fe);
 | 
						|
        assert(littleEndian(dv, 0) === -32361386);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === -32361386);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0x563412fe);
 | 
						|
    }
 | 
						|
 | 
						|
    // -2146290602 == (int)0x80123456
 | 
						|
    ta[0] = 0x56341280;
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === -2146290602);
 | 
						|
        assert(littleEndian(dv, 0) === 0x56341280);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0x56341280);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === -2146290602);
 | 
						|
    }
 | 
						|
}
 | 
						|
test1();
 | 
						|
 | 
						|
function test2() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getInt16(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getInt16(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getInt16(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(2);
 | 
						|
    let ta = new Int16Array(ab);
 | 
						|
    ta[0] = 0x0102;
 | 
						|
    let dv = new DataView(ab);
 | 
						|
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0x0201);
 | 
						|
        assert(littleEndian(dv, 0) === 0x0102);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0x0102);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0x0201);
 | 
						|
    }
 | 
						|
 | 
						|
    // Check sign.
 | 
						|
    ta[0] = -512; // 0xfe00
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0x00fe);
 | 
						|
        assert(littleEndian(dv, 0) === -512);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === -512);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0x00fe);
 | 
						|
    }
 | 
						|
 | 
						|
    // Check sign extension.
 | 
						|
    ta[0] = 0x00fe;
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === -512);
 | 
						|
        assert(littleEndian(dv, 0) === 0x00fe);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0x00fe);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === -512);
 | 
						|
    }
 | 
						|
}
 | 
						|
test2();
 | 
						|
 | 
						|
function test3() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getFloat32(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getFloat32(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getFloat32(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Float32Array(ab);
 | 
						|
    const normal = 12912.403; // 0x4649c19d
 | 
						|
    const normalAsDouble = 12912.403320312500;
 | 
						|
 | 
						|
    const flipped = -5.1162437589918884e-21;
 | 
						|
    ta[0] = normal;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === flipped);
 | 
						|
        assert(littleEndian(dv, 0) === 12912.403320312500);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === normalAsDouble);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === flipped);
 | 
						|
    }
 | 
						|
}
 | 
						|
test3();
 | 
						|
 | 
						|
function test4() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getUint32(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getUint32(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getUint32(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Uint32Array(ab);
 | 
						|
    ta[0] = 0xa0b0d0f0;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(bigEndian(dv, 0) === 0xf0d0b0a0);
 | 
						|
        assert(littleEndian(dv, 0) === 0xa0b0d0f0);
 | 
						|
        if (i % 2)
 | 
						|
            assert(biEndian(dv, 0, true) === 0xa0b0d0f0);
 | 
						|
        else
 | 
						|
            assert(biEndian(dv, 0, false) === 0xf0d0b0a0);
 | 
						|
    }
 | 
						|
}
 | 
						|
test4();
 | 
						|
 | 
						|
function test5() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getUint16(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getUint16(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getUint16(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Uint32Array(ab);
 | 
						|
    ta[0] = 0xa0b0d0f0;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(littleEndian(dv, 0) == 0xd0f0);
 | 
						|
        assert(bigEndian(dv, 0) == 0xf0d0);
 | 
						|
 | 
						|
        assert(littleEndian(dv, 1) == 0xb0d0);
 | 
						|
        assert(bigEndian(dv, 1) == 0xd0b0);
 | 
						|
 | 
						|
        assert(littleEndian(dv, 2) == 0xa0b0);
 | 
						|
        assert(bigEndian(dv, 2) == 0xb0a0);
 | 
						|
 | 
						|
        assert(biEndian(dv, 0, true) == 0xd0f0);
 | 
						|
        assert(biEndian(dv, 0, false) == 0xf0d0);
 | 
						|
 | 
						|
        assert(biEndian(dv, 1, true) == 0xb0d0);
 | 
						|
        assert(biEndian(dv, 1, false) == 0xd0b0);
 | 
						|
 | 
						|
        assert(biEndian(dv, 2, true) == 0xa0b0);
 | 
						|
        assert(biEndian(dv, 2, false) == 0xb0a0);
 | 
						|
    }
 | 
						|
}
 | 
						|
test5();
 | 
						|
 | 
						|
function test6() {
 | 
						|
    function bigEndian(o, i) {
 | 
						|
        return o.getInt16(i, false);
 | 
						|
    }
 | 
						|
    noInline(bigEndian);
 | 
						|
    function littleEndian(o, i) {
 | 
						|
        return o.getInt16(i, true);
 | 
						|
    }
 | 
						|
    noInline(littleEndian);
 | 
						|
    function biEndian(o, i, b) {
 | 
						|
        return o.getInt16(i, b);
 | 
						|
    }
 | 
						|
    noInline(biEndian);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Uint32Array(ab);
 | 
						|
    ta[0] = 0xa070fa01;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(littleEndian(dv, 0) == -1535);
 | 
						|
        assert(bigEndian(dv, 0) == 0x01fa);
 | 
						|
 | 
						|
        assert(littleEndian(dv, 1) == 0x70fa);
 | 
						|
        assert(bigEndian(dv, 1) == -1424);
 | 
						|
 | 
						|
        assert(littleEndian(dv, 2) == -24464);
 | 
						|
        assert(bigEndian(dv, 2) == 0x70a0);
 | 
						|
 | 
						|
        assert(biEndian(dv, 0, true) == -1535);
 | 
						|
        assert(biEndian(dv, 0, false) == 0x01fa);
 | 
						|
 | 
						|
        assert(biEndian(dv, 1, true) == 0x70fa);
 | 
						|
        assert(biEndian(dv, 1, false) == -1424);
 | 
						|
 | 
						|
        assert(biEndian(dv, 2, true) == -24464);
 | 
						|
        assert(biEndian(dv, 2, false) == 0x70a0);
 | 
						|
    }
 | 
						|
}
 | 
						|
test6();
 | 
						|
 | 
						|
function test7() {
 | 
						|
    function load(o, i) {
 | 
						|
        return o.getInt8(i);
 | 
						|
    }
 | 
						|
    noInline(load);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Uint32Array(ab);
 | 
						|
    ta[0] = 0xa070fa01;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(load(dv, 0) === 0x01);
 | 
						|
        assert(load(dv, 1) === -6);
 | 
						|
        assert(load(dv, 2) === 0x70);
 | 
						|
        assert(load(dv, 3) === -96);
 | 
						|
    }
 | 
						|
}
 | 
						|
test7();
 | 
						|
 | 
						|
function test8() {
 | 
						|
    function load(o, i) {
 | 
						|
        return o.getUint8(i);
 | 
						|
    }
 | 
						|
    noInline(load);
 | 
						|
 | 
						|
    let ab = new ArrayBuffer(4);
 | 
						|
    let ta = new Uint32Array(ab);
 | 
						|
    ta[0] = 0xa070fa01;
 | 
						|
 | 
						|
    let dv = new DataView(ab);
 | 
						|
    for (let i = 0; i < 10000; ++i) {
 | 
						|
        assert(load(dv, 0) === 0x01);
 | 
						|
        assert(load(dv, 1) === 0xfa);
 | 
						|
        assert(load(dv, 2) === 0x70);
 | 
						|
        assert(load(dv, 3) === 0xa0)
 | 
						|
    }
 | 
						|
}
 | 
						|
test8();
 |