Selaa lähdekoodia

Fix procedure calls from non-regular addressing modes

Ginger Bill 8 vuotta sitten
vanhempi
commit
813a028ed0
2 muutettua tiedostoa jossa 10 lisäystä ja 2 poistoa
  1. 6 0
      core/os_windows.odin
  2. 4 2
      src/check_expr.c

+ 6 - 0
core/os_windows.odin

@@ -110,6 +110,9 @@ close :: proc(fd: Handle) {
 }
 
 write :: proc(fd: Handle, data: []byte) -> (int, Errno) {
+	if len(data) == 0 {
+		return 0, ERROR_NONE;
+	}
 	bytes_written: i32;
 	e := win32.WriteFile(cast(win32.Handle)fd, ^data[0], cast(i32)len(data), ^bytes_written, nil);
 	if e == win32.FALSE {
@@ -120,6 +123,9 @@ write :: proc(fd: Handle, data: []byte) -> (int, Errno) {
 }
 
 read :: proc(fd: Handle, data: []byte) -> (int, Errno) {
+	if len(data) == 0 {
+		return 0, ERROR_NONE;
+	}
 	bytes_read: i32;
 	e := win32.ReadFile(cast(win32.Handle)fd, ^data[0], cast(u32)len(data), ^bytes_read, nil);
 	if e == win32.FALSE {

+ 4 - 2
src/check_expr.c

@@ -4764,11 +4764,13 @@ ExprKind check_call_expr(Checker *c, Operand *operand, AstNode *call) {
 	Type *proc_type = base_type(operand->type);
 	if (operand->mode != Addressing_Overload) {
 		bool valid_type = (proc_type != NULL) && is_type_proc(proc_type);
-		bool valid_mode = (operand->mode == Addressing_Value) || (operand->mode == Addressing_Variable);
+		bool valid_mode = is_operand_value(*operand);
 		if (!valid_type || !valid_mode) {
 			AstNode *e = operand->expr;
 			gbString str = expr_to_string(e);
-			error_node(e, "Cannot call a non-procedure: `%s` %d", str, operand->mode);
+			gbString type_str = type_to_string(operand->type);
+			error_node(e, "Cannot call a non-procedure: `%s` of type `%s`", str, type_str);
+			gb_string_free(type_str);
 			gb_string_free(str);
 
 			operand->mode = Addressing_Invalid;