]> git.mdlowis.com Git - proto/gir.git/commitdiff
Started building up the initial object environment
authorMike D. Lowis <mike.lowis@gentex.com>
Fri, 25 Sep 2015 19:52:35 +0000 (15:52 -0400)
committerMike D. Lowis <mike.lowis@gentex.com>
Fri, 25 Sep 2015 19:52:35 +0000 (15:52 -0400)
source/gir.c
source/gir.h
source/gir_internals.h
tests/test_gir.c

index 69610374a4cc31c88600f62c96ba2a6cd3539d68..7aeeaa55f5bcdd985e13ee47c0ba99f8049c2ddf 100644 (file)
@@ -1,5 +1,5 @@
-#include "gir.h"
 #include "gir_internals.h"
+#include "gir.h"
 
 /* String Interning
  *****************************************************************************/
@@ -50,12 +50,12 @@ static int slot_cmp(void* a, void* b) {
 
 /* Base Object Definition
  *****************************************************************************/
-Obj* obj_new(uint32_t type, size_t datasz) {
+Obj* obj_new(Obj* parent, uint32_t type, size_t datasz) {
     Obj* obj    = (Obj*)malloc(sizeof(struct Obj) + datasz);
-    obj->type   = type;
-    obj->size   = datasz;
-    obj->parent = NULL;
-    hamt_init(&(obj->slots), &slot_key, &slot_del, &slot_cmp);
+    obj->hdr.type   = type;
+    obj->hdr.size   = datasz;
+    obj->hdr.parent = parent;
+    hamt_init(&(obj->hdr.slots), &slot_key, &slot_del, &slot_cmp);
     return obj;
 }
 
@@ -63,33 +63,98 @@ void obj_set(Obj* obj, uintptr_t sel, Obj* val) {
     Slot* slot = (Slot*)malloc(sizeof(Slot));
     slot->sel  = sel;
     slot->val  = val;
-    hamt_insert(&(obj->slots), slot);
+    hamt_insert(&(obj->hdr.slots), slot);
 }
 
 Obj* obj_get(Obj* obj, uintptr_t sel) {
     Slot slot = { sel, NULL };
-    Slot* entry = hamt_lookup(&(obj->slots), &slot);
+    Slot* entry = hamt_lookup(&(obj->hdr.slots), &slot);
     return (entry != NULL) ? entry->val : NULL;
 }
 
+/* Base Environment Initialization
+ *****************************************************************************/
+static void init_nil(GirCtx* ctx) {
+    ctx->Nil = obj_new(NULL, TYPE_BARE, 0);
+    obj_set(ctx->Lobby, intern(ctx, "Nil"), ctx->Nil);
+}
+
+static void init_bool(GirCtx* ctx) {
+    ctx->Bool = obj_new(NULL, TYPE_BARE, 0);
+    obj_set(ctx->Lobby, intern(ctx, "Bool"), ctx->Bool);
+    obj_set(ctx->Lobby, intern(ctx, "True"), obj_new(ctx->Bool, TYPE_BARE, 0));
+    obj_set(ctx->Lobby, intern(ctx, "False"), obj_new(ctx->Bool, TYPE_BARE, 0));
+}
+
+//static void init_num(GirCtx* ctx) {
+//    ctx->Num = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Num"), ctx->Num);
+//}
+//
+//static void init_string(GirCtx* ctx) {
+//    ctx->String = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "String"), ctx->String);
+//}
+//
+//static void init_symbol(GirCtx* ctx) {
+//    ctx->Symbol = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Symbol"), ctx->Symbol);
+//}
+//
+//static void init_list(GirCtx* ctx) {
+//    ctx->List = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "List"), ctx->List);
+//}
+//
+//static void init_array(GirCtx* ctx) {
+//    ctx->Array = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Array"), ctx->Array);
+//}
+//
+//static void init_map(GirCtx* ctx) {
+//    ctx->Map = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Map"), ctx->Map);
+//}
+//
+//static void init_set(GirCtx* ctx) {
+//    ctx->Set = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Set"), ctx->Set);
+//}
+//
+//static void init_block(GirCtx* ctx) {
+//    ctx->Block = obj_new(TYPE_BARE, 0);
+//    obj_set(ctx->Lobby, intern(ctx, "Block"), ctx->Block);
+//}
+
+static void init_lobby(GirCtx* ctx) {
+    ctx->Lobby = obj_new(NULL, TYPE_BARE, 0);
+    init_nil(ctx);
+    init_bool(ctx);
+    //init_num(ctx);
+    //init_string(ctx);
+    //init_symbol(ctx);
+    //init_list(ctx);
+    //init_array(ctx);
+    //init_map(ctx);
+    //init_set(ctx);
+    //init_block(ctx);
+}
+
 /* Main API
  *****************************************************************************/
-GirCtx* gir_init(void)
-{
+GirCtx* gir_init(void) {
     GirCtx* ctx = malloc(sizeof(struct GirCtx));
     hamt_init(&(ctx->intern_pool), &intern_key, &intern_del, &intern_cmp);
-    ctx->lobby = NULL;
+    init_lobby(ctx);
     return ctx;
 }
 
-void gir_evalfile(FILE* input, const char* prompt)
-{
+void gir_evalfile(FILE* input, const char* prompt) {
     (void)input;
     (void)prompt;
 }
 
-void gir_deinit(GirCtx* ctx)
-{
+void gir_deinit(GirCtx* ctx) {
     free(ctx);
 }
 
index 01c72668334a974976b633876cefe56ff1ee4ba3..78fc79448da51d5636ac0b511db1c020a02ff7bf 100644 (file)
@@ -11,6 +11,29 @@ typedef struct Obj Obj;
 typedef struct GirCtx GirCtx;
 typedef struct Slot Slot;
 
+/******************************************************************************
+ *
+ *****************************************************************************/
+
+
+//*/
+//extern Obj* Lobby;
+//extern Obj* Nil;
+//extern Obj* Bool;
+//extern Obj* True;
+//extern Obj* False;
+//extern Obj* Num;
+//extern Obj* String;
+//extern Obj* Symbol;
+//extern Obj* List;
+//extern Obj* Array;
+//extern Obj* ByteArray;
+//extern Obj* Map;
+//extern Obj* Set;
+//extern Obj* Block;
+/******************************************************************************
+ * Top Level API
+ *****************************************************************************/
 GirCtx* gir_init(void);
 void gir_evalfile(FILE* input, const char* prompt);
 void gir_deinit(GirCtx* ctx);
@@ -25,48 +48,48 @@ void gir_deinit(GirCtx* ctx);
 
 
 
-Obj* gir_evalexpr(FILE* input);
-Obj* gir_send(Obj* rcvr, const char* sel, ...);
-
-/*
-Lobby
-    Nil
-    Bool
-        True
-        False
-    Num
-    String
-    Symbol
-    List
-    Array
-    ByteArray
-    Map
-    Set
-    Block
-*/
-extern Obj* Lobby;
-extern Obj* Nil;
-extern Obj* Bool;
-extern Obj* True;
-extern Obj* False;
-extern Obj* Num;
-extern Obj* String;
-extern Obj* Symbol;
-extern Obj* List;
-extern Obj* Array;
-extern Obj* ByteArray;
-extern Obj* Map;
-extern Obj* Set;
-extern Obj* Block;
-
-Obj* gir_mknum(double val);
-Obj* gir_mkstring(const char* val);
-Obj* gir_mksymbol(const char* val);
-Obj* gir_mklist(size_t num, ...);
-Obj* gir_mkarray(size_t num, ...);
-Obj* gir_mkbytearray(size_t num, uint8_t* val);
-Obj* gir_mkmap(void);
-Obj* gir_mkset(void);
-Obj* gir_mkblock(void);
+//Obj* gir_evalexpr(FILE* input);
+//Obj* gir_send(Obj* rcvr, const char* sel, ...);
+//
+///*
+//Lobby
+//    Nil
+//    Bool
+//        True
+//        False
+//    Num
+//    String
+//    Symbol
+//    List
+//    Array
+//    ByteArray
+//    Map
+//    Set
+//    Block
+//*/
+//extern Obj* Lobby;
+//extern Obj* Nil;
+//extern Obj* Bool;
+//extern Obj* True;
+//extern Obj* False;
+//extern Obj* Num;
+//extern Obj* String;
+//extern Obj* Symbol;
+//extern Obj* List;
+//extern Obj* Array;
+//extern Obj* ByteArray;
+//extern Obj* Map;
+//extern Obj* Set;
+//extern Obj* Block;
+//
+//Obj* gir_mknum(double val);
+//Obj* gir_mkstring(const char* val);
+//Obj* gir_mksymbol(const char* val);
+//Obj* gir_mklist(size_t num, ...);
+//Obj* gir_mkarray(size_t num, ...);
+//Obj* gir_mkbytearray(size_t num, uint8_t* val);
+//Obj* gir_mkmap(void);
+//Obj* gir_mkset(void);
+//Obj* gir_mkblock(void);
 
 #endif /* GIR_H */
index b68c2f03b383e12ad4401895a637e8f937fe14fd..3fd6b31fef2460e2127362856c4128311ad6d0c6 100644 (file)
@@ -98,17 +98,34 @@ void hamt_insert(hamt_t* trie, void* key);
 /******************************************************************************
  * User-facing Opaque Types
  *****************************************************************************/
-struct Obj {
+struct ObjHdr {
     uint32_t type;
     uint32_t size;
     struct Obj* parent;
     hamt_t slots;
+};
+
+struct Obj {
+    struct ObjHdr hdr;
     uint8_t data[];
 };
 
 struct GirCtx {
     hamt_t intern_pool;
-    struct Obj* lobby;
+    struct Obj* Lobby;
+    struct Obj* Nil;
+    struct Obj* Bool;
+    struct Obj* True;
+    struct Obj* False;
+    struct Obj* Num;
+    struct Obj* String;
+    struct Obj* Symbol;
+    struct Obj* List;
+    struct Obj* Array;
+    struct Obj* ByteArray;
+    struct Obj* Map;
+    struct Obj* Set;
+    struct Obj* Block;
 };
 
 struct Slot {
@@ -116,4 +133,70 @@ struct Slot {
     struct Obj* val;
 };
 
+/******************************************************************************
+ * Builtin Object Types
+ *****************************************************************************/
+#define TYPE_BARE   0
+#define TYPE_BOOL   1
+#define TYPE_NUM    2
+#define TYPE_STRING 3
+#define TYPE_SYMBOl 4
+#define TYPE_LIST   5
+#define TYPE_ARRAY  6
+#define TYPE_MAP    7
+#define TYPE_SET    8
+#define TYPE_BLOCK  9
+
+typedef struct ObjBool {
+    struct ObjHdr hdr;
+    bool val;
+} ObjBool;
+
+typedef struct ObjNum {
+    struct ObjHdr hdr;
+    double val;
+} ObjNum;
+
+typedef struct ObjString {
+    struct ObjHdr hdr;
+    char* val;
+} ObjString;
+
+typedef struct ObjSymbol {
+    struct ObjHdr hdr;
+    uintptr_t val;
+} ObjSymbol;
+
+typedef struct ObjList {
+    struct ObjHdr hdr;
+    slist_t val;
+} ObjList;
+
+//typedef struct ObjArray {
+//    struct ObjHdr hdr;
+//    vec_t val;
+//} ObjArray;
+
+typedef struct ObjMap {
+    struct ObjHdr hdr;
+    hamt_t val;
+} ObjMap;
+
+typedef struct ObjSet {
+    struct ObjHdr hdr;
+    hamt_t val;
+} ObjSet;
+
+//typedef struct ObjBlock {
+//    struct ObjHdr hdr;
+//    bytecode_t val;
+//} ObjBlock;
+
+/******************************************************************************
+ * Raw Object Operations
+ *****************************************************************************/
+struct Obj* obj_new(struct Obj* parent, uint32_t type, size_t datasz);
+void obj_set(struct Obj* obj, uintptr_t sel, struct Obj* val);
+struct Obj* obj_get(struct Obj* obj, uintptr_t sel);
+
 #endif /* GIR_INTERNALS_H */
index fc16a2414e4fd053f4f57d54838dc4f71391817a..93514e4b433ff9a94f7b0a319e19f07c984df9d0 100644 (file)
@@ -1,10 +1,39 @@
 #include "atf.h"
 #include "gir.h"
+#include "gir_internals.h"
 
 TEST_SUITE(GirTests) {
     /* Verify core object behavior
      *************************************************************************/
-    TEST(Verify_mkobject_constructs_an_object_with_the_lobby_as_a_parent) {
+    TEST(Constructing a raw object) {
+        Obj* obj = obj_new(NULL, 0, 0);
+        CHECK(obj != NULL);
+        CHECK(obj->hdr.type == 0);
+        CHECK(obj->hdr.size == 0);
+        CHECK(obj->hdr.parent == NULL);
+    }
+
+    TEST(Constructing a raw object with extra space for data) {
+        Obj* obj = obj_new(NULL, 1, sizeof(int));
+        CHECK(obj != NULL);
+        CHECK(obj->hdr.type == 1);
+        CHECK(obj->hdr.size == sizeof(int));
+        CHECK(obj->hdr.parent == NULL);
+    }
+
+    TEST(Adding a slot to an object) {
+        Obj* obj = obj_new(NULL, 1, sizeof(int));
+        obj_set(obj, 42, obj);
+        CHECK(obj != NULL);
+        CHECK(obj == obj_get(obj, 42));
+    }
 
+    TEST(Set the value of a slot for an object) {
+        Obj* obj = obj_new(NULL, 1, sizeof(int));
+        obj_set(obj, 42, obj);
+        CHECK(obj != NULL);
+        CHECK(obj == obj_get(obj, 42));
+        obj_set(obj, 42, NULL);
+        CHECK(NULL == obj_get(obj, 42));
     }
 }