Esempio n. 1
0
void EvNIOReader::readCallback(ev::io &evio, int revents){
    LOG_DEBUG("isClosed():%d, entryQueue.size():%d", isClosed(), entryQueue.size());
    if(isClosed()){
        LOG_DEBUG("isClosed()");
        return;
    }
    
    if(entryQueue.empty()){
        LOG_DEBUG("entryQueue.size():%d", entryQueue.size());
        stopReadEvio();
        return;
    }
    
    Entry* e = entryQueue.front();
    //errno = 0;
    size_t rsize = realRead(e->buff + e->actualLength, e->planLength - e->actualLength, e->pointer);
    LOG_DEBUG("rsize:%d", rsize);
    if(rsize < 0 && ERRNO_IS_AGAIN()){//errno == EAGAIN){
        LOG_DEBUG("errno:%d, rsize:", errno, rsize);
        //待下一次重读,
        feedReadEvio();
        return;
    }
    if(rsize <= 0){
        //读失败
        LOG_DEBUG("errno:%d, rsize:", errno, rsize);
        fireReadCompletionEvent(e->buff, rsize, e->pointer);
        close();
        return;
    }    
    
    e->actualLength += rsize;
    if(e->full && e->actualLength < e->planLength){
        LOG_DEBUG("actualLength:%d, planLength:%d", e->actualLength, e->planLength);
        return;
    }
    
    fireReadCompletionEvent(e->buff, e->actualLength, e->pointer);
    popEntry();

    
    LOG_DEBUG("entryQueue.size():%d", entryQueue.size());
    if(entryQueue.empty()){
        stopReadEvio();
    }else{
        feedReadEvio();
    }
}
//dup
int op_dup( unsigned char **opCode, StackFrame *stack, SimpleConstantPool *p ) {
    StackEntry *entry = popEntry(stack);
    int value = 0;
    value = EntryToInt(entry);
    if ( entry->type == STACK_ENTRY_INT ) {

        pushInt(stack, value);
        pushInt(stack, value);
    } else {
        pushRef(stack, value);
        pushRef(stack, value);
    }
#if SIMPLE_JVM_DEBUG
    printf("dup\n");
#endif
    *opCode = *opCode + 1;
    return 0;
}
Esempio n. 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;
}
Esempio n. 4
0
void EvNIOReader::reset(){
    stopReadEvio();
    while(!entryQueue.empty()){
        popEntry();
    }
}