From 18a4b33c4e6a79c49ec1c2d94d56cf2c52c76e9a Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 1 May 2026 18:42:51 +1000 Subject: [PATCH] Enabled the opaque value type Also improved a couple error messages. --- source/toy_value.c | 25 ++++++++++++++++++------- source/toy_value.h | 8 ++++---- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/source/toy_value.c b/source/toy_value.c index e5689dc..d58bedc 100644 --- a/source/toy_value.c +++ b/source/toy_value.c @@ -83,7 +83,7 @@ unsigned int Toy_hashValue(Toy_Value value) { case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "ERROR: Can't hash an unknown value type (%d), exiting\n" TOY_CC_RESET, (int)value.type); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't hash a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(value.type)); exit(-1); } @@ -144,7 +144,7 @@ Toy_Value Toy_copyValue(Toy_Bucket** bucketHandle, Toy_Value value) { case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "ERROR: Can't copy an unknown value type, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't copy a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(value.type)); exit(-1); } @@ -182,9 +182,12 @@ void Toy_freeValue(Toy_Value value) { return; case TOY_VALUE_OPAQUE: + //no-op + return; + case TOY_VALUE_ANY: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "ERROR: Can't free an unknown value type, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't free a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(value.type)); exit(-1); } } @@ -329,7 +332,7 @@ bool Toy_checkValuesAreEqual(Toy_Value left, Toy_Value right) { case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "ERROR: Unknown types in value equality, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't find equality for a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(left.type)); exit(-1); } @@ -368,10 +371,13 @@ bool Toy_checkValuesAreComparable(Toy_Value left, Toy_Value right) { return false; case TOY_VALUE_OPAQUE: + //nothing compares with an opaque + return false; + case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "Unknown types in value comparison check, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Unknown types in value comparison check, exiting\n" TOY_CC_RESET); exit(-1); } @@ -425,13 +431,15 @@ int Toy_compareValues(Toy_Value left, Toy_Value right) { break; case TOY_VALUE_OPAQUE: + break; + case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: break; } - fprintf(stderr, TOY_CC_ERROR "Unknown types in value comparison, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't compare with a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(left.type)); exit(-1); return ~0; @@ -641,10 +649,13 @@ Toy_String* Toy_stringifyValue(Toy_Bucket** bucketHandle, Toy_Value value) { return Toy_createStringLength(bucketHandle, "", 4); case TOY_VALUE_OPAQUE: + //dummy + return Toy_createStringLength(bucketHandle, "", 6); + case TOY_VALUE_ANY: case TOY_VALUE_REFERENCE: case TOY_VALUE_UNKNOWN: - fprintf(stderr, TOY_CC_ERROR "Unknown types in value stringify, exiting\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Can't stringify a given value type '%s', exiting\n" TOY_CC_RESET, Toy_private_getValueTypeAsCString(value.type)); exit(-1); } diff --git a/source/toy_value.h b/source/toy_value.h index fe12bbe..c642fc6 100644 --- a/source/toy_value.h +++ b/source/toy_value.h @@ -29,7 +29,6 @@ typedef enum Toy_ValueType { //8 bytes in size typedef struct Toy_Value { //32 | 64 BITNESS union { - struct Toy_Value* reference; //4 | 8 bool boolean; //1 | 1 int integer; //4 | 4 float number; //4 | 4 @@ -37,8 +36,8 @@ typedef struct Toy_Value { //32 | 64 BITNESS struct Toy_Array* array; //4 | 8 struct Toy_Table* table; //4 | 8 union Toy_Function_t* function;//4 | 8 - //more types go here as needed - + struct Toy_Value* reference; //4 | 8 + void* opaque; //4 | 8 } as; //4 | 8 Toy_ValueType type; //4 | 4 @@ -53,7 +52,6 @@ typedef struct Toy_Value { //32 | 64 BITNESS #define TOY_VALUE_IS_TABLE(value) ((value).type == TOY_VALUE_TABLE || (TOY_VALUE_IS_REFERENCE(value) && Toy_unwrapValue(value).type == TOY_VALUE_TABLE)) #define TOY_VALUE_IS_FUNCTION(value) ((value).type == TOY_VALUE_FUNCTION || (TOY_VALUE_IS_REFERENCE(value) && Toy_unwrapValue(value).type == TOY_VALUE_FUNCTION)) #define TOY_VALUE_IS_OPAQUE(value) ((value).type == TOY_VALUE_OPAQUE) -#define TOY_VALUE_IS_TYPE(value) ((value).type == TOY_VALUE_TYPE) #define TOY_VALUE_IS_REFERENCE(value) ((value).type == TOY_VALUE_REFERENCE) #define TOY_VALUE_AS_BOOLEAN(value) ((value).as.boolean) @@ -63,6 +61,7 @@ typedef struct Toy_Value { //32 | 64 BITNESS #define TOY_VALUE_AS_ARRAY(value) ((TOY_VALUE_IS_REFERENCE(value) ? Toy_unwrapValue(value) : value).as.array) #define TOY_VALUE_AS_TABLE(value) ((TOY_VALUE_IS_REFERENCE(value) ? Toy_unwrapValue(value) : value).as.table) #define TOY_VALUE_AS_FUNCTION(value) ((TOY_VALUE_IS_REFERENCE(value) ? Toy_unwrapValue(value) : value).as.function) +#define TOY_VALUE_AS_OPAQUE(value) ((TOY_VALUE_IS_REFERENCE(value) ? Toy_unwrapValue(value) : value).as.opaque) #define TOY_VALUE_FROM_NULL() ((Toy_Value){{ .integer = 0 }, TOY_VALUE_NULL}) #define TOY_VALUE_FROM_BOOLEAN(value) ((Toy_Value){{ .boolean = value }, TOY_VALUE_BOOLEAN}) @@ -73,6 +72,7 @@ typedef struct Toy_Value { //32 | 64 BITNESS #define TOY_VALUE_FROM_TABLE(value) ((Toy_Value){{ .table = value }, TOY_VALUE_TABLE}) #define TOY_VALUE_FROM_FUNCTION(value) ((Toy_Value){{ .function = value }, TOY_VALUE_FUNCTION}) +#define TOY_OPAQUE_FROM_POINTER(ptr) ((Toy_Value){{ .opaque = ptr }, TOY_VALUE_OPAQUE}) #define TOY_REFERENCE_FROM_POINTER(ptr) ((Toy_Value){{ .reference = ptr }, TOY_VALUE_REFERENCE}) //utilities