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