Skip to content

Commit

Permalink
Fixed issues with big int and number going between webassembly
Browse files Browse the repository at this point in the history
  • Loading branch information
calvogenerico committed Dec 13, 2023
1 parent 76edd76 commit 30f534f
Show file tree
Hide file tree
Showing 6 changed files with 626 additions and 32 deletions.
2 changes: 2 additions & 0 deletions packages/vm/src/args-translator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ export class ArgsTranslator {
case 'Int64Array':
case 'Float32Array':
case 'Float64Array':
into.writeBytes(from.readBytes())
break
case 'BigInt':
into.writeBool(from.readBool())
into.writeBytes(from.readBytes())
Expand Down
27 changes: 14 additions & 13 deletions packages/vm/src/tx-execution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {ExecContext} from "./tx-context/exec-context.js";
import {PkgData} from "./storage.js";
import {JigData} from "./memory/lower-value.js";
import {Option} from "./support/option.js";
import {WasmWord} from "./wasm-word.js";
import {WasmArg, WasmWord} from "./wasm-word.js";
import {AbiType} from "./memory/abi-helpers/abi-type.js";
import {serializeOutput, serializePointer} from "./memory/serialize-output.js";
import {fromCoreLock} from "./locks/from-core-lock.js";
Expand Down Expand Up @@ -507,7 +507,7 @@ class TxExecution {

// Assemblyscrypt callbacks

vmJigInit (from: WasmContainer): WasmWord {
vmJigInit (from: WasmContainer): WasmArg {
this.measurements.newJigs.inc()
const nextOrigin = this.nextOrigin.get()
const jigInitParams = new JigInitParams(
Expand All @@ -516,10 +516,10 @@ class TxExecution {
new Pointer(new Uint8Array(32).fill(0xff), 0xffff),
new OpenLock()
)
return jigInitParams.lowerInto(from)
return jigInitParams.lowerInto(from).toWasmArg(AbiType.u32())
}

vmJigLink (from: WasmContainer, jigPtr: WasmWord, rtId: number): WasmWord {
vmJigLink (from: WasmContainer, jigPtr: WasmWord, rtId: number): WasmArg {
const nextOrigin = this.nextOrigin.get()
let rtIdNode = from.abi.rtIdById(rtId)
.expect(new Error(`Runtime id "${rtId}" not found in ${base16.encode(from.hash)}`))
Expand Down Expand Up @@ -547,10 +547,10 @@ class TxExecution {
.lower(
serializePointer(new Pointer(from.hash, abiClass.idx)),
AbiType.fromName('ArrayBuffer')
)
).toWasmArg(AbiType.u32())
}

vmCallMethod (from: WasmContainer, targetPtr: WasmWord, methodNamePtr: WasmWord, argsPtr: WasmWord): WasmWord {
vmCallMethod (from: WasmContainer, targetPtr: WasmWord, methodNamePtr: WasmWord, argsPtr: WasmWord): WasmArg {
const targetOrigin = Pointer.fromBytes(from.liftBuf(targetPtr))
const methodName = from.liftString(methodNamePtr)

Expand All @@ -573,17 +573,18 @@ class TxExecution {
return methodRes.map(value => {
const lifted = value.lift()
return from.low.lower(lifted, method.rtype)
}).orElse(() => WasmWord.fromNumber(0))
}).orElse(() => WasmWord.fromNumber(0)).toWasmArg(method.rtype)
}

vmGetProp (from: WasmContainer, originPtr: WasmWord, propNamePtr: WasmWord) {
vmGetProp (from: WasmContainer, originPtr: WasmWord, propNamePtr: WasmWord): WasmArg {
const targetOrigin = Pointer.fromBytes(from.liftBuf(originPtr));
const propName = from.liftString(propNamePtr)
const jig = this.assertJig(targetOrigin)

const propTarget = jig.getPropValue(propName)
const lifted = propTarget.lift()
return from.low.lower(lifted, propTarget.ty)
const word = from.low.lower(lifted, propTarget.ty);
return word.toWasmArg(propTarget.ty)
}

vmJigLock (from: WasmContainer, targetOriginPtr: WasmWord, lockType: LockType, argsPtr: WasmWord): void {
Expand Down Expand Up @@ -646,7 +647,7 @@ class TxExecution {
return initParams.lowerInto(from)
}

vmCallFunction (from: WasmContainer, pkgIdPtr: WasmWord, fnNamePtr: WasmWord, argsBufPtr: WasmWord): WasmWord {
vmCallFunction (from: WasmContainer, pkgIdPtr: WasmWord, fnNamePtr: WasmWord, argsBufPtr: WasmWord): WasmArg {
const pkgId = from.liftString(pkgIdPtr)
const fnName = from.liftString(fnNamePtr)
const wasm = this.assertContainer(pkgId)
Expand All @@ -656,10 +657,10 @@ class TxExecution {
const args = this.lowerArgs(wasm, fn.args, argsBuf)
const res = wasm.callFn(fnName, args, fn.args.map(arg => arg.type))

return res.orDefault(WasmWord.null());
return res.orDefault(WasmWord.null()).toWasmArg(fn.rtype);
}

vmConstructorRemote (from: WasmContainer, pkgIdStrPtr: WasmWord, namePtr: WasmWord, argBufPtr: WasmWord): WasmWord {
vmConstructorRemote (from: WasmContainer, pkgIdStrPtr: WasmWord, namePtr: WasmWord, argBufPtr: WasmWord): WasmArg {
const pkgId = from.liftString(pkgIdStrPtr)
const clsName = from.liftString(namePtr)

Expand Down Expand Up @@ -692,7 +693,7 @@ class TxExecution {
jig.lock
)

return initParams.lowerInto(from);
return initParams.lowerInto(from).toWasmArg(AbiType.u32());
}

vmCallerTypeCheck (from: WasmContainer, rtIdToCheck: number, exact: boolean): boolean {
Expand Down
34 changes: 16 additions & 18 deletions packages/vm/src/wasm-container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,14 @@ import {Abi} from "@aldea/core/abi";
import {TxExecution} from "./tx-execution.js";
import {AbiAccess} from "./memory/abi-helpers/abi-access.js";
import {MemoryProxy} from "./memory-proxy.js";
import {WasmWord} from "./wasm-word.js";
import {WasmArg, WasmWord} from "./wasm-word.js";
import {AbiType} from "./memory/abi-helpers/abi-type.js";
import {Option} from "./support/option.js";
import {ValueLifter} from "./memory/value-lifter.js";
import {LowerValue} from "./memory/lower-value.js";
import {base16, BCS, BufReader} from "@aldea/core";
import {ExecutionError} from "./errors.js";

export type WasmPointer = number | bigint

export enum AuthCheck {
CALL,
LOCK
Expand Down Expand Up @@ -54,35 +52,35 @@ export class WasmContainer {
}
},
vm: {
jig_init: (): WasmPointer => {
return this._currentExec.get().vmJigInit(this).toUInt()
jig_init: (): WasmArg => {
return this._currentExec.get().vmJigInit(this)
},
jig_link: (jigPtr: number, rtid: number): WasmPointer => {
return this._currentExec.get().vmJigLink(this, WasmWord.fromNumber(jigPtr), rtid).toUInt()
jig_link: (jigPtr: number, rtid: number): WasmArg => {
return this._currentExec.get().vmJigLink(this, WasmWord.fromNumber(jigPtr), rtid)
},
jig_authcheck: (callerOriginPtr: number, check: AuthCheck): boolean => {
return this._currentExec.get().vmJigAuthCheck(this, WasmWord.fromNumber(callerOriginPtr), check)
},
call_method: (targetOriginPtr: number, fnNamePtr: number, argsPtr: number): number => {
call_method: (targetOriginPtr: number, fnNamePtr: number, argsPtr: number): WasmArg => {
return this._currentExec.get()
.vmCallMethod(
this,
WasmWord.fromNumber(targetOriginPtr),
WasmWord.fromNumber(fnNamePtr),
WasmWord.fromNumber(argsPtr)
).toUInt();
);
},
call_function: (pkgIdStrPtr: number, fnNamePtr: number, argsBufPtr: number): WasmPointer => {
call_function: (pkgIdStrPtr: number, fnNamePtr: number, argsBufPtr: number): WasmArg => {
return this._currentExec.get().vmCallFunction(
this,
WasmWord.fromNumber(pkgIdStrPtr),
WasmWord.fromNumber(fnNamePtr),
WasmWord.fromNumber(argsBufPtr)
).toUInt()
)
},

get_prop: (targetOriginPtr: number, propNamePtr: number): number => {
return this._currentExec.get().vmGetProp(this, WasmWord.fromNumber(targetOriginPtr), WasmWord.fromNumber(propNamePtr)).toUInt()
get_prop: (targetOriginPtr: number, propNamePtr: number): WasmArg => {
return this._currentExec.get().vmGetProp(this, WasmWord.fromNumber(targetOriginPtr), WasmWord.fromNumber(propNamePtr))
},
jig_lock: (originPtr: number, type: number, argsPtr: number) => {
this._currentExec.get().vmJigLock(this, WasmWord.fromNumber(originPtr), type, WasmWord.fromNumber(argsPtr))
Expand All @@ -97,26 +95,26 @@ export class WasmContainer {
caller_outputcheck: (): boolean => {
return this._currentExec.get().vmCallerOutputCheck()
},
caller_output: (): WasmPointer => {
caller_output: (): WasmArg => {
return this._currentExec.get().vmCallerOutput(this).toUInt()
},
caller_output_val: (keyPtr: number): WasmPointer => {
caller_output_val: (keyPtr: number): WasmArg => {
return this._currentExec.get().vmCallerOutputVal(this, WasmWord.fromNumber(keyPtr)).toUInt()
},
constructor_local: (classNamePtr: number, argsPtr: number): WasmPointer => {
constructor_local: (classNamePtr: number, argsPtr: number): WasmArg => {
return this._currentExec.get().vmConstructorLocal(
this,
WasmWord.fromNumber(classNamePtr),
WasmWord.fromNumber(argsPtr)
).toUInt()
},
constructor_remote: (pkgIdStrPtr: number, namePtr: number, argBufPtr: number): WasmPointer => {
constructor_remote: (pkgIdStrPtr: number, namePtr: number, argBufPtr: number): WasmArg => {
return this._currentExec.get().vmConstructorRemote(
this,
WasmWord.fromNumber(pkgIdStrPtr),
WasmWord.fromNumber(namePtr),
WasmWord.fromNumber(argBufPtr)
).toUInt()
)
},
proxy_link: () => {},
meter: (gasUsed: bigint) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/vm/src/wasm-word.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {AbiType} from "./memory/abi-helpers/abi-type.js";
import {BufReader, BufWriter} from "@aldea/core";

type WasmArg = number | bigint
export type WasmArg = number | bigint

export class WasmWord {
private value: ArrayBuffer;
Expand Down
Loading

0 comments on commit 30f534f

Please sign in to comment.