Ejemplo n.º 1
0
static Obj*
S_new_testobj() {
    StackString *class_name = SSTR_WRAP_UTF8("TestObj", 7);
    Obj *obj;
    Class *klass = Class_fetch_class((String*)class_name);
    if (!klass) {
        klass = Class_singleton((String*)class_name, OBJ);
    }
    obj = Class_Make_Obj(klass);
    return Obj_init(obj);
}
Ejemplo n.º 2
0
static FileHandle*
S_new_filehandle() {
    String *class_name = SSTR_WRAP_UTF8("TestFileHandle", 14);
    FileHandle *fh;
    Class *klass = Class_fetch_class(class_name);
    if (!klass) {
        klass = Class_singleton(class_name, FILEHANDLE);
    }
    Class_Override(klass, S_no_op_method, LUCY_FH_Close_OFFSET);
    fh = (FileHandle*)Class_Make_Obj(klass);
    return FH_do_open(fh, NULL, 0);
}
Ejemplo n.º 3
0
static Obj*
S_load_from_hash(Hash *dump) {
    String *class_name = (String*)Hash_Fetch_Utf8(dump, "_class", 6);

    // Assume that the presence of the "_class" key paired with a valid class
    // name indicates the output of a dump() rather than an ordinary Hash.
    if (class_name && Str_is_a(class_name, STRING)) {
        Class *klass = Class_fetch_class(class_name);

        if (!klass) {
            String *parent_class_name = Class_find_parent_class(class_name);
            if (parent_class_name) {
                Class *parent = Class_singleton(parent_class_name, NULL);
                klass = Class_singleton(class_name, parent);
                DECREF(parent_class_name);
            }
            else {
                // TODO: Fix load() so that it works with ordinary hash keys
                // named "_class".
                THROW(ERR, "Can't find class '%o'", class_name);
            }
        }

        // Dispatch to an alternate Load() method.
        if (klass) {
            return S_load_via_load_method(klass, (Obj*)dump);
        }

    }

    // It's an ordinary Hash.
    Hash *loaded = Hash_new(Hash_Get_Size(dump));

    HashIterator *iter = HashIter_new(dump);
    while (HashIter_Next(iter)) {
        String *key   = HashIter_Get_Key(iter);
        Obj    *value = HashIter_Get_Value(iter);
        Hash_Store(loaded, key, Freezer_load(value));
    }
    DECREF(iter);

    return (Obj*)loaded;

}