aboutsummaryrefslogtreecommitdiff
path: root/src/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-03-31 02:11:03 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-03-31 02:11:03 -0400
commit7a172be6213839a3d023ba21c3bafd7540a4bfe8 (patch)
tree5646ba0e4c0690fe64711fb77658308541de695b /src/compile.c
parentd3655740cc6a8e6c4788946af412065fb52f51dc (diff)
Remove threads and mutexed data from the language in favor of a
module-based approach
Diffstat (limited to 'src/compile.c')
-rw-r--r--src/compile.c91
1 files changed, 9 insertions, 82 deletions
diff --git a/src/compile.c b/src/compile.c
index 9073de5e..f228148a 100644
--- a/src/compile.c
+++ b/src/compile.c
@@ -39,7 +39,7 @@ static CORD compile_string_literal(CORD literal);
CORD promote_to_optional(type_t *t, CORD code)
{
- if (t == THREAD_TYPE || t == PATH_TYPE || t == PATH_TYPE_TYPE || t == MATCH_TYPE) {
+ if (t == PATH_TYPE || t == PATH_TYPE_TYPE || t == MATCH_TYPE) {
return code;
} else if (t->tag == IntType) {
switch (Match(t, IntType)->bits) {
@@ -228,18 +228,13 @@ static void add_closed_vars(Table_t *closed_vars, env_t *enclosing_scope, env_t
add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, UpdateAssign)->rhs);
break;
}
- case Not: case Negative: case HeapAllocate: case StackReference: case Mutexed: {
+ case Not: case Negative: case HeapAllocate: case StackReference: {
// UNSAFE:
ast_t *value = ast->__data.Not.value;
// END UNSAFE
add_closed_vars(closed_vars, enclosing_scope, env, value);
break;
}
- case Holding: {
- add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, Holding)->mutexed);
- add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, Holding)->body);
- break;
- }
case Min: {
add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, Min)->lhs);
add_closed_vars(closed_vars, enclosing_scope, env, Match(ast, Min)->rhs);
@@ -501,8 +496,7 @@ PUREFUNC CORD compile_unsigned_type(type_t *t)
CORD compile_type(type_t *t)
{
- if (t == THREAD_TYPE) return "Thread_t";
- else if (t == RNG_TYPE) return "RNG_t";
+ if (t == RNG_TYPE) return "RNG_t";
else if (t == MATCH_TYPE) return "Match_t";
else if (t == PATH_TYPE) return "Path_t";
else if (t == PATH_TYPE_TYPE) return "PathType_t";
@@ -512,7 +506,6 @@ CORD compile_type(type_t *t)
case AbortType: return "void";
case VoidType: return "void";
case MemoryType: return "void";
- case MutexedType: return "MutexedData_t";
case BoolType: return "Bool_t";
case ByteType: return "Byte_t";
case CStringType: return "const char*";
@@ -556,7 +549,7 @@ CORD compile_type(type_t *t)
case OptionalType: {
type_t *nonnull = Match(t, OptionalType)->type;
switch (nonnull->tag) {
- case CStringType: case FunctionType: case ClosureType: case MutexedType:
+ case CStringType: case FunctionType: case ClosureType:
case PointerType: case EnumType:
return compile_type(nonnull);
case TextType:
@@ -565,8 +558,6 @@ CORD compile_type(type_t *t)
case ArrayType: case TableType: case SetType:
return CORD_all("Optional", compile_type(nonnull));
case StructType: {
- if (nonnull == THREAD_TYPE)
- return "Thread_t";
if (nonnull == MATCH_TYPE)
return "OptionalMatch_t";
if (nonnull == PATH_TYPE)
@@ -689,7 +680,7 @@ CORD optional_into_nonnone(type_t *t, CORD value)
case IntType:
return CORD_all(value, ".value");
case StructType:
- if (t == THREAD_TYPE || t == MATCH_TYPE || t == PATH_TYPE || t == PATH_TYPE_TYPE)
+ if (t == MATCH_TYPE || t == PATH_TYPE || t == PATH_TYPE_TYPE)
return value;
return CORD_all(value, ".value");
default:
@@ -702,8 +693,7 @@ CORD check_none(type_t *t, CORD value)
t = Match(t, OptionalType)->type;
// NOTE: these use statement expressions ({...;}) because some compilers
// complain about excessive parens around equality comparisons
- if (t->tag == PointerType || t->tag == FunctionType || t->tag == CStringType
- || t == THREAD_TYPE)
+ if (t->tag == PointerType || t->tag == FunctionType || t->tag == CStringType)
return CORD_all("({", value, " == NULL;})");
else if (t == MATCH_TYPE)
return CORD_all("({(", value, ").index.small == 0;})");
@@ -729,8 +719,6 @@ CORD check_none(type_t *t, CORD value)
return CORD_all("(", value, ").is_none");
else if (t->tag == EnumType)
return CORD_all("({(", value, ").$tag == 0;})");
- else if (t->tag == MutexedType)
- return CORD_all("({", value, " == NULL;})");
print_err("Optional check not implemented for: ", type_to_str(t));
}
@@ -1344,30 +1332,6 @@ static CORD _compile_statement(env_t *env, ast_t *ast)
loop = CORD_all(loop, "\n", loop_ctx.stop_label, ":;");
return loop;
}
- case Holding: {
- ast_t *held = Match(ast, Holding)->mutexed;
- type_t *held_type = get_type(env, held);
- if (held_type->tag != MutexedType)
- code_err(held, "This is a ", type_to_str(held_type), ", not a mutexed value");
- CORD code = CORD_all(
- "{ // Holding\n",
- "MutexedData_t mutexed = ", compile(env, held), ";\n",
- "pthread_mutex_lock(&mutexed->mutex);\n");
-
- env_t *body_scope = fresh_scope(env);
- body_scope->deferred = new(deferral_t, .defer_env=env,
- .block=FakeAST(InlineCCode, .code="pthread_mutex_unlock(&mutexed->mutex);"),
- .next=body_scope->deferred);
- if (held->tag == Var) {
- CORD held_var = CORD_all(Match(held, Var)->name, "$held");
- set_binding(body_scope, Match(held, Var)->name,
- Type(PointerType, .pointed=Match(held_type, MutexedType)->type, .is_stack=true), held_var);
- code = CORD_all(code, compile_declaration(Type(PointerType, .pointed=Match(held_type, MutexedType)->type), held_var),
- " = (", compile_type(Type(PointerType, .pointed=Match(held_type, MutexedType)->type)), ")mutexed->data;\n");
- }
- return CORD_all(code, compile_statement(body_scope, Match(ast, Holding)->body),
- "pthread_mutex_unlock(&mutexed->mutex);\n}");
- }
case For: {
auto for_ = Match(ast, For);
@@ -1811,7 +1775,7 @@ CORD expr_as_text(CORD expr, type_t *t, CORD color)
case FunctionType: case ClosureType: return CORD_asprintf("Func$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(t));
case PointerType: return CORD_asprintf("Pointer$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(t));
case OptionalType: return CORD_asprintf("Optional$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(t));
- case StructType: case EnumType: case MutexedType:
+ case StructType: case EnumType:
return CORD_asprintf("generic_as_text(stack(%r), %r, %r)", expr, color, compile_type_info(t));
default: compiler_err(NULL, NULL, NULL, "Stringifying is not supported for ", type_to_str(t));
}
@@ -2199,8 +2163,7 @@ CORD compile_none(type_t *t)
if (t->tag == OptionalType)
t = Match(t, OptionalType)->type;
- if (t == THREAD_TYPE) return "NULL";
- else if (t == PATH_TYPE) return "NONE_PATH";
+ if (t == PATH_TYPE) return "NONE_PATH";
else if (t == PATH_TYPE_TYPE) return "((OptionalPathType_t){})";
else if (t == MATCH_TYPE) return "NONE_MATCH";
@@ -2231,7 +2194,6 @@ CORD compile_none(type_t *t)
env_t *enum_env = Match(t, EnumType)->env;
return CORD_all("((", compile_type(t), "){", namespace_prefix(enum_env, enum_env->namespace), "null})");
}
- case MutexedType: return "NONE_MUTEXED_DATA";
default: compiler_err(NULL, NULL, NULL, "none isn't implemented for this type: ", type_to_str(t));
}
}
@@ -2339,36 +2301,6 @@ CORD compile(env_t *env, ast_t *ast)
else
return CORD_all("stack(", compile(env, subject), ")");
}
- case Mutexed: {
- ast_t *mutexed = Match(ast, Mutexed)->value;
- return CORD_all("new(struct MutexedData_s, .mutex=PTHREAD_MUTEX_INITIALIZER, .data=", compile(env, WrapAST(mutexed, HeapAllocate, mutexed)), ")");
- }
- case Holding: {
- ast_t *held = Match(ast, Holding)->mutexed;
- type_t *held_type = get_type(env, held);
- if (held_type->tag != MutexedType)
- code_err(held, "This is a ", type_to_str(held_type), ", not a mutexed value");
- CORD code = CORD_all(
- "({ // Holding\n",
- "MutexedData_t mutexed = ", compile(env, held), ";\n",
- "pthread_mutex_lock(&mutexed->mutex);\n");
-
- env_t *body_scope = fresh_scope(env);
- body_scope->deferred = new(deferral_t, .defer_env=env,
- .block=FakeAST(InlineCCode, .code="pthread_mutex_unlock(&mutexed->mutex);"),
- .next=body_scope->deferred);
- if (held->tag == Var) {
- CORD held_var = CORD_all(Match(held, Var)->name, "$held");
- set_binding(body_scope, Match(held, Var)->name,
- Type(PointerType, .pointed=Match(held_type, MutexedType)->type, .is_stack=true), held_var);
- code = CORD_all(code, compile_declaration(Type(PointerType, .pointed=Match(held_type, MutexedType)->type), held_var),
- " = (", compile_type(Type(PointerType, .pointed=Match(held_type, MutexedType)->type)), ")mutexed->data;\n");
- }
- type_t *body_type = get_type(env, ast);
- return CORD_all(code, compile_declaration(body_type, "result"), " = ", compile(body_scope, Match(ast, Holding)->body), ";\n"
- "pthread_mutex_unlock(&mutexed->mutex);\n"
- "result;\n})");
- }
case Optional: {
ast_t *value = Match(ast, Optional)->value;
CORD value_code = compile(env, value);
@@ -3829,8 +3761,7 @@ CORD compile(env_t *env, ast_t *ast)
CORD compile_type_info(type_t *t)
{
- if (t == THREAD_TYPE) return "&Thread$info";
- else if (t == RNG_TYPE) return "&RNG$info";
+ if (t == RNG_TYPE) return "&RNG$info";
else if (t == MATCH_TYPE) return "&Match$info";
else if (t == PATH_TYPE) return "&Path$info";
else if (t == PATH_TYPE_TYPE) return "&PathType$info";
@@ -3890,10 +3821,6 @@ CORD compile_type_info(type_t *t)
type_t *non_optional = Match(t, OptionalType)->type;
return CORD_asprintf("Optional$info(sizeof(%r), __alignof__(%r), %r)", compile_type(non_optional), compile_type(non_optional), compile_type_info(non_optional));
}
- case MutexedType: {
- type_t *mutexed = Match(t, MutexedType)->type;
- return CORD_all("MutexedData$info(", compile_type_info(mutexed), ")");
- }
case TypeInfoType: return CORD_all("Type$info(", CORD_quoted(type_to_cord(Match(t, TypeInfoType)->type)), ")");
case MemoryType: return "&Memory$info";
case VoidType: return "&Void$info";