v.gen.native: initial support for cast statements (#11291)
parent
833bf2cf15
commit
57b148032f
|
@ -983,6 +983,20 @@ fn (mut g Gen) assign_stmt(node ast.AssignStmt) {
|
||||||
ast.GoExpr {
|
ast.GoExpr {
|
||||||
g.v_error('threads not implemented for the native backend', node.pos)
|
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 {
|
else {
|
||||||
// dump(node)
|
// dump(node)
|
||||||
g.v_error('unhandled assign_stmt expression: $right.type_name()', right.position())
|
g.v_error('unhandled assign_stmt expression: $right.type_name()', right.position())
|
||||||
|
|
|
@ -84,7 +84,7 @@ pub fn gen(files []&ast.File, table &ast.Table, out_name string, pref &pref.Pref
|
||||||
g.generate_header()
|
g.generate_header()
|
||||||
for file in files {
|
for file in files {
|
||||||
if file.warnings.len > 0 {
|
if file.warnings.len > 0 {
|
||||||
eprintln('Warning: ${file.warnings[0]}')
|
eprintln('warning: ${file.warnings[0]}')
|
||||||
}
|
}
|
||||||
if file.errors.len > 0 {
|
if file.errors.len > 0 {
|
||||||
g.n_error(file.errors[0].str())
|
g.n_error(file.errors[0].str())
|
||||||
|
@ -358,13 +358,21 @@ fn (mut g Gen) stmt(node ast.Stmt) {
|
||||||
// TODO
|
// TODO
|
||||||
// verror('expr')
|
// verror('expr')
|
||||||
}
|
}
|
||||||
|
ast.CastExpr {
|
||||||
|
g.mov64(.rax, e0.expr.str().int())
|
||||||
|
// do the job
|
||||||
|
}
|
||||||
ast.StringLiteral {
|
ast.StringLiteral {
|
||||||
s = e0.val.str()
|
s = e0.val.str()
|
||||||
g.expr(node.exprs[0])
|
g.expr(node.exprs[0])
|
||||||
g.mov64(.rax, g.allocate_string(s, 2))
|
g.mov64(.rax, g.allocate_string(s, 2))
|
||||||
}
|
}
|
||||||
|
ast.Ident {
|
||||||
|
g.expr(e0)
|
||||||
|
eprintln('ident $e0.name')
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
g.n_error('unknown return type $e0')
|
g.n_error('unknown return type $e0.type_name()')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// intel specific
|
// intel specific
|
||||||
|
@ -450,6 +458,20 @@ pub fn (mut g Gen) n_error(s string) {
|
||||||
util.verror('native error', s)
|
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) {
|
pub fn (mut g Gen) v_error(s string, pos token.Position) {
|
||||||
// TODO: store a file index in the Position too,
|
// TODO: store a file index in the Position too,
|
||||||
// so that the file path can be retrieved from the pos, instead
|
// so that the file path can be retrieved from the pos, instead
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
fn cast_test() {
|
||||||
|
a := int(1)
|
||||||
|
assert a == 1
|
||||||
|
b := u64(2)
|
||||||
|
assert b == 2
|
||||||
|
}
|
||||||
|
|
||||||
fn if_test() {
|
fn if_test() {
|
||||||
mut a := 1
|
mut a := 1
|
||||||
if a == 1 {
|
if a == 1 {
|
||||||
|
@ -81,6 +88,7 @@ struct User {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if_test()
|
if_test()
|
||||||
|
cast_test()
|
||||||
loop()
|
loop()
|
||||||
args()
|
args()
|
||||||
// expr()
|
// expr()
|
||||||
|
|
Loading…
Reference in New Issue