mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
At this point, only a minimal number of operations are working, and after running any kind of source code, the 'result' is simply left on the VM's stack. Still, it's awesome to see it reach this point.
59 lines
2.0 KiB
C
59 lines
2.0 KiB
C
#pragma once
|
|
|
|
#include "toy_common.h"
|
|
|
|
typedef enum Toy_ValueType {
|
|
TOY_VALUE_NULL,
|
|
TOY_VALUE_BOOLEAN,
|
|
TOY_VALUE_INTEGER,
|
|
TOY_VALUE_FLOAT,
|
|
TOY_VALUE_STRING,
|
|
TOY_VALUE_ARRAY,
|
|
TOY_VALUE_DICTIONARY,
|
|
TOY_VALUE_FUNCTION,
|
|
TOY_VALUE_OPAQUE,
|
|
} Toy_ValueType;
|
|
|
|
//8 bytes in size
|
|
typedef struct Toy_Value {
|
|
union {
|
|
bool boolean; //1
|
|
int integer; //4
|
|
float number; //4
|
|
//TODO: strings
|
|
//TODO: arrays
|
|
//TODO: dictonaries
|
|
//TODO: functions
|
|
//TODO: opaque
|
|
} as; //4
|
|
|
|
Toy_ValueType type; //4
|
|
} Toy_Value; //8
|
|
|
|
#define TOY_VALUE_IS_NULL(value) ((value).type == TOY_VALUE_NULL)
|
|
#define TOY_VALUE_IS_BOOLEAN(value) ((value).type == TOY_VALUE_BOOLEAN)
|
|
#define TOY_VALUE_IS_INTEGER(value) ((value).type == TOY_VALUE_INTEGER)
|
|
#define TOY_VALUE_IS_FLOAT(value) ((value).type == TOY_VALUE_FLOAT)
|
|
#define TOY_VALUE_IS_STRING(value) ((value).type == TOY_VALUE_STRING)
|
|
#define TOY_VALUE_IS_ARRAY(value) ((value).type == TOY_VALUE_ARRAY)
|
|
#define TOY_VALUE_IS_DICTIONARY(value) ((value).type == TOY_VALUE_DICTIONARY)
|
|
#define TOY_VALUE_IS_FUNCTION(value) ((value).type == TOY_VALUE_FUNCTION)
|
|
#define TOY_VALUE_IS_OPAQUE(value) ((value).type == TOY_VALUE_OPAQUE)
|
|
|
|
#define TOY_VALUE_AS_BOOLEAN(value) ((value).as.boolean)
|
|
#define TOY_VALUE_AS_INTEGER(value) ((value).as.integer)
|
|
#define TOY_VALUE_AS_FLOAT(value) ((value).as.number)
|
|
//TODO: more
|
|
|
|
#define TOY_VALUE_TO_NULL() ((Toy_Value){{ .integer = 0 }, TOY_VALUE_NULL})
|
|
#define TOY_VALUE_TO_BOOLEAN(value) ((Toy_Value){{ .boolean = value }, TOY_VALUE_BOOLEAN})
|
|
#define TOY_VALUE_TO_INTEGER(value) ((Toy_Value){{ .integer = value }, TOY_VALUE_INTEGER})
|
|
#define TOY_VALUE_TO_FLOAT(value) ((Toy_Value){{ .number = value }, TOY_VALUE_FLOAT})
|
|
//TODO: more
|
|
|
|
#define TOY_VALUE_IS_TRUTHY(value) Toy_private_isTruthy(value)
|
|
TOY_API bool Toy_private_isTruthy(Toy_Value value);
|
|
|
|
#define TOY_VALUE_IS_EQUAL(left, right) Toy_private_isEqual(left, right)
|
|
TOY_API bool Toy_private_isEqual(Toy_Value left, Toy_Value right);
|