Beispiel #1
0
void show_cl_type(sCLType* self, sCLClass* klass, sVMInfo* info)
{
    int i;

    if(self == NULL) {
        cl_print(info, "NULL");
    }
    else if(self->mGenericsTypesNum == 0) {
        cl_print(info, "%s", CONS_str(&klass->mConstPool, self->mClassNameOffset));
    }
    else {
        cl_print(info, "%s<", CONS_str(&klass->mConstPool, self->mClassNameOffset));
        for(i=0; i<self->mGenericsTypesNum; i++) {
            show_cl_type(self->mGenericsTypes[i], klass, info);
            if(i != self->mGenericsTypesNum-1) { cl_print(info, ","); }
        }
        cl_print(info, ">");
    }
}
Beispiel #2
0
void clone_cl_type2(sCLType* self, sCLType* cl_type2, sCLClass* klass, sCLClass* klass2)
{
    int i;

    self->mClassNameOffset = append_str_to_constant_pool(&klass->mConstPool, CONS_str(&klass2->mConstPool, cl_type2->mClassNameOffset), FALSE);

    self->mGenericsTypesNum = cl_type2->mGenericsTypesNum;

    for(i=0; i<cl_type2->mGenericsTypesNum; i++) {
        self->mGenericsTypes[i] = ALLOC clone_cl_type(cl_type2->mGenericsTypes[i], klass, klass2);
    }
}
Beispiel #3
0
static BOOL is_parent_class_by_name(sCLClass* klass1, char* parent_class_name)
{
    int i;
    for(i=0; i<klass1->mNumSuperClasses; i++) {
        char* real_class_name;
        
        real_class_name = CONS_str(&klass1->mConstPool, klass1->mSuperClasses[i].mClassNameOffset);

        if(strcmp(real_class_name, parent_class_name) == 0) {
            return TRUE;
        }
    }

    return FALSE;
}
Beispiel #4
0
ALLOC sCLType* clone_cl_type(sCLType* cl_type2, sCLClass* klass, sCLClass* klass2)
{
    sCLType* self;
    int i;

    self = ALLOC allocate_cl_type();

    self->mClassNameOffset = append_str_to_constant_pool(&klass->mConstPool, CONS_str(&klass2->mConstPool, cl_type2->mClassNameOffset), FALSE);

    for(i=0; i<cl_type2->mGenericsTypesNum; i++) {
        self->mGenericsTypes[i] = ALLOC clone_cl_type(cl_type2->mGenericsTypes[i], klass, klass2);
    }

    return self;
}
Beispiel #5
0
static BOOL entry_alias_of_dependece(sCLClass* klass)
{
    int i;
    for(i=0; i<klass->mNumDependences; i++) {
        sCLClass* depend_class;
        
        depend_class = cl_get_class(CONS_str(&klass->mConstPool, klass->mDependencesOffset[i]));

        ASSERT(depend_class != NULL);

        if(!entry_alias_of_class(depend_class)) {
            return FALSE;
        }
    }

    return TRUE;
}
Beispiel #6
0
static BOOL entry_alias_of_super_class(sCLClass* klass)
{
    int i;
    for(i=0; i<klass->mNumSuperClasses; i++) {
        sCLClass* super_class;
        
        super_class = cl_get_class(CONS_str(&klass->mConstPool, klass->mSuperClasses[i].mClassNameOffset));

        ASSERT(super_class != NULL);

        if(!entry_alias_of_class(super_class)) {
            return FALSE;
        }
    }

    return TRUE;
}
Beispiel #7
0
static void cl_type_to_string_core(sCLType* cl_type, sCLClass* klass, sBuf* buf)
{
    sBuf_append_str(buf, CONS_str(&klass->mConst, cl_type->mClassNameOffset));

    if(cl_type->mNumGenericsTypes > 0) {
        sBuf_append_str(buf, "<");

        int i;
        for(i=0; i<cl_type->mNumGenericsTypes; i++) {
            cl_type_to_string_core(cl_type->mGenericsTypes[i], klass, buf);

            if(i != cl_type->mNumGenericsTypes -1) {
                sBuf_append_str(buf, ",");
            }
        }

        sBuf_append_str(buf, ">");
    }

    if(cl_type->mArray) {
        sBuf_append_str(buf, "[]");
    }
    if(cl_type->mNullable) {
        sBuf_append_str(buf, "?");
    }

    if(cl_type->mBlockType) {
        sCLBlockType* block = cl_type->mBlockType;

        sBuf_append_str(buf, "(");

        int i;
        for(i=0; i<block->mNumParams; i++) {
            cl_type_to_string_core(block->mParams[i], klass, buf);

            if(i != block->mNumParams - 1) {
                sBuf_append_str(buf, ",");
            }
        }

        sBuf_append_str(buf, "):");

        cl_type_to_string_core(block->mResultType, klass, buf);
    }
}
Beispiel #8
0
sCLClass* get_class_from_cl_type(sCLType* cl_type, sCLClass* klass)
{
    char* class_name = CONS_str(&klass->mConst, cl_type->mClassNameOffset);

    return get_class_with_load_and_initialize(class_name, klass->mFlags & CLASS_FLAGS_JS);
}
Beispiel #9
0
static BOOL entry_alias_of_methods_and_fields_of_class(sCLClass* klass)
{
    int i;

    for(i=0; i<klass->mNumFields; i++) {
        sCLField* field = klass->mFields + i;
        sCLClass* klass2;
        
        klass2 = cl_get_class(CONS_str(&klass->mConstPool, field->mType.mClassNameOffset));
        
        ASSERT(klass2 != NULL);

        if(!entry_alias_of_class(klass2)) {
            return FALSE;
        }
    }

    for(i=0; i<klass->mNumMethods; i++) {
        sCLMethod* method = klass->mMethods + i;
        sCLClass* klass2;
        int j;

        /// result type ///
        klass2 = cl_get_class(CONS_str(&klass->mConstPool, method->mResultType.mClassNameOffset));
        
        ASSERT(klass2 != NULL);

        if(!entry_alias_of_class(klass2)) {
            return FALSE;
        }

        /// param types ///
        for(j=0; j<method->mNumParams; j++) {
            klass2 = cl_get_class(CONS_str(&klass->mConstPool, method->mParamTypes[j].mClassNameOffset)); 

            ASSERT(klass2 != NULL);

            if(!entry_alias_of_class(klass2)) {
                return FALSE;
            }
        }

        /// block type ///
        if(method->mNumBlockType == 1) {
            klass2 = cl_get_class(CONS_str(&klass->mConstPool, method->mBlockType.mResultType.mClassNameOffset));

            ASSERT(klass2 != NULL);

            if(!entry_alias_of_class(klass2)) {
                return FALSE;
            }

            for(j=0; j<method->mBlockType.mNumParams; j++) {
                klass2 = cl_get_class(CONS_str(&klass->mConstPool, method->mBlockType.mParamTypes[j].mClassNameOffset));

                ASSERT(klass2 != NULL);

                if(!entry_alias_of_class(klass2)) {
                    return FALSE;
                }
            }
        }

        /// exception ///
        for(j=0; j<method->mNumException; j++) {
            klass2 = cl_get_class(CONS_str(&klass->mConstPool, method->mExceptionClassNameOffset[j]));

            ASSERT(klass2 != NULL);

            if(!entry_alias_of_class(klass2)) {
                return FALSE;
            }
        }
    }

    return TRUE;
}