aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-02 19:53:09 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-02 19:53:09 -0400
commit337aa911a9027602d47cd56ddbfcde0230a48943 (patch)
treedaf93f7d7972a672ee6a815702c05ce05913fb8b
parent6d7a359f8f7757b1e23fa7c0feaf535541dcc84a (diff)
Auto promote to C String from Text
-rw-r--r--compile.c6
-rw-r--r--environment.c2
-rw-r--r--types.c4
3 files changed, 11 insertions, 1 deletions
diff --git a/compile.c b/compile.c
index 82963066..35c5f8f9 100644
--- a/compile.c
+++ b/compile.c
@@ -48,6 +48,12 @@ static bool promote(env_t *env, CORD *code, type_t *actual, type_t *needed)
if (actual->tag == IntType || actual->tag == NumType)
return true;
+ // Text to C String
+ if (actual->tag == TextType && !Match(actual, TextType)->lang && needed->tag == CStringType) {
+ *code = CORD_all("Text$as_c_string(", *code, ")");
+ return true;
+ }
+
// Automatic dereferencing:
if (actual->tag == PointerType && !Match(actual, PointerType)->is_optional
&& can_promote(Match(actual, PointerType)->pointed, needed)) {
diff --git a/environment.c b/environment.c
index 01c30946..d1639368 100644
--- a/environment.c
+++ b/environment.c
@@ -33,7 +33,7 @@ env_t *new_compilation_unit(CORD *libname)
} global_vars[] = {
{"say", {.code="say", .type=Type(FunctionType, .args=new(arg_t, .name="text", .type=TEXT_TYPE,
.next=new(arg_t, .name="newline", .type=Type(BoolType), .default_val=FakeAST(Bool, true))), .ret=Type(VoidType))}},
- {"fail", {.code="fail", .type=Type(FunctionType, .args=new(arg_t, .name="message", .type=TEXT_TYPE), .ret=Type(AbortType))}},
+ {"fail", {.code="fail", .type=Type(FunctionType, .args=new(arg_t, .name="message", .type=Type(CStringType)), .ret=Type(AbortType))}},
{"USE_COLOR", {.code="USE_COLOR", .type=Type(BoolType)}},
};
diff --git a/types.c b/types.c
index 16a77528..60168a86 100644
--- a/types.c
+++ b/types.c
@@ -289,6 +289,10 @@ bool can_promote(type_t *actual, type_t *needed)
return cmp == NUM_PRECISION_EQUAL || cmp == NUM_PRECISION_LESS;
}
+ // Text to C String
+ if (actual->tag == TextType && !Match(actual, TextType)->lang && needed->tag == CStringType)
+ return true;
+
// Automatic dereferencing:
if (actual->tag == PointerType && !Match(actual, PointerType)->is_optional
&& can_promote(Match(actual, PointerType)->pointed, needed))