First successful read and write

This commit is contained in:
Konstantin Nazarov 2024-07-29 00:14:30 +01:00
parent 4718780d9d
commit 2f59b0ba12
Signed by: knazarov
GPG key ID: 4CFE0A42FA409C22
4 changed files with 42 additions and 14 deletions

View file

@ -40,6 +40,7 @@ Result<Symbol> Symbol::create(Arena& arena, String& rhs) {
uint64_t res_size = rhs_size;
auto pod = TRY(arena.alloc<PodSymbol>(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> ByteArray::create(Arena& arena, String& str) {
size += utf8_codepoint_size(TRY(str[i]));
}
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char)));
pod->header.tag = Tag::ByteArray;
pod->size = size;
char* res = pod->data;
@ -106,6 +108,7 @@ Result<Value> Bool::copy(Arena& arena) {
Result<Pair> Pair::create(Arena& arena, Value& first, Value& rest) {
auto pod = TRY(arena.alloc<PodPair>());
pod->header.tag = Tag::Pair;
pod->first = OffPtr<PodObject>(pod, first.pod());
pod->rest = OffPtr<PodObject>(pod, rest.pod());

View file

@ -39,6 +39,7 @@ class Nil : public Object {
static Result<Nil> create(Arena& arena) {
auto pod = TRY(arena.alloc<PodNil>());
pod->header.tag = Tag::Nil;
return Nil(TRY(MkGcRoot(pod, arena)));
}
@ -68,6 +69,7 @@ class ByteArray : public Object {
}
static Result<ByteArray> create(Arena& arena, char* chars, int64_t size) {
auto pod = TRY(arena.alloc<PodByteArray>(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<ByteArray> create(Arena& arena, const char* str) {
uint64_t size = strlen(str);
auto pod = TRY(arena.alloc<PodByteArray>(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<String> create(Arena& arena, char32_t* chars, int64_t size) {
auto pod_string = TRY(arena.alloc<PodString>(size * sizeof(char32_t)));
auto pod = TRY(arena.alloc<PodString>(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<String> create(Arena& arena, const char* str) {
uint64_t size = strlen(str);
auto pod_string = TRY(arena.alloc<PodString>(size * sizeof(char32_t)));
auto pod = TRY(arena.alloc<PodString>(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<PodString>(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<PodString>(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<PodString>(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<PodString>(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<Symbol> create(Arena& arena, char32_t* chars, int64_t size) {
auto pod_symbol = TRY(arena.alloc<PodSymbol>(size * sizeof(char32_t)));
auto pod = TRY(arena.alloc<PodSymbol>(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<Symbol> create(Arena& arena, String& rhs);
@ -336,6 +346,7 @@ class Int64 : public Object {
static Result<Int64> create(Arena& arena, double val) {
auto pod = TRY(arena.alloc<PodInt64>());
pod->header.tag = Tag::Int64;
pod->value = val;
return Int64(TRY(MkGcRoot(pod, arena)));
@ -363,6 +374,7 @@ class Float : public Object {
static Result<Float> create(Arena& arena, double val) {
auto pod = TRY(arena.alloc<PodFloat>());
pod->header.tag = Tag::Float;
pod->value = val;
return Float(TRY(MkGcRoot(pod, arena)));
@ -391,6 +403,7 @@ class Bool : public Object {
static Result<Bool> create(Arena& arena, bool val) {
auto pod = TRY(arena.alloc<PodBool>());
pod->header.tag = Tag::Bool;
pod->value = val;
return Bool(TRY(MkGcRoot(pod, arena)));

View file

@ -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;
}

View file

@ -26,7 +26,7 @@ Result<String> Writer::write_one(Value& obj) {
Result<String> 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<String> 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, ")"));