Left: | ||
Right: |
OLD | NEW |
---|---|
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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 dealloc(reference, origBufferIndex, origByteOffset); | 183 dealloc(reference, origBufferIndex, origByteOffset); |
184 else | 184 else |
185 removeBuffer(origBufferIndex, buffers, views); | 185 removeBuffer(origBufferIndex, buffers, views); |
186 } | 186 } |
187 } | 187 } |
188 | 188 |
189 return newSize; | 189 return newSize; |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 function push() | |
194 { | |
195 let length = this.length | 0; | |
196 let newCount = arguments.length | 0; | |
197 this.length = length + newCount; | |
198 for (let i = 0; i < newCount; i++) | |
199 this.set(length + i, arguments[i]); | |
200 return length + newCount; | |
201 } | |
202 | |
203 function pop() | |
204 { | |
205 let length = this.length | 0; | |
206 if (length == 0) | |
207 throw new Error("No elements in the array"); | |
208 | |
209 let result = this.get(length - 1); | |
210 this.length = this.length - 1; | |
211 return result; | |
212 } | |
213 | |
214 function splice(index, count) | |
215 { | |
216 index = index | 0; | |
217 count = count | 0; | |
218 let length = this.length | 0; | |
219 if (index < 0) | |
René Jeschke
2014/05/19 08:35:53
What about the negative indexing one can use on 's
Wladimir Palant
2014/05/19 15:22:02
You are right, I wasn't aware that splice supporte
| |
220 index = 0; | |
221 if (index > length) | |
222 index = length; | |
223 if (index + count > length) | |
224 count = length - index; | |
225 | |
226 let newCount = (arguments.length | 0) - 2; | |
227 let diff = newCount - count; | |
228 let newLength = length + diff; | |
229 if (diff > 0) | |
230 { | |
231 this.length = newLength; | |
232 for (let i = length - 1; i >= index + count; i--) | |
233 this.set(i + diff, this.get(i)); | |
234 } | |
235 else if (diff < 0) | |
236 { | |
237 for (let i = index + count; i < length; i++) | |
238 this.set(i + diff, this.get(i)); | |
239 this.length = newLength; | |
240 } | |
241 | |
242 for (let i = 0; i < newCount; i++) | |
243 this.set(index + i, arguments[i + 2]); | |
244 } | |
245 | |
246 function unshift(value) | |
247 { | |
248 let args = [0, 0].concat(Array.prototype.slice.apply(arguments)); | |
249 this.splice.apply(this, args); | |
250 return this.length | 0; | |
251 } | |
252 | |
253 function shift() | |
254 { | |
255 let length = this.length | 0; | |
256 if (length == 0) | |
257 throw new Error("No elements in the array"); | |
258 | |
259 let result = this.get(0); | |
260 this.splice(0, 1); | |
261 return result; | |
262 } | |
263 | |
193 function createArrayType(elementType, typeDescriptor, meta) | 264 function createArrayType(elementType, typeDescriptor, meta) |
194 { | 265 { |
195 if (typeof meta != "object" || meta == null) | 266 if (typeof meta != "object" || meta == null) |
196 meta = {}; | 267 meta = {}; |
197 | 268 |
198 // We need to make sure that all buffer chunks are big enough to hold a | 269 // 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 | 270 // 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 | 271 // 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. | 272 // possible sizes is limited as the sizes can only be powers of two. |
202 let {TypedReference} = require("typedObjects/references"); | 273 let {TypedReference} = require("typedObjects/references"); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
235 let {int16, uint32} = require("typedObjects/primitiveTypes"); | 306 let {int16, uint32} = require("typedObjects/primitiveTypes"); |
236 typeDescriptor = Object.create(typeDescriptor || {}); | 307 typeDescriptor = Object.create(typeDescriptor || {}); |
237 typeDescriptor.arrayBufferIndex = int16; | 308 typeDescriptor.arrayBufferIndex = int16; |
238 typeDescriptor.arrayByteOffset = uint32; | 309 typeDescriptor.arrayByteOffset = uint32; |
239 typeDescriptor.getArrayBuffer = function() | 310 typeDescriptor.getArrayBuffer = function() |
240 { | 311 { |
241 return this.arrayBufferIndex >= 0 ? buffers[this.arrayBufferIndex] : null; | 312 return this.arrayBufferIndex >= 0 ? buffers[this.arrayBufferIndex] : null; |
242 }; | 313 }; |
243 typeDescriptor.length = uint32; | 314 typeDescriptor.length = uint32; |
244 typeDescriptor.size = uint32; | 315 typeDescriptor.size = uint32; |
316 typeDescriptor.push = push; | |
317 typeDescriptor.pop = pop; | |
318 typeDescriptor.splice = splice; | |
319 typeDescriptor.unshift = unshift; | |
320 typeDescriptor.shift = shift; | |
245 | 321 |
246 let elementShift = ilog2(elementType.referenceLength | 0); | 322 let elementShift = ilog2(elementType.referenceLength | 0); |
247 typeDescriptor.get = createGetter(elementGetter, elementShift); | 323 typeDescriptor.get = createGetter(elementGetter, elementShift); |
248 typeDescriptor.set = createSetter(elementSetter, elementShift); | 324 typeDescriptor.set = createSetter(elementSetter, elementShift); |
249 | 325 |
250 if (meta.hasOwnProperty("constructor") && typeof meta.constructor == "function ") | 326 if (meta.hasOwnProperty("constructor") && typeof meta.constructor == "function ") |
251 meta.constructor = createCombinedConstructor(meta.constructor); | 327 meta.constructor = createCombinedConstructor(meta.constructor); |
252 else | 328 else |
253 meta.constructor = defaultArrayConstructor; | 329 meta.constructor = defaultArrayConstructor; |
254 | 330 |
255 if (meta.hasOwnProperty("destructor") && typeof meta.destructor == "function") | 331 if (meta.hasOwnProperty("destructor") && typeof meta.destructor == "function") |
256 meta.destructor = createCombinedDestructor(meta.destructor); | 332 meta.destructor = createCombinedDestructor(meta.destructor); |
257 else | 333 else |
258 meta.destructor = defaultArrayDestructor; | 334 meta.destructor = defaultArrayDestructor; |
259 | 335 |
260 if (!meta.watch || typeof meta.watch != "object") | 336 if (!meta.watch || typeof meta.watch != "object") |
261 meta.watch = {}; | 337 meta.watch = {}; |
262 | 338 |
263 meta.watch.length = createLengthWatcher(elementType, elementSetter); | 339 meta.watch.length = createLengthWatcher(elementType, elementSetter); |
264 meta.watch.size = createSizeWatcher(elementType, minElements, bufferSize, buff ers, viewTypes, views, firstFree); | 340 meta.watch.size = createSizeWatcher(elementType, minElements, bufferSize, buff ers, viewTypes, views, firstFree); |
265 | 341 |
266 let {ObjectBase} = require("typedObjects/objectTypes"); | 342 let {ObjectBase} = require("typedObjects/objectTypes"); |
267 return ObjectBase.extend(typeDescriptor, meta); | 343 return ObjectBase.extend(typeDescriptor, meta); |
268 } | 344 } |
269 | 345 |
270 exports.createArrayType = createArrayType; | 346 exports.createArrayType = createArrayType; |
OLD | NEW |