From 57b148032f777e79dac10468de9b826148ecd841 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 24 Aug 2021 14:26:49 +0200 Subject: [PATCH] v.gen.native: initial support for cast statements (#11291) --- vlib/v/gen/native/amd64.v | 14 ++++++++++++++ vlib/v/gen/native/gen.v | 26 ++++++++++++++++++++++++-- vlib/v/gen/native/tests/general.vv | 8 ++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/vlib/v/gen/native/amd64.v b/vlib/v/gen/native/amd64.v index 6ff7a5f3e0..dbfab0564c 100644 --- a/vlib/v/gen/native/amd64.v +++ b/vlib/v/gen/native/amd64.v @@ -983,6 +983,20 @@ fn (mut g Gen) assign_stmt(node ast.AssignStmt) { ast.GoExpr { g.v_error('threads not implemented for the native backend', node.pos) } + ast.CastExpr { + g.warning('cast expressions are work in progress', right.pos) + match right.typname { + 'u64' { + g.allocate_var(name, 8, right.expr.str().int()) + } + 'int' { + g.allocate_var(name, 4, right.expr.str().int()) + } + else { + g.v_error('unsupported cast type $right.typ', node.pos) + } + } + } else { // dump(node) g.v_error('unhandled assign_stmt expression: $right.type_name()', right.position()) diff --git a/vlib/v/gen/native/gen.v b/vlib/v/gen/native/gen.v index b2bf0ee08f..1bf19fd667 100644 --- a/vlib/v/gen/native/gen.v +++ b/vlib/v/gen/native/gen.v @@ -84,7 +84,7 @@ pub fn gen(files []&ast.File, table &ast.Table, out_name string, pref &pref.Pref g.generate_header() for file in files { if file.warnings.len > 0 { - eprintln('Warning: ${file.warnings[0]}') + eprintln('warning: ${file.warnings[0]}') } if file.errors.len > 0 { g.n_error(file.errors[0].str()) @@ -358,13 +358,21 @@ fn (mut g Gen) stmt(node ast.Stmt) { // TODO // verror('expr') } + ast.CastExpr { + g.mov64(.rax, e0.expr.str().int()) + // do the job + } ast.StringLiteral { s = e0.val.str() g.expr(node.exprs[0]) g.mov64(.rax, g.allocate_string(s, 2)) } + ast.Ident { + g.expr(e0) + eprintln('ident $e0.name') + } else { - g.n_error('unknown return type $e0') + g.n_error('unknown return type $e0.type_name()') } } // intel specific @@ -450,6 +458,20 @@ pub fn (mut g Gen) n_error(s string) { util.verror('native error', s) } +pub fn (mut g Gen) warning(s string, pos token.Position) { + if g.pref.output_mode == .stdout { + werror := util.formatted_error('warning', s, g.pref.path, pos) + eprintln(werror) + } else { + g.warnings << errors.Warning{ + file_path: g.pref.path + pos: pos + reporter: .gen + message: s + } + } +} + pub fn (mut g Gen) v_error(s string, pos token.Position) { // TODO: store a file index in the Position too, // so that the file path can be retrieved from the pos, instead diff --git a/vlib/v/gen/native/tests/general.vv b/vlib/v/gen/native/tests/general.vv index 155a039509..7e19273d6f 100644 --- a/vlib/v/gen/native/tests/general.vv +++ b/vlib/v/gen/native/tests/general.vv @@ -1,3 +1,10 @@ +fn cast_test() { + a := int(1) + assert a == 1 + b := u64(2) + assert b == 2 +} + fn if_test() { mut a := 1 if a == 1 { @@ -81,6 +88,7 @@ struct User { fn main() { if_test() + cast_test() loop() args() // expr()