예제 #1
0
/* 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;
}
예제 #2
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;
}
예제 #3
0
/* 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;
}