cgen: minor fixes

pull/4061/head
Alexander Medvednikov 2020-03-18 16:47:37 +01:00
parent c514f0b672
commit fe6707b26d
4 changed files with 8 additions and 7 deletions

View File

@ -338,7 +338,7 @@ pub fn (a array) reverse() array {
data: vcalloc(a.cap * a.element_size) data: vcalloc(a.cap * a.element_size)
} }
for i in 0..a.len { for i in 0..a.len {
C.memcpy(arr.data + i * arr.element_size, &a[a.len - 1 - i], arr.element_size) C.memcpy(arr.data + i * arr.element_size, &a.data[a.len - 1 - i], arr.element_size)
} }
return arr return arr
} }
@ -412,7 +412,7 @@ pub fn (b []byte) hex() string {
mut hex := malloc(b.len * 2 + 1) mut hex := malloc(b.len * 2 + 1)
mut dst_i := 0 mut dst_i := 0
for i in b { for i in b {
n0 := i >> 4 n0 := i >> 4
hex[dst_i++] = if n0 < 10 { n0 + `0` } else { n0 + 87 } hex[dst_i++] = if n0 < 10 { n0 + `0` } else { n0 + 87 }
n1 := i & 0xF n1 := i & 0xF
hex[dst_i++] = if n1 < 10 { n1 + `0` } else { n1 + 87 } hex[dst_i++] = if n1 < 10 { n1 + `0` } else { n1 + 87 }

View File

@ -392,10 +392,10 @@ fn (s string) add(a string) string {
str: malloc(new_len + 1) str: malloc(new_len + 1)
} }
for j in 0..s.len { for j in 0..s.len {
res[j] = s[j] res.str[j] = s.str[j]
} }
for j in 0..a.len { for j in 0..a.len {
res[s.len + j] = a[j] res.str[s.len + j] = a.str[j]
} }
res.str[new_len] = `\0` // V strings are not null terminated, but just in case res.str[new_len] = `\0` // V strings are not null terminated, but just in case
return res return res

View File

@ -883,7 +883,7 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type {
} }
pub fn (c mut Checker) if_expr(node mut ast.IfExpr) table.Type { pub fn (c mut Checker) if_expr(node mut ast.IfExpr) table.Type {
if c.expected_type != 0 { if c.expected_type != table.void_type {
// sym := c.table.get_type_symbol(c.expected_type) // sym := c.table.get_type_symbol(c.expected_type)
// println('$c.file.path $node.pos.line_nr IF: checker exp type = ' + sym.name) // println('$c.file.path $node.pos.line_nr IF: checker exp type = ' + sym.name)
node.is_expr = true node.is_expr = true

View File

@ -1089,7 +1089,7 @@ fn (g mut Gen) ident(node ast.Ident) {
// TODO `is` // TODO `is`
match node.info { match node.info {
ast.IdentVar { ast.IdentVar {
if it.is_optional { if it.is_optional && !g.is_assign_expr {
g.write('/*opt*/') g.write('/*opt*/')
styp := g.typ(it.typ)[7..] // Option_int => int TODO perf? styp := g.typ(it.typ)[7..] // Option_int => int TODO perf?
g.write('(*($styp*)${name}.data)') g.write('(*($styp*)${name}.data)')
@ -1103,6 +1103,7 @@ fn (g mut Gen) ident(node ast.Ident) {
} }
fn (g mut Gen) if_expr(node ast.IfExpr) { fn (g mut Gen) if_expr(node ast.IfExpr) {
// g.writeln('/* if is_expr=$node.is_expr */')
// If expression? Assign the value to a temp var. // If expression? Assign the value to a temp var.
// Previously ?: was used, but it's too unreliable. // Previously ?: was used, but it's too unreliable.
type_sym := g.table.get_type_symbol(node.typ) type_sym := g.table.get_type_symbol(node.typ)
@ -1240,7 +1241,7 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
g.write('))') g.write('))')
} }
} }
else if sym.kind == .string { else if sym.kind == .string && !table.type_is_ptr(node.container_type) {
g.write('string_at(') g.write('string_at(')
g.expr(node.left) g.expr(node.left)
g.write(', ') g.write(', ')