1*635a8641SAndroid Build Coastguard Worker// Copyright 2014 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker// found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker(function() { 6*635a8641SAndroid Build Coastguard Worker var internal = mojo.internal; 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker var kHostIsLittleEndian = (function () { 9*635a8641SAndroid Build Coastguard Worker var endianArrayBuffer = new ArrayBuffer(2); 10*635a8641SAndroid Build Coastguard Worker var endianUint8Array = new Uint8Array(endianArrayBuffer); 11*635a8641SAndroid Build Coastguard Worker var endianUint16Array = new Uint16Array(endianArrayBuffer); 12*635a8641SAndroid Build Coastguard Worker endianUint16Array[0] = 1; 13*635a8641SAndroid Build Coastguard Worker return endianUint8Array[0] == 1; 14*635a8641SAndroid Build Coastguard Worker })(); 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker var kHighWordMultiplier = 0x100000000; 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker function Buffer(sizeOrArrayBuffer) { 19*635a8641SAndroid Build Coastguard Worker if (sizeOrArrayBuffer instanceof ArrayBuffer) 20*635a8641SAndroid Build Coastguard Worker this.arrayBuffer = sizeOrArrayBuffer; 21*635a8641SAndroid Build Coastguard Worker else 22*635a8641SAndroid Build Coastguard Worker this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer); 23*635a8641SAndroid Build Coastguard Worker 24*635a8641SAndroid Build Coastguard Worker this.dataView = new DataView(this.arrayBuffer); 25*635a8641SAndroid Build Coastguard Worker this.next = 0; 26*635a8641SAndroid Build Coastguard Worker } 27*635a8641SAndroid Build Coastguard Worker 28*635a8641SAndroid Build Coastguard Worker Object.defineProperty(Buffer.prototype, "byteLength", { 29*635a8641SAndroid Build Coastguard Worker get: function() { return this.arrayBuffer.byteLength; } 30*635a8641SAndroid Build Coastguard Worker }); 31*635a8641SAndroid Build Coastguard Worker 32*635a8641SAndroid Build Coastguard Worker Buffer.prototype.alloc = function(size) { 33*635a8641SAndroid Build Coastguard Worker var pointer = this.next; 34*635a8641SAndroid Build Coastguard Worker this.next += size; 35*635a8641SAndroid Build Coastguard Worker if (this.next > this.byteLength) { 36*635a8641SAndroid Build Coastguard Worker var newSize = (1.5 * (this.byteLength + size)) | 0; 37*635a8641SAndroid Build Coastguard Worker this.grow(newSize); 38*635a8641SAndroid Build Coastguard Worker } 39*635a8641SAndroid Build Coastguard Worker return pointer; 40*635a8641SAndroid Build Coastguard Worker }; 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) { 43*635a8641SAndroid Build Coastguard Worker (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer)); 44*635a8641SAndroid Build Coastguard Worker } 45*635a8641SAndroid Build Coastguard Worker 46*635a8641SAndroid Build Coastguard Worker Buffer.prototype.grow = function(size) { 47*635a8641SAndroid Build Coastguard Worker var newArrayBuffer = new ArrayBuffer(size); 48*635a8641SAndroid Build Coastguard Worker copyArrayBuffer(newArrayBuffer, this.arrayBuffer); 49*635a8641SAndroid Build Coastguard Worker this.arrayBuffer = newArrayBuffer; 50*635a8641SAndroid Build Coastguard Worker this.dataView = new DataView(this.arrayBuffer); 51*635a8641SAndroid Build Coastguard Worker }; 52*635a8641SAndroid Build Coastguard Worker 53*635a8641SAndroid Build Coastguard Worker Buffer.prototype.trim = function() { 54*635a8641SAndroid Build Coastguard Worker this.arrayBuffer = this.arrayBuffer.slice(0, this.next); 55*635a8641SAndroid Build Coastguard Worker this.dataView = new DataView(this.arrayBuffer); 56*635a8641SAndroid Build Coastguard Worker }; 57*635a8641SAndroid Build Coastguard Worker 58*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getUint8 = function(offset) { 59*635a8641SAndroid Build Coastguard Worker return this.dataView.getUint8(offset); 60*635a8641SAndroid Build Coastguard Worker } 61*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getUint16 = function(offset) { 62*635a8641SAndroid Build Coastguard Worker return this.dataView.getUint16(offset, kHostIsLittleEndian); 63*635a8641SAndroid Build Coastguard Worker } 64*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getUint32 = function(offset) { 65*635a8641SAndroid Build Coastguard Worker return this.dataView.getUint32(offset, kHostIsLittleEndian); 66*635a8641SAndroid Build Coastguard Worker } 67*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getUint64 = function(offset) { 68*635a8641SAndroid Build Coastguard Worker var lo, hi; 69*635a8641SAndroid Build Coastguard Worker if (kHostIsLittleEndian) { 70*635a8641SAndroid Build Coastguard Worker lo = this.dataView.getUint32(offset, kHostIsLittleEndian); 71*635a8641SAndroid Build Coastguard Worker hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); 72*635a8641SAndroid Build Coastguard Worker } else { 73*635a8641SAndroid Build Coastguard Worker hi = this.dataView.getUint32(offset, kHostIsLittleEndian); 74*635a8641SAndroid Build Coastguard Worker lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); 75*635a8641SAndroid Build Coastguard Worker } 76*635a8641SAndroid Build Coastguard Worker return lo + hi * kHighWordMultiplier; 77*635a8641SAndroid Build Coastguard Worker } 78*635a8641SAndroid Build Coastguard Worker 79*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getInt8 = function(offset) { 80*635a8641SAndroid Build Coastguard Worker return this.dataView.getInt8(offset); 81*635a8641SAndroid Build Coastguard Worker } 82*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getInt16 = function(offset) { 83*635a8641SAndroid Build Coastguard Worker return this.dataView.getInt16(offset, kHostIsLittleEndian); 84*635a8641SAndroid Build Coastguard Worker } 85*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getInt32 = function(offset) { 86*635a8641SAndroid Build Coastguard Worker return this.dataView.getInt32(offset, kHostIsLittleEndian); 87*635a8641SAndroid Build Coastguard Worker } 88*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getInt64 = function(offset) { 89*635a8641SAndroid Build Coastguard Worker var lo, hi; 90*635a8641SAndroid Build Coastguard Worker if (kHostIsLittleEndian) { 91*635a8641SAndroid Build Coastguard Worker lo = this.dataView.getUint32(offset, kHostIsLittleEndian); 92*635a8641SAndroid Build Coastguard Worker hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian); 93*635a8641SAndroid Build Coastguard Worker } else { 94*635a8641SAndroid Build Coastguard Worker hi = this.dataView.getInt32(offset, kHostIsLittleEndian); 95*635a8641SAndroid Build Coastguard Worker lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian); 96*635a8641SAndroid Build Coastguard Worker } 97*635a8641SAndroid Build Coastguard Worker return lo + hi * kHighWordMultiplier; 98*635a8641SAndroid Build Coastguard Worker } 99*635a8641SAndroid Build Coastguard Worker 100*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getFloat32 = function(offset) { 101*635a8641SAndroid Build Coastguard Worker return this.dataView.getFloat32(offset, kHostIsLittleEndian); 102*635a8641SAndroid Build Coastguard Worker } 103*635a8641SAndroid Build Coastguard Worker Buffer.prototype.getFloat64 = function(offset) { 104*635a8641SAndroid Build Coastguard Worker return this.dataView.getFloat64(offset, kHostIsLittleEndian); 105*635a8641SAndroid Build Coastguard Worker } 106*635a8641SAndroid Build Coastguard Worker 107*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setUint8 = function(offset, value) { 108*635a8641SAndroid Build Coastguard Worker this.dataView.setUint8(offset, value); 109*635a8641SAndroid Build Coastguard Worker } 110*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setUint16 = function(offset, value) { 111*635a8641SAndroid Build Coastguard Worker this.dataView.setUint16(offset, value, kHostIsLittleEndian); 112*635a8641SAndroid Build Coastguard Worker } 113*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setUint32 = function(offset, value) { 114*635a8641SAndroid Build Coastguard Worker this.dataView.setUint32(offset, value, kHostIsLittleEndian); 115*635a8641SAndroid Build Coastguard Worker } 116*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setUint64 = function(offset, value) { 117*635a8641SAndroid Build Coastguard Worker var hi = (value / kHighWordMultiplier) | 0; 118*635a8641SAndroid Build Coastguard Worker if (kHostIsLittleEndian) { 119*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset, value, kHostIsLittleEndian); 120*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian); 121*635a8641SAndroid Build Coastguard Worker } else { 122*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset, hi, kHostIsLittleEndian); 123*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian); 124*635a8641SAndroid Build Coastguard Worker } 125*635a8641SAndroid Build Coastguard Worker } 126*635a8641SAndroid Build Coastguard Worker 127*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setInt8 = function(offset, value) { 128*635a8641SAndroid Build Coastguard Worker this.dataView.setInt8(offset, value); 129*635a8641SAndroid Build Coastguard Worker } 130*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setInt16 = function(offset, value) { 131*635a8641SAndroid Build Coastguard Worker this.dataView.setInt16(offset, value, kHostIsLittleEndian); 132*635a8641SAndroid Build Coastguard Worker } 133*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setInt32 = function(offset, value) { 134*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset, value, kHostIsLittleEndian); 135*635a8641SAndroid Build Coastguard Worker } 136*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setInt64 = function(offset, value) { 137*635a8641SAndroid Build Coastguard Worker var hi = Math.floor(value / kHighWordMultiplier); 138*635a8641SAndroid Build Coastguard Worker if (kHostIsLittleEndian) { 139*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset, value, kHostIsLittleEndian); 140*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian); 141*635a8641SAndroid Build Coastguard Worker } else { 142*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset, hi, kHostIsLittleEndian); 143*635a8641SAndroid Build Coastguard Worker this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian); 144*635a8641SAndroid Build Coastguard Worker } 145*635a8641SAndroid Build Coastguard Worker } 146*635a8641SAndroid Build Coastguard Worker 147*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setFloat32 = function(offset, value) { 148*635a8641SAndroid Build Coastguard Worker this.dataView.setFloat32(offset, value, kHostIsLittleEndian); 149*635a8641SAndroid Build Coastguard Worker } 150*635a8641SAndroid Build Coastguard Worker Buffer.prototype.setFloat64 = function(offset, value) { 151*635a8641SAndroid Build Coastguard Worker this.dataView.setFloat64(offset, value, kHostIsLittleEndian); 152*635a8641SAndroid Build Coastguard Worker } 153*635a8641SAndroid Build Coastguard Worker 154*635a8641SAndroid Build Coastguard Worker internal.Buffer = Buffer; 155*635a8641SAndroid Build Coastguard Worker})(); 156