/* 0xb8 invokestatic */ static int op_invokestatic(unsigned char **opCode, StackFrame *stack, SimpleConstantPool *p) { u2 method_index ; unsigned char tmp[2]; char method_name[255]; char clsName[255]; char method_type[255]; tmp[0] = opCode[0][1]; tmp[1] = opCode[0][2]; method_index = tmp[0] << 8 | tmp[1]; #if SIMPLE_JVM_DEBUG printf("invokestatic method_index %d\n", method_index); printf("simpleMethodPool.method_used = %d\n", simpleMethodPool.method_used); #endif *opCode = *opCode + 3; if (method_index < simpleMethodPool.method_used) { MethodInfo *method = &simpleMethodPool.method[method_index]; memset(method_name, 0, 255); getUTF8String(p, method->name_index, 255, method_name); #if SIMPLE_JVM_DEBUG printf(" method name = %s\n", method_name); #endif } else { ConstantMethodRef *mRef = findMethodRef(p, method_index); if (mRef != 0) { ConstantClassRef *clasz = findClassRef(p, mRef->classIndex); ConstantNameAndType *nat = findNameAndType(p, mRef->nameAndTypeIndex); if (clasz == 0 || nat == 0) return -1; getUTF8String(p, clasz->stringIndex, 255, clsName); getUTF8String(p, nat->nameIndex, 255, method_name); getUTF8String(p, nat->typeIndex, 255, method_type); #if SIMPLE_JVM_DEBUG printf("call class %s\n", clsName); printf("call method %s\n", method_name); printf("call method type %s\n", method_type); int ret = #endif invoke_java_lang_library(stack, p, clsName, method_name, method_type); #if SIMPLE_JVM_DEBUG if (ret) { printf("invoke java lang library successful\n"); } #endif } } return 0; }
static int ParseColumnsAndGenerateCreate(unsigned nCols, const char *const *pCols, char **pzCreateSql, unsigned char *pTypes, char **pzErr){ unsigned i; char *zCreateSql = sqlite3_mprintf("CREATE TABLE x("); if( !zCreateSql ){ return SQLITE_NOMEM; } for( i=0; i<nCols; i++ ){ const char *zSep = (i < nCols - 1 ? ", " : ")"); const char *zNotNull = ""; const char *zNameStart, *zNameEnd; const char *zTypeStart, *zTypeEnd; int rc = findNameAndType(pCols[i], &zNameStart, &zNameEnd, &zTypeStart, &zTypeEnd, &pTypes[i]); if( rc!=SQLITE_OK ){ *pzErr = sqlite3_mprintf("unable to parse column %d", i); sqlite3_free(zCreateSql); return rc; } if( !(pTypes[i]&MASK_NULL) ){ zNotNull = " NOT NULL"; } zCreateSql = sqlite3_mprintf("%z%.*s %.*s%s%s", zCreateSql, zNameEnd - zNameStart, zNameStart, zTypeEnd - zTypeStart, zTypeStart, zNotNull, zSep); if( !zCreateSql ){ return SQLITE_NOMEM; } } *pzCreateSql = zCreateSql; return SQLITE_OK; }
/* invokevirtual */ static int op_invokevirtual(unsigned char **opCode, StackFrame *stack, SimpleConstantPool *p) { u2 object_ref; unsigned char tmp[2]; char clsName[255]; char utf8[255]; int len = 0; tmp[0] = opCode[0][1]; tmp[1] = opCode[0][2]; object_ref = tmp[0] << 8 | tmp[1]; #if SIMPLE_JVM_DEBUG printf("call object_ref %d\n", object_ref); #endif *opCode = *opCode + 3; ConstantMethodRef *mRef = findMethodRef(p, object_ref); if (mRef != 0) { ConstantClassRef *clasz = findClassRef(p, mRef->classIndex); ConstantNameAndType *nat = findNameAndType(p, mRef->nameAndTypeIndex); if (clasz == 0 || nat == 0) return -1; getUTF8String(p, clasz->stringIndex, 255, clsName); #if SIMPLE_JVM_DEBUG printf("call object ref class %s\n", clsName); #endif if (strcmp(clzNamePrint, clsName) == 0) { StackEntry *entry = popEntry(stack); int index = EntryToInt(entry); #if SIMPLE_JVM_DEBUG printf("call Println with index = %d\n", index); #endif if (entry->type == STACK_ENTRY_REF) { ConstantStringRef *strRef = findStringRef(p, index); if (strRef != 0) { getUTF8String(p, strRef->stringIndex, 255, utf8); len = strlen(utf8); memcpy(stringBuilderBuffer + stringBuilderUsed, utf8, len); stringBuilderUsed += len; stringBuilderBuffer[stringBuilderUsed] = 0; } } else if (entry->type == STACK_ENTRY_INT) { sprintf(utf8, "%d", index); len = strlen(utf8); memcpy(stringBuilderBuffer + stringBuilderUsed, utf8, len); stringBuilderUsed += len; stringBuilderBuffer[stringBuilderUsed] = 0; } // printf out the result printf("%s\n", stringBuilderBuffer); memset(stringBuilderBuffer, 0, 1024); stringBuilderUsed = 0; } else if (strcmp(clzNameStrBuilder, clsName) == 0) { StackEntry *entry = popEntry(stack); int index = EntryToInt(entry); #if SIMPLE_JVM_DEBUG printf("call StringBuilder with index = %d\n", index); #endif if (entry->type == STACK_ENTRY_REF) { ConstantStringRef *strRef = findStringRef(p, index); if (strRef != 0) { getUTF8String(p, strRef->stringIndex, 255, utf8); len = strlen(utf8); memcpy(stringBuilderBuffer + stringBuilderUsed, utf8, len); stringBuilderUsed += len; } } else if (entry->type == STACK_ENTRY_INT) { sprintf(utf8, "%d", index); len = strlen(utf8); memcpy(stringBuilderBuffer + stringBuilderUsed, utf8, len); stringBuilderUsed += len; #if SIMPLE_JVM_DEBUG printf("%s\n", stringBuilderBuffer); #endif } } } return 0; }