aboutsummaryrefslogtreecommitdiff
path: root/src/exact_value.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-01-06 13:43:01 +0000
committerGitHub <noreply@github.com>2025-01-06 13:43:01 +0000
commit6e49bbb66853b5d824ac5bbd534ae3e81c4f39aa (patch)
tree50886a3be8f2fcfab053e07cfe9e15f50fa5f9f6 /src/exact_value.cpp
parentbd96cd0af761994210018ca647eb843dfeb71494 (diff)
parent98efb03934b464a1b23759b5695a12ff37588357 (diff)
Merge branch 'master' into d3d11-annotations
Diffstat (limited to 'src/exact_value.cpp')
-rw-r--r--src/exact_value.cpp73
1 files changed, 56 insertions, 17 deletions
diff --git a/src/exact_value.cpp b/src/exact_value.cpp
index cd499272f..ceaed84c1 100644
--- a/src/exact_value.cpp
+++ b/src/exact_value.cpp
@@ -54,37 +54,50 @@ gb_global ExactValue const empty_exact_value = {};
gb_internal uintptr hash_exact_value(ExactValue v) {
mutex_lock(&hash_exact_value_mutex);
defer (mutex_unlock(&hash_exact_value_mutex));
+
+ uintptr res = 0;
switch (v.kind) {
case ExactValue_Invalid:
return 0;
case ExactValue_Bool:
- return gb_fnv32a(&v.value_bool, gb_size_of(v.value_bool));
+ res = gb_fnv32a(&v.value_bool, gb_size_of(v.value_bool));
+ break;
case ExactValue_String:
- return gb_fnv32a(v.value_string.text, v.value_string.len);
+ res = gb_fnv32a(v.value_string.text, v.value_string.len);
+ break;
case ExactValue_Integer:
{
u32 key = gb_fnv32a(v.value_integer.dp, gb_size_of(*v.value_integer.dp) * v.value_integer.used);
u8 last = (u8)v.value_integer.sign;
- return (key ^ last) * 0x01000193;
+ res = (key ^ last) * 0x01000193;
+ break;
}
case ExactValue_Float:
- return gb_fnv32a(&v.value_float, gb_size_of(v.value_float));
+ res = gb_fnv32a(&v.value_float, gb_size_of(v.value_float));
+ break;
case ExactValue_Pointer:
- return ptr_map_hash_key(v.value_pointer);
+ res = ptr_map_hash_key(v.value_pointer);
+ break;
case ExactValue_Complex:
- return gb_fnv32a(v.value_complex, gb_size_of(Complex128));
+ res = gb_fnv32a(v.value_complex, gb_size_of(Complex128));
+ break;
case ExactValue_Quaternion:
- return gb_fnv32a(v.value_quaternion, gb_size_of(Quaternion256));
+ res = gb_fnv32a(v.value_quaternion, gb_size_of(Quaternion256));
+ break;
case ExactValue_Compound:
- return ptr_map_hash_key(v.value_compound);
+ res = ptr_map_hash_key(v.value_compound);
+ break;
case ExactValue_Procedure:
- return ptr_map_hash_key(v.value_procedure);
+ res = ptr_map_hash_key(v.value_procedure);
+ break;
case ExactValue_Typeid:
- return ptr_map_hash_key(v.value_typeid);
+ res = ptr_map_hash_key(v.value_typeid);
+ break;
+ default:
+ res = gb_fnv32a(&v, gb_size_of(ExactValue));
}
- return gb_fnv32a(&v, gb_size_of(ExactValue));
-
+ return res & 0x7fffffff;
}
@@ -108,12 +121,14 @@ gb_internal ExactValue exact_value_string(String string) {
gb_internal ExactValue exact_value_i64(i64 i) {
ExactValue result = {ExactValue_Integer};
+ result.value_integer = {0};
big_int_from_i64(&result.value_integer, i);
return result;
}
gb_internal ExactValue exact_value_u64(u64 i) {
ExactValue result = {ExactValue_Integer};
+ result.value_integer = {0};
big_int_from_u64(&result.value_integer, i);
return result;
}
@@ -164,6 +179,7 @@ gb_internal ExactValue exact_value_typeid(Type *type) {
gb_internal ExactValue exact_value_integer_from_string(String const &string) {
ExactValue result = {ExactValue_Integer};
+ result.value_integer = {0};
bool success;
big_int_from_string(&result.value_integer, string, &success);
if (!success) {
@@ -174,7 +190,7 @@ gb_internal ExactValue exact_value_integer_from_string(String const &string) {
-gb_internal f64 float_from_string(String const &string) {
+gb_internal f64 float_from_string(String const &string, bool *success = nullptr) {
if (string.len < 128) {
char buf[128] = {};
isize n = 0;
@@ -187,7 +203,13 @@ gb_internal f64 float_from_string(String const &string) {
buf[n++] = cast(char)c;
}
buf[n] = 0;
- return atof(buf);
+
+ char *end_ptr;
+ f64 f = strtod(buf, &end_ptr);
+ if (success != nullptr) {
+ *success = *end_ptr == '\0';
+ }
+ return f;
} else {
TEMPORARY_ALLOCATOR_GUARD();
char *buf = gb_alloc_array(temporary_allocator(), char, string.len+1);
@@ -201,7 +223,13 @@ gb_internal f64 float_from_string(String const &string) {
buf[n++] = cast(char)c;
}
buf[n] = 0;
- return atof(buf);
+
+ char *end_ptr;
+ f64 f = strtod(buf, &end_ptr);
+ if (success != nullptr) {
+ *success = *end_ptr == '\0';
+ }
+ return f;
}
/*
isize i = 0;
@@ -313,7 +341,11 @@ gb_internal ExactValue exact_value_float_from_string(String string) {
return exact_value_integer_from_string(string);
}
- f64 f = float_from_string(string);
+ bool success;
+ f64 f = float_from_string(string, &success);
+ if (!success) {
+ return {ExactValue_Invalid};
+ }
return exact_value_float(f);
}
@@ -338,7 +370,11 @@ gb_internal ExactValue exact_value_from_basic_literal(TokenKind kind, String con
}
case Token_Rune: {
Rune r = GB_RUNE_INVALID;
- utf8_decode(string.text, string.len, &r);
+ if (string.len == 1) {
+ r = cast(Rune)string.text[0];
+ } else {
+ utf8_decode(string.text, string.len, &r);
+ }
return exact_value_i64(r);
}
}
@@ -556,6 +592,7 @@ gb_internal ExactValue exact_unary_operator_value(TokenKind op, ExactValue v, i3
return v;
case ExactValue_Integer: {
ExactValue i = {ExactValue_Integer};
+ i.value_integer = {0};
big_int_neg(&i.value_integer, &v.value_integer);
return i;
}
@@ -587,6 +624,7 @@ gb_internal ExactValue exact_unary_operator_value(TokenKind op, ExactValue v, i3
case ExactValue_Integer: {
GB_ASSERT(precision != 0);
ExactValue i = {ExactValue_Integer};
+ i.value_integer = {0};
big_int_not(&i.value_integer, &v.value_integer, precision, !is_unsigned);
return i;
}
@@ -653,6 +691,7 @@ gb_internal void match_exact_values(ExactValue *x, ExactValue *y) {
case ExactValue_String:
case ExactValue_Quaternion:
case ExactValue_Pointer:
+ case ExactValue_Compound:
case ExactValue_Procedure:
case ExactValue_Typeid:
return;