public int execute()

in ext/puma_http11/org/jruby/puma/Http11Parser.java [233:436]


   public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) {
     int p, pe;
     int cs = parser.cs;
     int len = buffer.length();
     assert off<=len : "offset past end of buffer";

     p = off;
     pe = len;
     // get a copy of the bytes, since it may not start at 0
     // FIXME: figure out how to just use the bytes in-place
     byte[] data = buffer.bytes();
     parser.buffer = buffer;

     
// line 250 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
	{
	int _klen;
	int _trans = 0;
	int _acts;
	int _nacts;
	int _keys;
	int _goto_targ = 0;

	_goto: while (true) {
	switch ( _goto_targ ) {
	case 0:
	if ( p == pe ) {
		_goto_targ = 4;
		continue _goto;
	}
	if ( cs == 0 ) {
		_goto_targ = 5;
		continue _goto;
	}
case 1:
	_match: do {
	_keys = _puma_parser_key_offsets[cs];
	_trans = _puma_parser_index_offsets[cs];
	_klen = _puma_parser_single_lengths[cs];
	if ( _klen > 0 ) {
		int _lower = _keys;
		int _mid;
		int _upper = _keys + _klen - 1;
		while (true) {
			if ( _upper < _lower )
				break;

			_mid = _lower + ((_upper-_lower) >> 1);
			if ( data[p] < _puma_parser_trans_keys[_mid] )
				_upper = _mid - 1;
			else if ( data[p] > _puma_parser_trans_keys[_mid] )
				_lower = _mid + 1;
			else {
				_trans += (_mid - _keys);
				break _match;
			}
		}
		_keys += _klen;
		_trans += _klen;
	}

	_klen = _puma_parser_range_lengths[cs];
	if ( _klen > 0 ) {
		int _lower = _keys;
		int _mid;
		int _upper = _keys + (_klen<<1) - 2;
		while (true) {
			if ( _upper < _lower )
				break;

			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
			if ( data[p] < _puma_parser_trans_keys[_mid] )
				_upper = _mid - 2;
			else if ( data[p] > _puma_parser_trans_keys[_mid+1] )
				_lower = _mid + 2;
			else {
				_trans += ((_mid - _keys)>>1);
				break _match;
			}
		}
		_trans += _klen;
	}
	} while (false);

	_trans = _puma_parser_indicies[_trans];
	cs = _puma_parser_trans_targs[_trans];

	if ( _puma_parser_trans_actions[_trans] != 0 ) {
		_acts = _puma_parser_trans_actions[_trans];
		_nacts = (int) _puma_parser_actions[_acts++];
		while ( _nacts-- > 0 )
	{
			switch ( _puma_parser_actions[_acts++] )
			{
	case 0:
// line 15 "ext/puma_http11/http11_parser.java.rl"
	{parser.mark = p; }
	break;
	case 1:
// line 17 "ext/puma_http11/http11_parser.java.rl"
	{ parser.field_start = p; }
	break;
	case 2:
// line 18 "ext/puma_http11/http11_parser.java.rl"
	{ /* FIXME stub */ }
	break;
	case 3:
// line 19 "ext/puma_http11/http11_parser.java.rl"
	{ 
    parser.field_len = p-parser.field_start;
  }
	break;
	case 4:
// line 23 "ext/puma_http11/http11_parser.java.rl"
	{ parser.mark = p; }
	break;
	case 5:
// line 24 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, p-parser.mark);
  }
	break;
	case 6:
// line 27 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
  }
	break;
	case 7:
// line 30 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
  }
	break;
	case 8:
// line 33 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
  }
	break;
	case 9:
// line 37 "ext/puma_http11/http11_parser.java.rl"
	{parser.query_start = p; }
	break;
	case 10:
// line 38 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, p-parser.query_start);
  }
	break;
	case 11:
// line 42 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.http_version(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
  }
	break;
	case 12:
// line 46 "ext/puma_http11/http11_parser.java.rl"
	{
    Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark);
  }
	break;
	case 13:
// line 50 "ext/puma_http11/http11_parser.java.rl"
	{ 
    parser.body_start = p + 1;
    http.header_done(runtime, parser.data, parser.buffer, p + 1, pe - p - 1);
    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
  }
	break;
// line 406 "ext/puma_http11/org/jruby/puma/Http11Parser.java"
			}
		}
	}

case 2:
	if ( cs == 0 ) {
		_goto_targ = 5;
		continue _goto;
	}
	if ( ++p != pe ) {
		_goto_targ = 1;
		continue _goto;
	}
case 4:
case 5:
	}
	break; }
	}

// line 116 "ext/puma_http11/http11_parser.java.rl"

     parser.cs = cs;
     parser.nread += (p - off);
     
     assert p <= pe                  : "buffer overflow after parsing execute";
     assert parser.nread <= len      : "nread longer than length";
     assert parser.body_start <= len : "body starts after buffer end";
     assert parser.mark < len        : "mark is after buffer end";
     assert parser.field_len <= len  : "field has length longer than whole buffer";
     assert parser.field_start < len : "field starts after buffer end";

     return parser.nread;
   }