diff --git a/src/common.cpp b/src/common.cpp index e1c3b3e..ad0d399 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -40,6 +40,7 @@ Result Symbol::create(Arena& arena, String& rhs) { uint64_t res_size = rhs_size; auto pod = TRY(arena.alloc(res_size * sizeof(char32_t))); + pod->header.tag = Tag::Symbol; pod->size = res_size; memcpy(pod->data, rhs._value->data, sizeof(char32_t) * rhs_size); @@ -52,6 +53,7 @@ Result ByteArray::create(Arena& arena, String& str) { size += utf8_codepoint_size(TRY(str[i])); } auto pod = TRY(arena.alloc(size * sizeof(char))); + pod->header.tag = Tag::ByteArray; pod->size = size; char* res = pod->data; @@ -106,6 +108,7 @@ Result Bool::copy(Arena& arena) { Result Pair::create(Arena& arena, Value& first, Value& rest) { auto pod = TRY(arena.alloc()); + pod->header.tag = Tag::Pair; pod->first = OffPtr(pod, first.pod()); pod->rest = OffPtr(pod, rest.pod()); diff --git a/src/common.hpp b/src/common.hpp index 40c0df4..0f86dce 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -39,6 +39,7 @@ class Nil : public Object { static Result create(Arena& arena) { auto pod = TRY(arena.alloc()); + pod->header.tag = Tag::Nil; return Nil(TRY(MkGcRoot(pod, arena))); } @@ -68,6 +69,7 @@ class ByteArray : public Object { } static Result create(Arena& arena, char* chars, int64_t size) { auto pod = TRY(arena.alloc(size * sizeof(char))); + pod->header.tag = Tag::ByteArray; memcpy(pod->data, chars, size * sizeof(char32_t)); pod->size = size; @@ -78,6 +80,7 @@ class ByteArray : public Object { static Result create(Arena& arena, const char* str) { uint64_t size = strlen(str); auto pod = TRY(arena.alloc(size * sizeof(char32_t))); + pod->header.tag = Tag::ByteArray; memcpy(pod->data, str, size); pod->size = size; @@ -165,22 +168,24 @@ class String : public Object { return String(TRY(MkGcRoot(obj, arena))); } static Result create(Arena& arena, char32_t* chars, int64_t size) { - auto pod_string = TRY(arena.alloc(size * sizeof(char32_t))); + auto pod = TRY(arena.alloc(size * sizeof(char32_t))); + pod->header.tag = Tag::String; - memcpy(pod_string->data, chars, size * sizeof(char32_t)); - pod_string->size = size; + memcpy(pod->data, chars, size * sizeof(char32_t)); + pod->size = size; - return String(TRY(MkGcRoot(pod_string, arena))); + return String(TRY(MkGcRoot(pod, arena))); } static Result create(Arena& arena, const char* str) { uint64_t size = strlen(str); - auto pod_string = TRY(arena.alloc(size * sizeof(char32_t))); + auto pod = TRY(arena.alloc(size * sizeof(char32_t))); + pod->header.tag = Tag::String; - for (uint64_t i = 0; i < size; i++) pod_string->data[i] = str[i]; - pod_string->size = size; + for (uint64_t i = 0; i < size; i++) pod->data[i] = str[i]; + pod->size = size; - return String(TRY(MkGcRoot(pod_string, arena))); + return String(TRY(MkGcRoot(pod, arena))); } uint64_t size() { return _value->size; } @@ -197,6 +202,7 @@ class String : public Object { uint64_t res_size = lhs_size + rhs_size; auto pod = TRY(arena.alloc(res_size * sizeof(char32_t))); + pod->header.tag = Tag::String; pod->size = res_size; memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_size); for (uint64_t i = 0; i < rhs_size; i++) pod->data[lhs_size + i] = rhs[i]; @@ -209,6 +215,7 @@ class String : public Object { uint64_t res_size = lhs_size + rhs_size; auto pod = TRY(arena.alloc(res_size * sizeof(char32_t))); + pod->header.tag = Tag::String; pod->size = res_size; memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_size); for (uint64_t i = 0; i < rhs_size; i++) pod->data[lhs_size + i] = rhs[i]; @@ -222,6 +229,7 @@ class String : public Object { uint64_t res_size = lhs_size + rhs_size; auto pod = TRY(arena.alloc(res_size * sizeof(char32_t))); + pod->header.tag = Tag::String; pod->size = res_size; memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_size); memcpy(pod->data + lhs_size, rhs._value->data, sizeof(char32_t) * rhs_size); @@ -233,6 +241,7 @@ class String : public Object { if (start > end) return ErrorCode::IndexOutOfRange; uint64_t res_size = end - start; auto pod = TRY(arena.alloc(res_size * sizeof(char32_t))); + pod->header.tag = Tag::String; pod->size = res_size; memcpy(pod->data, _value->data + start, sizeof(char32_t) * res_size); @@ -258,11 +267,12 @@ class Symbol : public Object { } static Result create(Arena& arena, char32_t* chars, int64_t size) { - auto pod_symbol = TRY(arena.alloc(size * sizeof(char32_t))); + auto pod = TRY(arena.alloc(size * sizeof(char32_t))); + pod->header.tag = Tag::Symbol; - memcpy(pod_symbol->data, chars, size * sizeof(char32_t)); + memcpy(pod->data, chars, size * sizeof(char32_t)); - return Symbol(TRY(MkGcRoot(pod_symbol, arena))); + return Symbol(TRY(MkGcRoot(pod, arena))); } static Result create(Arena& arena, String& rhs); @@ -336,6 +346,7 @@ class Int64 : public Object { static Result create(Arena& arena, double val) { auto pod = TRY(arena.alloc()); + pod->header.tag = Tag::Int64; pod->value = val; return Int64(TRY(MkGcRoot(pod, arena))); @@ -363,6 +374,7 @@ class Float : public Object { static Result create(Arena& arena, double val) { auto pod = TRY(arena.alloc()); + pod->header.tag = Tag::Float; pod->value = val; return Float(TRY(MkGcRoot(pod, arena))); @@ -391,6 +403,7 @@ class Bool : public Object { static Result create(Arena& arena, bool val) { auto pod = TRY(arena.alloc()); + pod->header.tag = Tag::Bool; pod->value = val; return Bool(TRY(MkGcRoot(pod, arena))); diff --git a/src/vli.cpp b/src/vli.cpp index 662bcde..3685ebe 100644 --- a/src/vli.cpp +++ b/src/vli.cpp @@ -20,6 +20,7 @@ int main() { std::cout << int(((Int64&)*val).value()) << "\n"; */ + /* { auto s = DIEIF(String::create(arena, "foo")); @@ -27,6 +28,7 @@ int main() { std::cout << "char: " << (char)DIEIF(s[2]) << "\n"; } std::cout << "root count: " << arena.root_count() << "\n"; + */ auto s = DIEIF(String::create(arena, "(1 2 3 \"foo\")")); auto reader = Reader(arena, s); @@ -36,8 +38,17 @@ int main() { auto writer = Writer(arena); auto s2 = DIEIF(writer.write_one(r)); - std::cout << "size: " << s.size() << "\n"; - std::cout << "char: " << (char)DIEIF(s[0]) << "\n"; DIEIF(debug_print(arena, s2)); + + /* + auto one = Value(DIEIF(Int64::create(arena, 1))); + auto nil = Value(DIEIF(Nil::create(arena))); + auto pair = Value(DIEIF(Pair::create(arena, one, nil))); + + auto writer = Writer(arena); + auto s2 = DIEIF(writer.write_one(pair)); + DIEIF(debug_print(arena, s2)); + */ + return 0; } diff --git a/src/writer.cpp b/src/writer.cpp index 2c91ca8..33a3e50 100644 --- a/src/writer.cpp +++ b/src/writer.cpp @@ -26,7 +26,7 @@ Result Writer::write_one(Value& obj) { Result Writer::write_int64(Int64& val) { char tmp[32]; - sprintf(tmp, "%luu64", val.value()); + sprintf(tmp, "%lu", val.value()); size_t len = strlen(tmp); return String::create(_arena, tmp); @@ -159,6 +159,7 @@ Result Writer::write_pair(Pair& val) { res = TRY(res.concat(_arena, first_str)); cur = TRY(pair.rest(_arena)); + is_first = false; } res = TRY(res.concat(_arena, ")"));