From f08e9c93e2cfeecc11179e73093f37170f6b4339 Mon Sep 17 00:00:00 2001 From: Joshua Tenner Date: Thu, 1 Aug 2019 12:55:22 -0400 Subject: [PATCH] fix(return) change to i32[] --- assembly/__tests__/example.spec.ts | 3 ++- assembly/index.ts | 13 +++++-------- src/rabin.js | 23 ++++------------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/assembly/__tests__/example.spec.ts b/assembly/__tests__/example.spec.ts index fa9ca44..e5d0835 100644 --- a/assembly/__tests__/example.spec.ts +++ b/assembly/__tests__/example.spec.ts @@ -23,7 +23,8 @@ describe("rabin degree", (): void => { it("fingerprint", (): void => { let r = new Rabin(14, 1 * 8, 2 * 8, 64) let file = getFile() - r.fingerprint(file, new Int32Array(file.length/8)) + let result = r.fingerprint(file) + // todo: inspect result }); }); diff --git a/assembly/index.ts b/assembly/index.ts index 9b9e7b9..2371382 100644 --- a/assembly/index.ts +++ b/assembly/index.ts @@ -175,10 +175,11 @@ export class Rabin { rabin_init(this) } - fingerprint(buf: Uint8Array, lengths: Int32Array): void { + fingerprint(buf: Uint8Array): i32[] { let len = buf.length; - let chunk_idx = 0; let ptr = changetype(buf.buffer) + let result = new Array(0); + while (1) { var remaining = rabin_next_chunk(this, ptr, len); if (remaining < 0) { @@ -187,16 +188,12 @@ export class Rabin { len -= remaining; ptr += remaining; - let c = chunk_idx++ - unchecked(lengths[c] = this.chunk_length) + result.push(this.chunk_length); } + return result; } } export function getUint8ArrayTypeId(): i32 { return idof(); } - -export function getInt32ArrayTypeId(): i32 { - return idof(); -} diff --git a/src/rabin.js b/src/rabin.js index dec56e7..fe26dc2 100644 --- a/src/rabin.js +++ b/src/rabin.js @@ -28,34 +28,19 @@ class Rabin { * @memberof Rabin */ fingerprint(buf) { - const lengths = new Int32Array(Math.ceil(buf.length/this.min)) const u8arraytype = this.asModule.getUint8ArrayTypeId() - const i32arraytype = this.asModule.getInt32ArrayTypeId() - const lengthsPtr = this.asModule.__retain(this.asModule.__allocArray(i32arraytype, lengths)) const pointer = this.asModule.__retain(this.asModule.__allocArray(u8arraytype, buf)) // run finderprint - this.rabin.fingerprint(pointer, lengthsPtr) + const processedPointer = this.rabin.fingerprint(pointer) - const processed = this.asModule.__getArray(lengthsPtr) - - //free memory - this.asModule.freeArray(lengthsPtr) - this.asModule.freeArray(pointer) - - // TODO: remove this. @see https://github.com/ipfs/js-ipfs/issues/2118#issuecomment-497722625 - // clean extra 0s in the array - const cleanArr = [] - for (let i = 0; i < processed.length; i++) { - if (processed[i] === 0) break - cleanArr[i] = processed[i]; - } + const processed = this.asModule.__getArray(processedPointer) // release memory - this.asModule.__release(lengthsPtr) this.asModule.__release(pointer) + this.asModule.__release(processedPointer) - return cleanArr + return processed } }