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; }
/* 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; }
void EvNIOReader::reset(){ stopReadEvio(); while(!entryQueue.empty()){ popEntry(); } }