aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--builtins/bool.c2
-rw-r--r--builtins/floats.c38
-rw-r--r--builtins/functions.c2
-rw-r--r--builtins/integers.c29
-rw-r--r--builtins/memory.c4
-rw-r--r--builtins/pointer.c6
-rw-r--r--builtins/string.c1
-rw-r--r--builtins/table.c2
-rw-r--r--builtins/types.c11
-rw-r--r--builtins/types.h6
-rw-r--r--compile.c13
12 files changed, 53 insertions, 63 deletions
diff --git a/Makefile b/Makefile
index 4d708bd3..35bb0cb3 100644
--- a/Makefile
+++ b/Makefile
@@ -41,7 +41,7 @@ tags:
ctags *.[ch] **/*.[ch]
clean:
- rm -f nextlang *.o
+ rm -f nextlang *.o builtins/*.o
%.1: %.1.md
pandoc --lua-filter=.pandoc/bold-code.lua -s $< -t man -o $@
diff --git a/builtins/bool.c b/builtins/bool.c
index 7614113f..e3d1f7ef 100644
--- a/builtins/bool.c
+++ b/builtins/bool.c
@@ -18,6 +18,7 @@ extern const void *SSS_HASH_VECTOR;
static CORD Bool_cord(const bool *b, bool colorize, const TypeInfo *type)
{
(void)type;
+ if (!b) return "Bool";
if (colorize)
return *b ? "\x1b[35myes\x1b[m" : "\x1b[35mno\x1b[m";
else
@@ -28,7 +29,6 @@ public struct {
TypeInfo type;
} Bool_type = {
.type={
- .name="Bool",
.size=sizeof(bool),
.align=alignof(bool),
.tag=CustomInfo,
diff --git a/builtins/floats.c b/builtins/floats.c
index a2188e68..cb71828a 100644
--- a/builtins/floats.c
+++ b/builtins/floats.c
@@ -32,18 +32,12 @@ static bool Num__equal(const double *x, const double *y, const TypeInfo *type) {
return *x == *y;
}
-public Str_t Num__format(double f, int64_t precision) {
- int len = snprintf(NULL, 0, "%.*f", (int)precision, f);
- char *str = GC_MALLOC_ATOMIC(len + 1);
- snprintf(str, len+1, "%.*f", (int)precision, f);
- return (Str_t){.data=str, .length=len, .stride=1};
+public CORD Num__format(double f, int64_t precision) {
+ return CORD_asprintf("%.*f", (int)precision, f);
}
-public Str_t Num__scientific(double f, int64_t precision) {
- int len = snprintf(NULL, 0, "%.*e", (int)precision, f);
- char *str = GC_MALLOC_ATOMIC(len + 1);
- snprintf(str, len+1, "%.*e", (int)precision, f);
- return (Str_t){.data=str, .length=len, .stride=1};
+public CORD Num__scientific(double f, int64_t precision) {
+ return CORD_asprintf("%.*e", (int)precision, f);
}
public double Num__mod(double num, double modulus) {
@@ -76,11 +70,10 @@ public struct {
// Binary functions:
double_binary_fn_t atan2, copysign, dist, hypot, maxmag, minmag, mod, nextafter, pow, remainder;
// Odds and ends:
- Str_t (*format)(double f, int64_t precision);
- Str_t (*scientific)(double f, int64_t precision);
+ CORD (*format)(double f, int64_t precision);
+ CORD (*scientific)(double f, int64_t precision);
} Num_type = {
.type=(TypeInfo){
- .name="Num",
.size=sizeof(double),
.align=alignof(double),
.tag=CustomInfo,
@@ -127,18 +120,12 @@ static bool Num32__equal(const float *x, const float *y, const TypeInfo *type) {
return *x == *y;
}
-public Str_t Num32__format(float f, int64_t precision) {
- int len = snprintf(NULL, 0, "%.*f", (int)precision, f);
- char *str = GC_MALLOC_ATOMIC(len + 1);
- snprintf(str, len+1, "%.*f", (int)precision, f);
- return (Str_t){.data=str, .length=len, .stride=1};
+public CORD Num32__format(float f, int64_t precision) {
+ return CORD_asprintf("%.*f", (int)precision, f);
}
-public Str_t Num32__scientific(float f, int64_t precision) {
- int len = snprintf(NULL, 0, "%.*e", (int)precision, f);
- char *str = GC_MALLOC_ATOMIC(len + 1);
- snprintf(str, len+1, "%.*e", (int)precision, f);
- return (Str_t){.data=str, .length=len, .stride=1};
+public CORD Num32__scientific(float f, int64_t precision) {
+ return CORD_asprintf("%.*e", (int)precision, f);
}
public float Num32__mod(float num, float modulus) {
@@ -175,11 +162,10 @@ public struct {
// Binary functions:
float_binary_fn_t atan2, copysign, dist, hypot, maxmag, minmag, mod, nextafter, pow, remainder;
// Odds and ends:
- Str_t (*format)(float f, int64_t precision);
- Str_t (*scientific)(float f, int64_t precision);
+ CORD (*format)(float f, int64_t precision);
+ CORD (*scientific)(float f, int64_t precision);
} Num32_type = {
.type=(TypeInfo){
- .name="Num32",
.size=sizeof(float),
.align=alignof(float),
.tag=CustomInfo,
diff --git a/builtins/functions.c b/builtins/functions.c
index 2892107a..780fb6dc 100644
--- a/builtins/functions.c
+++ b/builtins/functions.c
@@ -86,7 +86,7 @@ public CORD generic_cord(const void *obj, bool colorize, const TypeInfo *type)
case TableInfo: return Table_cord(obj, colorize, type);
case CustomInfo:
if (!type->CustomInfo.cord)
- builtin_fail("No cord function provided for type: %s!\n", type->name);
+ builtin_fail("No cord function provided for type!\n");
return type->CustomInfo.cord(obj, colorize, type);
default: errx(1, "Invalid type tag: %d", type->tag);
}
diff --git a/builtins/integers.c b/builtins/integers.c
index f221d104..13980e7a 100644
--- a/builtins/integers.c
+++ b/builtins/integers.c
@@ -18,6 +18,7 @@ extern const void *SSS_HASH_VECTOR;
#define DEFINE_INT_TYPE(c_type, KindOfInt, fmt, abs_fn, min_val, max_val)\
public CORD KindOfInt ## __cord(const c_type *i, bool colorize, const TypeInfo *type) { \
(void)type; \
+ if (!i) return #KindOfInt; \
CORD c; \
if (colorize) CORD_sprintf(&c, "\x1b[35m%"fmt"\x1b[33;2m\x1b[m", *i); \
else CORD_sprintf(&c, "%"fmt, *i); \
@@ -27,25 +28,16 @@ extern const void *SSS_HASH_VECTOR;
(void)type; \
return (*x > *y) - (*x < *y); \
} \
- public Str_t KindOfInt ## __format(c_type i, int64_t digits) { \
- int len = snprintf(NULL, 0, "%0*" fmt, (int)digits, i); \
- char *str = GC_MALLOC_ATOMIC(len + 1); \
- snprintf(str, len+1, "%0*" fmt, (int)digits, i); \
- return (Str_t){.data=str, .length=len, .stride=1}; \
+ public CORD KindOfInt ## __format(c_type i, int64_t digits) { \
+ return CORD_asprintf("%0*" fmt, (int)digits, i); \
} \
- public Str_t KindOfInt ## __hex(c_type i, int64_t digits, bool uppercase, bool prefix) { \
+ public CORD KindOfInt ## __hex(c_type i, int64_t digits, bool uppercase, bool prefix) { \
const char *hex_fmt = uppercase ? (prefix ? "0x%0.*lX" : "%0.*lX") : (prefix ? "0x%0.*lx" : "%0.*lx"); \
- int len = snprintf(NULL, 0, hex_fmt, (int)digits, (uint64_t)i); \
- char *str = GC_MALLOC_ATOMIC(len + 1); \
- snprintf(str, len+1, hex_fmt, (int)digits, (uint64_t)i); \
- return (Str_t){.data=str, .length=len, .stride=1}; \
+ return CORD_asprintf(hex_fmt, (int)digits, (uint64_t)i); \
} \
- public Str_t KindOfInt ## __octal(c_type i, int64_t digits, bool prefix) { \
+ public CORD KindOfInt ## __octal(c_type i, int64_t digits, bool prefix) { \
const char *octal_fmt = prefix ? "0o%0.*lo" : "%0.*lo"; \
- int len = snprintf(NULL, 0, octal_fmt, (int)digits, (uint64_t)i); \
- char *str = GC_MALLOC_ATOMIC(len + 1); \
- snprintf(str, len+1, octal_fmt, (int)digits, (uint64_t)i); \
- return (Str_t){.data=str, .length=len, .stride=1}; \
+ return CORD_asprintf(octal_fmt, (int)digits, (uint64_t)i); \
} \
public c_type KindOfInt ## __random(int64_t min, int64_t max) { \
if (min > max) builtin_fail("Random min (%ld) is larger than max (%ld)", min, max); \
@@ -60,13 +52,12 @@ extern const void *SSS_HASH_VECTOR;
TypeInfo type; \
c_type min, max; \
c_type (*abs)(c_type i); \
- Str_t (*format)(c_type i, int64_t digits); \
- Str_t (*hex)(c_type i, int64_t digits, bool uppercase, bool prefix); \
- Str_t (*octal)(c_type i, int64_t digits, bool prefix); \
+ CORD (*format)(c_type i, int64_t digits); \
+ CORD (*hex)(c_type i, int64_t digits, bool uppercase, bool prefix); \
+ CORD (*octal)(c_type i, int64_t digits, bool prefix); \
c_type (*random)(int64_t min, int64_t max); \
} KindOfInt##_type = { \
.type={ \
- .name=#KindOfInt, \
.size=sizeof(c_type), \
.align=alignof(c_type), \
.tag=CustomInfo, \
diff --git a/builtins/memory.c b/builtins/memory.c
index 4db6ca39..5397ab28 100644
--- a/builtins/memory.c
+++ b/builtins/memory.c
@@ -17,13 +17,13 @@ extern const void *SSS_HASH_VECTOR;
public CORD Memory__cord(const void *p, bool colorize, const TypeInfo *type) {
(void)type;
+ if (!p) return "Memory";
CORD cord;
- CORD_sprintf(&cord, colorize ? "\x1b[0;34;1mMemory<%p>\x1b[m" : "Memory<%p>", p);
+ CORD_sprintf(&cord, colorize ? "\x1b[0;34;1mMemory<%p>\x1b[m" : "Memory<%p>", *(const void**)p);
return cord;
}
public TypeInfo Memory_type = {
- .name="Memory",
.size=0,
.align=0,
.tag=CustomInfo,
diff --git a/builtins/pointer.c b/builtins/pointer.c
index 69d11c07..e0c8b549 100644
--- a/builtins/pointer.c
+++ b/builtins/pointer.c
@@ -23,8 +23,10 @@ typedef struct recursion_s {
public CORD Pointer__cord(const void *x, bool colorize, const TypeInfo *type) {
auto ptr_info = type->PointerInfo;
const void *ptr = *(const void**)x;
- if (!ptr)
- return colorize ? CORD_asprintf("\x1b[34;1m!%s\x1b[m", ptr_info.pointed->name) : CORD_cat(ptr_info.sigil, ptr_info.pointed->name);
+ if (!ptr) {
+ CORD typename = generic_cord(NULL, false, ptr_info.pointed);
+ return colorize ? CORD_asprintf("\x1b[34;1m!%s\x1b[m", typename) : CORD_cat(ptr_info.sigil, typename);
+ }
// Check for recursive references, so if `x.foo = x`, then it prints as
// `@Foo{foo=@..1}` instead of overflowing the stack:
diff --git a/builtins/string.c b/builtins/string.c
index 3b417d39..31998d66 100644
--- a/builtins/string.c
+++ b/builtins/string.c
@@ -252,7 +252,6 @@ public CORD Str__join(CORD glue, Str_Array_t pieces)
public Str_namespace_t Str_type = {
.type={
- .name="Str",
.size=sizeof(CORD),
.align=alignof(CORD),
.tag=CustomInfo,
diff --git a/builtins/table.c b/builtins/table.c
index 08e14958..7df98e50 100644
--- a/builtins/table.c
+++ b/builtins/table.c
@@ -46,7 +46,6 @@
extern const void *SSS_HASH_VECTOR;
TypeInfo MemoryPointer_typeinfo = {
- .name="@Memory",
.size=sizeof(void*),
.align=alignof(void*),
.tag=PointerInfo,
@@ -57,7 +56,6 @@ TypeInfo MemoryPointer_typeinfo = {
};
TypeInfo StrToVoidStarTable_type = {
- .name="{Str=>@Memory}",
.size=sizeof(table_t),
.align=alignof(table_t),
.tag=TableInfo,
diff --git a/builtins/types.c b/builtins/types.c
index a33c17f2..24c4de92 100644
--- a/builtins/types.c
+++ b/builtins/types.c
@@ -19,9 +19,9 @@ public CORD Type__cord(void *type_namespace, bool colorize, const TypeInfo *type
{
(void)type_namespace;
if (!colorize)
- return CORD_from_char_star(type->name);
+ return type->TypeInfoInfo.type_str;
CORD c;
- CORD_sprintf(&c, "\x1b[36;1m%s\x1b[m", type->name);
+ CORD_sprintf(&c, "\x1b[36;1m%s\x1b[m", type->TypeInfoInfo.type_str);
return c;
}
@@ -29,7 +29,6 @@ public struct {
TypeInfo type;
} TypeInfo_type = {
.type={
- .name="TypeInfo",
.size=sizeof(TypeInfo),
.align=alignof(TypeInfo),
.tag=CustomInfo,
@@ -39,15 +38,15 @@ public struct {
public struct {
TypeInfo type;
-} Void_type = {.type={.name="Void", .size=0, .align=0}};
+} Void_type = {.type={.size=0, .align=0}};
public struct {
TypeInfo type;
-} Abort_type = {.type={.name="Abort", .size=0, .align=0}};
+} Abort_type = {.type={.size=0, .align=0}};
public CORD Func__cord(const void *fn, bool colorize, const TypeInfo *type)
{
(void)fn;
- CORD c = type->name;
+ CORD c = type->TypeInfoInfo.type_str;
if (colorize)
CORD_sprintf(&c, "\x1b[32;1m%r\x1b[m", c);
return c;
diff --git a/builtins/types.h b/builtins/types.h
index dccb6d2f..abe82922 100644
--- a/builtins/types.h
+++ b/builtins/types.h
@@ -13,10 +13,9 @@ typedef bool (*equal_fn_t)(const void*, const void*, const struct TypeInfo*);
typedef CORD (*cord_fn_t)(const void*, bool, const struct TypeInfo*);
typedef struct TypeInfo {
- const char *name;
int64_t size, align;
struct { // Anonymous tagged union for convenience
- enum { CustomInfo, PointerInfo, ArrayInfo, TableInfo } tag;
+ enum { CustomInfo, PointerInfo, ArrayInfo, TableInfo, TypeInfoInfo, } tag;
union {
struct {
equal_fn_t equal;
@@ -35,6 +34,9 @@ typedef struct TypeInfo {
struct TypeInfo *key, *value;
int64_t entry_size, value_offset;
} TableInfo;
+ struct {
+ const char *type_str;
+ } TypeInfoInfo;
};
};
} TypeInfo;
diff --git a/compile.c b/compile.c
index c3dfb723..a230d712 100644
--- a/compile.c
+++ b/compile.c
@@ -414,4 +414,17 @@ CORD compile(env_t *env, ast_t *ast)
return NULL;
}
+// CORD compile_type_info(env_t *env, type_t *t)
+// {
+// switch (t->tag) {
+// case BoolType: return "&Bool$Info";
+// case IntType: return CORD_asprintf("&Int%ld$Info", Match(t, IntType)->bits);
+// case NumType: return CORD_asprintf("&Num%ld$Info", Match(t, NumType)->bits);
+// case StringType: return CORD_all("&", Match(t, StringType)->dsl ? Match(t, StringType)->dsl : "Str", "$Info");
+// case StructType: return CORD_all("&", Match(t, StructType)->name, "$Info");
+// case EnumType: return CORD_all("&", Match(t, EnumType)->name, "$Info");
+// case ArrayType: return CORD_all("&((TypeInfo){", Match(t, EnumType)->name, "$Info");
+// }
+// }
+
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0