Default result values for procedure types; Named result values in return statements

This commit is contained in:
Ginger Bill
2017-06-22 01:14:45 +01:00
parent 9faf0020cc
commit 8197c02dcf
10 changed files with 484 additions and 194 deletions
+25 -35
View File
@@ -121,9 +121,8 @@ var (
)
proc type_info_base(info: ^TypeInfo) -> ^TypeInfo {
if info == nil {
return nil;
}
if info == nil -> return nil;
var base = info;
match i in base {
case TypeInfo.Named:
@@ -134,9 +133,8 @@ proc type_info_base(info: ^TypeInfo) -> ^TypeInfo {
proc type_info_base_without_enum(info: ^TypeInfo) -> ^TypeInfo {
if info == nil {
return nil;
}
if info == nil -> return nil;
var base = info;
match i in base {
case TypeInfo.Named:
@@ -202,16 +200,20 @@ proc make_source_code_location(file: string, line, column: i64, procedure: strin
const DEFAULT_ALIGNMENT = align_of([vector 4]f32);
proc __init_context_from_ptr(c: ^Context, other: ^Context) #cc_contextless {
if c == nil {
return;
}
if c == nil -> return;
c^ = other^;
if c.allocator.procedure == nil {
c.allocator = default_allocator();
}
if c.thread_id == 0 {
c.thread_id = os.current_thread_id();
}
}
proc __init_context(c: ^Context) #cc_contextless {
if c == nil {
return;
}
if c == nil -> return;
if c.allocator.procedure == nil {
c.allocator = default_allocator();
}
@@ -497,9 +499,7 @@ proc __dynamic_array_make(array_: rawptr, elem_size, elem_align: int, len, cap:
proc __dynamic_array_reserve(array_: rawptr, elem_size, elem_align: int, cap: int) -> bool {
var array = ^raw.DynamicArray(array_);
if cap <= array.cap {
return true;
}
if cap <= array.cap -> return true;
// __check_context();
if array.allocator.procedure == nil {
@@ -512,9 +512,7 @@ proc __dynamic_array_reserve(array_: rawptr, elem_size, elem_align: int, cap: in
var allocator = array.allocator;
var new_data = allocator.procedure(allocator.data, AllocatorMode.Resize, new_size, elem_align, array.data, old_size, 0);
if new_data == nil {
return false;
}
if new_data == nil -> return false;
array.data = new_data;
array.cap = cap;
@@ -525,9 +523,7 @@ proc __dynamic_array_resize(array_: rawptr, elem_size, elem_align: int, len: int
var array = ^raw.DynamicArray(array_);
var ok = __dynamic_array_reserve(array_, elem_size, elem_align, len);
if ok {
array.len = len;
}
if ok -> array.len = len;
return ok;
}
@@ -546,10 +542,9 @@ proc __dynamic_array_append(array_: rawptr, elem_size, elem_align: int,
var cap = 2 * array.cap + max(8, item_count);
ok = __dynamic_array_reserve(array, elem_size, elem_align, cap);
}
if !ok {
// TODO(bill): Better error handling for failed reservation
return array.len;
}
// TODO(bill): Better error handling for failed reservation
if !ok -> return array.len;
var data = ^u8(array.data);
assert(data != nil);
__mem_copy(data + (elem_size*array.len), items, elem_size * item_count);
@@ -565,10 +560,9 @@ proc __dynamic_array_append_nothing(array_: rawptr, elem_size, elem_align: int)
var cap = 2 * array.cap + max(8, 1);
ok = __dynamic_array_reserve(array, elem_size, elem_align, cap);
}
if !ok {
// TODO(bill): Better error handling for failed reservation
return array.len;
}
// TODO(bill): Better error handling for failed reservation
if !ok -> return array.len;
var data = ^u8(array.data);
assert(data != nil);
__mem_zero(data + (elem_size*array.len), elem_size);
@@ -658,9 +652,7 @@ proc __dynamic_map_rehash(using header: __MapHeader, new_count: int) {
__dynamic_array_resize(nm_hashes, size_of(int), align_of(int), new_count);
__dynamic_array_reserve(&nm.entries, entry_size, entry_align, m.entries.len);
for i in 0..<new_count {
nm.hashes[i] = -1;
}
for i in 0..<new_count -> nm.hashes[i] = -1;
for var i = 0; i < m.entries.len; i++ {
if len(nm.hashes) == 0 {
@@ -750,9 +742,7 @@ proc __dynamic_map_full(using h: __MapHeader) -> bool {
proc __dynamic_map_hash_equal(h: __MapHeader, a, b: __MapKey) -> bool {
if a.hash == b.hash {
if h.is_key_string {
return a.str == b.str;
}
if h.is_key_string -> return a.str == b.str;
return true;
}
return false;
+2 -6
View File
@@ -11,9 +11,7 @@ type Decimal struct {
proc decimal_to_string(buf: []u8, a: ^Decimal) -> string {
proc digit_zero(buf: []u8) -> int {
for _, i in buf {
buf[i] = '0';
}
for _, i in buf -> buf[i] = '0';
return len(buf);
}
@@ -198,9 +196,7 @@ proc shift(a: ^Decimal, k: int) {
proc can_round_up(a: ^Decimal, nd: int) -> bool {
if nd < 0 || nd >= a.count { return false ; }
if a.digits[nd] == '5' && nd+1 == a.count {
if a.trunc {
return true;
}
if a.trunc -> return true;
return nd > 0 && (a.digits[nd-1]-'0')%2 != 0;
}
+44 -88
View File
@@ -189,9 +189,7 @@ proc fprint_type(fd: os.Handle, info: ^TypeInfo) {
}
proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
if ti == nil {
return;
}
if ti == nil -> return;
using TypeInfo;
match info in ti {
@@ -242,7 +240,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
var t = info.params.(^Tuple);
write_string(buf, "(");
for t, i in t.types {
if i > 0 { write_string(buf, ", "); }
if i > 0 -> write_string(buf, ", ");
write_type(buf, t);
}
write_string(buf, ")");
@@ -253,9 +251,9 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
}
case Tuple:
var count = len(info.names);
if count != 1 { write_string(buf, "("); }
if count != 1 -> write_string(buf, "(");
for name, i in info.names {
if i > 0 { write_string(buf, ", "); }
if i > 0 -> write_string(buf, ", ");
var t = info.types[i];
@@ -265,7 +263,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
}
write_type(buf, t);
}
if count != 1 { write_string(buf, ")"); }
if count != 1 -> write_string(buf, ")");
case Array:
write_string(buf, "[");
@@ -293,8 +291,8 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
case Struct:
write_string(buf, "struct ");
if info.packed { write_string(buf, "#packed "); }
if info.ordered { write_string(buf, "#ordered "); }
if info.packed -> write_string(buf, "#packed ");
if info.ordered -> write_string(buf, "#ordered ");
if info.custom_align {
write_string(buf, "#align ");
write_int(buf, i64(info.align), 10);
@@ -302,9 +300,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
}
write_byte(buf, '{');
for name, i in info.names {
if i > 0 {
write_string(buf, ", ");
}
if i > 0 -> write_string(buf, ", ");
write_string(buf, name);
write_string(buf, ": ");
write_type(buf, info.types[i]);
@@ -316,18 +312,14 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
var cf = info.common_fields;
var total_count = 0;
for name, i in cf.names {
if i > 0 {
write_string(buf, ", ");
}
if i > 0 -> write_string(buf, ", ");
write_string(buf, name);
write_string(buf, ": ");
write_type(buf, cf.types[i]);
total_count++;
}
for name, i in info.variant_names {
if total_count > 0 || i > 0 {
write_string(buf, ", ");
}
if total_count > 0 || i > 0 -> write_string(buf, ", ");
write_string(buf, name);
write_byte(buf, '{');
defer write_byte(buf, '}');
@@ -337,9 +329,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
var vc = len(variant.names)-len(cf.names);
for j in 0..vc {
if j > 0 {
write_string(buf, ", ");
}
if j > 0 -> write_string(buf, ", ");
var index = j + len(cf.names);
write_string(buf, variant.names[index]);
write_string(buf, ": ");
@@ -351,9 +341,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
case RawUnion:
write_string(buf, "raw_union {");
for name, i in info.names {
if i > 0 {
write_string(buf, ", ");
}
if i > 0 -> write_string(buf, ", ");
write_string(buf, name);
write_string(buf, ": ");
write_type(buf, info.types[i]);
@@ -365,9 +353,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
write_type(buf, info.base);
write_string(buf, " {");
for name, i in info.names {
if i > 0 {
write_string(buf, ", ");
}
if i > 0 -> write_string(buf, ", ");
write_string(buf, name);
}
write_string(buf, "}");
@@ -380,9 +366,7 @@ proc write_type(buf: ^StringBuffer, ti: ^TypeInfo) {
}
write_string(buf, " {");
for name, i in info.names {
if i > 0 {
write_string(buf, ", ");
}
if i > 0 -> write_string(buf, ", ");
write_string(buf, name);
write_string(buf, ": ");
write_int(buf, i64(info.bits[i]), 10);
@@ -404,9 +388,7 @@ proc _parse_int(s: string, offset: int) -> (result: int, offset: int, ok: bool)
var i = 0;
for i < len(s[offset..]) {
var c = rune(s[offset+i]);
if !is_digit(c) {
break;
}
if !is_digit(c) -> break;
i++;
result *= 10;
@@ -500,19 +482,13 @@ proc fmt_bool(using fi: ^FmtInfo, b: bool, verb: rune) {
proc fmt_write_padding(fi: ^FmtInfo, width: int) {
if width <= 0 {
return;
}
var pad_byte: u8 = '0';
if fi.space {
pad_byte = ' ';
}
if width <= 0 -> return;
var pad_byte: u8 = fi.space ? ' ' : '0';
var data = string_buffer_data(fi.buf^);
var count = min(width, cap(data)-len(data));
for _ in 0..<count {
write_byte(fi.buf, pad_byte);
}
for _ in 0..<count -> write_byte(fi.buf, pad_byte);
}
proc _fmt_int(fi: ^FmtInfo, u: u128, base: int, is_signed: bool, bit_size: int, digits: string) {
@@ -557,9 +533,9 @@ proc _fmt_int(fi: ^FmtInfo, u: u128, base: int, is_signed: bool, bit_size: int,
var flags: strconv.IntFlag;
if fi.hash && !fi.zero { flags |= strconv.IntFlag.Prefix; }
if fi.plus { flags |= strconv.IntFlag.Plus; }
if fi.space { flags |= strconv.IntFlag.Space; }
if fi.hash && !fi.zero -> flags |= strconv.IntFlag.Prefix;
if fi.plus -> flags |= strconv.IntFlag.Plus;
if fi.space -> flags |= strconv.IntFlag.Space;
var s = strconv.append_bits(buf[start..<start], u128(u), base, is_signed, bit_size, digits, flags);
if fi.hash && fi.zero {
@@ -642,11 +618,8 @@ proc fmt_float(fi: ^FmtInfo, v: f64, bit_size: int, verb: rune) {
// case 'f', 'F', 'v':
case 'f', 'F', 'v':
var prec: int = 3;
var prec: int = fi.prec_set ? fi.prec : 3;
var buf: [386]u8;
if fi.prec_set {
prec = fi.prec;
}
var str = strconv.append_float(buf[1..<1], v, 'f', prec, bit_size);
str = string(buf[0..len(str)]);
@@ -692,9 +665,7 @@ proc fmt_string(fi: ^FmtInfo, s: string, verb: rune) {
defer fi.space = space;
for i in 0..<len(s) {
if i > 0 && space {
write_byte(fi.buf, ' ');
}
if i > 0 && space -> write_byte(fi.buf, ' ');
_fmt_int(fi, u128(s[i]), 16, false, 8, verb == 'x' ? __DIGITS_LOWER : __DIGITS_UPPER);
}
@@ -810,9 +781,7 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
write_string(fi.buf, info.name);
write_byte(fi.buf, '{');
for _, i in b.names {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
write_string(fi.buf, b.names[i]);
write_string(fi.buf, " = ");
@@ -846,9 +815,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
write_byte(fi.buf, '[');
defer write_byte(fi.buf, ']');
for i in 0..<info.count {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
var data = ^u8(v.data) + i*info.elem_size;
fmt_arg(fi, any{rawptr(data), info.elem}, verb);
}
@@ -858,9 +826,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
defer write_byte(fi.buf, ']');
var array = ^raw.DynamicArray(v.data);
for i in 0..<array.len {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
var data = ^u8(array.data) + i*info.elem_size;
fmt_arg(fi, any{rawptr(data), info.elem}, verb);
}
@@ -870,9 +837,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
defer write_byte(fi.buf, ']');
var slice = ^[]u8(v.data);
for _, i in slice {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
var data = &slice[0] + i*info.elem_size;
fmt_arg(fi, any{rawptr(data), info.elem}, verb);
}
@@ -882,9 +848,7 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
defer write_byte(fi.buf, '>');
for i in 0..<info.count {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
var data = ^u8(v.data) + i*info.elem_size;
fmt_value(fi, any{rawptr(data), info.elem}, verb);
@@ -906,9 +870,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
entry_size = ed.elem_size;
)
for i in 0..<entries.len {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
var data = ^u8(entries.data) + i*entry_size;
var header = ^__MapEntryHeader(data);
@@ -932,9 +895,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
defer write_byte(fi.buf, '}');
for _, i in info.names {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
write_string(fi.buf, info.names[i]);
write_string(fi.buf, " = ");
var data = ^u8(v.data) + info.offsets[i];
@@ -947,9 +909,8 @@ proc fmt_value(fi: ^FmtInfo, v: any, verb: rune) {
var cf = info.common_fields;
for _, i in cf.names {
if i > 0 {
write_string(fi.buf, ", ");
}
if i > 0 -> write_string(fi.buf, ", ");
write_string(fi.buf, cf.names[i]);
write_string(fi.buf, " = ");
var data = ^u8(v.data) + cf.offsets[i];
@@ -1071,9 +1032,8 @@ proc sbprintln(buf: ^StringBuffer, args: ..any) -> string {
fi.buf = buf;
for arg, i in args {
if i > 0 {
write_byte(buf, ' ');
}
if i > 0 -> write_byte(buf, ' ');
fmt_value(&fi, args[i], 'v');
}
write_byte(buf, '\n');
@@ -1200,14 +1160,10 @@ proc sbprintf(b: ^StringBuffer, fmt: string, args: ..any) -> string {
if !fi.reordered && arg_index < len(args) {
write_string(b, "%!(EXTRA ");
for arg, index in args[arg_index..] {
if index > 0 {
write_string(b, ", ");
}
if arg == nil {
write_string(b, "<nil>");
} else {
fmt_arg(&fi, args[index], 'v');
}
if index > 0 -> write_string(b, ", ");
if arg == nil -> write_string(b, "<nil>");
else -> fmt_arg(&fi, args[index], 'v');
}
write_string(b, ")");
}