v.gen.c: fix codegen for `const a = u64(5) + 5`
parent
063ffe36d9
commit
b44f81528f
|
@ -31,7 +31,7 @@ const (
|
|||
|
||||
// This implementation is the quickest with gcc -O2
|
||||
// str_l returns the string representation of the integer nn with max chars.
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
fn (nn int) str_l(max int) string {
|
||||
unsafe {
|
||||
mut n := i64(nn)
|
||||
|
@ -39,7 +39,7 @@ fn (nn int) str_l(max int) string {
|
|||
if n == 0 {
|
||||
return '0'
|
||||
}
|
||||
|
||||
|
||||
mut is_neg := false
|
||||
if n < 0 {
|
||||
n = -n
|
||||
|
@ -84,7 +84,7 @@ fn (nn int) str_l(max int) string {
|
|||
*/
|
||||
return tos(buf, diff)
|
||||
|
||||
//return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
// return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ pub fn (n int) str() string {
|
|||
|
||||
// str returns the value of the `u32` as a `string`.
|
||||
// Example: assert u32(20000).str() == '20000'
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
pub fn (nn u32) str() string {
|
||||
unsafe {
|
||||
mut n := nn
|
||||
|
@ -146,7 +146,7 @@ pub fn (nn u32) str() string {
|
|||
C.memmove(buf, buf + index, diff + 1)
|
||||
return tos(buf, diff)
|
||||
|
||||
//return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
// return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,7 +158,7 @@ pub fn (n int_literal) str() string {
|
|||
|
||||
// str returns the value of the `i64` as a `string`.
|
||||
// Example: assert i64(-200000).str() == '-200000'
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
pub fn (nn i64) str() string {
|
||||
unsafe {
|
||||
mut n := nn
|
||||
|
@ -199,13 +199,13 @@ pub fn (nn i64) str() string {
|
|||
diff := max - index
|
||||
C.memmove(buf, buf + index, diff + 1)
|
||||
return tos(buf, diff)
|
||||
//return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
// return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
}
|
||||
}
|
||||
|
||||
// str returns the value of the `u64` as a `string`.
|
||||
// Example: assert u64(2000000).str() == '2000000'
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
pub fn (nn u64) str() string {
|
||||
unsafe {
|
||||
mut n := nn
|
||||
|
@ -236,7 +236,7 @@ pub fn (nn u64) str() string {
|
|||
diff := max - index
|
||||
C.memmove(buf, buf + index, diff + 1)
|
||||
return tos(buf, diff)
|
||||
//return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
// return tos(memdup(&buf[0] + index, (max - index)), (max - index))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -254,7 +254,7 @@ pub fn (b bool) str() string {
|
|||
//
|
||||
|
||||
// u64_to_hex converts the number `nn` to a (zero padded if necessary) hexadecimal `string`.
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
fn u64_to_hex(nn u64, len byte) string {
|
||||
mut n := nn
|
||||
mut buf := [256]byte{}
|
||||
|
@ -270,7 +270,7 @@ fn u64_to_hex(nn u64, len byte) string {
|
|||
}
|
||||
|
||||
// u64_to_hex_no_leading_zeros converts the number `nn` to hexadecimal `string`.
|
||||
[inline] [direct_array_access]
|
||||
[direct_array_access; inline]
|
||||
fn u64_to_hex_no_leading_zeros(nn u64, len byte) string {
|
||||
mut n := nn
|
||||
mut buf := [256]byte{}
|
||||
|
@ -391,19 +391,47 @@ pub fn (nn voidptr) str() string {
|
|||
|
||||
// hex returns the value of the `byteptr` as a hexadecimal `string`.
|
||||
// Note that the output is ***not*** zero padded.
|
||||
//pub fn (nn byteptr) str() string {
|
||||
// pub fn (nn byteptr) str() string {
|
||||
pub fn (nn byteptr) str() string {
|
||||
return u64(nn).hex()
|
||||
}
|
||||
|
||||
/*
|
||||
pub fn (nn byte) hex_full() string { return u64_to_hex(nn, 2) }
|
||||
pub fn (nn i8) hex_full() string { return u64_to_hex(byte(nn), 2) }
|
||||
pub fn (nn u16) hex_full() string { return u64_to_hex(nn, 4) }
|
||||
pub fn (nn i16) hex_full() string { return u64_to_hex(u16(nn), 4) }
|
||||
pub fn (nn u32) hex_full() string { return u64_to_hex(nn, 8) }
|
||||
pub fn (nn int) hex_full() string { return u64_to_hex(u32(nn), 8) }
|
||||
*/
|
||||
pub fn (nn byte) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 2)
|
||||
}
|
||||
|
||||
pub fn (nn i8) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 2)
|
||||
}
|
||||
|
||||
pub fn (nn u16) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 4)
|
||||
}
|
||||
|
||||
pub fn (nn i16) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 4)
|
||||
}
|
||||
|
||||
pub fn (nn u32) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 8)
|
||||
}
|
||||
|
||||
pub fn (nn int) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 8)
|
||||
}
|
||||
|
||||
pub fn (nn i64) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 16)
|
||||
}
|
||||
|
||||
pub fn (nn voidptr) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 16)
|
||||
}
|
||||
|
||||
pub fn (nn int_literal) hex_full() string {
|
||||
return u64_to_hex(u64(nn), 16)
|
||||
}
|
||||
|
||||
// hex_full returns the value of the `u64` as a *full* 16-digit hexadecimal `string`.
|
||||
// Example: assert u64(2).hex_full() == '0000000000000002'
|
||||
// Example: assert u64(255).hex_full() == '00000000000000ff'
|
||||
|
@ -411,12 +439,6 @@ pub fn (nn u64) hex_full() string {
|
|||
return u64_to_hex(nn, 16)
|
||||
}
|
||||
|
||||
/*
|
||||
pub fn (nn i64) hex_full() string { return u64_to_hex(u64(nn), 16) }
|
||||
pub fn (nn int_literal) hex_full() string { return u64_to_hex(nn, 16) }
|
||||
pub fn (nn voidptr) hex_full() string { return u64_to_hex(nn, 16) }
|
||||
pub fn (nn byteptr) hex_full() string { return u64_to_hex(nn, 16) }
|
||||
*/
|
||||
// str returns the contents of `byte` as a zero terminated `string`.
|
||||
// Example: assert byte(111).str() == '111'
|
||||
pub fn (b byte) str() string {
|
||||
|
|
|
@ -5000,6 +5000,9 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) {
|
|||
fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.ComptTimeConstValue, typ ast.Type) bool {
|
||||
mut styp := g.typ(typ)
|
||||
cname := '_const_$name'
|
||||
$if trace_const_precomputed ? {
|
||||
eprintln('> styp: $styp | cname: $cname | ct_value: $ct_value | $ct_value.type_name()')
|
||||
}
|
||||
match ct_value {
|
||||
byte {
|
||||
g.const_decl_write_precomputed(styp, cname, ct_value.str())
|
||||
|
@ -5026,7 +5029,11 @@ fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.Comp
|
|||
g.const_decl_simple_define(name, ct_value.str())
|
||||
return true
|
||||
}
|
||||
g.const_decl_write_precomputed(styp, cname, ct_value.str())
|
||||
if typ == ast.u64_type {
|
||||
g.const_decl_write_precomputed(styp, cname, ct_value.str() + 'U')
|
||||
} else {
|
||||
g.const_decl_write_precomputed(styp, cname, ct_value.str())
|
||||
}
|
||||
}
|
||||
u64 {
|
||||
g.const_decl_write_precomputed(styp, cname, ct_value.str() + 'U')
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
const zzz_byte_a = byte(`A`)
|
||||
|
||||
const zzz_u16_a = u16(999) + 5
|
||||
|
||||
const zzza = u64(123)
|
||||
|
||||
const zzzb = 5 + zzzc
|
||||
|
||||
const zzzc = 6 + zzza
|
||||
|
||||
const zzzx = zzza - 124
|
||||
|
||||
const zzz_zz = i64(-1)
|
||||
|
||||
struct Abc {
|
||||
x int
|
||||
}
|
||||
|
||||
const zzz_struct = Abc{123}
|
||||
|
||||
const zzzs = 'xyz' + 'abc'
|
||||
|
||||
fn test_number_consts() {
|
||||
assert zzz_byte_a.hex_full() == '41'
|
||||
assert zzz_u16_a.hex_full() == '03ec'
|
||||
assert zzza.hex_full() == '000000000000007b'
|
||||
assert zzzb.hex_full() == '0000000000000086'
|
||||
assert zzzc.hex_full() == '0000000000000081'
|
||||
// assert zzzx.hex_full() == '00000000ffffffff' // TODO: see why
|
||||
assert zzz_zz.hex_full() == 'ffffffffffffffff'
|
||||
}
|
||||
|
||||
fn test_struct_consts() {
|
||||
assert zzz_struct.str().contains('x: 123')
|
||||
}
|
||||
|
||||
fn test_string_consts() {
|
||||
assert zzzs == 'xyzabc'
|
||||
}
|
Loading…
Reference in New Issue