You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2013/07/17 16:12:34 UTC

[lucy-commits] [14/34] git commit: refs/heads/master - Migrate Lucy's plan classes to IVARS.

Migrate Lucy's plan classes to IVARS.

Change all Lucy's plan classes to access instance vars via an IVARS
struct rather than via `self`.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/c2adaf55
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/c2adaf55
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/c2adaf55

Branch: refs/heads/master
Commit: c2adaf555844dfb444766fe1fe12b5c673bda76b
Parents: 4f7440f
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Sat Jun 29 16:09:15 2013 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Jul 16 16:08:42 2013 -0700

----------------------------------------------------------------------
 core/Lucy/Plan/BlobType.c     | 28 +++++++----
 core/Lucy/Plan/FieldType.c    | 44 +++++++++--------
 core/Lucy/Plan/FullTextType.c | 62 ++++++++++++------------
 core/Lucy/Plan/NumericType.c  | 20 ++++----
 core/Lucy/Plan/Schema.c       | 98 ++++++++++++++++++++++----------------
 core/Lucy/Plan/StringType.c   | 34 ++++++-------
 core/Lucy/Plan/TextType.c     | 33 ++++++++-----
 7 files changed, 177 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/BlobType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/BlobType.c b/core/Lucy/Plan/BlobType.c
