chore(runtime/lean_obj): remove lean_ prefix

This commit is contained in:
Leonardo de Moura 2018-05-20 10:13:44 -07:00
parent e081f9ad78
commit 2d604e7d25
6 changed files with 271 additions and 271 deletions

View file

@ -160,7 +160,7 @@ do mk_copyright,
emit "// Generated using script: ../../gen/apply.lean\n",
emit "#include \"runtime/apply.h\"\n",
emit "namespace lean {\n",
emit "#define obj lean_obj\n",
emit "#define obj object\n",
emit "#define fx(i) closure_arg_cptr(f)[i]\n",
mk_fix_args,
max.mrepeat $ λ i, mk_typedef_fn (i+1),
@ -174,9 +174,9 @@ do mk_copyright,
mk_apply_n max,
emit "}\n"
-- Make string: "lean_obj* a1, lean_obj* a2, ..., lean_obj* an"
-- Make string: "object* a1, object* a2, ..., object** an"
def mk_arg_decls' (n : nat) : string :=
string.join $ (n.repeat (λ i r, r ++ [sformat! "lean_obj* a{i+1}"]) []).intersperse ", "
string.join $ (n.repeat (λ i r, r ++ [sformat! "object* a{i+1}"]) []).intersperse ", "
def mk_apply_h (max : nat) : m unit :=
do mk_copyright,
@ -187,10 +187,10 @@ do mk_copyright,
emit "namespace lean {\n",
max.mrepeat $ λ i,
let args := mk_arg_decls' (i+1) in
emit $ sformat! "lean_obj* apply_{i+1}(lean_obj* f, {args});\n",
emit "lean_obj* apply_n(lean_obj* f, unsigned n, lean_obj** args);\n",
emit $ sformat! "object* apply_{i+1}(object* f, {args});\n",
emit "object* apply_n(object* f, unsigned n, object** args);\n",
emit $ sformat! "// pre: n > {max}\n",
emit "lean_obj* apply_m(lean_obj* f, unsigned n, lean_obj** args);\n",
emit "object* apply_m(object* f, unsigned n, object** args);\n",
emit "}\n"
-- #eval (mk_apply_cpp lean.closure_max_args).run none

View file

@ -36,7 +36,7 @@ def finalize_prefix := "_lean_finalize_"
def file_header (runtime_dir : string) :=
"#include <" ++ runtime_dir ++ "/lean_obj.h>\n"
++ "#include <" ++ runtime_dir ++ "/apply.h>\n"
++ "typedef lean::lean_obj obj;"
++ "typedef lean::object obj;"
structure extract_env :=
(cfg : extract_cpp_config)

View file

