From 48857090fce5d13ffef8123fe88525826e1c7df5 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sat, 25 Apr 2020 08:42:23 +0200 Subject: [PATCH] runtime `as` type check: part 2 --- vlib/builtin/array.v | 15 +++++++++++---- vlib/builtin/string.v | 6 +++--- vlib/v/gen/cgen.v | 4 ++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index d29824fe3b..629b63ea8b 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -17,7 +17,7 @@ pub: } // Internal function, used by V (`nums := []int`) -fn new_array(mylen int, cap int, elm_size int) array { +fn __new_array(mylen int, cap int, elm_size int) array { cap_ := if cap == 0 { 1 } else { cap } arr := array{ len: mylen @@ -27,14 +27,21 @@ fn new_array(mylen int, cap int, elm_size int) array { } return arr } +fn new_array(mylen int, cap int, elm_size int) array { + cap_ := if cap == 0 { 1 } else { cap } + arr := array{ + len: mylen + cap: cap_ + element_size: elm_size + data: vcalloc(cap_ * elm_size) + } + return arr -fn __new_array(mylen int, cap int, elm_size int) array { - return new_array(mylen, cap, elm_size) } // TODO pub fn make(len int, cap int, elm_size int) array { - return new_array(len, cap, elm_size) + return __new_array(len, cap, elm_size) } /* diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index 6aa21d6220..23e58eca96 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -966,7 +966,7 @@ pub fn (s string) ustring() ustring { // runes will have at least s.len elements, save reallocations // TODO use VLA for small strings? - runes: new_array(0, s.len, sizeof(int)) + runes: __new_array(0, s.len, sizeof(int)) } for i := 0; i < s.len; i++ { char_len := utf8_char_len(s.str[i]) @@ -984,7 +984,7 @@ __global g_ustring_runes []int pub fn (s string) ustring_tmp() ustring { if g_ustring_runes.len == 0 { - g_ustring_runes = new_array(0, 128, sizeof(int)) + g_ustring_runes = __new_array(0, 128, sizeof(int)) } mut res := ustring{ s: s @@ -1032,7 +1032,7 @@ fn (u ustring) ge(a ustring) bool { pub fn (u ustring) add(a ustring) ustring { mut res := ustring{ s: u.s + a.s - runes: new_array(0, u.s.len + a.s.len, sizeof(int)) + runes: __new_array(0, u.s.len + a.s.len, sizeof(int)) } mut j := 0 for i := 0; i < u.s.len; i++ { diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index db5d274b51..b12b2475cc 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -2913,16 +2913,16 @@ fn (mut g Gen) as_cast(node ast.AsCast) { styp := g.typ(node.typ) expr_type_sym := g.table.get_type_symbol(node.expr_type) if expr_type_sym.kind == .sum_type { + /* g.write('/* as */ *($styp*)') g.expr(node.expr) g.write('.obj') - /* +*/ g.write('/* as */ *($styp*)__as_cast(') g.expr(node.expr) g.write('.obj, ') g.expr(node.expr) g.write('.typ, /*expected:*/$node.typ)') -*/ } }