Skip to content

Commit

Permalink
refactors and review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
Samy-33 committed Mar 9, 2024
1 parent 67d4771 commit 7f750fc
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 20 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ add_library(
src/cpp/jank/runtime/obj/persistent_array_map.cpp
src/cpp/jank/runtime/obj/persistent_hash_map.cpp
src/cpp/jank/runtime/obj/transient_hash_map.cpp
src/cpp/jank/runtime/obj/transient_vector.cpp
src/cpp/jank/runtime/obj/persistent_set.cpp
src/cpp/jank/runtime/obj/persistent_string.cpp
src/cpp/jank/runtime/obj/cons.cpp
Expand Down
9 changes: 6 additions & 3 deletions include/cpp/jank/runtime/obj/persistent_vector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ namespace jank::runtime
{
namespace obj
{
using persistent_vector = static_object<object_type::persistent_vector>;
using persistent_vector_ptr = native_box<persistent_vector>;

using transient_vector = static_object<object_type::transient_vector>;
using transient_vector_ptr = native_box<transient_vector>;
}
Expand Down Expand Up @@ -69,4 +66,10 @@ namespace jank::runtime
option<object_ptr> meta;
mutable native_hash hash{};
};

namespace obj
{
using persistent_vector = static_object<object_type::persistent_vector>;
using persistent_vector_ptr = native_box<persistent_vector>;
}
}
7 changes: 6 additions & 1 deletion include/cpp/jank/runtime/obj/transient_vector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ namespace jank::runtime

/* behavior::callable */
object_ptr call(object_ptr) const;
object_ptr call(object_ptr, object_ptr) const;

/* behavior::associatively_readable */
object_ptr get(object_ptr idx) const;
object_ptr get(object_ptr idx, object_ptr fallback) const;
object_ptr get_entry(object_ptr key) const;
native_bool contains(object_ptr key) const;

void assert_active() const;

Expand Down
3 changes: 2 additions & 1 deletion src/cpp/jank/evaluate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,8 @@ namespace jank::evaluate
}
}
}
else if constexpr(std::same_as<T, runtime::obj::persistent_set>)
else if constexpr(std::same_as<T, runtime::obj::persistent_set>
|| std::same_as<T, runtime::obj::transient_vector>)
{
auto const s(expr.arg_exprs.size());
if(s != 1)
Expand Down
2 changes: 2 additions & 0 deletions src/cpp/jank/runtime/behavior/callable.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "jank/runtime/obj/persistent_vector.hpp"
#include <iostream>

#include <fmt/core.h>
Expand Down Expand Up @@ -69,6 +70,7 @@ namespace jank::runtime
else if constexpr(std::same_as<T, obj::persistent_set>
|| std::same_as<T, obj::persistent_hash_map>
|| std::same_as<T, obj::persistent_array_map>
|| std::same_as<T, obj::transient_vector>
|| std::same_as<T, obj::keyword>)
{
return typed_source->call(a1);
Expand Down
84 changes: 69 additions & 15 deletions src/cpp/jank/runtime/obj/transient_vector.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#include "jank/runtime/detail/object_util.hpp"
#include "jank/runtime/erasure.hpp"
#include "jank/type.hpp"
#include <jank/runtime/detail/object_util.hpp>
#include <jank/runtime/erasure.hpp>
#include <jank/runtime/obj/persistent_vector_sequence.hpp>
#include <jank/runtime/util.hpp>
#include <jank/runtime/obj/native_function_wrapper.hpp>
#include <jank/runtime/obj/transient_vector.hpp>
#include <stdexcept>
#include <jank/type.hpp>

namespace jank::runtime
{
Expand Down Expand Up @@ -65,46 +65,100 @@ namespace jank::runtime
{
assert_active();
active = false;
return make_box<obj::persistent_vector>(std::move(data));
return make_box<obj::persistent_vector>(data.persistent());
}

object_ptr obj::transient_vector::call(object_ptr const o) const
object_ptr obj::transient_vector::call(object_ptr const idx) const
{
assert_active();
if(o->type == object_type::integer)
if(idx->type == object_type::integer)
{
auto const i(expect_object<obj::integer>(o)->data);
auto const i(expect_object<obj::integer>(idx)->data);
if(i < 0 || data.size() <= static_cast<size_t>(i))
{
throw std::runtime_error{
fmt::format("Index out of bound; index = {}, count = {}", i, count())
};
}

return data[i];
}
else
{
throw std::runtime_error{ fmt::format("key must be an integer; found {}",
runtime::detail::to_string(idx)) };
}
}

object_ptr obj::transient_vector::get(object_ptr idx) const
{
assert_active();
if(idx->type == object_type::integer)
{
auto const i(expect_object<obj::integer>(idx)->data);
if(i < 0 || data.size() <= static_cast<size_t>(i))
{
return obj::nil::nil_const();
}

return data.at(i);
return data[i];
}
else
{
throw std::runtime_error{ fmt::format("key must be an integer; found {}",
runtime::detail::to_string(o)) };
runtime::detail::to_string(idx)) };
}
}

object_ptr obj::transient_vector::call(object_ptr const o, object_ptr const fallback) const
object_ptr obj::transient_vector::get(object_ptr idx, object_ptr fallback) const
{
assert_active();
if(o->type == object_type::integer)
if(idx->type == object_type::integer)
{
auto const i(expect_object<obj::integer>(o)->data);
auto const i(expect_object<obj::integer>(idx)->data);
if(i < 0 || data.size() <= static_cast<size_t>(i))
{
return fallback;
}

return data.at(i);
return data[i];
}
else
{
throw std::runtime_error{ fmt::format("key must be an integer; found {}",
runtime::detail::to_string(o)) };
runtime::detail::to_string(idx)) };
}
}

object_ptr obj::transient_vector::get_entry(object_ptr const key) const
{
if(key->type == object_type::integer)
{
auto const i(expect_object<obj::integer>(key)->data);
if(i < 0 || data.size() <= static_cast<size_t>(i))
{
return obj::nil::nil_const();
}
/* TODO: Map entry type? */
return make_box<obj::persistent_vector>(key, data[i]);
}
else
{
throw std::runtime_error{ fmt::format("get_entry on a vector must be an integer; found {}",
runtime::detail::to_string(key)) };
}
}

native_bool obj::transient_vector::contains(object_ptr const key) const
{
if(key->type == object_type::integer)
{
auto const i(expect_object<obj::integer>(key)->data);
return i >= 0 && static_cast<size_t>(i) < data.size();
}
else
{
return false;
}
}

Expand Down

0 comments on commit 7f750fc

Please sign in to comment.