Browse Source

Fix Odin bug with "none" procedure calling conventions in the runtime

gingerBill 5 years ago
parent
commit
6aa708a455
2 changed files with 15 additions and 13 deletions
  1. 6 6
      core/runtime/internal.odin
  2. 9 7
      src/check_decl.cpp

+ 6 - 6
core/runtime/internal.odin

@@ -2,31 +2,31 @@ package runtime
 
 
 import "core:os"
 import "core:os"
 
 
-bswap_16 :: proc "pure" (x: u16) -> u16 {
+bswap_16 :: proc "none" (x: u16) -> u16 {
 	return x>>8 | x<<8;
 	return x>>8 | x<<8;
 }
 }
 
 
-bswap_32 :: proc "pure" (x: u32) -> u32 {
+bswap_32 :: proc "none" (x: u32) -> u32 {
 	return x>>24 | (x>>8)&0xff00 | (x<<8)&0xff0000 | x<<24;
 	return x>>24 | (x>>8)&0xff00 | (x<<8)&0xff0000 | x<<24;
 }
 }
 
 
-bswap_64 :: proc "pure" (x: u64) -> u64 {
+bswap_64 :: proc "none" (x: u64) -> u64 {
 	return u64(bswap_32(u32(x))) | u64(bswap_32(u32(x>>32)));
 	return u64(bswap_32(u32(x))) | u64(bswap_32(u32(x>>32)));
 }
 }
 
 
-bswap_128 :: proc "pure" (x: u128) -> u128 {
+bswap_128 :: proc "none" (x: u128) -> u128 {
 	return u128(bswap_64(u64(x))) | u128(bswap_64(u64(x>>64)));
 	return u128(bswap_64(u64(x))) | u128(bswap_64(u64(x>>64)));
 }
 }
 
 
 
 
-bswap_f32 :: proc "pure" (f: f32) -> f32 {
+bswap_f32 :: proc "none" (f: f32) -> f32 {
 	x := transmute(u32)f;
 	x := transmute(u32)f;
 	z := x>>24 | (x>>8)&0xff00 | (x<<8)&0xff0000 | x<<24;
 	z := x>>24 | (x>>8)&0xff00 | (x<<8)&0xff0000 | x<<24;
 	return transmute(f32)z;
 	return transmute(f32)z;
 
 
 }
 }
 
 
-bswap_f64 :: proc "pure" (f: f64) -> f64 {
+bswap_f64 :: proc "none" (f: f64) -> f64 {
 	x := transmute(u64)f;
 	x := transmute(u64)f;
 	z := u64(bswap_32(u32(x))) | u64(bswap_32(u32(x>>32)));
 	z := u64(bswap_32(u32(x))) | u64(bswap_32(u32(x>>32)));
 	return transmute(f64)z;
 	return transmute(f64)z;

+ 9 - 7
src/check_decl.cpp

@@ -1197,13 +1197,15 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
 	ctx->curr_proc_sig  = type;
 	ctx->curr_proc_sig  = type;
 	ctx->curr_proc_calling_convention = type->Proc.calling_convention;
 	ctx->curr_proc_calling_convention = type->Proc.calling_convention;
 
 
-	switch (type->Proc.calling_convention) {
-	case ProcCC_None:
-		error(body, "Procedures with the calling convention \"none\" are not allowed a body");
-		break;
-	case ProcCC_PureNone:
-		error(body, "Procedures with the calling convention \"pure_none\" are not allowed a body");
-		break;
+	if (ctx->pkg->name != "runtime") {
+		switch (type->Proc.calling_convention) {
+		case ProcCC_None:
+			error(body, "Procedures with the calling convention \"none\" are not allowed a body");
+			break;
+		case ProcCC_PureNone:
+			error(body, "Procedures with the calling convention \"pure_none\" are not allowed a body");
+			break;
+		}
 	}
 	}
 
 
 	ast_node(bs, BlockStmt, body);
 	ast_node(bs, BlockStmt, body);