| Index: mojo/public/js/bindings/codec.js
|
| diff --git a/mojo/public/js/bindings/codec.js b/mojo/public/js/bindings/codec.js
|
| index 0b680172c2ddedc562e289f499ced46515c78c99..84c86c1299125a654fdf3a9dec84b6295bcf6bbc 100644
|
| --- a/mojo/public/js/bindings/codec.js
|
| +++ b/mojo/public/js/bindings/codec.js
|
| @@ -202,8 +202,8 @@ define("mojo/public/js/bindings/codec", [
|
| return offsetPointer + offset;
|
| };
|
|
|
| - Decoder.prototype.decodeAndCreateDecoder = function() {
|
| - return new Decoder(this.buffer, this.handles, this.decodePointer());
|
| + Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
|
| + return new Decoder(this.buffer, this.handles, pointer);
|
| };
|
|
|
| Decoder.prototype.decodeHandle = function() {
|
| @@ -234,15 +234,27 @@ define("mojo/public/js/bindings/codec", [
|
| };
|
|
|
| Decoder.prototype.decodeStructPointer = function(cls) {
|
| - return cls.decode(this.decodeAndCreateDecoder());
|
| + var pointer = this.decodePointer();
|
| + if (!pointer) {
|
| + return null;
|
| + }
|
| + return cls.decode(this.decodeAndCreateDecoder(pointer));
|
| };
|
|
|
| Decoder.prototype.decodeArrayPointer = function(cls) {
|
| - return this.decodeAndCreateDecoder().decodeArray(cls);
|
| + var pointer = this.decodePointer();
|
| + if (!pointer) {
|
| + return null;
|
| + }
|
| + return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
|
| };
|
|
|
| Decoder.prototype.decodeStringPointer = function() {
|
| - return this.decodeAndCreateDecoder().decodeString();
|
| + var pointer = this.decodePointer();
|
| + if (!pointer) {
|
| + return null;
|
| + }
|
| + return this.decodeAndCreateDecoder(pointer).decodeString();
|
| };
|
|
|
| // Encoder ------------------------------------------------------------------
|
| @@ -367,17 +379,29 @@ define("mojo/public/js/bindings/codec", [
|
| };
|
|
|
| Encoder.prototype.encodeStructPointer = function(cls, val) {
|
| + if (!val) {
|
| + this.encodePointer(val);
|
| + return;
|
| + }
|
| var encoder = this.createAndEncodeEncoder(cls.encodedSize);
|
| cls.encode(encoder, val);
|
| };
|
|
|
| Encoder.prototype.encodeArrayPointer = function(cls, val) {
|
| + if (!val) {
|
| + this.encodePointer(val);
|
| + return;
|
| + }
|
| var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length;
|
| var encoder = this.createAndEncodeEncoder(encodedSize);
|
| encoder.encodeArray(cls, val);
|
| };
|
|
|
| Encoder.prototype.encodeStringPointer = function(val) {
|
| + if (!val) {
|
| + this.encodePointer(val);
|
| + return;
|
| + }
|
| var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
|
| var encoder = this.createAndEncodeEncoder(encodedSize);
|
| encoder.encodeString(val);
|
| @@ -642,10 +666,18 @@ define("mojo/public/js/bindings/codec", [
|
| PointerTo.prototype.encodedSize = 8;
|
|
|
| PointerTo.prototype.decode = function(decoder) {
|
| - return this.cls.decode(decoder.decodeAndCreateDecoder());
|
| + var pointer = decoder.decodePointer();
|
| + if (!pointer) {
|
| + return null;
|
| + }
|
| + return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
|
| };
|
|
|
| PointerTo.prototype.encode = function(encoder, val) {
|
| + if (!val) {
|
| + encoder.encodePointer(val);
|
| + return;
|
| + }
|
| var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
|
| this.cls.encode(objectEncoder, val);
|
| };
|
|
|