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;
|
||||
|
||||
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());
|
||||
|
||||
|
|
|
@ -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)));
|
||||
|
|
15
src/vli.cpp
15
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;
|
||||
}
|
||||
|
|
|
@ -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, ")"));
|
||||
|
|
Loading…
Reference in a new issue