@ -8,7 +8,7 @@ Author: Leonardo de Moura
// Generated using script: ../../gen/apply.lean
#include "runtime/apply.h"
namespace lean {
#define obj lean_obj
#define obj object
#define fx(i) closure_arg_cptr(f)[i]
static obj* fix_args(obj* f, unsigned n, obj*const* as) {

View file

@ -9,23 +9,23 @@ Author: Leonardo de Moura
#pragma once
#include "runtime/lean_obj.h"
namespace lean {
lean_obj* apply_1(lean_obj* f, lean_obj* a1);
lean_obj* apply_2(lean_obj* f, lean_obj* a1, lean_obj* a2);
lean_obj* apply_3(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3);
lean_obj* apply_4(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4);
lean_obj* apply_5(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5);
lean_obj* apply_6(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6);
lean_obj* apply_7(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7);
lean_obj* apply_8(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8);
lean_obj* apply_9(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9);
lean_obj* apply_10(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10);
lean_obj* apply_11(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11);
lean_obj* apply_12(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11, lean_obj* a12);
lean_obj* apply_13(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11, lean_obj* a12, lean_obj* a13);
lean_obj* apply_14(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11, lean_obj* a12, lean_obj* a13, lean_obj* a14);
lean_obj* apply_15(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11, lean_obj* a12, lean_obj* a13, lean_obj* a14, lean_obj* a15);
lean_obj* apply_16(lean_obj* f, lean_obj* a1, lean_obj* a2, lean_obj* a3, lean_obj* a4, lean_obj* a5, lean_obj* a6, lean_obj* a7, lean_obj* a8, lean_obj* a9, lean_obj* a10, lean_obj* a11, lean_obj* a12, lean_obj* a13, lean_obj* a14, lean_obj* a15, lean_obj* a16);
lean_obj* apply_n(lean_obj* f, unsigned n, lean_obj** args);
object* apply_1(object* f, object* a1);
object* apply_2(object* f, object* a1, object* a2);
object* apply_3(object* f, object* a1, object* a2, object* a3);
object* apply_4(object* f, object* a1, object* a2, object* a3, object* a4);
object* apply_5(object* f, object* a1, object* a2, object* a3, object* a4, object* a5);
object* apply_6(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6);
object* apply_7(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7);
object* apply_8(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8);
object* apply_9(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9);
object* apply_10(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10);
object* apply_11(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11);
object* apply_12(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11, object* a12);
object* apply_13(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11, object* a12, object* a13);
object* apply_14(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11, object* a12, object* a13, object* a14);
object* apply_15(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11, object* a12, object* a13, object* a14, object* a15);
object* apply_16(object* f, object* a1, object* a2, object* a3, object* a4, object* a5, object* a6, object* a7, object* a8, object* a9, object* a10, object* a11, object* a12, object* a13, object* a14, object* a15, object* a16);
object* apply_n(object* f, unsigned n, object** args);
// pre: n > 16
lean_obj* apply_m(lean_obj* f, unsigned n, lean_obj** args);
object* apply_m(object* f, unsigned n, object** args);
}

View file

@ -10,26 +10,26 @@ Author: Leonardo de Moura
#include "runtime/utf8.h"
namespace lean {
size_t obj_byte_size(lean_obj * o) {
size_t obj_byte_size(object * o) {
switch (get_kind(o)) {
case lean_obj_kind::Constructor: return cnstr_byte_size(o);
case lean_obj_kind::Closure: return closure_byte_size(o);
case lean_obj_kind::Array: return array_byte_size(o);
case lean_obj_kind::ScalarArray: return sarray_byte_size(o);
case lean_obj_kind::MPZ: return sizeof(lean_mpz);
case lean_obj_kind::External: lean_unreachable();
case object_kind::Constructor: return cnstr_byte_size(o);
case object_kind::Closure: return closure_byte_size(o);
case object_kind::Array: return array_byte_size(o);
case object_kind::ScalarArray: return sarray_byte_size(o);
case object_kind::MPZ: return sizeof(mpz_object);
case object_kind::External: lean_unreachable();
}
lean_unreachable();
}
size_t obj_header_size(lean_obj * o) {
size_t obj_header_size(object * o) {
switch (get_kind(o)) {
case lean_obj_kind::Constructor: return sizeof(lean_cnstr);
case lean_obj_kind::Closure: return sizeof(lean_closure);
case lean_obj_kind::Array: return sizeof(lean_array);
case lean_obj_kind::ScalarArray: return sizeof(lean_sarray);
case lean_obj_kind::MPZ: return sizeof(lean_mpz);
case lean_obj_kind::External: lean_unreachable();
case object_kind::Constructor: return sizeof(constructor);
case object_kind::Closure: return sizeof(closure);
case object_kind::Array: return sizeof(array);
case object_kind::ScalarArray: return sizeof(sarray);
case object_kind::MPZ: return sizeof(mpz_object);
case object_kind::External: lean_unreachable();
}
lean_unreachable();
}
@ -37,64 +37,64 @@ size_t obj_header_size(lean_obj * o) {
/* We use the field m_rc to implement a linked list of lean objects to be deleted.
This hack is safe because m_rc has type uintptr_t. */
static_assert(sizeof(atomic<rc_type>) == sizeof(lean_obj*), "unexpected atomic<rc_type> size, the object GC assumes these two types have the same size"); // NOLINT
static_assert(sizeof(atomic<rc_type>) == sizeof(object*), "unexpected atomic<rc_type> size, the object GC assumes these two types have the same size"); // NOLINT
inline lean_obj * get_next(lean_obj * o) {
inline object * get_next(object * o) {
lean_assert(o == static_cast<void*>(&(o->m_rc))); // The object GC relies on the fact that the first field of a structure is stored at offset 0
return *reinterpret_cast<lean_obj**>(o);
return *reinterpret_cast<object**>(o);
}
inline void set_next(lean_obj * o, lean_obj * n) {
inline void set_next(object * o, object * n) {
lean_assert(o == static_cast<void*>(&(o->m_rc))); // The object GC relies on the fact that the first field of a structure is stored at offset 0
*reinterpret_cast<lean_obj**>(o) = n;
*reinterpret_cast<object**>(o) = n;
}
inline void push_back(lean_obj * & todo, lean_obj * v) {
inline void push_back(object * & todo, object * v) {
set_next(v, todo);
todo = v;
}
inline lean_obj * pop_back(lean_obj * & todo) {
lean_obj * r = todo;
inline object * pop_back(object * & todo) {
object * r = todo;
todo = get_next(todo);
return r;
}
inline void dec_ref(lean_obj * o, lean_obj* & todo) {
inline void dec_ref(object * o, object* & todo) {
if (!is_scalar(o) && dec_ref_core(o))
push_back(todo, o);
}
void del(lean_obj * o) {
lean_obj * todo = nullptr;
void del(object * o) {
object * todo = nullptr;
while (true) {
switch (get_kind(o)) {
case lean_obj_kind::Constructor: {
lean_obj ** it = cnstr_obj_cptr(o);
lean_obj ** end = it + cnstr_num_objs(o);
case object_kind::Constructor: {
object ** it = cnstr_obj_cptr(o);
object ** end = it + cnstr_num_objs(o);
for (; it != end; ++it) dec_ref(*it, todo);
free(o);
break;
}
case lean_obj_kind::Closure: {
lean_obj ** it = closure_arg_cptr(o);
lean_obj ** end = it + closure_num_fixed(o);
case object_kind::Closure: {
object ** it = closure_arg_cptr(o);
object ** end = it + closure_num_fixed(o);
for (; it != end; ++it) dec_ref(*it, todo);
free(o);
break;
}
case lean_obj_kind::Array: {
lean_obj ** it = array_cptr(o);
lean_obj ** end = it + array_size(o);
case object_kind::Array: {
object ** it = array_cptr(o);
object ** end = it + array_size(o);
for (; it != end; ++it) dec_ref(*it, todo);
free(o);
break;
}
case lean_obj_kind::ScalarArray:
case object_kind::ScalarArray:
free(o); break;
case lean_obj_kind::MPZ:
case object_kind::MPZ:
dealloc_mpz(o); break;
case lean_obj_kind::External:
case object_kind::External:
dealloc_external(o); break;
}
/* We can use a counter to avoid pauses at `del` when many objects
@ -109,13 +109,13 @@ void del(lean_obj * o) {
/* Scalar arrays */
static lean_obj * sarray_ensure_capacity(lean_obj * o, size_t extra) {
static object * sarray_ensure_capacity(object * o, size_t extra) {
lean_assert(!is_shared(o));
size_t sz = sarray_size(o);
size_t cap = sarray_capacity(o);
if (sz + extra > cap) {
unsigned esize = sarray_elem_size(o);
lean_obj * new_o = alloc_sarray(esize, sz, cap + sz + extra);
object * new_o = alloc_sarray(esize, sz, cap + sz + extra);
lean_assert(sarray_capacity(new_o) >= sz + extra);
memcpy(sarray_cptr<char>(new_o), sarray_cptr<char>(o), esize * sz);
free(o);
@ -127,23 +127,23 @@ static lean_obj * sarray_ensure_capacity(lean_obj * o, size_t extra) {
/* Strings */
lean_obj * mk_string(char const * s) {
object * mk_string(char const * s) {
size_t sz = strlen(s);
size_t len = utf8_strlen(s);
size_t rsz = sz + sizeof(size_t) + 1;
lean_obj * r = alloc_sarray(1, rsz, rsz);
object * r = alloc_sarray(1, rsz, rsz);
sarray_set_data<size_t>(r, 0, len);
memcpy(sarray_cptr<char>(r) + sizeof(size_t), s, sz+1);
return r;
}
lean_obj * mk_string(std::string const & s) {
object * mk_string(std::string const & s) {
return mk_string(s.c_str());
}
lean_obj * string_push(lean_obj * s, unsigned c) {
object * string_push(object * s, unsigned c) {
lean_assert(!is_shared(s));
lean_obj * r = sarray_ensure_capacity(s, 5);
object * r = sarray_ensure_capacity(s, 5);
size_t sz = sarray_size(r);
unsigned consumed = push_unicode_scalar(sarray_cptr<char>(r) + sz - 1, c);
sarray_set_size(r, sz + consumed);
@ -152,7 +152,7 @@ lean_obj * string_push(lean_obj * s, unsigned c) {
return r;
}
lean_obj * string_append(lean_obj * s1, lean_obj * s2) {
object * string_append(object * s1, object * s2) {
lean_assert(!is_shared(s1));
size_t sz1 = sarray_size(s1);
size_t sz2 = sarray_size(s2);
@ -160,7 +160,7 @@ lean_obj * string_append(lean_obj * s1, lean_obj * s2) {
size_t len2 = string_len(s2);
lean_assert(sz2 >= sizeof(size_t));
sz2 -= sizeof(size_t);
lean_obj * r = sarray_ensure_capacity(s1, sz2-1);
object * r = sarray_ensure_capacity(s1, sz2-1);
if (s1 == s2) s2 = r;
memcpy(sarray_cptr<char>(r) + sz1 - 1, c_str(s2), sz2 - 1);
unsigned new_sz = sz1 + sz2 - 1;
@ -172,7 +172,7 @@ lean_obj * string_append(lean_obj * s1, lean_obj * s2) {
/* Natural numbers */
lean_obj * nat_big_add(lean_obj * a1, lean_obj * a2) {
object * nat_big_add(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1))
return mk_nat_obj_core(unbox(a1) + mpz_value(a2));
@ -182,7 +182,7 @@ lean_obj * nat_big_add(lean_obj * a1, lean_obj * a2) {
return mk_nat_obj_core(mpz_value(a1) + mpz_value(a2));
}
lean_obj * nat_big_sub(lean_obj * a1, lean_obj * a2) {
object * nat_big_sub(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1)) {
lean_assert(unbox(a1) < mpz_value(a2));
@ -198,7 +198,7 @@ lean_obj * nat_big_sub(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_mul(lean_obj * a1, lean_obj * a2) {
object * nat_big_mul(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1))
return mk_nat_obj_core(unbox(a1) * mpz_value(a2));
@ -208,7 +208,7 @@ lean_obj * nat_big_mul(lean_obj * a1, lean_obj * a2) {
return mk_nat_obj_core(mpz_value(a1) * mpz_value(a2));
}
lean_obj * nat_big_div(lean_obj * a1, lean_obj * a2) {
object * nat_big_div(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1)) {
lean_assert(mpz_value(a2) != 0);
@ -223,7 +223,7 @@ lean_obj * nat_big_div(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_mod(lean_obj * a1, lean_obj * a2) {
object * nat_big_mod(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1)) {
lean_assert(mpz_value(a2) != 0);
@ -237,7 +237,7 @@ lean_obj * nat_big_mod(lean_obj * a1, lean_obj * a2) {
}
}
bool nat_big_eq(lean_obj * a1, lean_obj * a2) {
bool nat_big_eq(object * a1, object * a2) {
if (is_scalar(a1)) {
lean_assert(unbox(a1) != mpz_value(a2))
return false;
@ -249,7 +249,7 @@ bool nat_big_eq(lean_obj * a1, lean_obj * a2) {
}
}
bool nat_big_le(lean_obj * a1, lean_obj * a2) {
bool nat_big_le(object * a1, object * a2) {
if (is_scalar(a1)) {
lean_assert(unbox(a1) < mpz_value(a2))
return true;
@ -261,7 +261,7 @@ bool nat_big_le(lean_obj * a1, lean_obj * a2) {
}
}
bool nat_big_lt(lean_obj * a1, lean_obj * a2) {
bool nat_big_lt(object * a1, object * a2) {
if (is_scalar(a1)) {
lean_assert(unbox(a1) < mpz_value(a2));
return true;
@ -273,7 +273,7 @@ bool nat_big_lt(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_land(lean_obj * a1, lean_obj * a2) {
object * nat_big_land(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1))
return mk_nat_obj(mpz(unbox(a1)) & mpz_value(a2));
@ -283,7 +283,7 @@ lean_obj * nat_big_land(lean_obj * a1, lean_obj * a2) {
return mk_nat_obj(mpz_value(a1) & mpz_value(a2));
}
lean_obj * nat_big_lor(lean_obj * a1, lean_obj * a2) {
object * nat_big_lor(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1))
return mk_nat_obj(mpz(unbox(a1)) | mpz_value(a2));
@ -293,7 +293,7 @@ lean_obj * nat_big_lor(lean_obj * a1, lean_obj * a2) {
return mk_nat_obj(mpz_value(a1) | mpz_value(a2));
}
lean_obj * nat_big_lxor(lean_obj * a1, lean_obj * a2) {
object * nat_big_lxor(object * a1, object * a2) {
lean_assert(!is_scalar(a1) || !is_scalar(a2));
if (is_scalar(a1))
return mk_nat_obj(mpz(unbox(a1)) ^ mpz_value(a2));
@ -305,7 +305,7 @@ lean_obj * nat_big_lxor(lean_obj * a1, lean_obj * a2) {
/* Integers */
lean_obj * int_big_add(lean_obj * a1, lean_obj * a2) {
object * int_big_add(object * a1, object * a2) {
if (is_scalar(a1))
return mk_int_obj(int2int(a1) + mpz_value(a2));
else if (is_scalar(a2))
@ -314,7 +314,7 @@ lean_obj * int_big_add(lean_obj * a1, lean_obj * a2) {
return mk_int_obj(mpz_value(a1) + mpz_value(a2));
}
lean_obj * int_big_sub(lean_obj * a1, lean_obj * a2) {
object * int_big_sub(object * a1, object * a2) {
if (is_scalar(a1))
return mk_int_obj(int2int(a1) - mpz_value(a2));
else if (is_scalar(a2))
@ -323,7 +323,7 @@ lean_obj * int_big_sub(lean_obj * a1, lean_obj * a2) {
return mk_int_obj(mpz_value(a1) - mpz_value(a2));
}
lean_obj * int_big_mul(lean_obj * a1, lean_obj * a2) {
object * int_big_mul(object * a1, object * a2) {
if (is_scalar(a1))
return mk_int_obj(int2int(a1) * mpz_value(a2));
else if (is_scalar(a2))
@ -332,7 +332,7 @@ lean_obj * int_big_mul(lean_obj * a1, lean_obj * a2) {
return mk_int_obj(mpz_value(a1) * mpz_value(a2));
}
lean_obj * int_big_div(lean_obj * a1, lean_obj * a2) {
object * int_big_div(object * a1, object * a2) {
if (is_scalar(a1))
return mk_int_obj(int2int(a1) / mpz_value(a2));
else if (is_scalar(a2))
@ -341,7 +341,7 @@ lean_obj * int_big_div(lean_obj * a1, lean_obj * a2) {
return mk_int_obj(mpz_value(a1) / mpz_value(a2));
}
lean_obj * int_big_rem(lean_obj * a1, lean_obj * a2) {
object * int_big_rem(object * a1, object * a2) {
if (is_scalar(a1))
return mk_int_obj(mpz(int2int(a1)) % mpz_value(a2));
else if (is_scalar(a2))
@ -350,7 +350,7 @@ lean_obj * int_big_rem(lean_obj * a1, lean_obj * a2) {
return mk_int_obj(mpz_value(a1) % mpz_value(a2));
}
bool int_big_eq(lean_obj * a1, lean_obj * a2) {
bool int_big_eq(object * a1, object * a2) {
if (is_scalar(a1)) {
lean_assert(int2int(a1) != mpz_value(a2))
return false;
@ -362,7 +362,7 @@ bool int_big_eq(lean_obj * a1, lean_obj * a2) {
}
}
bool int_big_le(lean_obj * a1, lean_obj * a2) {
bool int_big_le(object * a1, object * a2) {
if (is_scalar(a1)) {
return int2int(a1) <= mpz_value(a2);
} else if (is_scalar(a2)) {
@ -372,7 +372,7 @@ bool int_big_le(lean_obj * a1, lean_obj * a2) {
}
}
bool int_big_lt(lean_obj * a1, lean_obj * a2) {
bool int_big_lt(object * a1, object * a2) {
if (is_scalar(a1)) {
return int2int(a1) < mpz_value(a2);
} else if (is_scalar(a2)) {
@ -384,12 +384,12 @@ bool int_big_lt(lean_obj * a1, lean_obj * a2) {
/* Debugging helper functions */
void dbg_print_str(lean_obj * o) {
void dbg_print_str(object * o) {
lean_assert(is_string(o));
std::cout << c_str(o) << "\n";
}
void dbg_print_num(lean_obj * o) {
void dbg_print_num(object * o) {
if (is_scalar(o)) {
std::cout << unbox(o) << "\n";
} else {
@ -398,5 +398,5 @@ void dbg_print_num(lean_obj * o) {
}
}
extern "C" void lean_dbg_print_str(lean::lean_obj* o) { lean::dbg_print_str(o); }
extern "C" void lean_dbg_print_num(lean::lean_obj* o) { lean::dbg_print_num(o); }
extern "C" void lean_dbg_print_str(lean::object* o) { lean::dbg_print_str(o); }
extern "C" void lean_dbg_print_num(lean::object* o) { lean::dbg_print_num(o); }

View file

@ -23,16 +23,16 @@ inline void * alloca(size_t s) {
#endif
}
enum class lean_obj_kind { Constructor, Closure, Array, ScalarArray, MPZ, External };
enum class object_kind { Constructor, Closure, Array, ScalarArray, MPZ, External };
/* The reference counter is a uintptr_t, because at deletion time, we use this field to implement
a linked list of objects to be deleted. */
typedef uintptr_t rc_type;
struct lean_obj {
struct object {
atomic<rc_type> m_rc;
unsigned m_kind:16;
lean_obj(lean_obj_kind k):m_rc(1), m_kind(static_cast<unsigned>(k)) {}
object(object_kind k):m_rc(1), m_kind(static_cast<unsigned>(k)) {}
};
/* We can represent inductive datatypes that have:
@ -43,21 +43,21 @@ struct lean_obj {
We only need m_scalar_size for implementing sanity checks at runtime.
Header size: 12 bytes in 32 bit machines and 16 bytes in 64 bit machines. */
struct lean_cnstr : public lean_obj {
struct constructor : public object {
unsigned m_tag:16;
unsigned m_num_objs:16;
unsigned m_scalar_size:16;
lean_cnstr(unsigned tag, unsigned num_objs, unsigned scalar_sz):
lean_obj(lean_obj_kind::Constructor), m_tag(tag), m_num_objs(num_objs), m_scalar_size(scalar_sz) {}
constructor(unsigned tag, unsigned num_objs, unsigned scalar_sz):
object(object_kind::Constructor), m_tag(tag), m_num_objs(num_objs), m_scalar_size(scalar_sz) {}
};
/* Array of objects.
Header size: 16 bytes in 32 bit machines and 32 bytes in 64 bit machines. */
struct lean_array : public lean_obj {
struct array : public object {
size_t m_size;
size_t m_capacity;
lean_array(size_t sz, size_t c):
lean_obj(lean_obj_kind::Array), m_size(sz), m_capacity(c) {}
array(size_t sz, size_t c):
object(object_kind::Array), m_size(sz), m_capacity(c) {}
};
/* Array of scalar values.
@ -65,15 +65,15 @@ struct lean_array : public lean_obj {
The field m_elem_size is only needed for implementing sanity checks at runtime.
Header size: 16 bytes in 32 bit machines and 32 bytes in 64 bit machines. */
struct lean_sarray : public lean_obj {
struct sarray : public object {
unsigned m_elem_size:16; // in bytes
size_t m_size;
size_t m_capacity;
lean_sarray(unsigned esz, size_t sz, size_t c):
lean_obj(lean_obj_kind::ScalarArray), m_elem_size(esz), m_size(sz), m_capacity(c) {}
sarray(unsigned esz, size_t sz, size_t c):
object(object_kind::ScalarArray), m_elem_size(esz), m_size(sz), m_capacity(c) {}
};
typedef lean_obj * (*lean_cfun)(lean_obj *); // NOLINT
typedef object * (*lean_cfun)(object *); // NOLINT
/* Note that `lean_cfun` is a function pointer for a C function of
arity 1. The `apply` operator performs a cast operation.
@ -85,31 +85,31 @@ typedef lean_obj * (*lean_cfun)(lean_obj *); // NOLINT
from bytecodes. We just store an extra argument: the virtual machine
function descriptor. We store in m_fun a pointer to a C function
that extracts the function descriptor and then invokes the VM. */
struct lean_closure : public lean_obj {
struct closure : public object {
unsigned m_arity:16; // number of arguments expected by m_fun.
unsigned m_num_fixed:16; // number of arguments that have been already fixed.
lean_cfun m_fun;
lean_closure(lean_cfun f, unsigned arity, unsigned n):
lean_obj(lean_obj_kind::Closure), m_arity(arity), m_num_fixed(n), m_fun(f) {}
closure(lean_cfun f, unsigned arity, unsigned n):
object(object_kind::Closure), m_arity(arity), m_num_fixed(n), m_fun(f) {}
};
struct lean_mpz : public lean_obj {
struct mpz_object : public object {
mpz m_value;
lean_mpz(mpz const & v):
lean_obj(lean_obj_kind::MPZ), m_value(v) {}
mpz_object(mpz const & v):
object(object_kind::MPZ), m_value(v) {}
};
/* Base class for wrapping external data.
/* Base class for wrapping external_object data.
For example, we use it to wrap the Lean environment object. */
struct lean_external : public lean_obj {
struct external_object : public object {
virtual void dealloc() {}
virtual ~lean_external() {}
virtual ~external_object() {}
};
inline bool is_null(lean_obj * o) { return o == nullptr; }
inline bool is_scalar(lean_obj * o) { return (reinterpret_cast<uintptr_t>(o) & 1) == 1; }
inline lean_obj * box(unsigned n) { return reinterpret_cast<lean_obj*>((static_cast<uintptr_t>(n) << 1) | 1); }
inline unsigned unbox(lean_obj * o) { return reinterpret_cast<uintptr_t>(o) >> 1; }
inline bool is_null(object * o) { return o == nullptr; }
inline bool is_scalar(object * o) { return (reinterpret_cast<uintptr_t>(o) & 1) == 1; }
inline object * box(unsigned n) { return reinterpret_cast<object*>((static_cast<uintptr_t>(n) << 1) | 1); }
inline unsigned unbox(object * o) { return reinterpret_cast<uintptr_t>(o) >> 1; }
/* Generic Lean object delete operation.
@ -125,62 +125,62 @@ inline unsigned unbox(lean_obj * o) { return reinterpret_cast<uintptr_t>(o) >> 1
3- They can unfold the loop that decrements the reference counters for nested objects.
\pre !is_scalar(o); */
void del(lean_obj * o);
void del(object * o);
inline unsigned get_rc(lean_obj * o) { lean_assert(!is_scalar(o)); return atomic_load_explicit(&(o->m_rc), memory_order_acquire); }
inline bool is_shared(lean_obj * o) { return get_rc(o) > 1; }
inline void inc_ref(lean_obj * o) { atomic_fetch_add_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_relaxed); }
inline void dec_shared_ref(lean_obj * o) { lean_assert(is_shared(o)); atomic_fetch_sub_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_acq_rel); }
inline bool dec_ref_core(lean_obj * o) { lean_assert(get_rc(o) > 0); return atomic_fetch_sub_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_acq_rel) == 1; }
inline void dec_ref(lean_obj * o) { if (dec_ref_core(o)) del(o); }
inline void inc(lean_obj * o) { if (!is_scalar(o)) inc_ref(o); }
inline void dec(lean_obj * o) { if (!is_scalar(o)) dec_ref(o); }
inline unsigned get_rc(object * o) { lean_assert(!is_scalar(o)); return atomic_load_explicit(&(o->m_rc), memory_order_acquire); }
inline bool is_shared(object * o) { return get_rc(o) > 1; }
inline void inc_ref(object * o) { atomic_fetch_add_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_relaxed); }
inline void dec_shared_ref(object * o) { lean_assert(is_shared(o)); atomic_fetch_sub_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_acq_rel); }
inline bool dec_ref_core(object * o) { lean_assert(get_rc(o) > 0); return atomic_fetch_sub_explicit(&o->m_rc, static_cast<rc_type>(1), memory_order_acq_rel) == 1; }
inline void dec_ref(object * o) { if (dec_ref_core(o)) del(o); }
inline void inc(object * o) { if (!is_scalar(o)) inc_ref(o); }
inline void dec(object * o) { if (!is_scalar(o)) dec_ref(o); }
/* Testers */
inline lean_obj_kind get_kind(lean_obj * o) { return static_cast<lean_obj_kind>(o->m_kind); }
inline bool is_cnstr(lean_obj * o) { return get_kind(o) == lean_obj_kind::Constructor; }
inline bool is_closure(lean_obj * o) { return get_kind(o) == lean_obj_kind::Closure; }
inline bool is_array(lean_obj * o) { return get_kind(o) == lean_obj_kind::Array; }
inline bool is_sarray(lean_obj * o) { return get_kind(o) == lean_obj_kind::ScalarArray; }
inline bool is_mpz(lean_obj * o) { return get_kind(o) == lean_obj_kind::MPZ; }
inline bool is_external(lean_obj * o) { return get_kind(o) == lean_obj_kind::External; }
inline object_kind get_kind(object * o) { return static_cast<object_kind>(o->m_kind); }
inline bool is_cnstr(object * o) { return get_kind(o) == object_kind::Constructor; }
inline bool is_closure(object * o) { return get_kind(o) == object_kind::Closure; }
inline bool is_array(object * o) { return get_kind(o) == object_kind::Array; }
inline bool is_sarray(object * o) { return get_kind(o) == object_kind::ScalarArray; }
inline bool is_mpz(object * o) { return get_kind(o) == object_kind::MPZ; }
inline bool is_external(object * o) { return get_kind(o) == object_kind::External; }
/* Casting */
inline lean_cnstr * to_cnstr(lean_obj * o) { lean_assert(is_cnstr(o)); return static_cast<lean_cnstr*>(o); }
inline lean_closure * to_closure(lean_obj * o) { lean_assert(is_closure(o)); return static_cast<lean_closure*>(o); }
inline lean_array * to_array(lean_obj * o) { lean_assert(is_array(o)); return static_cast<lean_array*>(o); }
inline lean_sarray * to_sarray(lean_obj * o) { lean_assert(is_sarray(o)); return static_cast<lean_sarray*>(o); }
inline lean_mpz * to_mpz(lean_obj * o) { lean_assert(is_mpz(o)); return static_cast<lean_mpz*>(o); }
inline lean_external * to_external(lean_obj * o) { lean_assert(is_external(o)); return static_cast<lean_external*>(o); }
inline constructor * to_cnstr(object * o) { lean_assert(is_cnstr(o)); return static_cast<constructor*>(o); }
inline closure * to_closure(object * o) { lean_assert(is_closure(o)); return static_cast<closure*>(o); }
inline array * to_array(object * o) { lean_assert(is_array(o)); return static_cast<array*>(o); }
inline sarray * to_sarray(object * o) { lean_assert(is_sarray(o)); return static_cast<sarray*>(o); }
inline mpz_object * to_mpz(object * o) { lean_assert(is_mpz(o)); return static_cast<mpz_object*>(o); }
inline external_object * to_external(object * o) { lean_assert(is_external(o)); return static_cast<external_object*>(o); }
/* The memory associated with all Lean objects but `lean_mpz` and `lean_external` can be deallocated using `free`.
/* The memory associated with all Lean objects but `mpz_object` and `external_object` can be deallocated using `free`.
All fields in these objects are integral types, but `std::atomic<uintptr_t> m_rc`.
However, `std::atomic<Integral>` has a trivial destructor.
In the C++ reference manual (http://en.cppreference.com/w/cpp/atomic/atomic), we find the following sentence:
"Additionally, the resulting std::atomic<Integral> specialization has standard layout, a trivial default constructor,
and a trivial destructor." */
inline void dealloc_mpz(lean_obj * o) { delete to_mpz(o); }
inline void dealloc_external(lean_obj * o) { delete to_external(o); }
inline void dealloc(lean_obj * o) {
inline void dealloc_mpz(object * o) { delete to_mpz(o); }
inline void dealloc_external(object * o) { delete to_external(o); }
inline void dealloc(object * o) {
switch (get_kind(o)) {
case lean_obj_kind::External: dealloc_external(o); break;
case lean_obj_kind::MPZ: dealloc_mpz(o); break;
case object_kind::External: dealloc_external(o); break;
case object_kind::MPZ: dealloc_mpz(o); break;
default: break;
}
}
/* Size of the object in bytes. This function is used for debugging purposes.
\pre !is_scalar(o) && !is_external(o) */
size_t obj_byte_size(lean_obj * o);
size_t obj_byte_size(object * o);
/* Size of the object header in bytes. This function is used for debugging purposes.
\pre !is_scalar(o) && !is_external(o) */
size_t obj_header_size(lean_obj * o);
size_t obj_header_size(object * o);
/* Retrieves data of type `T` stored offset bytes inside of `o` */
template<typename T>
inline T obj_data(lean_obj * o, size_t offset) {
inline T obj_data(object * o, size_t offset) {
lean_assert(obj_header_size(o) <= offset);
lean_assert(offset + sizeof(T) <= obj_byte_size(o));
return *(reinterpret_cast<T *>(reinterpret_cast<char *>(o) + offset));
@ -188,7 +188,7 @@ inline T obj_data(lean_obj * o, size_t offset) {
/* Set object data of type T */
template<typename T>
inline void obj_set_data(lean_obj * o, size_t offset, T v) {
inline void obj_set_data(object * o, size_t offset, T v) {
lean_assert(!is_shared(o));
lean_assert(obj_header_size(o) <= offset);
lean_assert(offset + sizeof(T) <= obj_byte_size(o));
@ -196,104 +196,104 @@ inline void obj_set_data(lean_obj * o, size_t offset, T v) {
}
/* Constructor objects */
inline lean_obj * alloc_cnstr(unsigned tag, unsigned num_objs, unsigned scalar_sz) {
inline object * alloc_cnstr(unsigned tag, unsigned num_objs, unsigned scalar_sz) {
lean_assert(tag < 65536 && num_objs < 65536 && scalar_sz < 65536);
return new (malloc(sizeof(lean_cnstr) + num_objs * sizeof(lean_obj *) + scalar_sz)) lean_cnstr(tag, num_objs, scalar_sz); // NOLINT
return new (malloc(sizeof(constructor) + num_objs * sizeof(object *) + scalar_sz)) constructor(tag, num_objs, scalar_sz); // NOLINT
}
inline unsigned cnstr_tag(lean_obj * o) { return to_cnstr(o)->m_tag; }
inline unsigned cnstr_num_objs(lean_obj * o) { return to_cnstr(o)->m_num_objs; }
inline unsigned cnstr_scalar_size(lean_obj * o) { return to_cnstr(o)->m_scalar_size; }
inline size_t cnstr_byte_size(lean_obj * o) { return sizeof(lean_cnstr) + cnstr_num_objs(o)*sizeof(lean_obj*) + cnstr_scalar_size(o); } // NOLINT
inline lean_obj * cnstr_obj(lean_obj * o, unsigned i) {
inline unsigned cnstr_tag(object * o) { return to_cnstr(o)->m_tag; }
inline unsigned cnstr_num_objs(object * o) { return to_cnstr(o)->m_num_objs; }
inline unsigned cnstr_scalar_size(object * o) { return to_cnstr(o)->m_scalar_size; }
inline size_t cnstr_byte_size(object * o) { return sizeof(constructor) + cnstr_num_objs(o)*sizeof(object*) + cnstr_scalar_size(o); } // NOLINT
inline object * cnstr_obj(object * o, unsigned i) {
lean_assert(i < cnstr_num_objs(o));
return obj_data<lean_obj*>(o, sizeof(lean_cnstr) + sizeof(lean_obj*)*i); // NOLINT
return obj_data<object*>(o, sizeof(constructor) + sizeof(object*)*i); // NOLINT
}
inline lean_obj ** cnstr_obj_cptr(lean_obj * o) {
inline object ** cnstr_obj_cptr(object * o) {
lean_assert(is_cnstr(o));
return reinterpret_cast<lean_obj**>(reinterpret_cast<char*>(o) + sizeof(lean_cnstr));
return reinterpret_cast<object**>(reinterpret_cast<char*>(o) + sizeof(constructor));
}
template<typename T>
inline T cnstr_scalar(lean_obj * o, size_t offset) {
return obj_data<T>(o, sizeof(lean_cnstr) + offset);
inline T cnstr_scalar(object * o, size_t offset) {
return obj_data<T>(o, sizeof(constructor) + offset);
}
inline void cnstr_set_obj(lean_obj * o, unsigned i, lean_obj * v) {
inline void cnstr_set_obj(object * o, unsigned i, object * v) {
lean_assert(i < cnstr_num_objs(o));
obj_set_data(o, sizeof(lean_cnstr) + sizeof(lean_obj*)*i, v); // NOLINT
obj_set_data(o, sizeof(constructor) + sizeof(object*)*i, v); // NOLINT
}
template<typename T>
inline void cnstr_set_scalar(lean_obj * o, unsigned i, T v) {
obj_set_data(o, sizeof(lean_cnstr) + i, v);
inline void cnstr_set_scalar(object * o, unsigned i, T v) {
obj_set_data(o, sizeof(constructor) + i, v);
}
/* Closures */
inline lean_obj * alloc_closure(lean_cfun fun, unsigned arity, unsigned num_fixed) {
inline object * alloc_closure(lean_cfun fun, unsigned arity, unsigned num_fixed) {
lean_assert(arity > 0);
lean_assert(num_fixed < arity);
return new (malloc(sizeof(lean_closure) + num_fixed * sizeof(lean_obj *))) lean_closure(fun, arity, num_fixed); // NOLINT
return new (malloc(sizeof(closure) + num_fixed * sizeof(object *))) closure(fun, arity, num_fixed); // NOLINT
}
inline lean_cfun closure_fun(lean_obj * o) { return to_closure(o)->m_fun; }
inline unsigned closure_arity(lean_obj * o) { return to_closure(o)->m_arity; }
inline unsigned closure_num_fixed(lean_obj * o) { return to_closure(o)->m_num_fixed; }
inline size_t closure_byte_size(lean_obj * o) { return sizeof(lean_closure) + (closure_arity(o) - 1)*sizeof(lean_obj*); } // NOLINT
inline lean_obj * closure_arg(lean_obj * o, unsigned i) {
inline lean_cfun closure_fun(object * o) { return to_closure(o)->m_fun; }
inline unsigned closure_arity(object * o) { return to_closure(o)->m_arity; }
inline unsigned closure_num_fixed(object * o) { return to_closure(o)->m_num_fixed; }
inline size_t closure_byte_size(object * o) { return sizeof(closure) + (closure_arity(o) - 1)*sizeof(object*); } // NOLINT
inline object * closure_arg(object * o, unsigned i) {
lean_assert(i < closure_num_fixed(o));
return obj_data<lean_obj*>(o, sizeof(lean_closure) + sizeof(lean_obj*)*i); // NOLINT
return obj_data<object*>(o, sizeof(closure) + sizeof(object*)*i); // NOLINT
}
inline lean_obj ** closure_arg_cptr(lean_obj * o) {
inline object ** closure_arg_cptr(object * o) {
lean_assert(is_closure(o));
return reinterpret_cast<lean_obj**>(reinterpret_cast<char*>(o) + sizeof(lean_closure));
return reinterpret_cast<object**>(reinterpret_cast<char*>(o) + sizeof(closure));
}
inline void closure_set_arg(lean_obj * o, unsigned i, lean_obj * a) {
inline void closure_set_arg(object * o, unsigned i, object * a) {
lean_assert(i < closure_num_fixed(o));
obj_set_data(o, sizeof(lean_closure) + sizeof(lean_obj*)*i, a); // NOLINT
obj_set_data(o, sizeof(closure) + sizeof(object*)*i, a); // NOLINT
}
inline unsigned tag(lean_obj * o) { if (is_scalar(o)) return unbox(o); else return cnstr_tag(o); }
inline unsigned tag(object * o) { if (is_scalar(o)) return unbox(o); else return cnstr_tag(o); }
/* Array of objects */
inline lean_obj * alloc_array(size_t size, size_t capacity) {
return new (malloc(sizeof(lean_array) + capacity * sizeof(lean_obj *))) lean_array(size, capacity); // NOLINT
inline object * alloc_array(size_t size, size_t capacity) {
return new (malloc(sizeof(array) + capacity * sizeof(object *))) array(size, capacity); // NOLINT
}
inline size_t array_size(lean_obj * o) { return to_array(o)->m_size; }
inline size_t array_capacity(lean_obj * o) { return to_array(o)->m_capacity; }
inline size_t array_byte_size(lean_obj * o) { return sizeof(lean_array) + array_capacity(o)*sizeof(lean_obj*); } // NOLINT
inline lean_obj * array_obj(lean_obj * o, size_t i) {
inline size_t array_size(object * o) { return to_array(o)->m_size; }
inline size_t array_capacity(object * o) { return to_array(o)->m_capacity; }
inline size_t array_byte_size(object * o) { return sizeof(array) + array_capacity(o)*sizeof(object*); } // NOLINT
inline object * array_obj(object * o, size_t i) {
lean_assert(i < array_size(o));
return obj_data<lean_obj*>(o, sizeof(lean_array) + sizeof(lean_obj*)*i); // NOLINT
return obj_data<object*>(o, sizeof(array) + sizeof(object*)*i); // NOLINT
}
inline lean_obj ** array_cptr(lean_obj * o) {
inline object ** array_cptr(object * o) {
lean_assert(is_array(o));
return reinterpret_cast<lean_obj**>(reinterpret_cast<char*>(o) + sizeof(lean_array));
return reinterpret_cast<object**>(reinterpret_cast<char*>(o) + sizeof(array));
}
inline void array_set_size(lean_obj * o, size_t sz) {
inline void array_set_size(object * o, size_t sz) {
lean_assert(is_array(o));
lean_assert(!is_shared(o));
lean_assert(sz <= array_capacity(o));
to_array(o)->m_size = sz;
}
inline void array_set_obj(lean_obj * o, size_t i, lean_obj * v) {
inline void array_set_obj(object * o, size_t i, object * v) {
lean_assert(i < array_size(o));
obj_set_data(o, sizeof(lean_array) + sizeof(lean_obj*)*i, v); // NOLINT
obj_set_data(o, sizeof(array) + sizeof(object*)*i, v); // NOLINT
}
/* Array of scalars */
inline lean_obj * alloc_sarray(unsigned elem_size, size_t size, size_t capacity) {
return new (malloc(sizeof(lean_sarray) + capacity * elem_size)) lean_sarray(elem_size, size, capacity); // NOLINT
inline object * alloc_sarray(unsigned elem_size, size_t size, size_t capacity) {
return new (malloc(sizeof(sarray) + capacity * elem_size)) sarray(elem_size, size, capacity); // NOLINT
}
inline unsigned sarray_elem_size(lean_obj * o) { return to_sarray(o)->m_elem_size; }
inline size_t sarray_size(lean_obj * o) { return to_sarray(o)->m_size; }
inline size_t sarray_capacity(lean_obj * o) { return to_sarray(o)->m_capacity; }
inline size_t sarray_byte_size(lean_obj * o) { return sizeof(lean_sarray) + sarray_capacity(o)*sarray_elem_size(o); } // NOLINT
inline unsigned sarray_elem_size(object * o) { return to_sarray(o)->m_elem_size; }
inline size_t sarray_size(object * o) { return to_sarray(o)->m_size; }
inline size_t sarray_capacity(object * o) { return to_sarray(o)->m_capacity; }
inline size_t sarray_byte_size(object * o) { return sizeof(sarray) + sarray_capacity(o)*sarray_elem_size(o); } // NOLINT
template<typename T>
T * sarray_cptr(lean_obj * o) {
T * sarray_cptr(object * o) {
lean_assert(is_sarray(o)); lean_assert(sarray_elem_size(o) == sizeof(T));
return reinterpret_cast<T*>(reinterpret_cast<char*>(o) + sizeof(lean_sarray));
return reinterpret_cast<T*>(reinterpret_cast<char*>(o) + sizeof(sarray));
}
template<typename T> T sarray_data(lean_obj * o, size_t i) { return sarray_cptr<T>(o)[i]; }
template<typename T> void sarray_set_data(lean_obj * o, size_t i, T v) {
obj_set_data(o, sizeof(lean_sarray) + sizeof(T)*i, v);
template<typename T> T sarray_data(object * o, size_t i) { return sarray_cptr<T>(o)[i]; }
template<typename T> void sarray_set_data(object * o, size_t i, T v) {
obj_set_data(o, sizeof(sarray) + sizeof(T)*i, v);
}
inline void sarray_set_size(lean_obj * o, size_t sz) {
inline void sarray_set_size(object * o, size_t sz) {
lean_assert(is_sarray(o));
lean_assert(!is_shared(o));
lean_assert(sz <= sarray_capacity(o));
@ -302,36 +302,36 @@ inline void sarray_set_size(lean_obj * o, size_t sz) {
/* MPZ */
inline lean_obj * alloc_mpz(mpz const & m) { return new lean_mpz(m); }
inline mpz const & mpz_value(lean_obj * o) { return to_mpz(o)->m_value; }
inline object * alloc_mpz(mpz const & m) { return new mpz_object(m); }
inline mpz const & mpz_value(object * o) { return to_mpz(o)->m_value; }
/* String */
lean_obj * mk_string(char const * s);
lean_obj * mk_string(std::string const & s);
inline bool is_string(lean_obj * o) { return !is_scalar(o) && is_sarray(o) && sarray_elem_size(o) == 1; }
inline char const * c_str(lean_obj * o) { lean_assert(is_string(o)); return sarray_cptr<char>(o) + sizeof(size_t); }
inline size_t string_len(lean_obj * o) { return sarray_data<size_t>(o, 0); }
lean_obj * string_push(lean_obj * s, unsigned c);
lean_obj * string_append(lean_obj * s1, lean_obj * s2);
object * mk_string(char const * s);
object * mk_string(std::string const & s);
inline bool is_string(object * o) { return !is_scalar(o) && is_sarray(o) && sarray_elem_size(o) == 1; }
inline char const * c_str(object * o) { lean_assert(is_string(o)); return sarray_cptr<char>(o) + sizeof(size_t); }
inline size_t string_len(object * o) { return sarray_data<size_t>(o, 0); }
object * string_push(object * s, unsigned c);
object * string_append(object * s1, object * s2);
/* Natural numbers */
#define LEAN_MAX_SMALL_NAT (sizeof(void*) == 8 ? std::numeric_limits<unsigned>::max() : (std::numeric_limits<unsigned>::max() >> 1)) // NOLINT
inline lean_obj * mk_nat_obj_core(mpz const & m) {
inline object * mk_nat_obj_core(mpz const & m) {
lean_assert(m > LEAN_MAX_SMALL_NAT);
return alloc_mpz(m);
}
inline lean_obj * mk_nat_obj(mpz const & m) {
inline object * mk_nat_obj(mpz const & m) {
if (m > LEAN_MAX_SMALL_NAT)
return mk_nat_obj_core(m);
else
return box(m.get_unsigned_int());
}
inline lean_obj * mk_nat_obj(unsigned n) {
inline object * mk_nat_obj(unsigned n) {
if (sizeof(void*) == 8) { // NOLINT
return box(n);
} else if (n <= LEAN_MAX_SMALL_NAT) {
@ -341,7 +341,7 @@ inline lean_obj * mk_nat_obj(unsigned n) {
}
}
inline lean_obj * mk_nat_obj(uint64 n) {
inline object * mk_nat_obj(uint64 n) {
if (LEAN_LIKELY(n <= LEAN_MAX_SMALL_NAT)) {
return box(n);
} else {
@ -349,12 +349,12 @@ inline lean_obj * mk_nat_obj(uint64 n) {
}
}
inline uint64 nat2uint64(lean_obj * a) {
inline uint64 nat2uint64(object * a) {
lean_assert(is_scalar(a));
return unbox(a);
}
inline lean_obj * nat_succ(lean_obj * a) {
inline object * nat_succ(object * a) {
if (LEAN_LIKELY(is_scalar(a))) {
return mk_nat_obj(nat2uint64(a) + 1);
} else {
@ -362,9 +362,9 @@ inline lean_obj * nat_succ(lean_obj * a) {
}
}
lean_obj * nat_big_add(lean_obj * a1, lean_obj * a2);
object * nat_big_add(object * a1, object * a2);
inline lean_obj * nat_add(lean_obj * a1, lean_obj * a2) {
inline object * nat_add(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return mk_nat_obj(nat2uint64(a1) + nat2uint64(a2));
} else {
@ -372,9 +372,9 @@ inline lean_obj * nat_add(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_sub(lean_obj * a1, lean_obj * a2);
object * nat_big_sub(object * a1, object * a2);
inline lean_obj * nat_sub(lean_obj * a1, lean_obj * a2) {
inline object * nat_sub(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
unsigned n1 = unbox(a1);
unsigned n2 = unbox(a2);
@ -387,9 +387,9 @@ inline lean_obj * nat_sub(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_mul(lean_obj * a1, lean_obj * a2);
object * nat_big_mul(object * a1, object * a2);
inline lean_obj * nat_mul(lean_obj * a1, lean_obj * a2) {
inline object * nat_mul(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return mk_nat_obj(nat2uint64(a1) * nat2uint64(a2));
} else {
@ -397,9 +397,9 @@ inline lean_obj * nat_mul(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_div(lean_obj * a1, lean_obj * a2);
object * nat_big_div(object * a1, object * a2);
inline lean_obj * nat_div(lean_obj * a1, lean_obj * a2) {
inline object * nat_div(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
unsigned n1 = unbox(a1);
unsigned n2 = unbox(a2);
@ -412,9 +412,9 @@ inline lean_obj * nat_div(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_mod(lean_obj * a1, lean_obj * a2);
object * nat_big_mod(object * a1, object * a2);
inline lean_obj * nat_mod(lean_obj * a1, lean_obj * a2) {
inline object * nat_mod(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
unsigned n1 = unbox(a1);
unsigned n2 = unbox(a2);
@ -427,9 +427,9 @@ inline lean_obj * nat_mod(lean_obj * a1, lean_obj * a2) {
}
}
bool nat_big_eq(lean_obj * a1, lean_obj * a2);
bool nat_big_eq(object * a1, object * a2);
inline bool nat_eq(lean_obj * a1, lean_obj * a2) {
inline bool nat_eq(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return a1 == a2;
} else {
@ -437,13 +437,13 @@ inline bool nat_eq(lean_obj * a1, lean_obj * a2) {
}
}
inline bool nat_ne(lean_obj * a1, lean_obj * a2) {
inline bool nat_ne(object * a1, object * a2) {
return !nat_eq(a1, a2);
}
bool nat_big_le(lean_obj * a1, lean_obj * a2);
bool nat_big_le(object * a1, object * a2);
inline bool nat_le(lean_obj * a1, lean_obj * a2) {
inline bool nat_le(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return a1 <= a2;
} else {
@ -451,9 +451,9 @@ inline bool nat_le(lean_obj * a1, lean_obj * a2) {
}
}
bool nat_big_lt(lean_obj * a1, lean_obj * a2);
bool nat_big_lt(object * a1, object * a2);
inline bool nat_lt(lean_obj * a1, lean_obj * a2) {
inline bool nat_lt(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return a1 < a2;
} else {
@ -461,29 +461,29 @@ inline bool nat_lt(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * nat_big_land(lean_obj * a1, lean_obj * a2);
object * nat_big_land(object * a1, object * a2);
inline lean_obj * nat_land(lean_obj * a1, lean_obj * a2) {
inline object * nat_land(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return reinterpret_cast<lean_obj*>(reinterpret_cast<uintptr_t>(a1) & reinterpret_cast<uintptr_t>(a2));
return reinterpret_cast<object*>(reinterpret_cast<uintptr_t>(a1) & reinterpret_cast<uintptr_t>(a2));
} else {
return nat_big_land(a1, a2);
}
}
lean_obj * nat_big_lor(lean_obj * a1, lean_obj * a2);
object * nat_big_lor(object * a1, object * a2);
inline lean_obj * nat_lor(lean_obj * a1, lean_obj * a2) {
inline object * nat_lor(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return reinterpret_cast<lean_obj*>(reinterpret_cast<uintptr_t>(a1) | reinterpret_cast<uintptr_t>(a2));
return reinterpret_cast<object*>(reinterpret_cast<uintptr_t>(a1) | reinterpret_cast<uintptr_t>(a2));
} else {
return nat_big_lor(a1, a2);
}
}
lean_obj * nat_big_xor(lean_obj * a1, lean_obj * a2);
object * nat_big_xor(object * a1, object * a2);
inline lean_obj * nat_lxor(lean_obj * a1, lean_obj * a2) {
inline object * nat_lxor(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return box(unbox(a1) ^ unbox(a2));
} else {
@ -496,19 +496,19 @@ inline lean_obj * nat_lxor(lean_obj * a1, lean_obj * a2) {
#define LEAN_MAX_SMALL_INT (sizeof(void*) == 8 ? std::numeric_limits<int>::max() : (1 << 30)) // NOLINT
#define LEAN_MIN_SMALL_INT (sizeof(void*) == 8 ? std::numeric_limits<int>::min() : -(1 << 30)) // NOLINT
inline lean_obj * mk_int_obj_core(mpz const & m) {
inline object * mk_int_obj_core(mpz const & m) {
lean_assert(m < LEAN_MIN_SMALL_INT || m > LEAN_MAX_SMALL_INT);
return alloc_mpz(m);
}
inline lean_obj * mk_int_obj(mpz const & m) {
inline object * mk_int_obj(mpz const & m) {
if (m < LEAN_MIN_SMALL_INT || m > LEAN_MAX_SMALL_INT)
return mk_int_obj_core(m);
else
return box(static_cast<unsigned>(m.get_int()));
}
inline lean_obj * mk_int_obj(int n) {
inline object * mk_int_obj(int n) {
if (sizeof(void*) == 8) { // NOLINT
return box(static_cast<unsigned>(n));
} else if (LEAN_MIN_SMALL_INT <= n && n <= LEAN_MAX_SMALL_INT) {
@ -518,7 +518,7 @@ inline lean_obj * mk_int_obj(int n) {
}
}
inline lean_obj * mk_int_obj(int64 n) {
inline object * mk_int_obj(int64 n) {
if (LEAN_LIKELY(LEAN_MIN_SMALL_INT <= n && n <= LEAN_MAX_SMALL_INT)) {
return box(static_cast<unsigned>(static_cast<int>(n)));
} else {
@ -526,7 +526,7 @@ inline lean_obj * mk_int_obj(int64 n) {
}
}
inline int64 int2int64(lean_obj * a) {
inline int64 int2int64(object * a) {
lean_assert(is_scalar(a));
if (sizeof(void*) == 8) { // NOLINT
return static_cast<int>(unbox(a));
@ -535,7 +535,7 @@ inline int64 int2int64(lean_obj * a) {
}
}
inline int int2int(lean_obj * a) {
inline int int2int(object * a) {
lean_assert(is_scalar(a));
if (sizeof(void*) == 8) { // NOLINT
return static_cast<int>(unbox(a));
@ -544,7 +544,7 @@ inline int int2int(lean_obj * a) {
}
}
inline lean_obj * nat2int(lean_obj * a) {
inline object * nat2int(object * a) {
if (is_scalar(a)) {
unsigned v = unbox(a);
if (v <= LEAN_MAX_SMALL_INT) {
@ -557,7 +557,7 @@ inline lean_obj * nat2int(lean_obj * a) {
}
}
inline lean_obj * int_neg(lean_obj * a) {
inline object * int_neg(object * a) {
if (LEAN_LIKELY(is_scalar(a))) {
return mk_int_obj(-int2int64(a));
} else {
@ -565,9 +565,9 @@ inline lean_obj * int_neg(lean_obj * a) {
}
}
lean_obj * int_big_add(lean_obj * a1, lean_obj * a2);
object * int_big_add(object * a1, object * a2);
inline lean_obj * int_add(lean_obj * a1, lean_obj * a2) {
inline object * int_add(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return mk_int_obj(int2int64(a1) + int2int64(a2));
} else {
@ -575,9 +575,9 @@ inline lean_obj * int_add(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * int_big_sub(lean_obj * a1, lean_obj * a2);
object * int_big_sub(object * a1, object * a2);
inline lean_obj * int_sub(lean_obj * a1, lean_obj * a2) {
inline object * int_sub(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return mk_int_obj(int2int64(a1) - int2int64(a2));
} else {
@ -585,9 +585,9 @@ inline lean_obj * int_sub(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * int_big_mul(lean_obj * a1, lean_obj * a2);
object * int_big_mul(object * a1, object * a2);
inline lean_obj * int_mul(lean_obj * a1, lean_obj * a2) {
inline object * int_mul(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return mk_int_obj(int2int64(a1) * int2int64(a2));
} else {
@ -595,9 +595,9 @@ inline lean_obj * int_mul(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * int_big_div(lean_obj * a1, lean_obj * a2);
object * int_big_div(object * a1, object * a2);
inline lean_obj * int_div(lean_obj * a1, lean_obj * a2) {
inline object * int_div(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
int v1 = int2int(a1);
int v2 = int2int(a2);
@ -610,9 +610,9 @@ inline lean_obj * int_div(lean_obj * a1, lean_obj * a2) {
}
}
lean_obj * int_big_rem(lean_obj * a1, lean_obj * a2);
object * int_big_rem(object * a1, object * a2);
inline lean_obj * int_rem(lean_obj * a1, lean_obj * a2) {
inline object * int_rem(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
int v1 = int2int(a1);
int v2 = int2int(a2);
@ -625,9 +625,9 @@ inline lean_obj * int_rem(lean_obj * a1, lean_obj * a2) {
}
}
bool int_big_eq(lean_obj * a1, lean_obj * a2);
bool int_big_eq(object * a1, object * a2);
inline bool int_eq(lean_obj * a1, lean_obj * a2) {
inline bool int_eq(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return a1 == a2;
} else {
@ -635,13 +635,13 @@ inline bool int_eq(lean_obj * a1, lean_obj * a2) {
}
}
inline bool int_ne(lean_obj * a1, lean_obj * a2) {
inline bool int_ne(object * a1, object * a2) {
return !int_eq(a1, a2);
}
bool int_big_le(lean_obj * a1, lean_obj * a2);
bool int_big_le(object * a1, object * a2);
inline bool int_le(lean_obj * a1, lean_obj * a2) {
inline bool int_le(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return int2int(a1) <= int2int(a2);
} else {
@ -649,9 +649,9 @@ inline bool int_le(lean_obj * a1, lean_obj * a2) {
}
}
bool int_big_lt(lean_obj * a1, lean_obj * a2);
bool int_big_lt(object * a1, object * a2);
inline bool int_lt(lean_obj * a1, lean_obj * a2) {
inline bool int_lt(object * a1, object * a2) {
if (LEAN_LIKELY(is_scalar(a1) && is_scalar(a2))) {
return int2int(a1) < int2int(a2);
} else {