First successful read and write
This commit is contained in:
parent
4718780d9d
commit
2f59b0ba12
4 changed files with 42 additions and 14 deletions
|
@ -40,6 +40,7 @@ Result<Symbol> Symbol::create(Arena& arena, String& rhs) {
|
||||||
uint64_t res_size = rhs_size;
|
uint64_t res_size = rhs_size;
|
||||||
|
|
||||||
auto pod = TRY(arena.alloc<PodSymbol>(res_size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodSymbol>(res_size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::Symbol;
|
||||||
pod->size = res_size;
|
pod->size = res_size;
|
||||||
memcpy(pod->data, rhs._value->data, sizeof(char32_t) * rhs_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]));
|
size += utf8_codepoint_size(TRY(str[i]));
|
||||||
}
|
}
|
||||||
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char)));
|
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char)));
|
||||||
|
pod->header.tag = Tag::ByteArray;
|
||||||
pod->size = size;
|
pod->size = size;
|
||||||
|
|
||||||
char* res = pod->data;
|
char* res = pod->data;
|
||||||
|
@ -106,6 +108,7 @@ Result<Value> Bool::copy(Arena& arena) {
|
||||||
|
|
||||||
Result<Pair> Pair::create(Arena& arena, Value& first, Value& rest) {
|
Result<Pair> Pair::create(Arena& arena, Value& first, Value& rest) {
|
||||||
auto pod = TRY(arena.alloc<PodPair>());
|
auto pod = TRY(arena.alloc<PodPair>());
|
||||||
|
pod->header.tag = Tag::Pair;
|
||||||
pod->first = OffPtr<PodObject>(pod, first.pod());
|
pod->first = OffPtr<PodObject>(pod, first.pod());
|
||||||
pod->rest = OffPtr<PodObject>(pod, rest.pod());
|
pod->rest = OffPtr<PodObject>(pod, rest.pod());
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ class Nil : public Object {
|
||||||
|
|
||||||
static Result<Nil> create(Arena& arena) {
|
static Result<Nil> create(Arena& arena) {
|
||||||
auto pod = TRY(arena.alloc<PodNil>());
|
auto pod = TRY(arena.alloc<PodNil>());
|
||||||
|
pod->header.tag = Tag::Nil;
|
||||||
|
|
||||||
return Nil(TRY(MkGcRoot(pod, arena)));
|
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) {
|
static Result<ByteArray> create(Arena& arena, char* chars, int64_t size) {
|
||||||
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char)));
|
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char)));
|
||||||
|
pod->header.tag = Tag::ByteArray;
|
||||||
|
|
||||||
memcpy(pod->data, chars, size * sizeof(char32_t));
|
memcpy(pod->data, chars, size * sizeof(char32_t));
|
||||||
pod->size = size;
|
pod->size = size;
|
||||||
|
@ -78,6 +80,7 @@ class ByteArray : public Object {
|
||||||
static Result<ByteArray> create(Arena& arena, const char* str) {
|
static Result<ByteArray> create(Arena& arena, const char* str) {
|
||||||
uint64_t size = strlen(str);
|
uint64_t size = strlen(str);
|
||||||
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodByteArray>(size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::ByteArray;
|
||||||
|
|
||||||
memcpy(pod->data, str, size);
|
memcpy(pod->data, str, size);
|
||||||
pod->size = size;
|
pod->size = size;
|
||||||
|
@ -165,22 +168,24 @@ class String : public Object {
|
||||||
return String(TRY(MkGcRoot(obj, arena)));
|
return String(TRY(MkGcRoot(obj, arena)));
|
||||||
}
|
}
|
||||||
static Result<String> create(Arena& arena, char32_t* chars, int64_t size) {
|
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));
|
memcpy(pod->data, chars, size * sizeof(char32_t));
|
||||||
pod_string->size = size;
|
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) {
|
static Result<String> create(Arena& arena, const char* str) {
|
||||||
uint64_t size = strlen(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];
|
for (uint64_t i = 0; i < size; i++) pod->data[i] = str[i];
|
||||||
pod_string->size = size;
|
pod->size = size;
|
||||||
|
|
||||||
return String(TRY(MkGcRoot(pod_string, arena)));
|
return String(TRY(MkGcRoot(pod, arena)));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t size() { return _value->size; }
|
uint64_t size() { return _value->size; }
|
||||||
|
@ -197,6 +202,7 @@ class String : public Object {
|
||||||
uint64_t res_size = lhs_size + rhs_size;
|
uint64_t res_size = lhs_size + rhs_size;
|
||||||
|
|
||||||
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::String;
|
||||||
pod->size = res_size;
|
pod->size = res_size;
|
||||||
memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_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];
|
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;
|
uint64_t res_size = lhs_size + rhs_size;
|
||||||
|
|
||||||
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::String;
|
||||||
pod->size = res_size;
|
pod->size = res_size;
|
||||||
memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_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];
|
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;
|
uint64_t res_size = lhs_size + rhs_size;
|
||||||
|
|
||||||
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::String;
|
||||||
pod->size = res_size;
|
pod->size = res_size;
|
||||||
memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_size);
|
memcpy(pod->data, _value->data, sizeof(char32_t) * lhs_size);
|
||||||
memcpy(pod->data + lhs_size, rhs._value->data, sizeof(char32_t) * rhs_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;
|
if (start > end) return ErrorCode::IndexOutOfRange;
|
||||||
uint64_t res_size = end - start;
|
uint64_t res_size = end - start;
|
||||||
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
auto pod = TRY(arena.alloc<PodString>(res_size * sizeof(char32_t)));
|
||||||
|
pod->header.tag = Tag::String;
|
||||||
pod->size = res_size;
|
pod->size = res_size;
|
||||||
memcpy(pod->data, _value->data + start, sizeof(char32_t) * 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) {
|
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);
|
static Result<Symbol> create(Arena& arena, String& rhs);
|
||||||
|
@ -336,6 +346,7 @@ class Int64 : public Object {
|
||||||
|
|
||||||
static Result<Int64> create(Arena& arena, double val) {
|
static Result<Int64> create(Arena& arena, double val) {
|
||||||
auto pod = TRY(arena.alloc<PodInt64>());
|
auto pod = TRY(arena.alloc<PodInt64>());
|
||||||
|
pod->header.tag = Tag::Int64;
|
||||||
pod->value = val;
|
pod->value = val;
|
||||||
|
|
||||||
return Int64(TRY(MkGcRoot(pod, arena)));
|
return Int64(TRY(MkGcRoot(pod, arena)));
|
||||||
|
@ -363,6 +374,7 @@ class Float : public Object {
|
||||||
|
|
||||||
static Result<Float> create(Arena& arena, double val) {
|
static Result<Float> create(Arena& arena, double val) {
|
||||||
auto pod = TRY(arena.alloc<PodFloat>());
|
auto pod = TRY(arena.alloc<PodFloat>());
|
||||||
|
pod->header.tag = Tag::Float;
|
||||||
pod->value = val;
|
pod->value = val;
|
||||||
|
|
||||||
return Float(TRY(MkGcRoot(pod, arena)));
|
return Float(TRY(MkGcRoot(pod, arena)));
|
||||||
|
@ -391,6 +403,7 @@ class Bool : public Object {
|
||||||
|
|
||||||
static Result<Bool> create(Arena& arena, bool val) {
|
static Result<Bool> create(Arena& arena, bool val) {
|
||||||
auto pod = TRY(arena.alloc<PodBool>());
|
auto pod = TRY(arena.alloc<PodBool>());
|
||||||
|
pod->header.tag = Tag::Bool;
|
||||||
pod->value = val;
|
pod->value = val;
|
||||||
|
|
||||||
return Bool(TRY(MkGcRoot(pod, arena)));
|
return Bool(TRY(MkGcRoot(pod, arena)));
|
||||||
|
|
15
src/vli.cpp
15
src/vli.cpp
|
@ -20,6 +20,7 @@ int main() {
|
||||||
std::cout << int(((Int64&)*val).value()) << "\n";
|
std::cout << int(((Int64&)*val).value()) << "\n";
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
auto s = DIEIF(String::create(arena, "foo"));
|
auto s = DIEIF(String::create(arena, "foo"));
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ int main() {
|
||||||
std::cout << "char: " << (char)DIEIF(s[2]) << "\n";
|
std::cout << "char: " << (char)DIEIF(s[2]) << "\n";
|
||||||
}
|
}
|
||||||
std::cout << "root count: " << arena.root_count() << "\n";
|
std::cout << "root count: " << arena.root_count() << "\n";
|
||||||
|
*/
|
||||||
|
|
||||||
auto s = DIEIF(String::create(arena, "(1 2 3 \"foo\")"));
|
auto s = DIEIF(String::create(arena, "(1 2 3 \"foo\")"));
|
||||||
auto reader = Reader(arena, s);
|
auto reader = Reader(arena, s);
|
||||||
|
@ -36,8 +38,17 @@ int main() {
|
||||||
auto writer = Writer(arena);
|
auto writer = Writer(arena);
|
||||||
auto s2 = DIEIF(writer.write_one(r));
|
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));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ Result<String> Writer::write_one(Value& obj) {
|
||||||
|
|
||||||
Result<String> Writer::write_int64(Int64& val) {
|
Result<String> Writer::write_int64(Int64& val) {
|
||||||
char tmp[32];
|
char tmp[32];
|
||||||
sprintf(tmp, "%luu64", val.value());
|
sprintf(tmp, "%lu", val.value());
|
||||||
size_t len = strlen(tmp);
|
size_t len = strlen(tmp);
|
||||||
|
|
||||||
return String::create(_arena, tmp);
|
return String::create(_arena, tmp);
|
||||||
|
@ -159,6 +159,7 @@ Result<String> Writer::write_pair(Pair& val) {
|
||||||
res = TRY(res.concat(_arena, first_str));
|
res = TRY(res.concat(_arena, first_str));
|
||||||
|
|
||||||
cur = TRY(pair.rest(_arena));
|
cur = TRY(pair.rest(_arena));
|
||||||
|
is_first = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = TRY(res.concat(_arena, ")"));
|
res = TRY(res.concat(_arena, ")"));
|
||||||
|
|
Loading…
Reference in a new issue