Skip to content

Commit 6e0dd44

Browse files
authored
Merge pull request AssemblyScript#24 from nearprotocol/wasm-new-read-api
Update to Wasm new read API
2 parents 87bb77c + a4aa1a5 commit 6e0dd44

10 files changed

+1163
-1068
lines changed

bin/asinit

100644100755
File mode changed.

dist/assemblyscript.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/definitions.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ export class NEARBindingsBuilder extends ExportsWalker {
237237
let signature = element.signature;
238238
let returnType = signature.returnType;
239239
this.generateEncodeFunction(returnType);
240-
this.sb.push(`export function near_func_${element.name}(): void {
241-
let json = new Uint8Array(input_read_len());
242-
input_read_into(json.buffer.data);
240+
this.sb.push(`export function ${element.name}(): void {
241+
// Reading input bytes.
242+
let json = storage._internalReadBytes(4, 0, 0);
243243
let handler = new __near_ArgsParser_${element.name}();
244244
handler.buffer = json;
245245
handler.decoder = new JSONDecoder<__near_ArgsParser_${element.name}>(handler);
@@ -261,7 +261,8 @@ export class NEARBindingsBuilder extends ExportsWalker {
261261
this.generateFieldEncoder(returnType, '"result"', "result");
262262
this.sb.push(`
263263
encoder.popObject();
264-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
264+
let val = encoder.serialize();
265+
return_value(val.byteLength, val.buffer.data);
265266
`);
266267
}
267268
this.sb.push(`}`);
@@ -582,18 +583,14 @@ export class NEARBindingsBuilder extends ExportsWalker {
582583
let allExported = (<Element[]>this.exportedClasses).concat(<Element[]>this.exportedFunctions).filter(e => e.is(CommonFlags.MODULE_EXPORT));
583584
let allImportsStr = allExported.map(c => `${c.name} as wrapped_${c.name}`).join(", ");
584585
this.sb = [`
585-
import { near } from "./near";
586+
import { storage, near } from "./near";
586587
import { JSONEncoder} from "./json/encoder"
587588
import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder"
588589
import {${allImportsStr}} from "./${mainSource.normalizedPath.replace(".ts", "")}";
589590
590591
// Runtime functions
591592
@external("env", "return_value")
592-
declare function return_value(value_ptr: u32): void;
593-
@external("env", "input_read_len")
594-
declare function input_read_len(): u32;
595-
@external("env", "input_read_into")
596-
declare function input_read_into(ptr: usize): void;
593+
declare function return_value(value_len: usize, value_ptr: usize): void;
597594
`].concat(this.sb);
598595
this.exportedClasses.forEach(c => {
599596
this.sb.push(`export class ${c.name} extends ${this.wrappedTypeName(c.type)} {

tests/near-bindgen/main_near.ts.expected

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { near } from "./near";
1+
import { storage, near } from "./near";
22
import { JSONEncoder } from "./json/encoder";
33
import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder";
44
import {
@@ -11,9 +11,7 @@ import {
1111
} from "./main";
1212

1313
// Runtime functions
14-
declare function return_value(value_ptr: u32): void;
15-
declare function input_read_len(): u32;
16-
declare function input_read_into(ptr: usize): void;
14+
declare function return_value(value_len: usize, value_ptr: usize): void;
1715

1816
import { near } from "./near";
1917
import { near as bazinga_near } from "./near";
@@ -43,9 +41,9 @@ export class __near_ArgsParser_doNothing extends ThrowingJSONHandler {
4341
return super.pushArray(name);
4442
}
4543
}
46-
export function near_func_doNothing(): void {
47-
let json = new Uint8Array(input_read_len());
48-
input_read_into(json.buffer.data);
44+
export function doNothing(): void {
45+
// Reading input bytes.
46+
let json = storage._internalReadBytes(4, 0, 0);
4947
let handler = new __near_ArgsParser_doNothing();
5048
handler.buffer = json;
5149
handler.decoder = new JSONDecoder<__near_ArgsParser_doNothing>(handler);
@@ -100,9 +98,9 @@ export class __near_ArgsParser_add extends ThrowingJSONHandler {
10098
return super.pushArray(name);
10199
}
102100
}
103-
export function near_func_add(): void {
104-
let json = new Uint8Array(input_read_len());
105-
input_read_into(json.buffer.data);
101+
export function add(): void {
102+
// Reading input bytes.
103+
let json = storage._internalReadBytes(4, 0, 0);
106104
let handler = new __near_ArgsParser_add();
107105
handler.buffer = json;
108106
handler.decoder = new JSONDecoder<__near_ArgsParser_add>(handler);
@@ -115,7 +113,8 @@ export function near_func_add(): void {
115113
encoder.setInteger("result", result);
116114

117115
encoder.popObject();
118-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
116+
let val = encoder.serialize();
117+
return_value(val.byteLength, val.buffer.data);
119118
}
120119
import { __near_decode_ContainerClass } from "./model_near";
121120
export class __near_ArgsParser_rewrapFoobar extends ThrowingJSONHandler {
@@ -156,9 +155,9 @@ export class __near_ArgsParser_rewrapFoobar extends ThrowingJSONHandler {
156155
}
157156
}
158157
import { __near_encode_AnotherContainerClass } from "./model_near";
159-
export function near_func_rewrapFoobar(): void {
160-
let json = new Uint8Array(input_read_len());
161-
input_read_into(json.buffer.data);
158+
export function rewrapFoobar(): void {
159+
// Reading input bytes.
160+
let json = storage._internalReadBytes(4, 0, 0);
162161
let handler = new __near_ArgsParser_rewrapFoobar();
163162
handler.buffer = json;
164163
handler.decoder = new JSONDecoder<__near_ArgsParser_rewrapFoobar>(handler);
@@ -177,7 +176,8 @@ export function near_func_rewrapFoobar(): void {
177176
}
178177

179178
encoder.popObject();
180-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
179+
let val = encoder.serialize();
180+
return_value(val.byteLength, val.buffer.data);
181181
}
182182
import { __near_decode_AnotherContainerClass } from "./model_near";
183183
export class __near_ArgsParser_unwrapFoobar extends ThrowingJSONHandler {
@@ -218,9 +218,9 @@ export class __near_ArgsParser_unwrapFoobar extends ThrowingJSONHandler {
218218
}
219219
}
220220
import { __near_encode_FooBar } from "./model_near";
221-
export function near_func_unwrapFoobar(): void {
222-
let json = new Uint8Array(input_read_len());
223-
input_read_into(json.buffer.data);
221+
export function unwrapFoobar(): void {
222+
// Reading input bytes.
223+
let json = storage._internalReadBytes(4, 0, 0);
224224
let handler = new __near_ArgsParser_unwrapFoobar();
225225
handler.buffer = json;
226226
handler.decoder = new JSONDecoder<__near_ArgsParser_unwrapFoobar>(handler);
@@ -239,7 +239,8 @@ export function near_func_unwrapFoobar(): void {
239239
}
240240

241241
encoder.popObject();
242-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
242+
let val = encoder.serialize();
243+
return_value(val.byteLength, val.buffer.data);
243244
}
244245
import { __near_decode_Array_String } from "./model_near";
245246
export class __near_ArgsParser_getStringArrayLength extends ThrowingJSONHandler {
@@ -280,9 +281,9 @@ export class __near_ArgsParser_getStringArrayLength extends ThrowingJSONHandler
280281
return super.pushArray(name);
281282
}
282283
}
283-
export function near_func_getStringArrayLength(): void {
284-
let json = new Uint8Array(input_read_len());
285-
input_read_into(json.buffer.data);
284+
export function getStringArrayLength(): void {
285+
// Reading input bytes.
286+
let json = storage._internalReadBytes(4, 0, 0);
286287
let handler = new __near_ArgsParser_getStringArrayLength();
287288
handler.buffer = json;
288289
handler.decoder = new JSONDecoder<__near_ArgsParser_getStringArrayLength>(
@@ -297,7 +298,8 @@ export function near_func_getStringArrayLength(): void {
297298
encoder.setInteger("result", result);
298299

299300
encoder.popObject();
300-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
301+
let val = encoder.serialize();
302+
return_value(val.byteLength, val.buffer.data);
301303
}
302304
import { __near_decode_Array_FooBar } from "./model_near";
303305
export class __near_ArgsParser_convertFoobars extends ThrowingJSONHandler {
@@ -353,9 +355,9 @@ export function __near_encode_Array_ContainerClass(
353355
}
354356
}
355357
}
356-
export function near_func_convertFoobars(): void {
357-
let json = new Uint8Array(input_read_len());
358-
input_read_into(json.buffer.data);
358+
export function convertFoobars(): void {
359+
// Reading input bytes.
360+
let json = storage._internalReadBytes(4, 0, 0);
359361
let handler = new __near_ArgsParser_convertFoobars();
360362
handler.buffer = json;
361363
handler.decoder = new JSONDecoder<__near_ArgsParser_convertFoobars>(handler);
@@ -374,5 +376,6 @@ export function near_func_convertFoobars(): void {
374376
}
375377

376378
encoder.popObject();
377-
return_value(near.bufferWithSize(encoder.serialize()).buffer.data);
379+
let val = encoder.serialize();
380+
return_value(val.byteLength, val.buffer.data);
378381
}

tests/near-bindgen/model_near.ts.expected

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { near } from "./near";
1+
import { storage, near } from "./near";
22
import { JSONEncoder } from "./json/encoder";
33
import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder";
44
import {
@@ -8,9 +8,7 @@ import {
88
} from "./model";
99

1010
// Runtime functions
11-
declare function return_value(value_ptr: u32): void;
12-
declare function input_read_len(): u32;
13-
declare function input_read_into(ptr: usize): void;
11+
declare function return_value(value_len: usize, value_ptr: usize): void;
1412

1513
export function __near_encode_Array_String(
1614
value: Array<String>,

tests/near-bindgen/near.ts

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,49 @@
1-
export namespace near {
2-
export function bufferWithSizeFromPtr(ptr: usize, length: usize): Uint8Array {
3-
let withSize = new Uint8Array(length + 4);
4-
store<u32>(withSize.buffer.data, length);
5-
// TODO: Should use better copy routine or better avoid copy altogether
6-
for (let i = <usize>0; i < length; i++) {
7-
withSize[i + 4] = load<u8>(ptr + i);
1+
const DEFAULT_SCRATCH_BUFFER_SIZE: usize = 1 << 16;
2+
3+
type DataTypeIndex = u32;
4+
5+
export class Storage {
6+
private _scratchBuf: Uint8Array = new Uint8Array(DEFAULT_SCRATCH_BUFFER_SIZE);
7+
/**
8+
* @hidden
9+
* Reads given params into the internal scratch buffer and returns length.
10+
*/
11+
private _internalBufferRead(dataType: DataTypeIndex, keyLen: usize, key: usize): usize {
12+
for (let i = 0; i < 2; ++i) {
13+
let len = data_read(
14+
dataType,
15+
keyLen,
16+
key,
17+
this._scratchBuf.byteLength,
18+
this._scratchBuf.buffer.data,
19+
);
20+
if (len <= <usize>(this._scratchBuf.byteLength)) {
21+
return len;
22+
}
23+
this._scratchBuf = new Uint8Array(len);
824
}
9-
return withSize;
25+
assert(false, "Internal scratch buffer was resized more than once");
26+
return 0;
1027
}
1128

12-
export function bufferWithSize(buf: Uint8Array): Uint8Array {
13-
return bufferWithSizeFromPtr(buf.buffer.data, buf.byteLength);
29+
/**
30+
* @hidden
31+
* Reads bytes for the given params.
32+
*/
33+
_internalReadBytes(dataType: DataTypeIndex, keyLen: usize, key: usize): Uint8Array {
34+
let len = this._internalBufferRead(dataType, keyLen, key);
35+
if (len == 0) {
36+
return null;
37+
}
38+
let res = new Uint8Array(len);
39+
memory.copy(res.buffer.data, this._scratchBuf.buffer.data, len);
40+
return res;
1441
}
42+
}
43+
44+
export let storage: Storage = new Storage();
1545

46+
export namespace near {
1647
export function str<T>(value: T): string {
1748
let arr: Array<T> = [value];
1849
return arr.toString();
@@ -25,3 +56,6 @@ export namespace near {
2556

2657
@external("env", "log")
2758
declare function _near_log(msg_ptr: usize): void;
59+
60+
@external("env", "data_read")
61+
declare function data_read(type_index: u32, key_len: usize, key: usize, max_buf_len: usize, buf_ptr: usize): usize;

tests/near-bindgen/test.js

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ async function loadModule(path) {
2222
}
2323
console.log(str);
2424
},
25-
input_read_len() {
25+
data_read(index, keyLen, key, maxBufPtr, bufPtr) {
26+
assert(index == 4);
27+
assert(maxBufPtr >= bufPtr);
28+
copyToPtr(inputJson, bufPtr);
2629
return inputJson.length;
2730
},
28-
input_read_into(ptr) {
29-
copyToPtr(inputJson, ptr);
30-
},
31-
return_value(ptr) {
32-
outputJson = readBuffer(ptr);
31+
return_value(valLen, valPtr) {
32+
outputJson = readBuffer(valLen, valPtr);
3333
}
3434
}
3535
});
@@ -49,12 +49,10 @@ async function loadModule(path) {
4949
}
5050
}
5151

52-
function readBuffer(ptr) {
53-
const len = module.U32[ptr / 4];
54-
ptr += 4;
55-
const result = new Uint8Array(len);
56-
for (let i = 0; i < len; i++) {
57-
result[i] = module.I8[ptr + i];
52+
function readBuffer(valLen, valPtr) {
53+
const result = new Uint8Array(valLen);
54+
for (let i = 0; i < valLen; i++) {
55+
result[i] = module.I8[valPtr + i];
5856
}
5957
return result;
6058
}

tests/near-bindgen/test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ export function runTest(): void {
2121
}
2222

2323
export function convertFoobars(): void {
24-
main.near_func_convertFoobars();
24+
main.convertFoobars();
2525
}
2626

2727
export function getStringArrayLength(): void {
28-
main.near_func_getStringArrayLength();
28+
main.getStringArrayLength();
2929
}
3030

3131
export function rewrapFoobar(): void {
32-
main.near_func_rewrapFoobar();
32+
main.rewrapFoobar();
3333
}
3434

3535
export function unwrapFoobar(): void {
36-
main.near_func_unwrapFoobar();
37-
}
36+
main.unwrapFoobar();
37+
}

0 commit comments

Comments
 (0)