diff --git a/ext/http11/http11_parser.java.rl b/ext/http11/http11_parser.java.rl index ce06ade3..32fcf047 100644 --- a/ext/http11/http11_parser.java.rl +++ b/ext/http11/http11_parser.java.rl @@ -116,12 +116,12 @@ public class Http11Parser { public int execute(ByteList buffer, int off) { int p, pe; int cs = parser.cs; - int len = buffer.realSize; + int len = buffer.length(); assert off<=len : "offset past end of buffer"; p = off; pe = len; - byte[] data = buffer.bytes; + byte[] data = buffer.unsafeBytes(); parser.buffer = buffer; %% write exec; diff --git a/ext/http11/org/jruby/mongrel/Http11.java b/ext/http11/org/jruby/mongrel/Http11.java index 63acd5df..52c83ebe 100644 --- a/ext/http11/org/jruby/mongrel/Http11.java +++ b/ext/http11/org/jruby/mongrel/Http11.java @@ -1,30 +1,3 @@ -/***** BEGIN LICENSE BLOCK ***** - * Version: CPL 1.0/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Common Public - * License Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.eclipse.org/legal/cpl-v10.html - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * Copyright (C) 2007 Ola Bini - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the CPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the CPL, the GPL or the LGPL. - ***** END LICENSE BLOCK *****/ package org.jruby.mongrel; import org.jruby.Ruby; @@ -35,8 +8,10 @@ import org.jruby.RubyNumeric; import org.jruby.RubyObject; import org.jruby.RubyString; -import org.jruby.runtime.CallbackFactory; +import org.jruby.anno.JRubyMethod; + import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.exceptions.RaiseException; @@ -73,16 +48,8 @@ public class Http11 extends RubyObject { RubyModule mMongrel = runtime.defineModule("Mongrel"); mMongrel.defineClassUnder("HttpParserError",runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator()); - CallbackFactory cf = runtime.callbackFactory(Http11.class); - RubyClass cHttpParser = mMongrel.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR); - cHttpParser.defineFastMethod("initialize",cf.getFastMethod("initialize")); - cHttpParser.defineFastMethod("reset",cf.getFastMethod("reset")); - cHttpParser.defineFastMethod("finish",cf.getFastMethod("finish")); - cHttpParser.defineFastMethod("execute",cf.getFastMethod("execute", IRubyObject.class, IRubyObject.class, IRubyObject.class)); - cHttpParser.defineFastMethod("error?",cf.getFastMethod("has_error")); - cHttpParser.defineFastMethod("finished?",cf.getFastMethod("is_finished")); - cHttpParser.defineFastMethod("nread",cf.getFastMethod("nread")); + cHttpParser.defineAnnotatedMethods(Http11.class); } private Ruby runtime; @@ -121,15 +88,15 @@ public class Http11 extends RubyObject { v = RubyString.newString(runtime, new ByteList(Http11.this.hp.parser.buffer,value,vlen)); f = RubyString.newString(runtime, "HTTP_"); ByteList b = new ByteList(Http11.this.hp.parser.buffer,field,flen); - for(int i=0,j=b.realSize;i= d.realSize) { + if(from >= d.length()) { throw new RaiseException(runtime, eHttpParserError, "Requested start is after data buffer end.", true); } else { this.hp.parser.data = req_hash; @@ -252,14 +224,17 @@ public class Http11 extends RubyObject { } } + @JRubyMethod(name = "error?") public IRubyObject has_error() { return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse(); } + @JRubyMethod(name = "finished?") public IRubyObject is_finished() { return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse(); } + @JRubyMethod public IRubyObject nread() { return runtime.newFixnum(this.hp.parser.nread); } diff --git a/ext/http11/org/jruby/mongrel/Http11Parser.java b/ext/http11/org/jruby/mongrel/Http11Parser.java index 99b9d8bc..dabdfd9f 100644 --- a/ext/http11/org/jruby/mongrel/Http11Parser.java +++ b/ext/http11/org/jruby/mongrel/Http11Parser.java @@ -14,7 +14,7 @@ public class Http11Parser { /** Data **/ -// line 18 "ext/http11_java/org/jruby/mongrel/Http11Parser.java" +// line 18 "ext/http11/org/jruby/mongrel/Http11Parser.java" private static byte[] init__http_parser_actions_0() { return new byte [] { @@ -236,7 +236,7 @@ static final int http_parser_en_main = 1; cs = 0; -// line 240 "ext/http11_java/org/jruby/mongrel/Http11Parser.java" +// line 240 "ext/http11/org/jruby/mongrel/Http11Parser.java" { cs = http_parser_start; } @@ -257,16 +257,16 @@ static final int http_parser_en_main = 1; public int execute(ByteList buffer, int off) { int p, pe; int cs = parser.cs; - int len = buffer.realSize; + int len = buffer.length(); assert off<=len : "offset past end of buffer"; p = off; pe = len; - byte[] data = buffer.bytes; + byte[] data = buffer.unsafeBytes(); parser.buffer = buffer; -// line 270 "ext/http11_java/org/jruby/mongrel/Http11Parser.java" +// line 270 "ext/http11/org/jruby/mongrel/Http11Parser.java" { int _klen; int _trans = 0; @@ -431,7 +431,7 @@ case 1: { p += 1; _goto_targ = 5; if (true) continue _goto;} } break; -// line 435 "ext/http11_java/org/jruby/mongrel/Http11Parser.java" +// line 435 "ext/http11/org/jruby/mongrel/Http11Parser.java" } } } diff --git a/tasks/ragel.rake b/tasks/ragel.rake index cd9be711..232d8843 100644 --- a/tasks/ragel.rake +++ b/tasks/ragel.rake @@ -9,10 +9,12 @@ file 'ext/http11/http11_parser.c' => ['ext/http11/http11_parser.rl'] do |t| end end -file 'ext/http11_java/org/jruby/mongrel/Http11Parser.java' => ['ext/http11/http11_parser.rl'] do |t| +file 'ext/http11/org/jruby/mongrel/Http11Parser.java' => ['ext/http11/http11_parser.java.rl'] do |t| begin - sh "ragel #{t.prerequisites.last} -J -o #{t.name}" + sh "ragel #{t.prerequisites.last} -J -G2 -o #{t.name}" rescue - fail "Could not build wrapper using Ragel (it failed or not installed?)" + fail "Could not build wrapper using Ragel (it failed or not installed?)" end end + +task :ragel => (defined?(JRUBY_VERSION) ? 'ext/http11/org/jruby/mongrel/Http11Parser.java' : 'ext/http11/http11_parser.c')