From 3f93808914a5488e81dde6f6e382f663bcc41fef Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Sat, 15 Sep 2018 02:54:30 +0200 Subject: [PATCH] Integrate Buffer experiment into Pointer; Remove CArray --- std/assembly/index.d.ts | 6 - tests/compiler/std/buffer.optimized.wat | 247 --------------- tests/compiler/std/buffer.ts | 40 --- tests/compiler/std/buffer.untouched.wat | 327 -------------------- tests/compiler/std/pointer.optimized.wat | 266 ++++++++++++++--- tests/compiler/std/pointer.ts | 36 ++- tests/compiler/std/pointer.untouched.wat | 363 ++++++++++++++++++++--- 7 files changed, 573 insertions(+), 712 deletions(-) delete mode 100644 tests/compiler/std/buffer.optimized.wat delete mode 100644 tests/compiler/std/buffer.ts delete mode 100644 tests/compiler/std/buffer.untouched.wat diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 29b2596d..8b082dae 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -457,12 +457,6 @@ declare class Array { sort(comparator?: (a: T, b: T) => i32): this; } -/** Class representing a C-like array of values of type `T` with limited capabilities. */ -declare class CArray { - [key: number]: T; - private constructor(); -} - /** Class representing a sequence of characters. */ declare class String { diff --git a/tests/compiler/std/buffer.optimized.wat b/tests/compiler/std/buffer.optimized.wat deleted file mode 100644 index b3339f65..00000000 --- a/tests/compiler/std/buffer.optimized.wat +++ /dev/null @@ -1,247 +0,0 @@ -(module - (type $iifv (func (param i32 i32 f32))) - (type $iif (func (param i32 i32) (result f32))) - (type $iiiiv (func (param i32 i32 i32 i32))) - (type $v (func)) - (type $FUNCSIG$i (func (result i32))) - (type $FUNCSIG$ii (func (param i32) (result i32))) - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) - (global $std/buffer/buf (mut i32) (i32.const 0)) - (memory $0 1) - (data (i32.const 8) "\0d\00\00\00s\00t\00d\00/\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (export "memory" (memory $0)) - (start $start) - (func $std/buffer/Buffer.from (; 1 ;) (; has Stack IR ;) (type $FUNCSIG$i) (result i32) - (i32.const 0) - ) - (func $std/buffer/Buffer#set (; 2 ;) (; has Stack IR ;) (type $iifv) (param $0 i32) (param $1 i32) (param $2 f32) - (f32.store - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - (get_local $2) - ) - ) - (func $std/buffer/Buffer#get (; 3 ;) (; has Stack IR ;) (type $iif) (param $0 i32) (param $1 i32) (result f32) - (f32.load - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - ) - ) - (func $std/buffer/Buffer#slice (; 4 ;) (; has Stack IR ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (i32.add - (get_local $0) - (i32.const 4) - ) - ) - (func $start (; 5 ;) (; has Stack IR ;) (type $v) - (set_global $std/buffer/buf - (call $std/buffer/Buffer.from) - ) - (call $std/buffer/Buffer#set - (get_global $std/buffer/buf) - (i32.const 0) - (f32.const 1.100000023841858) - ) - (call $std/buffer/Buffer#set - (get_global $std/buffer/buf) - (i32.const 1) - (f32.const 1.2000000476837158) - ) - (if - (f32.ne - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 0) - ) - (f32.const 1.100000023841858) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 26) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 1) - ) - (f32.const 1.2000000476837158) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 27) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (get_global $std/buffer/buf) - ) - (f32.const 1.100000023841858) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 29) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (i32.add - (get_global $std/buffer/buf) - (i32.const 4) - ) - ) - (f32.const 1.2000000476837158) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 30) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (i32.const 0) - ) - (f32.const 1.100000023841858) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 32) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (i32.const 4) - ) - (f32.const 1.2000000476837158) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 33) - (i32.const 0) - ) - (unreachable) - ) - ) - (f32.store - (i32.add - (get_global $std/buffer/buf) - (i32.const 8) - ) - (f32.const 1.2999999523162842) - ) - (if - (f32.ne - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 2) - ) - (f32.const 1.2999999523162842) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 36) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (i32.add - (get_global $std/buffer/buf) - (i32.const 8) - ) - ) - (f32.const 1.2999999523162842) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 37) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f32.ne - (f32.load - (i32.const 8) - ) - (f32.const 1.2999999523162842) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 38) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.ne - (call $std/buffer/Buffer#slice - (get_global $std/buffer/buf) - ) - (i32.const 4) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 40) - (i32.const 0) - ) - (unreachable) - ) - ) - ) -) diff --git a/tests/compiler/std/buffer.ts b/tests/compiler/std/buffer.ts deleted file mode 100644 index f3830aeb..00000000 --- a/tests/compiler/std/buffer.ts +++ /dev/null @@ -1,40 +0,0 @@ -class Buffer { - - static from(ptr: usize): Buffer { - return changetype>(ptr); - } - - @operator("[]") @inline get(index: i32): T { - return load(changetype(this) + (index << alignof())); - } - - @operator("[]=") @inline set(index: i32, value: T): void { - store(changetype(this) + (index << alignof()), value); - } - - slice(startIndex: i32): Buffer { - return changetype>(changetype(this) + (startIndex << alignof())); - } - - // ... -} - -var buf = Buffer.from(0); -buf[0] = 1.1; -buf[1] = 1.2; - -assert(buf[0] == 1.1); -assert(buf[1] == 1.2); - -assert(buf.get(0) == 1.1); -assert(buf.get(1) == 1.2); - -assert(load(0) == 1.1); -assert(load(4) == 1.2); - -buf.set(2, 1.3); -assert(buf[2] == 1.3); -assert(buf.get(2) == 1.3); -assert(load(8) == 1.3); - -assert(buf.slice(1) === changetype>(4)); diff --git a/tests/compiler/std/buffer.untouched.wat b/tests/compiler/std/buffer.untouched.wat deleted file mode 100644 index d08715e0..00000000 --- a/tests/compiler/std/buffer.untouched.wat +++ /dev/null @@ -1,327 +0,0 @@ -(module - (type $ii (func (param i32) (result i32))) - (type $iifv (func (param i32 i32 f32))) - (type $iif (func (param i32 i32) (result f32))) - (type $iiiiv (func (param i32 i32 i32 i32))) - (type $iii (func (param i32 i32) (result i32))) - (type $v (func)) - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) - (global $std/buffer/buf (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 40)) - (memory $0 1) - (data (i32.const 8) "\0d\00\00\00s\00t\00d\00/\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (export "memory" (memory $0)) - (start $start) - (func $std/buffer/Buffer.from (; 1 ;) (type $ii) (param $0 i32) (result i32) - (get_local $0) - ) - (func $std/buffer/Buffer#set (; 2 ;) (type $iifv) (param $0 i32) (param $1 i32) (param $2 f32) - (f32.store - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - (get_local $2) - ) - ) - (func $std/buffer/Buffer#get (; 3 ;) (type $iif) (param $0 i32) (param $1 i32) (result f32) - (f32.load - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - ) - ) - (func $std/buffer/Buffer#slice (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - ) - (func $start (; 5 ;) (type $v) - (local $0 i32) - (local $1 i32) - (local $2 f32) - (set_global $std/buffer/buf - (call $std/buffer/Buffer.from - (i32.const 0) - ) - ) - (call $std/buffer/Buffer#set - (get_global $std/buffer/buf) - (i32.const 0) - (f32.const 1.100000023841858) - ) - (call $std/buffer/Buffer#set - (get_global $std/buffer/buf) - (i32.const 1) - (f32.const 1.2000000476837158) - ) - (if - (i32.eqz - (f32.eq - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 0) - ) - (f32.const 1.100000023841858) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 26) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 1) - ) - (f32.const 1.2000000476837158) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 27) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (block $std/buffer/Buffer#get|inlined.0 (result f32) - (set_local $0 - (get_global $std/buffer/buf) - ) - (set_local $1 - (i32.const 0) - ) - (f32.load - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - ) - ) - (f32.const 1.100000023841858) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 29) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (block $std/buffer/Buffer#get|inlined.1 (result f32) - (set_local $1 - (get_global $std/buffer/buf) - ) - (set_local $0 - (i32.const 1) - ) - (f32.load - (i32.add - (get_local $1) - (i32.shl - (get_local $0) - (i32.const 2) - ) - ) - ) - ) - (f32.const 1.2000000476837158) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 30) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (f32.load - (i32.const 0) - ) - (f32.const 1.100000023841858) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 32) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (f32.load - (i32.const 4) - ) - (f32.const 1.2000000476837158) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 33) - (i32.const 0) - ) - (unreachable) - ) - ) - (block $std/buffer/Buffer#set|inlined.0 - (set_local $0 - (get_global $std/buffer/buf) - ) - (set_local $1 - (i32.const 2) - ) - (set_local $2 - (f32.const 1.2999999523162842) - ) - (f32.store - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 2) - ) - ) - (get_local $2) - ) - ) - (if - (i32.eqz - (f32.eq - (call $std/buffer/Buffer#get - (get_global $std/buffer/buf) - (i32.const 2) - ) - (f32.const 1.2999999523162842) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 36) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (block $std/buffer/Buffer#get|inlined.2 (result f32) - (set_local $1 - (get_global $std/buffer/buf) - ) - (set_local $0 - (i32.const 2) - ) - (f32.load - (i32.add - (get_local $1) - (i32.shl - (get_local $0) - (i32.const 2) - ) - ) - ) - ) - (f32.const 1.2999999523162842) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 37) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f32.eq - (f32.load - (i32.const 8) - ) - (f32.const 1.2999999523162842) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 38) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (i32.eq - (call $std/buffer/Buffer#slice - (get_global $std/buffer/buf) - (i32.const 1) - ) - (i32.const 4) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 8) - (i32.const 40) - (i32.const 0) - ) - (unreachable) - ) - ) - ) -) diff --git a/tests/compiler/std/pointer.optimized.wat b/tests/compiler/std/pointer.optimized.wat index f56b1d5b..5552f428 100644 --- a/tests/compiler/std/pointer.optimized.wat +++ b/tests/compiler/std/pointer.optimized.wat @@ -1,8 +1,8 @@ (module - (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) + (type $iifv (func (param i32 i32 f32))) + (type $iif (func (param i32 i32) (result f32))) (type $v (func)) - (type $iv (func (param i32))) (type $FUNCSIG$ii (func (param i32) (result i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (global $std/pointer/one (mut i32) (i32.const 0)) @@ -10,17 +10,38 @@ (global $std/pointer/add (mut i32) (i32.const 0)) (global $std/pointer/sub (mut i32) (i32.const 0)) (global $std/pointer/nextOne (mut i32) (i32.const 0)) - (global $~argc (mut i32) (i32.const 0)) + (global $std/pointer/buf (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 8) "\0e\00\00\00s\00t\00d\00/\00p\00o\00i\00n\00t\00e\00r\00.\00t\00s") (export "memory" (memory $0)) - (export "_setargc" (func $~setargc)) - (export "Pointer#constructor" (func $std/pointer/Pointer#constructor|trampoline)) (start $start) (func $std/pointer/Pointer#constructor (; 1 ;) (; has Stack IR ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (get_local $0) ) - (func $start (; 2 ;) (; has Stack IR ;) (type $v) + (func $std/pointer/Pointer#set (; 2 ;) (; has Stack IR ;) (type $iifv) (param $0 i32) (param $1 i32) (param $2 f32) + (f32.store + (i32.add + (get_local $0) + (i32.shl + (get_local $1) + (i32.const 2) + ) + ) + (get_local $2) + ) + ) + (func $std/pointer/Pointer#get (; 3 ;) (; has Stack IR ;) (type $iif) (param $0 i32) (param $1 i32) (result f32) + (f32.load + (i32.add + (get_local $0) + (i32.shl + (get_local $1) + (i32.const 2) + ) + ) + ) + ) + (func $start (; 4 ;) (; has Stack IR ;) (type $v) (set_global $std/pointer/one (call $std/pointer/Pointer#constructor (i32.const 8) @@ -40,7 +61,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 52) + (i32.const 66) (i32.const 0) ) (unreachable) @@ -55,7 +76,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 53) + (i32.const 67) (i32.const 0) ) (unreachable) @@ -80,7 +101,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 57) + (i32.const 71) (i32.const 0) ) (unreachable) @@ -97,7 +118,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 58) + (i32.const 72) (i32.const 0) ) (unreachable) @@ -118,7 +139,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 61) + (i32.const 75) (i32.const 0) ) (unreachable) @@ -139,7 +160,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 64) + (i32.const 78) (i32.const 0) ) (unreachable) @@ -154,7 +175,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 66) + (i32.const 80) (i32.const 0) ) (unreachable) @@ -178,7 +199,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 68) + (i32.const 82) (i32.const 0) ) (unreachable) @@ -193,7 +214,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 69) + (i32.const 83) (i32.const 0) ) (unreachable) @@ -208,7 +229,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 71) + (i32.const 85) (i32.const 0) ) (unreachable) @@ -235,7 +256,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 74) + (i32.const 88) (i32.const 0) ) (unreachable) @@ -252,7 +273,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 75) + (i32.const 89) (i32.const 0) ) (unreachable) @@ -269,34 +290,195 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 76) + (i32.const 90) + (i32.const 0) + ) + (unreachable) + ) + ) + (set_global $std/pointer/buf + (call $std/pointer/Pointer#constructor + (i32.const 0) + ) + ) + (call $std/pointer/Pointer#set + (get_global $std/pointer/buf) + (i32.const 0) + (f32.const 1.100000023841858) + ) + (call $std/pointer/Pointer#set + (get_global $std/pointer/buf) + (i32.const 1) + (f32.const 1.2000000476837158) + ) + (if + (f32.ne + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 0) + ) + (f32.const 1.100000023841858) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 96) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 1) + ) + (f32.const 1.2000000476837158) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 97) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (get_global $std/pointer/buf) + ) + (f32.const 1.100000023841858) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 99) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (i32.add + (get_global $std/pointer/buf) + (i32.const 4) + ) + ) + (f32.const 1.2000000476837158) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 100) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (i32.const 0) + ) + (f32.const 1.100000023841858) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 102) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (i32.const 4) + ) + (f32.const 1.2000000476837158) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 103) + (i32.const 0) + ) + (unreachable) + ) + ) + (f32.store + (i32.add + (get_global $std/pointer/buf) + (i32.const 8) + ) + (f32.const 1.2999999523162842) + ) + (if + (f32.ne + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 2) + ) + (f32.const 1.2999999523162842) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 106) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (i32.add + (get_global $std/pointer/buf) + (i32.const 8) + ) + ) + (f32.const 1.2999999523162842) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 107) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f32.ne + (f32.load + (i32.const 8) + ) + (f32.const 1.2999999523162842) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 108) (i32.const 0) ) (unreachable) ) ) ) - (func $std/pointer/Pointer#constructor|trampoline (; 3 ;) (; has Stack IR ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (block $1of1 - (block $0of1 - (block $outOfRange - (br_table $0of1 $1of1 $outOfRange - (get_global $~argc) - ) - ) - (unreachable) - ) - (set_local $1 - (i32.const 0) - ) - ) - (call $std/pointer/Pointer#constructor - (get_local $1) - ) - ) - (func $~setargc (; 4 ;) (; has Stack IR ;) (type $iv) (param $0 i32) - (set_global $~argc - (get_local $0) - ) - ) ) diff --git a/tests/compiler/std/pointer.ts b/tests/compiler/std/pointer.ts index 48ef6df8..404a6e51 100644 --- a/tests/compiler/std/pointer.ts +++ b/tests/compiler/std/pointer.ts @@ -1,6 +1,6 @@ // A pointer arithmetic experiment -export class Pointer { +class Pointer { // FIXME: does not inline, always yields a trampoline @inline constructor(offset: usize = 0) { @@ -12,7 +12,11 @@ export class Pointer { } @inline get value(): T { - return changetype(changetype(this)); + if (isReference()) { + return changetype(changetype(this)); + } else { + return load(changetype(this)); + } } // FIXME: in general, inlining any of the following always yields a block. one could argue that @@ -39,6 +43,16 @@ export class Pointer { const size = isReference() ? offsetof() : sizeof(); return changetype>(changetype(this) - size); } + + @inline @operator("[]") get(index: i32): T { + const size = isReference() ? offsetof() : sizeof(); + return load(changetype(this) + (index * size)); + } + + @inline @operator("[]=") set(index: i32, value: T): void { + const size = isReference() ? offsetof() : sizeof(); + store(changetype(this) + (index * size), value); + } } @unmanaged @@ -74,3 +88,21 @@ assert(two.offset == 24); assert(two.offset == 8); assert(two.value.key == 1); assert(two.value.val == 2); + +var buf = new Pointer(0); +buf[0] = 1.1; +buf[1] = 1.2; + +assert(buf[0] == 1.1); +assert(buf[1] == 1.2); + +assert(buf.get(0) == 1.1); +assert(buf.get(1) == 1.2); + +assert(load(0) == 1.1); +assert(load(4) == 1.2); + +buf.set(2, 1.3); +assert(buf[2] == 1.3); +assert(buf.get(2) == 1.3); +assert(load(8) == 1.3); diff --git a/tests/compiler/std/pointer.untouched.wat b/tests/compiler/std/pointer.untouched.wat index 766a9332..56381130 100644 --- a/tests/compiler/std/pointer.untouched.wat +++ b/tests/compiler/std/pointer.untouched.wat @@ -1,28 +1,54 @@ (module (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) + (type $iifv (func (param i32 i32 f32))) + (type $iif (func (param i32 i32) (result f32))) (type $v (func)) - (type $iv (func (param i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (global $std/pointer/one (mut i32) (i32.const 0)) (global $std/pointer/two (mut i32) (i32.const 0)) (global $std/pointer/add (mut i32) (i32.const 0)) (global $std/pointer/sub (mut i32) (i32.const 0)) (global $std/pointer/nextOne (mut i32) (i32.const 0)) + (global $std/pointer/buf (mut i32) (i32.const 0)) (global $HEAP_BASE i32 (i32.const 40)) - (global $~argc (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 8) "\0e\00\00\00s\00t\00d\00/\00p\00o\00i\00n\00t\00e\00r\00.\00t\00s\00") (export "memory" (memory $0)) - (export "_setargc" (func $~setargc)) - (export "Pointer#constructor" (func $std/pointer/Pointer#constructor|trampoline)) (start $start) (func $std/pointer/Pointer#constructor (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (get_local $1) ) - (func $start (; 2 ;) (type $v) + (func $std/pointer/Pointer#constructor (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (get_local $1) + ) + (func $std/pointer/Pointer#set (; 3 ;) (type $iifv) (param $0 i32) (param $1 i32) (param $2 f32) + (f32.store + (i32.add + (get_local $0) + (i32.mul + (get_local $1) + (i32.const 4) + ) + ) + (get_local $2) + ) + ) + (func $std/pointer/Pointer#get (; 4 ;) (type $iif) (param $0 i32) (param $1 i32) (result f32) + (f32.load + (i32.add + (get_local $0) + (i32.mul + (get_local $1) + (i32.const 4) + ) + ) + ) + ) + (func $start (; 5 ;) (type $v) (local $0 i32) (local $1 i32) + (local $2 f32) (set_global $std/pointer/one (call $std/pointer/Pointer#constructor (i32.const 0) @@ -51,7 +77,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 52) + (i32.const 66) (i32.const 0) ) (unreachable) @@ -73,7 +99,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 53) + (i32.const 67) (i32.const 0) ) (unreachable) @@ -84,7 +110,9 @@ (set_local $0 (get_global $std/pointer/one) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.0 + (get_local $0) + ) ) (i32.const 1) ) @@ -93,7 +121,9 @@ (set_local $0 (get_global $std/pointer/one) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.1 + (get_local $0) + ) ) (i32.const 2) ) @@ -105,7 +135,9 @@ (set_local $0 (get_global $std/pointer/one) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.2 + (get_local $0) + ) ) ) (i32.const 1) @@ -115,7 +147,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 57) + (i32.const 71) (i32.const 0) ) (unreachable) @@ -129,7 +161,9 @@ (set_local $0 (get_global $std/pointer/one) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.3 + (get_local $0) + ) ) ) (i32.const 2) @@ -139,7 +173,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 58) + (i32.const 72) (i32.const 0) ) (unreachable) @@ -175,7 +209,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 61) + (i32.const 75) (i32.const 0) ) (unreachable) @@ -211,7 +245,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 64) + (i32.const 78) (i32.const 0) ) (unreachable) @@ -233,7 +267,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 66) + (i32.const 80) (i32.const 0) ) (unreachable) @@ -266,7 +300,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 68) + (i32.const 82) (i32.const 0) ) (unreachable) @@ -288,7 +322,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 69) + (i32.const 83) (i32.const 0) ) (unreachable) @@ -310,7 +344,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 71) + (i32.const 85) (i32.const 0) ) (unreachable) @@ -354,7 +388,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 74) + (i32.const 88) (i32.const 0) ) (unreachable) @@ -368,7 +402,9 @@ (set_local $0 (get_global $std/pointer/two) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.4 + (get_local $0) + ) ) ) (i32.const 1) @@ -378,7 +414,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 75) + (i32.const 89) (i32.const 0) ) (unreachable) @@ -392,7 +428,9 @@ (set_local $0 (get_global $std/pointer/two) ) - (get_local $0) + (br $std/pointer/Pointer#get:value|inlined.5 + (get_local $0) + ) ) ) (i32.const 2) @@ -402,35 +440,264 @@ (call $~lib/env/abort (i32.const 0) (i32.const 8) - (i32.const 76) + (i32.const 90) + (i32.const 0) + ) + (unreachable) + ) + ) + (set_global $std/pointer/buf + (call $std/pointer/Pointer#constructor + (i32.const 0) + (i32.const 0) + ) + ) + (call $std/pointer/Pointer#set + (get_global $std/pointer/buf) + (i32.const 0) + (f32.const 1.100000023841858) + ) + (call $std/pointer/Pointer#set + (get_global $std/pointer/buf) + (i32.const 1) + (f32.const 1.2000000476837158) + ) + (if + (i32.eqz + (f32.eq + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 0) + ) + (f32.const 1.100000023841858) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 96) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 1) + ) + (f32.const 1.2000000476837158) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 97) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (block $std/pointer/Pointer#get|inlined.0 (result f32) + (set_local $0 + (get_global $std/pointer/buf) + ) + (set_local $1 + (i32.const 0) + ) + (f32.load + (i32.add + (get_local $0) + (i32.mul + (get_local $1) + (i32.const 4) + ) + ) + ) + ) + (f32.const 1.100000023841858) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 99) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (block $std/pointer/Pointer#get|inlined.1 (result f32) + (set_local $1 + (get_global $std/pointer/buf) + ) + (set_local $0 + (i32.const 1) + ) + (f32.load + (i32.add + (get_local $1) + (i32.mul + (get_local $0) + (i32.const 4) + ) + ) + ) + ) + (f32.const 1.2000000476837158) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 100) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (f32.load + (i32.const 0) + ) + (f32.const 1.100000023841858) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 102) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (f32.load + (i32.const 4) + ) + (f32.const 1.2000000476837158) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 103) + (i32.const 0) + ) + (unreachable) + ) + ) + (block $std/pointer/Pointer#set|inlined.0 + (set_local $0 + (get_global $std/pointer/buf) + ) + (set_local $1 + (i32.const 2) + ) + (set_local $2 + (f32.const 1.2999999523162842) + ) + (f32.store + (i32.add + (get_local $0) + (i32.mul + (get_local $1) + (i32.const 4) + ) + ) + (get_local $2) + ) + ) + (if + (i32.eqz + (f32.eq + (call $std/pointer/Pointer#get + (get_global $std/pointer/buf) + (i32.const 2) + ) + (f32.const 1.2999999523162842) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 106) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (block $std/pointer/Pointer#get|inlined.2 (result f32) + (set_local $1 + (get_global $std/pointer/buf) + ) + (set_local $0 + (i32.const 2) + ) + (f32.load + (i32.add + (get_local $1) + (i32.mul + (get_local $0) + (i32.const 4) + ) + ) + ) + ) + (f32.const 1.2999999523162842) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 107) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f32.eq + (f32.load + (i32.const 8) + ) + (f32.const 1.2999999523162842) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 8) + (i32.const 108) (i32.const 0) ) (unreachable) ) ) ) - (func $std/pointer/Pointer#constructor|trampoline (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (block $1of1 - (block $0of1 - (block $outOfRange - (br_table $0of1 $1of1 $outOfRange - (get_global $~argc) - ) - ) - (unreachable) - ) - (set_local $1 - (i32.const 0) - ) - ) - (call $std/pointer/Pointer#constructor - (get_local $0) - (get_local $1) - ) - ) - (func $~setargc (; 4 ;) (type $iv) (param $0 i32) - (set_global $~argc - (get_local $0) - ) - ) )