Esempio n. 1
0
        public Emitter arrset(MethodBase setter)
        {
            setter.IsArraySetter().AssertTrue();

            var n_dims = setter.Paramc() - 1;
            var value = pop_expr();
            var indices = 0.UpTo(n_dims - 1).Select(_ => _stk.Pop()).Reverse().ToReadOnly();
            var arr = pop_arr();
            indices.ForEach(idx => _stk.Push(idx));
            calc_offset(arr, n_dims);

            var el_t = arr.Node.Type().GetElementType();
            var r_offset = (Reg)pop_expr();
            _ptx.Add(new st{ss = arr.Space, type = el_t, a = r_offset, b = value});

            return this;
        }
Esempio n. 2
0
        public Emitter arrget(MethodBase getter)
        {
            getter.IsArrayGetter().AssertTrue();

            var n_dims = getter.Paramc();
            var indices = 0.UpTo(n_dims - 1).Select(_ => _stk.Pop()).Reverse().ToReadOnly();
            var arr = pop_arr();
            indices.ForEach(idx => _stk.Push(idx));
            calc_offset(arr, n_dims);

            var el_t = arr.Node.Type().GetElementType();
            var d = def_local(el_t);
            var r_offset = (Reg)pop_expr();
            _ptx.Add(new ld{ss = arr.Space, type = el_t, d = d, a = r_offset});
            push(d);

            return this;
        }