diff --git a/lib/chibi/ast.c b/lib/chibi/ast.c index 3b878092..3ead140f 100644 --- a/lib/chibi/ast.c +++ b/lib/chibi/ast.c @@ -298,11 +298,15 @@ static sexp sexp_object_size (sexp ctx, sexp self, sexp_sint_t n, sexp x) { static sexp sexp_integer_to_immediate (sexp ctx, sexp self, sexp_sint_t n, sexp i, sexp dflt) { sexp x = (sexp)sexp_unbox_fixnum(i); sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, i); - if (sexp_pointerp(x)) + if (!x || sexp_pointerp(x)) return dflt; return x; } +static sexp sexp_object_to_integer (sexp ctx, sexp self, sexp_sint_t n, sexp x) { + return sexp_make_integer(ctx, (sexp_uint_t)x); +} + static sexp sexp_make_lambda_op (sexp ctx, sexp self, sexp_sint_t n, sexp name, sexp params, sexp body, sexp locals) { sexp res = sexp_alloc_type(ctx, lambda, SEXP_LAMBDA); sexp_lambda_name(res) = name; @@ -559,6 +563,7 @@ sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char sexp_define_type(ctx, "Lam", SEXP_LAMBDA); sexp_define_type(ctx, "Cnd", SEXP_CND); sexp_define_type(ctx, "Set", SEXP_SET); + sexp_define_type(ctx, "Set-Syn", SEXP_SET_SYN); sexp_define_type(ctx, "Ref", SEXP_REF); sexp_define_type(ctx, "Seq", SEXP_SEQ); sexp_define_type(ctx, "Lit", SEXP_LIT); @@ -654,6 +659,7 @@ sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char sexp_define_foreign(ctx, env, "core-code", 1, sexp_core_code_op); sexp_define_foreign(ctx, env, "object-size", 1, sexp_object_size); sexp_define_foreign_opt(ctx, env, "integer->immediate", 2, sexp_integer_to_immediate, SEXP_FALSE); + sexp_define_foreign_opt(ctx, env, "object->integer", 1, sexp_object_to_integer, SEXP_FALSE); sexp_define_foreign(ctx, env, "gc", 0, sexp_gc_op); sexp_define_foreign(ctx, env, "gc-count", 0, sexp_gc_count_op); sexp_define_foreign(ctx, env, "gc-usecs", 0, sexp_gc_usecs_op); diff --git a/lib/chibi/ast.sld b/lib/chibi/ast.sld index 76a16f23..5ac0d66e 100644 --- a/lib/chibi/ast.sld +++ b/lib/chibi/ast.sld @@ -5,7 +5,7 @@ Object Input-Port Output-Port Opcode Procedure Bytecode Macro Env Number Bignum Flonum Integer Complex Char Boolean Symbol String Byte-Vector Vector Pair File-Descriptor - Context Lam Cnd Set Ref Seq Lit Sc Exception Core + Context Lam Cnd Set Set-Syn Ref Seq Lit Sc Exception Core syntactic-closure? lambda? cnd? set? ref? seq? lit? type? core? environment? bytecode? exception? macro? context? file-descriptor? syntactic-closure-expr syntactic-closure-env syntactic-closure-vars @@ -34,7 +34,7 @@ extend-env env-parent env-parent-set! env-lambda env-lambda-set! env-define! env-push! env-syntactic? env-syntactic?-set! core-code type-name type-cpl type-parent type-slots type-num-slots type-printer - object-size integer->immediate gc gc-usecs gc-count + object-size object->integer integer->immediate gc gc-usecs gc-count atomically thread-list abort string-contains string-cursor-copy! errno integer->error-string flatten-dot update-free-vars! setenv unsetenv safe-setenv)