/* Copyright 2021 Mozilla Foundation
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
// ./test/core/gc/struct.wast
// ./test/core/gc/struct.wast:3
let $0 = instantiate(`(module
(type (struct))
(type (struct (field)))
(type (struct (field i8)))
(type (struct (field i8 i8 i8 i8)))
(type (struct (field $$x1 i32) (field $$y1 i32)))
(type (struct (field i8 i16 i32 i64 f32 f64 anyref funcref (ref 0 ) (ref null 1 ))))
(type (struct (field i32 i64 i8) (field) (field) (field (ref null i31) anyref)))
(type (struct (field $$x2 i32) (field f32 f64) (field $$y2 i32)))
)`);
// ./test/core/gc/struct.wast:15
assert_malformed(
() => instantiate(`(type (struct (field $$x i32) (field $$x i32))) `),
`duplicate field`,
);
// ./test/core/gc/struct.wast:25
let $1 = instantiate(`(module
(rec
(type $$s0 (struct (field (ref 0 ) (ref 1 ) (ref $$s0) (ref $$s1))))
(type $$s1 (struct (field (ref 0 ) (ref 1 ) (ref $$s0) (ref $$s1))))
)
(func (param (ref $$forward)))
(type $$forward (struct))
)`);
// ./test/core/gc/struct.wast:36
assert_invalid(
() => instantiate(`(module (type (struct (field (ref 1 )))))`),
`unknown type`,
);
// ./test/core/gc/struct.wast:40
assert_invalid(
() => instantiate(`(module (type (struct (field (mut (ref 1 ))))))`),
`unknown type`,
);
// ./test/core/gc/struct.wast:48
let $2 = instantiate(`(module
(type (struct (field $$x i32)))
(type $$t1 (struct (field i32) (field $$x f32)))
(type $$t2 (struct (field i32 i32) (field $$x i64)))
(func (param (ref 0 )) (result i32) (struct.get 0 $$x (local.get 0 )))
(func (param (ref $$t1)) (result f32) (struct.get 1 $$x (local.get 0 )))
(func (param (ref $$t2)) (result i64) (struct.get $$t2 $$x (local.get 0 )))
)`);
// ./test/core/gc/struct.wast:58
assert_invalid(
() => instantiate(`(module
(type (struct (field $$x i64)))
(type $$t (struct (field $$x i32)))
(func (param (ref 0 )) (result i32) (struct.get 0 $$x (local.get 0 )))
)`),
`type mismatch`,
);
// ./test/core/gc/struct.wast:70
let $3 = instantiate(`(module
(type $$vec (struct (field f32) (field $$y (mut f32)) (field $$z f32)))
(global (ref $$vec) (struct.new $$vec (f32.const 1 ) (f32.const 2 ) (f32.const 3 )))
(global (ref $$vec) (struct.new_default $$vec))
(func (export "new" ) (result anyref)
(struct.new_default $$vec)
)
(func $$get_0_0 (param $$v (ref $$vec)) (result f32)
(struct.get 0 0 (local.get $$v))
)
(func (export "get_0_0" ) (result f32)
(call $$get_0_0 (struct.new_default $$vec))
)
(func $$get_vec_0 (param $$v (ref $$vec)) (result f32)
(struct.get $$vec 0 (local.get $$v))
)
(func (export "get_vec_0" ) (result f32)
(call $$get_vec_0 (struct.new_default $$vec))
)
(func $$get_0_y (param $$v (ref $$vec)) (result f32)
(struct.get 0 $$y (local.get $$v))
)
(func (export "get_0_y" ) (result f32)
(call $$get_0_y (struct.new_default $$vec))
)
(func $$get_vec_y (param $$v (ref $$vec)) (result f32)
(struct.get $$vec $$y (local.get $$v))
)
(func (export "get_vec_y" ) (result f32)
(call $$get_vec_y (struct.new_default $$vec))
)
(func $$set_get_y (param $$v (ref $$vec)) (param $$y f32) (result f32)
(struct.set $$vec $$y (local.get $$v) (local.get $$y))
(struct.get $$vec $$y (local.get $$v))
)
(func (export "set_get_y" ) (param $$y f32) (result f32)
(call $$set_get_y (struct.new_default $$vec) (local.get $$y))
)
(func $$set_get_1 (param $$v (ref $$vec)) (param $$y f32) (result f32)
(struct.set $$vec 1 (local.get $$v) (local.get $$y))
(struct.get $$vec $$y (local.get $$v))
)
(func (export "set_get_1" ) (param $$y f32) (result f32)
(call $$set_get_1 (struct.new_default $$vec) (local.get $$y))
)
)`);
// ./test/core/gc/struct.wast:122
assert_return(() => invoke($3 , `new `, []), [new RefWithType('structref' )]);
// ./test/core/gc/struct.wast:124
assert_return(() => invoke($3 , `get_0_0`, []), [value("f32" , 0 )]);
// ./test/core/gc/struct.wast:125
assert_return(() => invoke($3 , `get_vec_0`, []), [value("f32" , 0 )]);
// ./test/core/gc/struct.wast:126
assert_return(() => invoke($3 , `get_0_y`, []), [value("f32" , 0 )]);
// ./test/core/gc/struct.wast:127
assert_return(() => invoke($3 , `get_vec_y`, []), [value("f32" , 0 )]);
// ./test/core/gc/struct.wast:129
assert_return(() => invoke($3 , `set_get_y`, [value("f32" , 7 )]), [value("f32" , 7 )]);
// ./test/core/gc/struct.wast:130
assert_return(() => invoke($3 , `set_get_1`, [value("f32" , 7 )]), [value("f32" , 7 )]);
// ./test/core/gc/struct.wast:132
assert_invalid(
() => instantiate(`(module
(type $$s (struct (field i64)))
(func (export "struct.set-immutable" ) (param $$s (ref $$s))
(struct.set $$s 0 (local.get $$s) (i64.const 1 ))
)
)`),
`field is immutable`,
);
// ./test/core/gc/struct.wast:145
let $4 = instantiate(`(module
(type $$t (struct (field i32 (mut i32))))
(func (export "struct.get-null" )
(local (ref null $$t)) (drop (struct.get $$t 1 (local.get 0 )))
)
(func (export "struct.set-null" )
(local (ref null $$t)) (struct.set $$t 1 (local.get 0 ) (i32.const 0 ))
)
)`);
// ./test/core/gc/struct.wast:155
assert_trap(() => invoke($4 , `struct.get-null `, []), `null structure reference`);
// ./test/core/gc/struct.wast:156
assert_trap(() => invoke($4 , `struct.set-null `, []), `null structure reference`);
// ./test/core/gc/struct.wast:160
let $5 = instantiate(`(module
(type $$s (struct (field i8) (field (mut i8)) (field i16) (field (mut i16))))
(global (export "g0" ) (ref $$s) (struct.new $$s (i32.const 0 ) (i32.const 1 ) (i32.const 2 ) (i32.const 3 )))
(global (export "g1" ) (ref $$s) (struct.new $$s (i32.const 254 ) (i32.const 255 ) (i32.const 65534 ) (i32.const 65535 )))
(func (export "get_packed_g0_0" ) (result i32 i32)
(struct.get_s 0 0 (global.get 0 ))
(struct.get_u 0 0 (global.get 0 ))
)
(func (export "get_packed_g1_0" ) (result i32 i32)
(struct.get_s 0 0 (global.get 1 ))
(struct.get_u 0 0 (global.get 1 ))
)
(func (export "get_packed_g0_1" ) (result i32 i32)
(struct.get_s 0 1 (global.get 0 ))
(struct.get_u 0 1 (global.get 0 ))
)
(func (export "get_packed_g1_1" ) (result i32 i32)
(struct.get_s 0 1 (global.get 1 ))
(struct.get_u 0 1 (global.get 1 ))
)
(func (export "get_packed_g0_2" ) (result i32 i32)
(struct.get_s 0 2 (global.get 0 ))
(struct.get_u 0 2 (global.get 0 ))
)
(func (export "get_packed_g1_2" ) (result i32 i32)
(struct.get_s 0 2 (global.get 1 ))
(struct.get_u 0 2 (global.get 1 ))
)
(func (export "get_packed_g0_3" ) (result i32 i32)
(struct.get_s 0 3 (global.get 0 ))
(struct.get_u 0 3 (global.get 0 ))
)
(func (export "get_packed_g1_3" ) (result i32 i32)
(struct.get_s 0 3 (global.get 1 ))
(struct.get_u 0 3 (global.get 1 ))
)
(func (export "set_get_packed_g0_1" ) (param i32) (result i32 i32)
(struct.set 0 1 (global.get 0 ) (local.get 0 ))
(struct.get_s 0 1 (global.get 0 ))
(struct.get_u 0 1 (global.get 0 ))
)
(func (export "set_get_packed_g0_3" ) (param i32) (result i32 i32)
(struct.set 0 3 (global.get 0 ) (local.get 0 ))
(struct.get_s 0 3 (global.get 0 ))
(struct.get_u 0 3 (global.get 0 ))
)
)`);
// ./test/core/gc/struct.wast:219
assert_return(() => invoke($5 , `get_packed_g0_0`, []), [value("i32" , 0 ), value("i32" , 0 )]);
// ./test/core/gc/struct.wast:220
assert_return(() => invoke($5 , `get_packed_g1_0`, []), [value("i32" , -2 ), value("i32" , 254 )]);
// ./test/core/gc/struct.wast:221
assert_return(() => invoke($5 , `get_packed_g0_1`, []), [value("i32" , 1 ), value("i32" , 1 )]);
// ./test/core/gc/struct.wast:222
assert_return(() => invoke($5 , `get_packed_g1_1`, []), [value("i32" , -1 ), value("i32" , 255 )]);
// ./test/core/gc/struct.wast:223
assert_return(() => invoke($5 , `get_packed_g0_2`, []), [value("i32" , 2 ), value("i32" , 2 )]);
// ./test/core/gc/struct.wast:224
assert_return(() => invoke($5 , `get_packed_g1_2`, []), [value("i32" , -2 ), value("i32" , 65534 )]);
// ./test/core/gc/struct.wast:225
assert_return(() => invoke($5 , `get_packed_g0_3`, []), [value("i32" , 3 ), value("i32" , 3 )]);
// ./test/core/gc/struct.wast:226
assert_return(() => invoke($5 , `get_packed_g1_3`, []), [value("i32" , -1 ), value("i32" , 65535 )]);
// ./test/core/gc/struct.wast:228
assert_return(() => invoke($5 , `set_get_packed_g0_1`, [257 ]), [value("i32" , 1 ), value("i32" , 1 )]);
// ./test/core/gc/struct.wast:229
assert_return(() => invoke($5 , `set_get_packed_g0_3`, [257 ]), [value("i32" , 257 ), value("i32" , 257 )]);
Messung V0.5 in Prozent C=81 H=100 G=90
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-11)
¤
*© Formatika GbR, Deutschland