KAI_BEGIN void SignedContinuation::Create(Pointer<Array> args, Pointer<Array> rtypes, Pointer<Continuation> C, Pointer<Executor> exec) { cont = C; if (args.Exists()) { if ((args->Size() & 1) != 0) KAI_THROW_1(Base, "SignedContinuation argument list must be a list of (type, label)"); cont = C; // add the formal params Array::const_iterator A = args->Begin(), B = args->End(); while (A != B) { Object type_ident = *A++; Pointer<Label> label = *A++; Pointer<const ClassBase *> klass = exec->Resolve(type_ident); params.push_back(FormalParameter((*klass)->GetTypeNumber(), *label)); } } // set the return types if (rtypes.Exists()) { // TODO } }
Object Registry::NewFromTypeNumber(Type::Number type_number) { ClassBase const *klass = classes[type_number.ToInt()]; if (!klass) KAI_THROW_1(UnknownTypeNumber, type_number.ToInt()); return NewFromClass(klass); }
Object Registry::NewFromClassName(const char *classname_str) { Label classname = classname_str; const ClassBase *klass = GetClass(classname); if (klass == 0) KAI_THROW_1(UnknownClass<>, String(classname_str)); return NewFromClass(klass); }
void StorageBase::AddedToContainer(Object const &container) { if (container.GetHandle() == GetHandle()) KAI_THROW_1(InternalError, "Can't add a container to itself"); containers.push_back(container.GetHandle()); if (IsWhite()) SetGrey(); }
void Registry::AddClass(const ClassBase *klass) { if (klass == 0) KAI_THROW_0(NullObject); if (GetClass(klass->GetTypeNumber())) KAI_THROW_1(Base, "Duplicate Class"); classes[klass->GetTypeNumber().ToInt()] = klass; }
void StorageBase::Set(const Label &name, Object const &child) { if (child.GetHandle() == GetHandle()) KAI_THROW_1(InternalError, "Recursion"); // mark the object as being altered SetDirty(); // set a property if it exists ClassBase const *klass = GetClass(); if (klass->HasProperty(name)) { klass->GetProperty(name).SetValue(*this, child); return; } // otherwise this is a child object. remove any existing child Remove(name); // update the child object if (!child.Exists()) { Dictionary::iterator ch = dictionary.find(name); if (ch != dictionary.end()) dictionary.erase(ch); return; } StorageBase &base = KAI_NAMESPACE(GetStorageBase(child)); base.SetLabel(name); base.SetParentHandle(GetHandle()); bool clean = base.IsClean(); bool konst = base.IsConst(); bool managed = base.IsManaged(); base.switches = switches; // inherit properties of parent... if (clean) // ...but preserve cleanliness base.switches |= IObject::Clean; else base.switches &= ~IObject::Clean; if (konst) // ...and constness base.switches |= IObject::Const; if (managed) // ...and managed base.switches |= IObject::Managed; // add it to this dictionary, inform it of being added to a container dictionary[name] = child; base.AddedToContainer(*this); }
Object Registry::NewFromClass(const ClassBase *klass) { if (klass == 0) KAI_THROW_1(UnknownClass<>, "NULL Class"); Handle handle = next_handle.NextValue(); StorageBase *base = 0; base = klass->NewStorage(this, handle); #ifdef KAI_DEBUG_REGISTRY if (IsWatchingType(klass->GetTypeNumber())) KAI_TRACE() << klass->GetName() << ": " << handle; #endif base->SetColor(ObjectColor::White); base->SetMarked(false); instances[handle] = base; klass->Create(*base); return Object(ObjectConstructParams(this, klass, handle)); }