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); }
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); }
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; }