Index: mojo/public/bindings/js/codec.js |
diff --git a/mojo/public/bindings/js/codec.js b/mojo/public/bindings/js/codec.js |
deleted file mode 100644 |
index 9827b36b1822f6f6783a9857b2b5d5fafbc7dbd1..0000000000000000000000000000000000000000 |
--- a/mojo/public/bindings/js/codec.js |
+++ /dev/null |
@@ -1,505 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-define("mojo/public/bindings/js/codec", function() { |
- |
- // Memory ------------------------------------------------------------------- |
- |
- function store8(memory, pointer, val) { |
- memory[pointer] = val; |
- } |
- |
- function store16(memory, pointer, val) { |
- memory[pointer + 0] = val >> 0; |
- memory[pointer + 1] = val >> 8; |
- } |
- |
- function store32(memory, pointer, val) { |
- memory[pointer + 0] = val >> 0; |
- memory[pointer + 1] = val >> 8; |
- memory[pointer + 2] = val >> 16; |
- memory[pointer + 3] = val >> 24; |
- } |
- |
- function store64(memory, pointer, val) { |
- store32(memory, pointer, val); |
- var high = (val / 0x10000) | 0; |
- store32(memory, pointer + 4, high); |
- } |
- |
- function load8(memory, pointer) { |
- return memory[pointer]; |
- } |
- |
- function load16(memory, pointer) { |
- return (memory[pointer + 0] << 0) + |
- (memory[pointer + 1] << 8); |
- } |
- |
- function load32(memory, pointer) { |
- return (memory[pointer + 0] << 0) + |
- (memory[pointer + 1] << 8) + |
- (memory[pointer + 2] << 16) + |
- (memory[pointer + 3] << 24); |
- } |
- |
- var kAlignment = 8; |
- |
- function align(size) { |
- return size + (kAlignment - (size % kAlignment)) % kAlignment; |
- } |
- |
- // Buffer ------------------------------------------------------------------- |
- |
- function Buffer(size) { |
- this.memory = new Uint8Array(size); |
- this.next = 0; |
- } |
- |
- Buffer.prototype.alloc = function(size) { |
- var pointer = this.next; |
- this.next += size; |
- if (this.next > this.memory.length) { |
- var newSize = (1.5 * (this.memory.length + size)) | 0; |
- this.grow(newSize); |
- } |
- return pointer; |
- }; |
- |
- Buffer.prototype.grow = function(size) { |
- var newMemory = new Uint8Array(size); |
- var oldMemory = this.memory; |
- for (var i = 0; i < oldMemory.length; ++i) |
- newMemory[i] = oldMemory[i]; |
- this.memory = newMemory; |
- }; |
- |
- Buffer.prototype.createViewOfAllocatedMemory = function() { |
- return new Uint8Array(this.memory.buffer, 0, this.next); |
- }; |
- |
- // Constants ---------------------------------------------------------------- |
- |
- var kArrayHeaderSize = 8; |
- var kStructHeaderSize = 8; |
- var kMessageHeaderSize = 16; |
- var kMessageWithRequestIDHeaderSize = 24; |
- |
- // Decoder ------------------------------------------------------------------ |
- |
- function Decoder(memory, handles, base) { |
- this.memory = memory; |
- this.handles = handles; |
- this.base = base; |
- this.next = base; |
- this.viewU32 = new Uint32Array( |
- this.memory.buffer, 0, |
- Math.floor(this.memory.length / Uint32Array.BYTES_PER_ELEMENT)); |
- this.viewFloat = new Float32Array( |
- this.memory.buffer, 0, |
- Math.floor(this.memory.length / Float32Array.BYTES_PER_ELEMENT)); |
- } |
- |
- Decoder.prototype.skip = function(offset) { |
- this.next += offset; |
- }; |
- |
- Decoder.prototype.read8 = function() { |
- var result = load8(this.memory, this.next); |
- this.next += 1; |
- return result; |
- }; |
- |
- Decoder.prototype.read32 = function() { |
- var result = this.viewU32[this.next / this.viewU32.BYTES_PER_ELEMENT]; |
- this.next += this.viewU32.BYTES_PER_ELEMENT; |
- return result; |
- }; |
- |
- Decoder.prototype.read64 = function() { |
- var low = this.read32(); |
- var high = this.read32(); |
- return low + high * 0x100000000; |
- }; |
- |
- Decoder.prototype.decodeFloat = function() { |
- var result = this.viewFloat[this.next / this.viewFloat.BYTES_PER_ELEMENT]; |
- this.next += this.viewFloat.BYTES_PER_ELEMENT; |
- return result; |
- }; |
- |
- Decoder.prototype.decodePointer = function() { |
- // TODO(abarth): To correctly decode a pointer, we need to know the real |
- // base address of the array buffer. |
- var offsetPointer = this.next; |
- var offset = this.read64(); |
- if (!offset) |
- return 0; |
- return offsetPointer + offset; |
- }; |
- |
- Decoder.prototype.decodeAndCreateDecoder = function() { |
- return new Decoder(this.memory, this.handles, this.decodePointer()); |
- }; |
- |
- Decoder.prototype.decodeHandle = function() { |
- return this.handles[this.read32()]; |
- }; |
- |
- Decoder.prototype.decodeString = function() { |
- // TODO(abarth): We should really support UTF-8. We might want to |
- // jump out of the VM to decode the string directly from the array |
- // buffer using v8::String::NewFromUtf8. |
- var numberOfBytes = this.read32(); |
- var numberOfElements = this.read32(); |
- var val = new Array(numberOfElements); |
- var memory = this.memory; |
- var base = this.next; |
- for (var i = 0; i < numberOfElements; ++i) { |
- val[i] = String.fromCharCode(memory[base + i] & 0x7F); |
- } |
- this.next += numberOfElements; |
- return val.join(''); |
- }; |
- |
- Decoder.prototype.decodeArray = function(cls) { |
- var numberOfBytes = this.read32(); |
- var numberOfElements = this.read32(); |
- var val = new Array(numberOfElements); |
- for (var i = 0; i < numberOfElements; ++i) { |
- val[i] = cls.decode(this); |
- } |
- return val; |
- }; |
- |
- Decoder.prototype.decodeStructPointer = function(cls) { |
- return cls.decode(this.decodeAndCreateDecoder()); |
- }; |
- |
- Decoder.prototype.decodeArrayPointer = function(cls) { |
- return this.decodeAndCreateDecoder().decodeArray(cls); |
- }; |
- |
- Decoder.prototype.decodeStringPointer = function() { |
- return this.decodeAndCreateDecoder().decodeString(); |
- }; |
- |
- // Encoder ------------------------------------------------------------------ |
- |
- function Encoder(buffer, handles, base) { |
- this.buffer = buffer; |
- this.handles = handles; |
- this.base = base; |
- this.next = base; |
- } |
- |
- Encoder.prototype.skip = function(offset) { |
- this.next += offset; |
- }; |
- |
- Encoder.prototype.write8 = function(val) { |
- store8(this.buffer.memory, this.next, val); |
- this.next += 1; |
- }; |
- |
- Encoder.prototype.write32 = function(val) { |
- store32(this.buffer.memory, this.next, val); |
- this.next += 4; |
- }; |
- |
- Encoder.prototype.write64 = function(val) { |
- store64(this.buffer.memory, this.next, val); |
- this.next += 8; |
- }; |
- |
- Encoder.prototype.encodeFloat = function(val) { |
- var floatBuffer = new Float32Array(1); |
- floatBuffer[0] = val; |
- var buffer = new Uint8Array(floatBuffer.buffer, 0); |
- for (var i = 0; i < buffer.length; ++i) |
- this.buffer.memory[this.next++] = buffer[i]; |
- }; |
- |
- Encoder.prototype.encodePointer = function(pointer) { |
- if (!pointer) |
- return this.write64(0); |
- // TODO(abarth): To correctly encode a pointer, we need to know the real |
- // base address of the array buffer. |
- var offset = pointer - this.next; |
- this.write64(offset); |
- }; |
- |
- Encoder.prototype.createAndEncodeEncoder = function(size) { |
- var pointer = this.buffer.alloc(align(size)); |
- this.encodePointer(pointer); |
- return new Encoder(this.buffer, this.handles, pointer); |
- }; |
- |
- Encoder.prototype.encodeHandle = function(handle) { |
- this.handles.push(handle); |
- this.write32(this.handles.length - 1); |
- }; |
- |
- Encoder.prototype.encodeString = function(val) { |
- var numberOfElements = val.length; |
- var numberOfBytes = kArrayHeaderSize + numberOfElements; |
- this.write32(numberOfBytes); |
- this.write32(numberOfElements); |
- // TODO(abarth): We should really support UTF-8. We might want to |
- // jump out of the VM to encode the string directly from the array |
- // buffer using v8::String::WriteUtf8. |
- var memory = this.buffer.memory; |
- var base = this.next; |
- var len = val.length; |
- for (var i = 0; i < len; ++i) { |
- memory[base + i] = val.charCodeAt(i) & 0x7F; |
- } |
- this.next += len; |
- }; |
- |
- Encoder.prototype.encodeArray = function(cls, val) { |
- var numberOfElements = val.length; |
- var numberOfBytes = kArrayHeaderSize + cls.encodedSize * numberOfElements; |
- this.write32(numberOfBytes); |
- this.write32(numberOfElements); |
- for (var i = 0; i < numberOfElements; ++i) { |
- cls.encode(this, val[i]); |
- } |
- }; |
- |
- Encoder.prototype.encodeStructPointer = function(cls, val) { |
- var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
- cls.encode(encoder, val); |
- }; |
- |
- Encoder.prototype.encodeArrayPointer = function(cls, val) { |
- var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; |
- var encoder = this.createAndEncodeEncoder(encodedSize); |
- encoder.encodeArray(cls, val); |
- }; |
- |
- Encoder.prototype.encodeStringPointer = function(val) { |
- // TODO(abarth): This won't be right once we support UTF-8. |
- var encodedSize = kArrayHeaderSize + val.length; |
- var encoder = this.createAndEncodeEncoder(encodedSize); |
- encoder.encodeString(val); |
- }; |
- |
- // Message ------------------------------------------------------------------ |
- |
- var kMessageExpectsResponse = 1 << 0; |
- var kMessageIsResponse = 1 << 1; |
- |
- function Message(memory, handles) { |
- this.memory = memory; |
- this.handles = handles; |
- } |
- |
- Message.prototype.setRequestID = function(requestID) { |
- // TODO(darin): Verify that space was reserved for this field! |
- store64(this.memory, 4 + 4 + 4 + 4, requestID); |
- }; |
- |
- Message.prototype.getFlags = function() { |
- // Skip over num_bytes, num_fields, and message_name. |
- return load32(this.memory, 4 + 4 + 4); |
- }; |
- |
- // MessageBuilder ----------------------------------------------------------- |
- |
- function MessageBuilder(messageName, payloadSize) { |
- // Currently, we don't compute the payload size correctly ahead of time. |
- // Instead, we resize the buffer at the end. |
- var numberOfBytes = kMessageHeaderSize + payloadSize; |
- this.buffer = new Buffer(numberOfBytes); |
- this.handles = []; |
- var encoder = this.createEncoder(kMessageHeaderSize); |
- encoder.write32(kMessageHeaderSize); |
- encoder.write32(2); // num_fields. |
- encoder.write32(messageName); |
- encoder.write32(0); // flags. |
- } |
- |
- MessageBuilder.prototype.createEncoder = function(size) { |
- var pointer = this.buffer.alloc(size); |
- return new Encoder(this.buffer, this.handles, pointer); |
- }; |
- |
- MessageBuilder.prototype.encodeStruct = function(cls, val) { |
- cls.encode(this.createEncoder(cls.encodedSize), val); |
- }; |
- |
- MessageBuilder.prototype.finish = function() { |
- // TODO(abarth): Rather than resizing the buffer at the end, we could |
- // compute the size we need ahead of time, like we do in C++. |
- var memory = this.buffer.createViewOfAllocatedMemory(); |
- var message = new Message(memory, this.handles); |
- this.buffer = null; |
- this.handles = null; |
- this.encoder = null; |
- return message; |
- }; |
- |
- // MessageWithRequestIDBuilder ----------------------------------------------- |
- |
- function MessageWithRequestIDBuilder(messageName, payloadSize, flags, |
- requestID) { |
- // Currently, we don't compute the payload size correctly ahead of time. |
- // Instead, we resize the buffer at the end. |
- var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; |
- this.buffer = new Buffer(numberOfBytes); |
- this.handles = []; |
- var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); |
- encoder.write32(kMessageWithRequestIDHeaderSize); |
- encoder.write32(3); // num_fields. |
- encoder.write32(messageName); |
- encoder.write32(flags); |
- encoder.write64(requestID); |
- } |
- |
- MessageWithRequestIDBuilder.prototype = |
- Object.create(MessageBuilder.prototype); |
- MessageWithRequestIDBuilder.prototype.constructor = |
- MessageWithRequestIDBuilder; |
- |
- // MessageReader ------------------------------------------------------------ |
- |
- function MessageReader(message) { |
- this.decoder = new Decoder(message.memory, message.handles, 0); |
- var messageHeaderSize = this.decoder.read32(); |
- this.payloadSize = message.memory.length - messageHeaderSize; |
- var numFields = this.decoder.read32(); |
- this.messageName = this.decoder.read32(); |
- this.flags = this.decoder.read32(); |
- if (numFields >= 3) |
- this.requestID = this.decoder.read64(); |
- this.decoder.skip(messageHeaderSize - this.decoder.next); |
- } |
- |
- MessageReader.prototype.decodeStruct = function(cls) { |
- return cls.decode(this.decoder); |
- }; |
- |
- // Built-in types ----------------------------------------------------------- |
- |
- function Uint8() { |
- } |
- |
- Uint8.encodedSize = 1; |
- |
- Uint8.decode = function(decoder) { |
- return decoder.read8(); |
- }; |
- |
- Uint8.encode = function(encoder, val) { |
- encoder.write8(val); |
- }; |
- |
- function Uint16() { |
- } |
- |
- Uint16.encodedSize = 2; |
- |
- Uint16.decode = function(decoder) { |
- return decoder.read16(); |
- }; |
- |
- Uint16.encode = function(encoder, val) { |
- encoder.write16(val); |
- }; |
- |
- function Uint32() { |
- } |
- |
- Uint32.encodedSize = 4; |
- |
- Uint32.decode = function(decoder) { |
- return decoder.read32(); |
- }; |
- |
- Uint32.encode = function(encoder, val) { |
- encoder.write32(val); |
- }; |
- |
- function Uint64() { |
- }; |
- |
- Uint64.encodedSize = 8; |
- |
- Uint64.decode = function(decoder) { |
- return decoder.read64(); |
- }; |
- |
- Uint64.encode = function(encoder, val) { |
- encoder.write64(val); |
- }; |
- |
- function PointerTo(cls) { |
- this.cls = cls; |
- }; |
- |
- // TODO(abarth): Add missing types: |
- // * String |
- // * Float |
- // * Double |
- // * Signed integers |
- |
- PointerTo.prototype.encodedSize = 8; |
- |
- PointerTo.prototype.decode = function(decoder) { |
- return this.cls.decode(decoder.decodeAndCreateDecoder()); |
- }; |
- |
- PointerTo.prototype.encode = function(encoder, val) { |
- var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize); |
- this.cls.encode(objectEncoder, val); |
- }; |
- |
- function ArrayOf(cls) { |
- this.cls = cls; |
- }; |
- |
- ArrayOf.prototype.encodedSize = 8; |
- |
- ArrayOf.prototype.decode = function(decoder) { |
- return decoder.decodeArrayPointer(self.cls); |
- }; |
- |
- ArrayOf.prototype.encode = function(encoder, val) { |
- encoder.encodeArrayPointer(self.cls, val); |
- }; |
- |
- function Handle() { |
- } |
- |
- Handle.encodedSize = 4; |
- |
- Handle.decode = function(decoder) { |
- return decoder.decodeHandle(); |
- }; |
- |
- Handle.encode = function(encoder, val) { |
- encoder.encodeHandle(val); |
- }; |
- |
- var exports = {}; |
- exports.align = align; |
- exports.Message = Message; |
- exports.MessageBuilder = MessageBuilder; |
- exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
- exports.MessageReader = MessageReader; |
- exports.kArrayHeaderSize = kArrayHeaderSize; |
- exports.kStructHeaderSize = kStructHeaderSize; |
- exports.kMessageHeaderSize = kMessageHeaderSize; |
- exports.kMessageExpectsResponse = kMessageExpectsResponse; |
- exports.kMessageIsResponse = kMessageIsResponse; |
- exports.Uint8 = Uint8; |
- exports.Uint16 = Uint16; |
- exports.Uint32 = Uint32; |
- exports.Uint64 = Uint64; |
- exports.PointerTo = PointerTo; |
- exports.ArrayOf = ArrayOf; |
- exports.Handle = Handle; |
- return exports; |
-}); |