| LEFT | RIGHT | 
|    1 /* |    1 /* | 
|    2  * This file is part of Adblock Plus <http://adblockplus.org/>, |    2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 
|    3  * Copyright (C) 2006-2014 Eyeo GmbH |    3  * Copyright (C) 2006-2014 Eyeo GmbH | 
|    4  * |    4  * | 
|    5  * Adblock Plus is free software: you can redistribute it and/or modify |    5  * Adblock Plus is free software: you can redistribute it and/or modify | 
|    6  * it under the terms of the GNU General Public License version 3 as |    6  * it under the terms of the GNU General Public License version 3 as | 
|    7  * published by the Free Software Foundation. |    7  * published by the Free Software Foundation. | 
|    8  * |    8  * | 
|    9  * Adblock Plus is distributed in the hope that it will be useful, |    9  * Adblock Plus is distributed in the hope that it will be useful, | 
|   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of |   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   78 { |   78 { | 
|   79   let {STATE_UNINITIALIZED} = require("typedObjects/objectTypes"); |   79   let {STATE_UNINITIALIZED} = require("typedObjects/objectTypes"); | 
|   80   return function lengthWatcher(newLength) |   80   return function lengthWatcher(newLength) | 
|   81   { |   81   { | 
|   82     newLength = newLength | 0; |   82     newLength = newLength | 0; | 
|   83     if (newLength < 0) |   83     if (newLength < 0) | 
|   84       newLength = 0; |   84       newLength = 0; | 
|   85     if (newLength > this.size) |   85     if (newLength > this.size) | 
|   86       this.size = newLength; |   86       this.size = newLength; | 
|   87  |   87  | 
|   88     let cleanupValue = elementType.cleanupValue; |   88     let initialValue = elementType.initialValue; | 
|   89     if (typeof cleanupValue != "undefined") |   89     if (typeof initialValue != "undefined") | 
|   90     { |   90     { | 
|   91       let length = this.length; |   91       let length = this.length; | 
|   92       if (newLength > length) |   92       if (newLength > length) | 
|   93       { |   93       { | 
|   94         // We have to call element setter directly here, this.set() will |   94         // We have to call element setter directly here, this.set() will | 
|   95         // complain because of writing out of bounds (new length isn't set yet). |   95         // complain because of writing out of bounds (new length isn't set yet). | 
|   96         // We also need to change state temporarily in order to avoid an attemt |   96         // We also need to change state temporarily in order to avoid an attemt | 
|   97         // to release "existing" values. |   97         // to release "existing" values. | 
|   98         let origState = this._state; |   98         let origState = this._state; | 
|   99         this._state = STATE_UNINITIALIZED; |   99         this._state = STATE_UNINITIALIZED; | 
|  100         try |  100         try | 
|  101         { |  101         { | 
|  102           let referenceLength = elementType.referenceLength | 0; |  102           let referenceLength = elementType.referenceLength | 0; | 
|  103           let bufferIndex = this.arrayBufferIndex | 0; |  103           let bufferIndex = this.arrayBufferIndex | 0; | 
|  104           for (let i = length, offset = this.arrayByteOffset + length * referenc
     eLength; |  104           for (let i = length, offset = this.arrayByteOffset + length * referenc
     eLength; | 
|  105               i < newLength; |  105               i < newLength; | 
|  106               i++, offset += referenceLength) |  106               i++, offset += referenceLength) | 
|  107           { |  107           { | 
|  108             elementSetter.call(this, bufferIndex, offset, cleanupValue); |  108             elementSetter.call(this, bufferIndex, offset, initialValue); | 
|  109           } |  109           } | 
|  110         } |  110         } | 
|  111         finally |  111         finally | 
|  112         { |  112         { | 
|  113           this._state = origState; |  113           this._state = origState; | 
|  114         } |  114         } | 
|  115       } |  115       } | 
|  116       else |  116       else | 
|  117       { |  117       { | 
|  118         for (let i = newLength; i < length; i++) |  118         for (let i = newLength; i < length; i++) | 
|  119           this.set(i, cleanupValue); |  119           this.set(i, initialValue); | 
|  120       } |  120       } | 
|  121     } |  121     } | 
|  122  |  122  | 
|  123     return newLength; |  123     return newLength; | 
|  124   } |  124   } | 
|  125 } |  125 } | 
|  126  |  126  | 
|  127 function createSizeWatcher(elementType, minElements, bufferSize, buffers, viewTy
     pes, views, firstFree) |  127 function createSizeWatcher(elementType, minElements, bufferSize, buffers, viewTy
     pes, views, firstFree) | 
|  128 { |  128 { | 
|  129   let referenceLength = elementType.referenceLength | 0; |  129   let referenceLength = elementType.referenceLength | 0; | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  152         if (typeof reference != "undefined") |  152         if (typeof reference != "undefined") | 
|  153         { |  153         { | 
|  154           [bufferIndex, byteOffset] = alloc(reference, |  154           [bufferIndex, byteOffset] = alloc(reference, | 
|  155               referenceLength * newSize, (bufferSize / newSize) | 0, |  155               referenceLength * newSize, (bufferSize / newSize) | 0, | 
|  156               buffers, viewTypes, views); |  156               buffers, viewTypes, views); | 
|  157         } |  157         } | 
|  158         else |  158         else | 
|  159         { |  159         { | 
|  160           // This array is too large, it needs an individual buffer |  160           // This array is too large, it needs an individual buffer | 
|  161           bufferIndex = addBuffer(referenceLength * newSize, buffers, viewTypes,
      views); |  161           bufferIndex = addBuffer(referenceLength * newSize, buffers, viewTypes,
      views); | 
 |  162           bufferOffset = 0; | 
|  162         } |  163         } | 
|  163  |  164  | 
|  164         if (size > 0) |  165         if (size > 0) | 
|  165         { |  166         { | 
|  166           let copyBytes = length * referenceLength; |  167           let copyBytes = length * referenceLength; | 
|  167           let src = Uint8Array(buffers[this.arrayBufferIndex], this.arrayByteOff
     set, copyBytes); |  168           let src = new Uint8Array(buffers[this.arrayBufferIndex], this.arrayByt
     eOffset, copyBytes); | 
|  168           let dst = Uint8Array(buffers[bufferIndex], byteOffset, copyBytes); |  169           let dst = new Uint8Array(buffers[bufferIndex], byteOffset, copyBytes); | 
|  169           dst.set(src); |  170           dst.set(src); | 
|  170         } |  171         } | 
|  171  |  172  | 
|  172         this.arrayBufferIndex = bufferIndex; |  173         this.arrayBufferIndex = bufferIndex; | 
|  173         this.arrayByteOffset = byteOffset; |  174         this.arrayByteOffset = byteOffset; | 
|  174       } |  175       } | 
|  175       else |  176       else | 
|  176         this.arrayBufferIndex = -1; |  177         this.arrayBufferIndex = -1; | 
|  177  |  178  | 
|  178       if (size > 0) |  179       if (size > 0) | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  198   // We need to make sure that all buffer chunks are big enough to hold a |  199   // We need to make sure that all buffer chunks are big enough to hold a | 
|  199   // reference in order to manage the free chunks as a linked list. Each array |  200   // reference in order to manage the free chunks as a linked list. Each array | 
|  200   // buffer should be dedicated to arrays of particular size - the number of |  201   // buffer should be dedicated to arrays of particular size - the number of | 
|  201   // possible sizes is limited as the sizes can only be powers of two. |  202   // possible sizes is limited as the sizes can only be powers of two. | 
|  202   let {TypedReference} = require("typedObjects/references"); |  203   let {TypedReference} = require("typedObjects/references"); | 
|  203   let minElements = nextPow2(Math.max(Math.ceil(TypedReference.byteLength / elem
     entType.referenceLength) | 0, 1)); |  204   let minElements = nextPow2(Math.max(Math.ceil(TypedReference.byteLength / elem
     entType.referenceLength) | 0, 1)); | 
|  204   let bufferSize = ("arrayBufferSize" in meta ? meta.arrayBufferSize | 0 : 1024)
     ; |  205   let bufferSize = ("arrayBufferSize" in meta ? meta.arrayBufferSize | 0 : 1024)
     ; | 
|  205   bufferSize = nextPow2(Math.max(bufferSize, minElements * 2)) | 0; |  206   bufferSize = nextPow2(Math.max(bufferSize, minElements * 2)) | 0; | 
|  206  |  207  | 
|  207   let buffers = []; |  208   let buffers = []; | 
|  208   let viewTypes = elementType.viewTypes; |  209   let viewTypes = elementType.viewTypes.slice(); | 
|  209   let views = []; |  210   let views = []; | 
|  210   for (let i = 0, l = viewTypes.length | 0; i < l; i++) |  211   for (let i = 0, l = viewTypes.length | 0; i < l; i++) | 
|  211     views.push([]); |  212     views.push([]); | 
|  212  |  213  | 
|  213   let elementGetter = elementType.createGetter.apply(elementType, [0].concat(vie
     ws)); |  214   let elementGetter = elementType.createGetter.apply(elementType, [0].concat(vie
     ws)); | 
|  214   let elementSetter = elementType.createSetter.apply(elementType, [0].concat(vie
     ws)); |  215   let elementSetter = elementType.createSetter.apply(elementType, [0].concat(vie
     ws)); | 
|  215  |  216  | 
|  216   let typedReferenceTypes = TypedReference.viewTypes; |  217   let typedReferenceTypes = TypedReference.viewTypes; | 
|  217   let typedReferenceViews = []; |  218   let typedReferenceViews = []; | 
|  218   for (let i = 0, l = typedReferenceTypes.length | 0; i < l; i++) |  219   for (let i = 0, l = typedReferenceTypes.length | 0; i < l; i++) | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  257     meta.watch = {}; |  258     meta.watch = {}; | 
|  258  |  259  | 
|  259   meta.watch.length = createLengthWatcher(elementType, elementSetter); |  260   meta.watch.length = createLengthWatcher(elementType, elementSetter); | 
|  260   meta.watch.size = createSizeWatcher(elementType, minElements, bufferSize, buff
     ers, viewTypes, views, firstFree); |  261   meta.watch.size = createSizeWatcher(elementType, minElements, bufferSize, buff
     ers, viewTypes, views, firstFree); | 
|  261  |  262  | 
|  262   let {ObjectBase} = require("typedObjects/objectTypes"); |  263   let {ObjectBase} = require("typedObjects/objectTypes"); | 
|  263   return ObjectBase.extend(typeDescriptor, meta); |  264   return ObjectBase.extend(typeDescriptor, meta); | 
|  264 } |  265 } | 
|  265  |  266  | 
|  266 exports.createArrayType = createArrayType; |  267 exports.createArrayType = createArrayType; | 
| LEFT | RIGHT |