H{ } [ special-objects set emit-jit-data ] keep assoc-size
] unit-test
-{ 90 } [
+{ 95 } [
50 <vector> [ 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
: 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
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
! 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
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
// 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 */
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
#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 <typename Iterator> void object::each_slot(Iterator& iter) {