コード例 #1
0
ファイル: SignedContinuation.cpp プロジェクト: kalineh/KAI
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
	}
}
コード例 #2
0
ファイル: Registry.cpp プロジェクト: kalineh/KAI
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);
}
コード例 #3
0
ファイル: Registry.cpp プロジェクト: kalineh/KAI
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);
}
コード例 #4
0
ファイル: StorageBase.cpp プロジェクト: cschladetsch/KAI
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();
}
コード例 #5
0
ファイル: Registry.cpp プロジェクト: kalineh/KAI
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;
}
コード例 #6
0
ファイル: StorageBase.cpp プロジェクト: cschladetsch/KAI
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);
}
コード例 #7
0
ファイル: Registry.cpp プロジェクト: kalineh/KAI
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));
}