From 339b1b6466434a57bfbea069ab5aedf3ffa7d16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Wed, 9 Dec 2015 21:31:13 +0100 Subject: [PATCH] VM: put the singletons t, -1, 0 and 1 in the special objects table Having them there instead of as fields in the vm struct removes a bunch of special handling. This commit just adds them and doesn't remove the old ones to avoid potential chicken-and-egg bootstrap problems. --- basis/bootstrap/image/image-tests.factor | 22 +++++++++++++++++++++- basis/bootstrap/image/image.factor | 8 ++++++++ core/kernel/kernel.factor | 9 +++++++-- vm/objects.hpp | 15 +++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/basis/bootstrap/image/image-tests.factor b/basis/bootstrap/image/image-tests.factor index 2e91ce4099..d41d676ca9 100644 --- a/basis/bootstrap/image/image-tests.factor +++ b/basis/bootstrap/image/image-tests.factor @@ -31,6 +31,26 @@ IN: bootstrap.image.tests H{ } [ special-objects set emit-jit-data ] keep assoc-size ] unit-test -{ 90 } [ +{ 95 } [ 50 [ bootstrapping-image set emit-image-header ] keep length ] unit-test + +! emit-bignum +{ V{ + ! 33 bignum + 32 0 33 + ! -108 bignum + 32 1 108 +} } [ + V{ } bootstrapping-image set + 33 emit-bignum + -108 emit-bignum + bootstrapping-image get +] unit-test + +! prepare-object - what does this mean? +{ 269 } [ + V{ } clone bootstrapping-image set + H{ } clone objects set + 55 >bignum prepare-object +] unit-test diff --git a/basis/bootstrap/image/image.factor b/basis/bootstrap/image/image.factor index e407d0399f..44d8e5cf17 100755 --- a/basis/bootstrap/image/image.factor +++ b/basis/bootstrap/image/image.factor @@ -433,6 +433,12 @@ M: quotation prepare-object : emit-words ( -- ) all-words [ emit-word ] each ; +: emit-singletons ( -- ) + t OBJ-CANONICAL-TRUE special-objects get set-at + 0 >bignum OBJ-BIGNUM-ZERO special-objects get set-at + 1 >bignum OBJ-BIGNUM-POS-ONE special-objects get set-at + -1 >bignum OBJ-BIGNUM-NEG-ONE special-objects get set-at ; + : emit-global ( -- ) { dictionary source-files builtins @@ -497,6 +503,8 @@ M: quotation prepare-object emit-jit-data "Serializing global namespace..." print flush emit-global + "Serializing singletons..." print flush + emit-singletons "Serializing special object table..." print flush emit-special-objects "Performing word fixups..." print flush diff --git a/core/kernel/kernel.factor b/core/kernel/kernel.factor index 611ba18d97..7821a6abea 100644 --- a/core/kernel/kernel.factor +++ b/core/kernel/kernel.factor @@ -309,8 +309,7 @@ ERROR: assert got expect ; ! Special object count and identifiers must be kept in sync with: ! vm/objects.hpp -! basis/bootstrap/image/image.factor -CONSTANT: special-object-count 80 +CONSTANT: special-object-count 85 CONSTANT: OBJ-WALKER-HOOK 3 @@ -409,6 +408,12 @@ CONSTANT: OBJ-VM-COMPILE-TIME 75 CONSTANT: OBJ-VM-VERSION 76 CONSTANT: OBJ-VM-GIT-LABEL 77 +CONSTANT: OBJ-CANONICAL-TRUE 78 + +CONSTANT: OBJ-BIGNUM-ZERO 79 +CONSTANT: OBJ-BIGNUM-POS-ONE 80 +CONSTANT: OBJ-BIGNUM-NEG-ONE 81 + ! Context object count and identifiers must be kept in sync with: ! vm/contexts.hpp diff --git a/vm/objects.hpp b/vm/objects.hpp index 9696be2627..dc29b0382a 100644 --- a/vm/objects.hpp +++ b/vm/objects.hpp @@ -4,7 +4,7 @@ namespace factor { // core/kernel/kernel.factor // basis/bootstrap/image/image.factor -static const cell special_object_count = 80; +static const cell special_object_count = 85; enum special_object { OBJ_WALKER_HOOK = 3, /* non-local exit hook, used by library only */ @@ -110,6 +110,15 @@ enum special_object { OBJ_VM_COMPILE_TIME = 75, /* when the binary was built */ OBJ_VM_VERSION = 76, /* factor version */ OBJ_VM_GIT_LABEL = 77, /* git label (git describe --all --long) */ + + /* Canonical truth value. In Factor, 't' */ + OBJ_CANONICAL_TRUE = 78, + + /* Canonical bignums. These needs to be kept in the image in case + some heap objects refer to them. */ + OBJ_BIGNUM_ZERO, + OBJ_BIGNUM_POS_ONE, + OBJ_BIGNUM_NEG_ONE = 81, }; /* save-image-and-exit discards special objects that are filled in on startup @@ -118,7 +127,9 @@ enum special_object { #define OBJ_LAST_SAVE OBJ_STAGE2 inline static bool save_special_p(cell i) { - return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE); + /* Need to fix the order here. */ + return (i >= OBJ_FIRST_SAVE && i <= OBJ_LAST_SAVE) || + (i >= OBJ_CANONICAL_TRUE); } template void object::each_slot(Iterator& iter) {