stateNotFound(c, builder);
//return code
//code that synchronizes the state object and returns
setupLocalVariables(c);
final CodeLocation returnIncompleteCode = c.mark();
c.aload(PARSE_STATE_VAR);
c.dup();
c.dup();
c.dup();
c.dup();
c.iload(STATE_POS_VAR);
c.putfield(parseStateClass, "pos", "I");
c.aload(STATE_CURRENT_VAR);
c.putfield(parseStateClass, "current", HTTP_STRING_DESCRIPTOR);
c.aload(STATE_CURRENT_BYTES_VAR);
c.putfield(parseStateClass, "currentBytes", "[B");
c.iload(CURRENT_STATE_VAR);
c.putfield(parseStateClass, "parseState", "I");
c.returnInstruction();
setupLocalVariables(c);
final CodeLocation returnCompleteCode = c.mark();
c.aload(PARSE_STATE_VAR);
c.dup();
c.dup();
c.dup();
c.dup();
c.iconst(0);
c.putfield(parseStateClass, "pos", "I");
c.aconstNull();
c.putfield(parseStateClass, "current", HTTP_STRING_DESCRIPTOR);
c.aconstNull();
c.putfield(parseStateClass, "currentBytes", "[B");
c.aload(STATE_STRING_BUILDER_VAR);
c.iconst(0);
c.invokevirtual(StringBuilder.class.getName(), "setLength", "(I)V");
c.iconst(0);
c.putfield(parseStateClass, "parseState", "I");
c.returnInstruction();
//prefix
c.branchEnd(prefixMatch.get());
final CodeLocation prefixLoop = c.mark(); //loop for when we are prefix matching
handleReturnIfNoMoreBytes(c, returnIncompleteCode);
//load 3 copies of the current byte into the stack
c.aload(BYTE_BUFFER_VAR);
c.invokevirtual(ByteBuffer.class.getName(), "get", "()B");
c.dup();
c.dup();
final Set<BranchEnd> prefixHandleSpace = new HashSet<BranchEnd>();
if (stateMachine.isHeader()) {
c.iconst(':');
prefixHandleSpace.add(c.ifIcmpeq());
c.dup();
}
c.iconst(' ');
prefixHandleSpace.add(c.ifIcmpeq());
c.dup();
c.iconst('\t');
prefixHandleSpace.add(c.ifIcmpeq());
c.dup();
c.iconst('\r');
prefixHandleSpace.add(c.ifIcmpeq());
c.dup();
c.iconst('\n');
prefixHandleSpace.add(c.ifIcmpeq());
//check if we have overrun
c.aload(STATE_CURRENT_BYTES_VAR);
c.arraylength();
c.iload(STATE_POS_VAR);
BranchEnd overrun = c.ifIcmpeq();
//so we have not overrun
//now check if the character matches
c.dup();
c.aload(STATE_CURRENT_BYTES_VAR);
c.iload(STATE_POS_VAR);
c.baload();
c.isub();
BranchEnd noMatch = c.ifne();
//so they match
c.pop2(); //pop our extra bytes off the stack, we do not need it
c.iinc(STATE_POS_VAR, 1);
handleReturnIfNoMoreBytes(c, returnIncompleteCode);
c.gotoInstruction(prefixLoop);
c.branchEnd(overrun); //overrun and not match use the same code path
c.branchEnd(noMatch); //the current character did not match
c.iconst(NO_STATE);
c.istore(CURRENT_STATE_VAR);
//create the string builder
c.aload(STATE_STRING_BUILDER_VAR);
c.aload(STATE_CURRENT_VAR);
c.invokevirtual(HTTP_STRING_CLASS, "toString", "()Ljava/lang/String;");
c.iconst(0);
c.iload(STATE_POS_VAR);
c.invokevirtual(String.class.getName(), "substring", "(II)Ljava/lang/String;");
c.invokevirtual(StringBuilder.class.getName(), "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
c.swap();
c.invokevirtual(StringBuilder.class.getName(), "append", "(C)Ljava/lang/StringBuilder;");
c.pop2();
BranchEnd prefixToNoState = c.gotoInstruction();
//handle the space case
for (BranchEnd b : prefixHandleSpace) {
c.branchEnd(b);
}
//new state will be 0
c.iconst(0);
c.istore(CURRENT_STATE_VAR);
c.aload(STATE_CURRENT_BYTES_VAR);
c.arraylength();
c.iload(STATE_POS_VAR);
BranchEnd correctLength = c.ifIcmpeq();
c.newInstruction(HTTP_STRING_CLASS);
c.dup();
c.aload(STATE_CURRENT_BYTES_VAR);
c.iconst(0);
c.iload(STATE_POS_VAR);
c.invokespecial(HTTP_STRING_CLASS, "<init>", "([BII)V");
stateMachine.handleOtherToken(c);
//TODO: exit if it returns null
//decrease the available bytes
c.pop();
tokenDone(c, returnCompleteCode, stateMachine);
c.branchEnd(correctLength);
c.aload(STATE_CURRENT_VAR);
stateMachine.handleStateMachineMatchedToken(c);
//TODO: exit if it returns null
c.pop();
tokenDone(c, returnCompleteCode, stateMachine);
//nostate
c.branchEnd(noState.get());
c.branchEnd(prefixToNoState);
CodeLocation noStateLoop = c.mark();
handleReturnIfNoMoreBytes(c, returnIncompleteCode);
//load 2 copies of the current byte into the stack
c.aload(BYTE_BUFFER_VAR);
c.invokevirtual(ByteBuffer.class.getName(), "get", "()B");