checker: error on a.slice(x,y) outside `builtin`
parent
129eee346b
commit
d9532eda30
|
@ -50,7 +50,7 @@ mut:
|
||||||
fn (mut n Network) populate(network []int) {
|
fn (mut n Network) populate(network []int) {
|
||||||
assert network.len >= 2
|
assert network.len >= 2
|
||||||
input := network[0]
|
input := network[0]
|
||||||
hiddens := network.slice(1, network.len - 1)
|
hiddens := network[1..network.len-1]
|
||||||
output := network[network.len - 1]
|
output := network[network.len - 1]
|
||||||
mut index := 0
|
mut index := 0
|
||||||
mut previous_neurons := 0
|
mut previous_neurons := 0
|
||||||
|
|
|
@ -255,9 +255,9 @@ fn test_left() {
|
||||||
|
|
||||||
fn test_slice() {
|
fn test_slice() {
|
||||||
a := [1, 2, 3, 4]
|
a := [1, 2, 3, 4]
|
||||||
b := a.slice(2, 4)
|
b := a[2..4]
|
||||||
assert b.len == 2
|
assert b.len == 2
|
||||||
assert a.slice(1, 2).len == 1
|
assert a[1..2].len == 1
|
||||||
assert a.len == 4
|
assert a.len == 4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ fn test_clone() {
|
||||||
assert nums2.len == 5
|
assert nums2.len == 5
|
||||||
assert nums.str() == '[1, 2, 3, 4, 100]'
|
assert nums.str() == '[1, 2, 3, 4, 100]'
|
||||||
assert nums2.str() == '[1, 2, 3, 4, 100]'
|
assert nums2.str() == '[1, 2, 3, 4, 100]'
|
||||||
assert nums.slice(1, 3).str() == '[2, 3]'
|
assert nums[1..3].str() == '[2, 3]'
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -94,21 +94,20 @@ pub fn (mut x AesCbc) decrypt_blocks(mut dst []byte, src []byte) {
|
||||||
mut start := end - x.block_size
|
mut start := end - x.block_size
|
||||||
mut prev := start - x.block_size
|
mut prev := start - x.block_size
|
||||||
// Copy the last block of ciphertext in preparation as the new iv.
|
// Copy the last block of ciphertext in preparation as the new iv.
|
||||||
copy(x.tmp, src.slice(start, end))
|
copy(x.tmp, src[start..end])
|
||||||
// Loop over all but the first block.
|
// Loop over all but the first block.
|
||||||
for start > 0 {
|
for start > 0 {
|
||||||
mut src_chunk := src.slice(start, end)
|
mut src_chunk := src[start..end]
|
||||||
x.b.decrypt(mut (*dst).slice(start, end), mut src_chunk)
|
x.b.decrypt(mut (*dst)[start..end], mut src_chunk)
|
||||||
cipher.xor_bytes(mut (*dst).slice(start, end), (*dst).slice(start, end), src.slice(prev,
|
cipher.xor_bytes(mut (*dst)[start..end], (*dst)[start..end], src[prev..start])
|
||||||
start))
|
|
||||||
end = start
|
end = start
|
||||||
start = prev
|
start = prev
|
||||||
prev -= x.block_size
|
prev -= x.block_size
|
||||||
}
|
}
|
||||||
// The first block is special because it uses the saved iv.
|
// The first block is special because it uses the saved iv.
|
||||||
mut src_chunk := src.slice(start, end)
|
mut src_chunk := src[start..end]
|
||||||
x.b.decrypt(mut (*dst).slice(start, end), mut src_chunk)
|
x.b.decrypt(mut (*dst)[start..end], mut src_chunk)
|
||||||
cipher.xor_bytes(mut (*dst).slice(start, end), (*dst).slice(start, end), x.iv)
|
cipher.xor_bytes(mut (*dst)[start..end], (*dst)[start..end], x.iv)
|
||||||
// Set the new iv to the first block we copied earlier.
|
// Set the new iv to the first block we copied earlier.
|
||||||
x.iv = x.tmp
|
x.iv = x.tmp
|
||||||
x.tmp = x.iv
|
x.tmp = x.iv
|
||||||
|
|
|
@ -41,9 +41,9 @@ import encoding.binary
|
||||||
fn encrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
fn encrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
||||||
_ = src[15] // early bounds check
|
_ = src[15] // early bounds check
|
||||||
mut s0 := binary.big_endian_u32(src[..4])
|
mut s0 := binary.big_endian_u32(src[..4])
|
||||||
mut s1 := binary.big_endian_u32(src.slice(4, 8))
|
mut s1 := binary.big_endian_u32(src[4..8])
|
||||||
mut s2 := binary.big_endian_u32(src.slice(8, 12))
|
mut s2 := binary.big_endian_u32(src[8..12])
|
||||||
mut s3 := binary.big_endian_u32(src.slice(12, 16))
|
mut s3 := binary.big_endian_u32(src[12..16])
|
||||||
// First round just XORs input with key.
|
// First round just XORs input with key.
|
||||||
s0 ^= xk[0]
|
s0 ^= xk[0]
|
||||||
s1 ^= xk[1]
|
s1 ^= xk[1]
|
||||||
|
@ -83,18 +83,18 @@ fn encrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
||||||
s3 ^= xk[k + 3]
|
s3 ^= xk[k + 3]
|
||||||
_ := dst[15] // early bounds check
|
_ := dst[15] // early bounds check
|
||||||
binary.big_endian_put_u32(mut (*dst)[0..4], s0)
|
binary.big_endian_put_u32(mut (*dst)[0..4], s0)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(4, 8), s1)
|
binary.big_endian_put_u32(mut (*dst)[4..8], s1)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(8, 12), s2)
|
binary.big_endian_put_u32(mut (*dst)[8..12], s2)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(12, 16), s3)
|
binary.big_endian_put_u32(mut (*dst)[12..16], s3)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decrypt one block from src into dst, using the expanded key xk.
|
// Decrypt one block from src into dst, using the expanded key xk.
|
||||||
fn decrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
fn decrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
||||||
_ = src[15] // early bounds check
|
_ = src[15] // early bounds check
|
||||||
mut s0 := binary.big_endian_u32(src[0..4])
|
mut s0 := binary.big_endian_u32(src[0..4])
|
||||||
mut s1 := binary.big_endian_u32(src.slice(4, 8))
|
mut s1 := binary.big_endian_u32(src[4..8])
|
||||||
mut s2 := binary.big_endian_u32(src.slice(8, 12))
|
mut s2 := binary.big_endian_u32(src[8..12])
|
||||||
mut s3 := binary.big_endian_u32(src.slice(12, 16))
|
mut s3 := binary.big_endian_u32(src[12..16])
|
||||||
// First round just XORs input with key.
|
// First round just XORs input with key.
|
||||||
s0 ^= xk[0]
|
s0 ^= xk[0]
|
||||||
s1 ^= xk[1]
|
s1 ^= xk[1]
|
||||||
|
@ -134,9 +134,9 @@ fn decrypt_block_generic(xk []u32, mut dst []byte, src []byte) {
|
||||||
s3 ^= xk[k + 3]
|
s3 ^= xk[k + 3]
|
||||||
_ = dst[15] // early bounds check
|
_ = dst[15] // early bounds check
|
||||||
binary.big_endian_put_u32(mut (*dst)[..4], s0)
|
binary.big_endian_put_u32(mut (*dst)[..4], s0)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(4, 8), s1)
|
binary.big_endian_put_u32(mut (*dst)[4..8], s1)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(8, 12), s2)
|
binary.big_endian_put_u32(mut (*dst)[8..12], s2)
|
||||||
binary.big_endian_put_u32(mut (*dst).slice(12, 16), s3)
|
binary.big_endian_put_u32(mut (*dst)[12..16], s3)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply s_box0 to each byte in w.
|
// Apply s_box0 to each byte in w.
|
||||||
|
|
|
@ -1270,6 +1270,10 @@ pub fn (mut c Checker) call_method(mut call_expr ast.CallExpr) table.Type {
|
||||||
mut elem_typ := table.void_type
|
mut elem_typ := table.void_type
|
||||||
is_filter_map := method_name in ['filter', 'map']
|
is_filter_map := method_name in ['filter', 'map']
|
||||||
is_sort := method_name == 'sort'
|
is_sort := method_name == 'sort'
|
||||||
|
is_slice := method_name == 'slice'
|
||||||
|
if is_slice && !c.is_builtin_mod {
|
||||||
|
c.error('.slice() is a private method, use `x[start..end]` instead', call_expr.pos)
|
||||||
|
}
|
||||||
if is_filter_map || is_sort {
|
if is_filter_map || is_sort {
|
||||||
array_info := left_type_sym.info as table.Array
|
array_info := left_type_sym.info as table.Array
|
||||||
if is_filter_map {
|
if is_filter_map {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/checker/tests/method_array_slice.vv:5:12: error: .slice() is a private method, use `x[start..end]` instead
|
||||||
|
3 | fn main() {
|
||||||
|
4 | a := os.args.clone()
|
||||||
|
5 | println(a.slice(1))
|
||||||
|
| ~~~~~~~~
|
||||||
|
6 | println(a[1..])
|
||||||
|
7 | }
|
|
@ -0,0 +1,7 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a := os.args.clone()
|
||||||
|
println(a.slice(1))
|
||||||
|
println(a[1..])
|
||||||
|
}
|
Loading…
Reference in New Issue