Exemplo n.º 1
0
ECode CStructInfo::InitStatic(
    /* [in] */ CClsModule* clsModule,
    /* [in] */ StructDirEntry* structDirEntry)
{
    mClsModule = clsModule;

    Int32 base = mClsModule->mBase;
    mStructDirEntry = structDirEntry;
    mName = adjustNameAddr(base, mStructDirEntry->mName);
    StructDescriptor* desc = adjustStructDescAddr(base, structDirEntry->mDesc);
    StructElement* elem = NULL;

    ECode ec = NOERROR;
    mFieldTypeInfos = ArrayOf<IDataTypeInfo*>::Alloc(desc->mElementCount);
    if (!mFieldTypeInfos) {
        ec = E_OUT_OF_MEMORY;
        goto EExit;
    }

    mFieldNames = ArrayOf<String>::Alloc(desc->mElementCount);
    if (!mFieldNames) {
        ec = E_OUT_OF_MEMORY;
        goto EExit;
    }

    for (Int32 i = 0; i < desc->mElementCount; i++) {
        elem = getStructElementAddr(base, desc->mElements, i);
        (*mFieldNames)[i] = adjustNameAddr(base, elem->mName);

        AutoPtr<IDataTypeInfo> dataTypeInfo;
        ec = g_objInfoList.AcquireDataTypeInfo(mClsModule,
                &elem->mType, (IDataTypeInfo**)&dataTypeInfo, TRUE);
        if (FAILED(ec)) goto EExit;
        mFieldTypeInfos->Set(i, dataTypeInfo);
    }

    ec = InitFieldElement();
    if (FAILED(ec)) goto EExit;

    ec = InitFieldInfos();
    if (FAILED(ec)) goto EExit;

    return NOERROR;

EExit:
    mFieldNames = NULL;
    mFieldTypeInfos = NULL;

    return ec;
}
ECode CInterfaceInfo::CreateIFList()
{
    if (mIFList) {
        return NOERROR;
    }

    UInt32* indexList = (UInt32 *)alloca(
            mClsMod->mInterfaceCount * sizeof(UInt32));
    if (indexList == NULL) {
        return E_OUT_OF_MEMORY;
    }

    Int32 i, j = 0;
    mIFCount = 0;
    UInt32 index = mIndex;
    InterfaceDirEntry* ifDir = NULL;
    while (index != 0) {
        indexList[mIFCount++] = index;
        ifDir = getInterfaceDirAddr(mBase, mClsMod->mInterfaceDirs, index);
        index = adjustInterfaceDescAddr(mBase, ifDir->mDesc)->mParentIndex;
    }

    indexList[mIFCount] = 0;
    mIFCount++;

    UInt32 beginNo = METHOD_START_NO;
    mIFList = new IFIndexEntry[mIFCount];
    if (mIFList == NULL) {
        return E_OUT_OF_MEMORY;
    }

    for (i = mIFCount - 1, j = 0; i >= 0; i--, j++) {
        index = indexList[i];
        mIFList[j].mIndex = index;
        mIFList[j].mBeginNo = beginNo;
        ifDir = getInterfaceDirAddr(mBase, mClsMod->mInterfaceDirs, index);
        mIFList[j].mName = adjustNameAddr(mBase, ifDir->mName);
        mIFList[j].mNameSpace = adjustNameAddr(mBase, ifDir->mNameSpace);
        mIFList[j].mDesc = adjustInterfaceDescAddr(mBase, ifDir->mDesc);
        beginNo += mIFList[j].mDesc->mMethodCount;
    }

    mMethodCount = 0;
    for (i = 0; i < (int)mIFCount; i++) {
        mMethodCount += mIFList[i].mDesc->mMethodCount;
    }

    return NOERROR;
}
Exemplo n.º 3
0
ECode CClassInfo::AcquireConstructorList()
{
    if (!(mDesc->dwAttribs & ClassAttrib_hasctor)) {
        return NOERROR;
    }

    ECode ec = NOERROR;
    g_objInfoList.LockHashTable(EntryType_Class);
    if (!mCtorClassInfo) {
        AutoPtr<IModuleInfo> pModuleInfo;

        ec = mClsModule->GetModuleInfo((IModuleInfo**)&pModuleInfo);
        if (FAILED(ec)) {
            g_objInfoList.UnlockHashTable(EntryType_Class);
            return ec;
        }

        String clsName;
        clsName = adjustNameAddr(mBase, mClassDirEntry->mName);
        clsName += "ClassObject";

        ec = pModuleInfo->GetClassInfo(clsName, (IClassInfo**)&mCtorClassInfo);
    }
    g_objInfoList.UnlockHashTable(EntryType_Class);

    if (FAILED(ec)) return ec;

    mCtorList = NULL;
    return mCtorClassInfo->AcquireSpecialMethodList(
            EntryType_Constructor, (CEntryList**)&mCtorList);
}
Exemplo n.º 4
0
ECode CClsModule::GetModuleInfo(
    /* [out] */ IModuleInfo** moduleInfo)
{
    if (!moduleInfo) {
        return E_INVALID_ARGUMENT;
    }

    return _CReflector_AcquireModuleInfo(
            String(adjustNameAddr(mBase, mClsMod->mUunm)), moduleInfo);
}
Exemplo n.º 5
0
ECode CClassInfo::GetNamespace(
    /* [out] */ String* ns)
{
    if (ns == NULL) {
        return E_INVALID_ARGUMENT;
    }

    *ns = adjustNameAddr(mBase, mClassDirEntry->mNameSpace);
    return NOERROR;
}
ECode CInterfaceInfo::GetName(
    /* [out] */ String* name)
{
    if (name == NULL) {
        return E_INVALID_ARGUMENT;
    }

    *name = adjustNameAddr(mBase, mInterfaceDirEntry->mName);
    return NOERROR;
}
Exemplo n.º 7
0
Boolean IsSysAlaisType(
    /* [in] */ const CClsModule* clsModule,
    /* [in] */ UInt32 index)
{
    Int32 base = clsModule->mBase;
    CLSModule* module = clsModule->mClsMod;
    AliasDirEntry* aliasDir = getAliasDirAddr(base, module->mAliasDirs, index);
    char* nameSpace = adjustNameAddr(base, aliasDir->mNameSpace);
    return (nameSpace) && !strcmp(nameSpace, "systypes");
}
Exemplo n.º 8
0
ECode CClassInfo::GetId(
    /* [out] */ ClassID* clsid)
{
    if (!clsid) {
        return E_INVALID_ARGUMENT;
    }

    clsid->clsid =  mDesc->clsid;
    strcpy(clsid->pUunm,  adjustNameAddr(mBase, mClsMod->mUunm));

    return NOERROR;
}
Exemplo n.º 9
0
CClassInfo::CClassInfo(
    /* [in] */ CClsModule* clsModule,
    /* [in] */ ClassDirEntry* clsDirEntry)
{
    mClsModule = clsModule;
    mClsMod = mClsModule->mClsMod;
    mClassDirEntry = clsDirEntry;
    mIFList = NULL;
    mCBIFList = NULL;

    mCBMethodDesc = NULL;

    mMethodCount = 0;
    mCBMethodCount = 0;
    mCBIFCount = 0;
    mIFCount = 0;

    mBase = mClsModule->mBase;
    mDesc = adjustClassDescAddr(mBase, mClassDirEntry->mDesc);

    mClsId.pUunm = mUrn;
    mClsId.clsid = mDesc->clsid;
    strcpy(mClsId.pUunm, adjustNameAddr(mBase, mClsMod->mUunm));
}
Exemplo n.º 10
0
ECode CClassInfo::CreateIFList()
{
    if (mIFList) {
        return NOERROR;
    }

    UInt32* indexList =
            (UInt32 *)alloca(mClsMod->mInterfaceCount * sizeof(UInt32));
    if (indexList == NULL) {
        return E_OUT_OF_MEMORY;
    }

    IFIndexEntry* allIFList = (IFIndexEntry *)
            alloca(mClsMod->mInterfaceCount * sizeof(IFIndexEntry));
    if (allIFList == NULL) {
        return E_OUT_OF_MEMORY;
    }

    Int32 i, j, k, n = 0, iNo, listCount = 0;
    UInt32 index = 0, eventNum = 1, beginNo = METHOD_START_NO;
    Boolean isCallBack = FALSE;
    mIFCount = 0;
    mCBIFCount = 0;
    ClassInterface* cifDir = NULL;
    InterfaceDirEntry* ifDir = NULL;

    for (i = 0; i < mDesc->mInterfaceCount; i++) {
        cifDir = getCIFAddr(mBase, mDesc->ppInterfaces, i);
        if (cifDir->wAttribs & ClassInterfaceAttrib_callback) {
            isCallBack = TRUE;
        }
        else {
            isCallBack = FALSE;
        }

        index = cifDir->mIndex;

        iNo = 0;
        while (index != 0) {
            indexList[iNo++] = index;
            ifDir = getInterfaceDirAddr(mBase,
                    mClsMod->mInterfaceDirs, index);
            index = adjustInterfaceDescAddr(mBase, ifDir->mDesc)->sParentIndex;
        }

        indexList[iNo] = 0;

        //Save the indexList to mIFList
        for (j = iNo; j >= 0; j--) {
            index = indexList[j];
            if (listCount != 0) {
                //If the same inteface in list, continue
                for (k = 0; k < listCount; k++) {
                    if (allIFList[k].mIndex == index) {
                        beginNo = allIFList[k].mBeginNo
                                + allIFList[k].mDesc->cMethods;
                        if (!isCallBack) {
                            if (!(allIFList[k].mAttribs & IFAttrib_normal)) {
                                mIFCount++;
                                allIFList[k].mAttribs |= IFAttrib_normal;
                            }
                        }
                        else {
                            if (!(allIFList[k].mAttribs & IFAttrib_callback)) {
                                mCBIFCount++;
                                allIFList[k].mAttribs |= IFAttrib_callback;
                            }
                        }

                        break;
                    }
                }

                if (k < listCount) {
                    continue;
                }
            }

            allIFList[listCount].mIndex = index;
            allIFList[listCount].mBeginNo = beginNo;
            ifDir = getInterfaceDirAddr(mBase, mClsMod->mInterfaceDirs, index);
            allIFList[listCount].mName = adjustNameAddr(mBase, ifDir->mName);
            allIFList[listCount].mNameSpace = adjustNameAddr(mBase, ifDir->mNameSpace);
            allIFList[listCount].mDesc = adjustInterfaceDescAddr(mBase, ifDir->mDesc);

            if (!isCallBack) {
                mIFCount++;
                allIFList[listCount].mAttribs = IFAttrib_normal;
            }
            else {
                mCBIFCount++;
                allIFList[listCount].mAttribs = IFAttrib_callback;
            }
            beginNo +=  allIFList[listCount].mDesc->cMethods;

            listCount++;
        }
    }

    mIFList = new IFIndexEntry[mIFCount];
    if (!mIFList) goto EExit;

    if (mCBIFCount) {
        mCBIFCount--;
        mCBIFList = new IFIndexEntry[mCBIFCount];
        if (!mCBIFList) goto EExit;
    }

    mMethodCount = 0;
    mCBMethodCount = 0;
    j = 0;
    k = 0;
    for (i = 0; i < listCount; i++) {
        if (allIFList[i].mAttribs & IFAttrib_normal) {
            memcpy(&mIFList[j], &allIFList[i], sizeof(IFIndexEntry));
            mMethodCount += allIFList[i].mDesc->cMethods;
            j++;
        }
        if (i && mCBIFCount && (allIFList[i].mAttribs & IFAttrib_callback)) {
            memcpy(&mCBIFList[k], &allIFList[i], sizeof(IFIndexEntry));
            mCBMethodCount += allIFList[i].mDesc->cMethods;
            k++;
        }
    }

    //Set Callback Method Info
    mCBMethodDesc = new CBMethodDesc[mCBMethodCount];
    if (!mCBMethodDesc) goto EExit;
    memset(mCBMethodDesc, 0, mCBMethodCount * sizeof(CBMethodDesc));

    for (i = 0; i < k; i++) {
        for (j = 0; j < mCBIFList[i].mDesc->cMethods; j++) {
            mCBMethodDesc[n].mDesc = getMethodDescAddr(mBase,
                    mCBIFList[i].mDesc->ppMethods, j);
            mCBMethodDesc[n].mIndex = MK_METHOD_INDEX(mCBIFList[i].mIndex,
                    mCBIFList[i].mBeginNo + j);
            mCBMethodDesc[n].mEventNum = eventNum;
            eventNum++;
            n++;
        }
        eventNum += 2;
    }

    return NOERROR;

EExit:
    mIFCount = 0;
    mCBIFCount = 0;
    mMethodCount = 0;
    mCBMethodCount = 0;

    if (mIFList) {
        delete [] mIFList;
        mIFList = NULL;
    }

    if (mCBIFList) {
        delete [] mCBIFList;
        mCBIFList = NULL;
    }

    if (mCBMethodDesc) {
        delete [] mCBMethodDesc;
        mCBMethodDesc = NULL;
    }

    return E_OUT_OF_MEMORY;
}