index e8492c9..1892d5a 100644
--- a/core/Lucy/Plan/BlobType.c
+++ b/core/Lucy/Plan/BlobType.c
@@ -28,7 +28,8 @@ BlobType_new(bool stored) {
 BlobType*
 BlobType_init(BlobType *self, bool stored) {
     FType_init((FieldType*)self);
-    self->stored = stored;
+    BlobTypeIVARS *const ivars = BlobType_IVARS(self);
+    ivars->stored = stored;
     return self;
 }
 
@@ -58,26 +59,26 @@ BlobType_primitive_id(BlobType *self) {
 
 bool
 BlobType_equals(BlobType *self, Obj *other) {
-    BlobType *twin = (BlobType*)other;
-    if (twin == self)               { return true; }
+    if ((BlobType*)other == self)   { return true; }
     if (!Obj_Is_A(other, BLOBTYPE)) { return false; }
     return FType_equals((FieldType*)self, other);
 }
 
 Hash*
 BlobType_dump_for_schema(BlobType *self) {
+    BlobTypeIVARS *const ivars = BlobType_IVARS(self);
     Hash *dump = Hash_new(0);
     Hash_Store_Str(dump, "type", 4, (Obj*)CB_newf("blob"));
 
     // Store attributes that override the defaults -- even if they're
     // meaningless.
-    if (self->boost != 1.0) {
-        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", self->boost));
+    if (ivars->boost != 1.0) {
+        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", ivars->boost));
     }
-    if (self->indexed) {
+    if (ivars->indexed) {
         Hash_Store_Str(dump, "indexed", 7, (Obj*)CFISH_TRUE);
     }
-    if (self->stored) {
+    if (ivars->stored) {
         Hash_Store_Str(dump, "stored", 6, (Obj*)CFISH_TRUE);
     }
 
@@ -108,9 +109,16 @@ BlobType_load(BlobType *self, Obj *dump) {
     UNUSED_VAR(self);
 
     BlobType_init(loaded, false);
-    if (boost_dump)   { loaded->boost   = (float)Obj_To_F64(boost_dump);    }
-    if (indexed_dump) { loaded->indexed = Obj_To_Bool(indexed_dump); }
-    if (stored_dump)  { loaded->stored  = Obj_To_Bool(stored_dump);  }
+    BlobTypeIVARS *const loaded_ivars = BlobType_IVARS(loaded);
+    if (boost_dump) {
+        loaded_ivars->boost = (float)Obj_To_F64(boost_dump);
+    }
+    if (indexed_dump) {
+        loaded_ivars->indexed = Obj_To_Bool(indexed_dump);
+    }
+    if (stored_dump){
+        loaded_ivars->stored = Obj_To_Bool(stored_dump);
+    }
 
     return loaded;
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/FieldType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/FieldType.c b/core/Lucy/Plan/FieldType.c
index 00139ae..089f7c1 100644
--- a/core/Lucy/Plan/FieldType.c
+++ b/core/Lucy/Plan/FieldType.c
@@ -30,52 +30,53 @@ FType_init(FieldType *self) {
 FieldType*
 FType_init2(FieldType *self, float boost, bool indexed, bool stored,
             bool sortable) {
-    self->boost              = boost;
-    self->indexed            = indexed;
-    self->stored             = stored;
-    self->sortable           = sortable;
+    FieldTypeIVARS *const ivars = FType_IVARS(self);
+    ivars->boost             = boost;
+    ivars->indexed           = indexed;
+    ivars->stored            = stored;
+    ivars->sortable          = sortable;
     ABSTRACT_CLASS_CHECK(self, FIELDTYPE);
     return self;
 }
 
 void
 FType_set_boost(FieldType *self, float boost) {
-    self->boost = boost;
+    FType_IVARS(self)->boost = boost;
 }
 
 void
 FType_set_indexed(FieldType *self, bool indexed) {
-    self->indexed = !!indexed;
+    FType_IVARS(self)->indexed = !!indexed;
 }
 
 void
 FType_set_stored(FieldType *self, bool stored) {
-    self->stored = !!stored;
+    FType_IVARS(self)->stored = !!stored;
 }
 
 void
 FType_set_sortable(FieldType *self, bool sortable) {
-    self->sortable = !!sortable;
+    FType_IVARS(self)->sortable = !!sortable;
 }
 
 float
 FType_get_boost(FieldType *self) {
-    return self->boost;
+    return FType_IVARS(self)->boost;
 }
 
 bool
 FType_indexed(FieldType *self) {
-    return self->indexed;
+    return FType_IVARS(self)->indexed;
 }
 
 bool
 FType_stored(FieldType *self) {
-    return self->stored;
+    return FType_IVARS(self)->stored;
 }
 
 bool
 FType_sortable(FieldType *self) {
-    return self->sortable;
+    return FType_IVARS(self)->sortable;
 }
 
 bool
@@ -98,14 +99,17 @@ FType_compare_values(FieldType *self, Obj *a, Obj *b) {
 
 bool
 FType_equals(FieldType *self, Obj *other) {
-    FieldType *twin = (FieldType*)other;
-    if (twin == self)                                     { return true; }
-    if (FType_Get_VTable(self) != FType_Get_VTable(twin)) { return false; }
-    if (self->boost != twin->boost)                       { return false; }
-    if (!!self->indexed    != !!twin->indexed)            { return false; }
-    if (!!self->stored     != !!twin->stored)             { return false; }
-    if (!!self->sortable   != !!twin->sortable)           { return false; }
-    if (!!FType_Binary(self) != !!FType_Binary(twin))     { return false; }
+    if ((FieldType*)other == self)                       { return true; }
+    if (FType_Get_VTable(self) != Obj_Get_VTable(other)) { return false; }
+    FieldTypeIVARS *const ivars = FType_IVARS(self);
+    FieldTypeIVARS *const ovars = FType_IVARS((FieldType*)other);
+    if (ivars->boost != ovars->boost)                    { return false; }
+    if (!!ivars->indexed    != !!ovars->indexed)         { return false; }
+    if (!!ivars->stored     != !!ovars->stored)          { return false; }
+    if (!!ivars->sortable   != !!ovars->sortable)        { return false; }
+    if (!!FType_Binary(self) != !!FType_Binary((FieldType*)other)) {
+        return false;
+    }
     return true;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/FullTextType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/FullTextType.c b/core/Lucy/Plan/FullTextType.c
index 4c30b2b..ac379eb 100644
--- a/core/Lucy/Plan/FullTextType.c
+++ b/core/Lucy/Plan/FullTextType.c
@@ -38,33 +38,36 @@ FullTextType_init2(FullTextType *self, Analyzer *analyzer, float boost,
                    bool indexed, bool stored, bool sortable,
                    bool highlightable) {
     FType_init((FieldType*)self);
+    FullTextTypeIVARS *const ivars = FullTextType_IVARS(self);
 
     /* Assign */
-    self->boost         = boost;
-    self->indexed       = indexed;
-    self->stored        = stored;
-    self->sortable      = sortable;
-    self->highlightable = highlightable;
-    self->analyzer      = (Analyzer*)INCREF(analyzer);
+    ivars->boost         = boost;
+    ivars->indexed       = indexed;
+    ivars->stored        = stored;
+    ivars->sortable      = sortable;
+    ivars->highlightable = highlightable;
+    ivars->analyzer      = (Analyzer*)INCREF(analyzer);
 
     return self;
 }
 
 void
 FullTextType_destroy(FullTextType *self) {
-    DECREF(self->analyzer);
+    FullTextTypeIVARS *const ivars = FullTextType_IVARS(self);
+    DECREF(ivars->analyzer);
     SUPER_DESTROY(self, FULLTEXTTYPE);
 }
 
 bool
 FullTextType_equals(FullTextType *self, Obj *other) {
-    FullTextType *twin = (FullTextType*)other;
-    if (twin == self)                                   { return true; }
-    if (!Obj_Is_A(other, FULLTEXTTYPE))                 { return false; }
-    if (!FType_equals((FieldType*)self, other))         { return false; }
-    if (!!self->sortable != !!twin->sortable)           { return false; }
-    if (!!self->highlightable != !!twin->highlightable) { return false; }
-    if (!Analyzer_Equals(self->analyzer, (Obj*)twin->analyzer)) {
+    if ((FullTextType*)other == self)                     { return true; }
+    if (!Obj_Is_A(other, FULLTEXTTYPE))                   { return false; }
+    FullTextTypeIVARS *const ivars = FullTextType_IVARS(self);
+    FullTextTypeIVARS *const ovars = FullTextType_IVARS((FullTextType*)other);
+    if (!FType_equals((FieldType*)self, other))           { return false; }
+    if (!!ivars->sortable      != !!ovars->sortable)      { return false; }
+    if (!!ivars->highlightable != !!ovars->highlightable) { return false; }
+    if (!Analyzer_Equals(ivars->analyzer, (Obj*)ovars->analyzer)) {
         return false;
     }
     return true;
@@ -72,23 +75,24 @@ FullTextType_equals(FullTextType *self, Obj *other) {
 
 Hash*
 FullTextType_dump_for_schema(FullTextType *self) {
+    FullTextTypeIVARS *const ivars = FullTextType_IVARS(self);
     Hash *dump = Hash_new(0);
     Hash_Store_Str(dump, "type", 4, (Obj*)CB_newf("fulltext"));
 
     // Store attributes that override the defaults.
-    if (self->boost != 1.0) {
-        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", self->boost));
+    if (ivars->boost != 1.0) {
+        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", ivars->boost));
     }
-    if (!self->indexed) {
+    if (!ivars->indexed) {
         Hash_Store_Str(dump, "indexed", 7, (Obj*)CFISH_FALSE);
     }
-    if (!self->stored) {
+    if (!ivars->stored) {
         Hash_Store_Str(dump, "stored", 6, (Obj*)CFISH_FALSE);
     }
-    if (self->sortable) {
+    if (ivars->sortable) {
         Hash_Store_Str(dump, "sortable", 8, (Obj*)CFISH_TRUE);
     }
-    if (self->highlightable) {
+    if (ivars->highlightable) {
         Hash_Store_Str(dump, "highlightable", 13, (Obj*)CFISH_TRUE);
     }
 
@@ -97,11 +101,12 @@ FullTextType_dump_for_schema(FullTextType *self) {
 
 Hash*
 FullTextType_dump(FullTextType *self) {
+    FullTextTypeIVARS *const ivars = FullTextType_IVARS(self);
     Hash *dump = FullTextType_Dump_For_Schema(self);
     Hash_Store_Str(dump, "_class", 6,
                    (Obj*)CB_Clone(FullTextType_Get_Class_Name(self)));
     Hash_Store_Str(dump, "analyzer", 8,
-                   (Obj*)Analyzer_Dump(self->analyzer));
+                   (Obj*)Analyzer_Dump(ivars->analyzer));
     DECREF(Hash_Delete_Str(dump, "type", 4));
 
     return dump;
@@ -146,30 +151,25 @@ FullTextType_load(FullTextType *self, Obj *dump) {
     }
     CERTIFY(analyzer, ANALYZER);
 
-    FullTextType_init(loaded, analyzer);
+    FullTextType_init2(loaded, analyzer, boost, indexed, stored,
+                       sortable, hl);
     DECREF(analyzer);
-    if (boost_dump)   { loaded->boost         = boost;    }
-    if (indexed_dump) { loaded->indexed       = indexed;  }
-    if (stored_dump)  { loaded->stored        = stored;   }
-    if (sort_dump)    { loaded->sortable      = sortable; }
-    if (hl_dump)      { loaded->highlightable = hl;       }
-
     return loaded;
 }
 
 void
 FullTextType_set_highlightable(FullTextType *self, bool highlightable) {
-    self->highlightable = highlightable;
+    FullTextType_IVARS(self)->highlightable = highlightable;
 }
 
 Analyzer*
 FullTextType_get_analyzer(FullTextType *self) {
-    return self->analyzer;
+    return FullTextType_IVARS(self)->analyzer;
 }
 
 bool
 FullTextType_highlightable(FullTextType *self) {
-    return self->highlightable;
+    return FullTextType_IVARS(self)->highlightable;
 }
 
 Similarity*

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/NumericType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/NumericType.c b/core/Lucy/Plan/NumericType.c
index a71602a..2d73119 100644
--- a/core/Lucy/Plan/NumericType.c
+++ b/core/Lucy/Plan/NumericType.c
@@ -28,10 +28,11 @@ NumericType*
 NumType_init2(NumericType *self, float boost, bool indexed, bool stored,
               bool sortable) {
     FType_init((FieldType*)self);
-    self->boost      = boost;
-    self->indexed    = indexed;
-    self->stored     = stored;
-    self->sortable   = sortable;
+    NumericTypeIVARS *const ivars = NumType_IVARS(self);
+    ivars->boost      = boost;
+    ivars->indexed    = indexed;
+    ivars->stored     = stored;
+    ivars->sortable   = sortable;
     return self;
 }
 
@@ -43,20 +44,21 @@ NumType_binary(NumericType *self) {
 
 Hash*
 NumType_dump_for_schema(NumericType *self) {
+    NumericTypeIVARS *const ivars = NumType_IVARS(self);
     Hash *dump = Hash_new(0);
     Hash_Store_Str(dump, "type", 4, (Obj*)NumType_Specifier(self));
 
     // Store attributes that override the defaults.
-    if (self->boost != 1.0) {
-        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", self->boost));
+    if (ivars->boost != 1.0) {
+        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", ivars->boost));
     }
-    if (!self->indexed) {
+    if (!ivars->indexed) {
         Hash_Store_Str(dump, "indexed", 7, (Obj*)CFISH_FALSE);
     }
-    if (!self->stored) {
+    if (!ivars->stored) {
         Hash_Store_Str(dump, "stored", 6, (Obj*)CFISH_FALSE);
     }
-    if (self->sortable) {
+    if (ivars->sortable) {
         Hash_Store_Str(dump, "sortable", 8, (Obj*)CFISH_TRUE);
     }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/Schema.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/Schema.c b/core/Lucy/Plan/Schema.c
index ba6de0b..64f9281 100644
--- a/core/Lucy/Plan/Schema.c
+++ b/core/Lucy/Plan/Schema.c
@@ -53,28 +53,30 @@ Schema_new() {
 
 Schema*
 Schema_init(Schema *self) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     // Init.
-    self->analyzers      = Hash_new(0);
-    self->types          = Hash_new(0);
-    self->sims           = Hash_new(0);
-    self->uniq_analyzers = VA_new(2);
-    VA_Resize(self->uniq_analyzers, 1);
+    ivars->analyzers      = Hash_new(0);
+    ivars->types          = Hash_new(0);
+    ivars->sims           = Hash_new(0);
+    ivars->uniq_analyzers = VA_new(2);
+    VA_Resize(ivars->uniq_analyzers, 1);
 
     // Assign.
-    self->arch = Schema_Architecture(self);
-    self->sim  = Arch_Make_Similarity(self->arch);
+    ivars->arch = Schema_Architecture(self);
+    ivars->sim  = Arch_Make_Similarity(ivars->arch);
 
     return self;
 }
 
 void
 Schema_destroy(Schema *self) {
-    DECREF(self->arch);
-    DECREF(self->analyzers);
-    DECREF(self->uniq_analyzers);
-    DECREF(self->types);
-    DECREF(self->sims);
-    DECREF(self->sim);
+    SchemaIVARS *const ivars = Schema_IVARS(self);
+    DECREF(ivars->arch);
+    DECREF(ivars->analyzers);
+    DECREF(ivars->uniq_analyzers);
+    DECREF(ivars->types);
+    DECREF(ivars->sims);
+    DECREF(ivars->sim);
     SUPER_DESTROY(self, SCHEMA);
 }
 
@@ -94,12 +96,13 @@ S_add_unique(VArray *array, Obj *elem) {
 
 bool
 Schema_equals(Schema *self, Obj *other) {
-    Schema *twin = (Schema*)other;
-    if (twin == self)                                 { return true; }
-    if (!Obj_Is_A(other, SCHEMA))                     { return false; }
-    if (!Arch_Equals(self->arch, (Obj*)twin->arch))   { return false; }
-    if (!Sim_Equals(self->sim, (Obj*)twin->sim))      { return false; }
-    if (!Hash_Equals(self->types, (Obj*)twin->types)) { return false; }
+    if ((Schema*)other == self)                         { return true; }
+    if (!Obj_Is_A(other, SCHEMA))                       { return false; }
+    SchemaIVARS *const ivars = Schema_IVARS(self);
+    SchemaIVARS *const ovars = Schema_IVARS((Schema*)other);
+    if (!Arch_Equals(ivars->arch, (Obj*)ovars->arch))   { return false; }
+    if (!Sim_Equals(ivars->sim, (Obj*)ovars->sim))      { return false; }
+    if (!Hash_Equals(ivars->types, (Obj*)ovars->types)) { return false; }
     return true;
 }
 
@@ -138,82 +141,90 @@ Schema_spec_field(Schema *self, const CharBuf *field, FieldType *type) {
 
 static void
 S_add_text_field(Schema *self, const CharBuf *field, FieldType *type) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     FullTextType *fttype    = (FullTextType*)CERTIFY(type, FULLTEXTTYPE);
     Similarity   *sim       = FullTextType_Make_Similarity(fttype);
     Analyzer     *analyzer  = FullTextType_Get_Analyzer(fttype);
 
     // Cache helpers.
-    Hash_Store(self->sims, (Obj*)field, (Obj*)sim);
-    Hash_Store(self->analyzers, (Obj*)field, INCREF(analyzer));
-    S_add_unique(self->uniq_analyzers, (Obj*)analyzer);
+    Hash_Store(ivars->sims, (Obj*)field, (Obj*)sim);
+    Hash_Store(ivars->analyzers, (Obj*)field, INCREF(analyzer));
+    S_add_unique(ivars->uniq_analyzers, (Obj*)analyzer);
 
     // Store FieldType.
-    Hash_Store(self->types, (Obj*)field, INCREF(type));
+    Hash_Store(ivars->types, (Obj*)field, INCREF(type));
 }
 
 static void
 S_add_string_field(Schema *self, const CharBuf *field, FieldType *type) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     StringType *string_type = (StringType*)CERTIFY(type, STRINGTYPE);
     Similarity *sim         = StringType_Make_Similarity(string_type);
 
     // Cache helpers.
-    Hash_Store(self->sims, (Obj*)field, (Obj*)sim);
+    Hash_Store(ivars->sims, (Obj*)field, (Obj*)sim);
 
     // Store FieldType.
-    Hash_Store(self->types, (Obj*)field, INCREF(type));
+    Hash_Store(ivars->types, (Obj*)field, INCREF(type));
 }
 
 static void
 S_add_blob_field(Schema *self, const CharBuf *field, FieldType *type) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     BlobType *blob_type = (BlobType*)CERTIFY(type, BLOBTYPE);
-    Hash_Store(self->types, (Obj*)field, INCREF(blob_type));
+    Hash_Store(ivars->types, (Obj*)field, INCREF(blob_type));
 }
 
 static void
 S_add_numeric_field(Schema *self, const CharBuf *field, FieldType *type) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     NumericType *num_type = (NumericType*)CERTIFY(type, NUMERICTYPE);
-    Hash_Store(self->types, (Obj*)field, INCREF(num_type));
+    Hash_Store(ivars->types, (Obj*)field, INCREF(num_type));
 }
 
 FieldType*
 Schema_fetch_type(Schema *self, const CharBuf *field) {
-    return (FieldType*)Hash_Fetch(self->types, (Obj*)field);
+    SchemaIVARS *const ivars = Schema_IVARS(self);
+    return (FieldType*)Hash_Fetch(ivars->types, (Obj*)field);
 }
 
 Analyzer*
 Schema_fetch_analyzer(Schema *self, const CharBuf *field) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     return field
-           ? (Analyzer*)Hash_Fetch(self->analyzers, (Obj*)field)
+           ? (Analyzer*)Hash_Fetch(ivars->analyzers, (Obj*)field)
            : NULL;
 }
 
 Similarity*
 Schema_fetch_sim(Schema *self, const CharBuf *field) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     Similarity *sim = NULL;
     if (field != NULL) {
-        sim = (Similarity*)Hash_Fetch(self->sims, (Obj*)field);
+        sim = (Similarity*)Hash_Fetch(ivars->sims, (Obj*)field);
     }
     return sim;
 }
 
 uint32_t
 Schema_num_fields(Schema *self) {
-    return Hash_Get_Size(self->types);
+    SchemaIVARS *const ivars = Schema_IVARS(self);
+    return Hash_Get_Size(ivars->types);
 }
 
 Architecture*
 Schema_get_architecture(Schema *self) {
-    return self->arch;
+    return Schema_IVARS(self)->arch;
 }
 
 Similarity*
 Schema_get_similarity(Schema *self) {
-    return self->sim;
+    return Schema_IVARS(self)->sim;
 }
 
 VArray*
 Schema_all_fields(Schema *self) {
-    return Hash_Keys(self->types);
+    return Hash_Keys(Schema_IVARS(self)->types);
 }
 
 uint32_t
@@ -237,20 +248,21 @@ S_find_in_array(VArray *array, Obj *obj) {
 
 Hash*
 Schema_dump(Schema *self) {
+    SchemaIVARS *const ivars = Schema_IVARS(self);
     Hash *dump = Hash_new(0);
-    Hash *type_dumps = Hash_new(Hash_Get_Size(self->types));
+    Hash *type_dumps = Hash_new(Hash_Get_Size(ivars->types));
     CharBuf *field;
     FieldType *type;
 
     // Record class name, store dumps of unique Analyzers.
     Hash_Store_Str(dump, "_class", 6,
                    (Obj*)CB_Clone(Schema_Get_Class_Name(self)));
-    Hash_Store_Str(dump, "analyzers", 9, (Obj*)VA_Dump(self->uniq_analyzers));
+    Hash_Store_Str(dump, "analyzers", 9, (Obj*)VA_Dump(ivars->uniq_analyzers));
 
     // Dump FieldTypes.
     Hash_Store_Str(dump, "fields", 6, (Obj*)type_dumps);
-    Hash_Iterate(self->types);
-    while (Hash_Next(self->types, (Obj**)&field, (Obj**)&type)) {
+    Hash_Iterate(ivars->types);
+    while (Hash_Next(ivars->types, (Obj**)&field, (Obj**)&type)) {
         VTable *type_vtable = FType_Get_VTable(type);
 
         // Dump known types to simplified format.
@@ -259,7 +271,7 @@ Schema_dump(Schema *self) {
             Hash *type_dump = FullTextType_Dump_For_Schema(fttype);
             Analyzer *analyzer = FullTextType_Get_Analyzer(fttype);
             uint32_t tick
-                = S_find_in_array(self->uniq_analyzers, (Obj*)analyzer);
+                = S_find_in_array(ivars->uniq_analyzers, (Obj*)analyzer);
 
             // Store the tick which references a unique analyzer.
             Hash_Store_Str(type_dump, "analyzer", 8,
@@ -299,7 +311,8 @@ Schema_load(Schema *self, Obj *dump) {
 
     // Start with a blank Schema.
     Schema_init(loaded);
-    VA_Grow(loaded->uniq_analyzers, VA_Get_Size(analyzers));
+    SchemaIVARS *const loaded_ivars = Schema_IVARS(loaded);
+    VA_Grow(loaded_ivars->uniq_analyzers, VA_Get_Size(analyzers));
 
     Hash_Iterate(type_dumps);
     while (Hash_Next(type_dumps, (Obj**)&field, (Obj**)&type_dump)) {
@@ -390,8 +403,9 @@ Schema_eat(Schema *self, Schema *other) {
 
     CharBuf *field;
     FieldType *type;
-    Hash_Iterate(other->types);
-    while (Hash_Next(other->types, (Obj**)&field, (Obj**)&type)) {
+    SchemaIVARS *const ovars = Schema_IVARS(other);
+    Hash_Iterate(ovars->types);
+    while (Hash_Next(ovars->types, (Obj**)&field, (Obj**)&type)) {
         Schema_Spec_Field(self, field, type);
     }
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/StringType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/StringType.c b/core/Lucy/Plan/StringType.c
index d27cd37..2965121 100644
--- a/core/Lucy/Plan/StringType.c
+++ b/core/Lucy/Plan/StringType.c
@@ -36,37 +36,38 @@ StringType*
 StringType_init2(StringType *self, float boost, bool indexed,
                  bool stored, bool sortable) {
     FType_init((FieldType*)self);
-    self->boost      = boost;
-    self->indexed    = indexed;
-    self->stored     = stored;
-    self->sortable   = sortable;
+    StringTypeIVARS *const ivars = StringType_IVARS(self);
+    ivars->boost      = boost;
+    ivars->indexed    = indexed;
+    ivars->stored     = stored;
+    ivars->sortable   = sortable;
     return self;
 }
 
 bool
 StringType_equals(StringType *self, Obj *other) {
-    StringType *twin = (StringType*)other;
-    if (twin == self)                           { return true; }
+    if ((StringType*)other == self)             { return true; }
     if (!FType_equals((FieldType*)self, other)) { return false; }
     return true;
 }
 
 Hash*
 StringType_dump_for_schema(StringType *self) {
+    StringTypeIVARS *const ivars = StringType_IVARS(self);
     Hash *dump = Hash_new(0);
     Hash_Store_Str(dump, "type", 4, (Obj*)CB_newf("string"));
 
     // Store attributes that override the defaults.
-    if (self->boost != 1.0) {
-        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", self->boost));
+    if (ivars->boost != 1.0) {
+        Hash_Store_Str(dump, "boost", 5, (Obj*)CB_newf("%f64", ivars->boost));
     }
-    if (!self->indexed) {
+    if (!ivars->indexed) {
         Hash_Store_Str(dump, "indexed", 7, (Obj*)CFISH_FALSE);
     }
-    if (!self->stored) {
+    if (!ivars->stored) {
         Hash_Store_Str(dump, "stored", 6, (Obj*)CFISH_FALSE);
     }
-    if (self->sortable) {
+    if (ivars->sortable) {
         Hash_Store_Str(dump, "sortable", 8, (Obj*)CFISH_TRUE);
     }
 
@@ -97,13 +98,12 @@ StringType_load(StringType *self, Obj *dump) {
     Obj *sortable_dump   = Hash_Fetch_Str(source, "sortable", 8);
     UNUSED_VAR(self);
 
-    StringType_init(loaded);
-    if (boost_dump)    { loaded->boost    = (float)Obj_To_F64(boost_dump); }
-    if (indexed_dump)  { loaded->indexed  = Obj_To_Bool(indexed_dump); }
-    if (stored_dump)   { loaded->stored   = Obj_To_Bool(stored_dump); }
-    if (sortable_dump) { loaded->sortable = Obj_To_Bool(sortable_dump); }
+    float boost    = boost_dump    ? (float)Obj_To_F64(boost_dump) : 1.0f;
+    bool  indexed  = indexed_dump  ? Obj_To_Bool(indexed_dump)     : true;
+    bool  stored   = stored_dump   ? Obj_To_Bool(stored_dump)      : true;
+    bool  sortable = sortable_dump ? Obj_To_Bool(sortable_dump)    : false;
 
-    return loaded;
+    return StringType_init2(loaded, boost, indexed, stored, sortable);
 }
 
 Similarity*

http://git-wip-us.apache.org/repos/asf/lucy/blob/c2adaf55/core/Lucy/Plan/TextType.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/TextType.c b/core/Lucy/Plan/TextType.c
index 44a290d..25ee102 100644
--- a/core/Lucy/Plan/TextType.c
+++ b/core/Lucy/Plan/TextType.c
@@ -53,37 +53,42 @@ TextTermStepper_new() {
 TextTermStepper*
 TextTermStepper_init(TextTermStepper *self) {
     TermStepper_init((TermStepper*)self);
-    self->value = (Obj*)CB_new(0);
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
+    ivars->value = (Obj*)CB_new(0);
     return self;
 }
 
 void
 TextTermStepper_set_value(TextTermStepper *self, Obj *value) {
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
     CERTIFY(value, CHARBUF);
-    DECREF(self->value);
-    self->value = INCREF(value);
+    DECREF(ivars->value);
+    ivars->value = INCREF(value);
 }
 
 void
 TextTermStepper_reset(TextTermStepper *self) {
-    CB_Set_Size((CharBuf*)self->value, 0);
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
+    CB_Set_Size((CharBuf*)ivars->value, 0);
 }
 
 void
 TextTermStepper_write_key_frame(TextTermStepper *self, OutStream *outstream,
                                 Obj *value) {
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
     uint8_t *buf  = CB_Get_Ptr8((CharBuf*)value);
     size_t   size = CB_Get_Size((CharBuf*)value);
     OutStream_Write_C32(outstream, size);
     OutStream_Write_Bytes(outstream, buf, size);
-    Obj_Mimic(self->value, value);
+    Obj_Mimic(ivars->value, value);
 }
 
 void
 TextTermStepper_write_delta(TextTermStepper *self, OutStream *outstream,
                             Obj *value) {
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
     CharBuf *new_value  = (CharBuf*)CERTIFY(value, CHARBUF);
-    CharBuf *last_value = (CharBuf*)self->value;
+    CharBuf *last_value = (CharBuf*)ivars->value;
     char    *new_text  = (char*)CB_Get_Ptr8(new_value);
     size_t   new_size  = CB_Get_Size(new_value);
     char    *last_text = (char*)CB_Get_Ptr8(last_value);
@@ -100,18 +105,19 @@ TextTermStepper_write_delta(TextTermStepper *self, OutStream *outstream,
     OutStream_Write_String(outstream, diff_start_str, diff_len);
 
     // Update value.
-    CB_Mimic((CharBuf*)self->value, value);
+    CB_Mimic((CharBuf*)ivars->value, value);
 }
 
 void
 TextTermStepper_read_key_frame(TextTermStepper *self, InStream *instream) {
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
     const uint32_t text_len = InStream_Read_C32(instream);
 
     // Allocate space.
-    if (self->value == NULL) {
-        self->value = (Obj*)CB_new(text_len);
+    if (ivars->value == NULL) {
+        ivars->value = (Obj*)CB_new(text_len);
     }
-    CharBuf *value = (CharBuf*)self->value;
+    CharBuf *value = (CharBuf*)ivars->value;
     char *ptr      = CB_Grow(value, text_len);
 
     // Set the value text.
@@ -129,15 +135,16 @@ TextTermStepper_read_key_frame(TextTermStepper *self, InStream *instream) {
 
 void
 TextTermStepper_read_delta(TextTermStepper *self, InStream *instream) {
+    TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self);
     const uint32_t text_overlap     = InStream_Read_C32(instream);
     const uint32_t finish_chars_len = InStream_Read_C32(instream);
     const uint32_t total_text_len   = text_overlap + finish_chars_len;
 
     // Allocate space.
-    if (self->value == NULL) {
-        self->value = (Obj*)CB_new(total_text_len);
+    if (ivars->value == NULL) {
+        ivars->value = (Obj*)CB_new(total_text_len);
     }
-    CharBuf *value = (CharBuf*)self->value;
+    CharBuf *value = (CharBuf*)ivars->value;
     char *ptr      = CB_Grow(value, total_text_len);
 
     // Set the value text.