Lexer support for JRuby.
JRuby now passes all tests. Benchmark wise it completes the big XML benchmark in about 500-600 milliseconds.
This commit is contained in:
parent
b9a4038e42
commit
3afef5f7cc
|
@ -11,6 +11,7 @@ import org.jruby.RubyModule;
|
||||||
import org.jruby.RubyClass;
|
import org.jruby.RubyClass;
|
||||||
import org.jruby.RubyObject;
|
import org.jruby.RubyObject;
|
||||||
import org.jruby.RubyString;
|
import org.jruby.RubyString;
|
||||||
|
import org.jruby.util.ByteList;
|
||||||
import org.jruby.anno.JRubyClass;
|
import org.jruby.anno.JRubyClass;
|
||||||
import org.jruby.anno.JRubyMethod;
|
import org.jruby.anno.JRubyMethod;
|
||||||
import org.jruby.runtime.ThreadContext;
|
import org.jruby.runtime.ThreadContext;
|
||||||
|
@ -20,6 +21,8 @@ import org.jruby.runtime.builtin.IRubyObject;
|
||||||
@JRubyClass(name="Oga::XML::Lexer", parent="Object")
|
@JRubyClass(name="Oga::XML::Lexer", parent="Object")
|
||||||
public class Lexer extends RubyObject
|
public class Lexer extends RubyObject
|
||||||
{
|
{
|
||||||
|
private Ruby runtime;
|
||||||
|
|
||||||
%% write data;
|
%% write data;
|
||||||
|
|
||||||
public static void load(Ruby runtime)
|
public static void load(Ruby runtime)
|
||||||
|
@ -47,6 +50,8 @@ public class Lexer extends RubyObject
|
||||||
public Lexer(Ruby runtime, RubyClass klass)
|
public Lexer(Ruby runtime, RubyClass klass)
|
||||||
{
|
{
|
||||||
super(runtime, klass);
|
super(runtime, klass);
|
||||||
|
|
||||||
|
this.runtime = runtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@JRubyMethod
|
@JRubyMethod
|
||||||
|
@ -64,7 +69,7 @@ public class Lexer extends RubyObject
|
||||||
int te = 0;
|
int te = 0;
|
||||||
int p = 0;
|
int p = 0;
|
||||||
int pe = data.length;
|
int pe = data.length;
|
||||||
int eof = 0;
|
int eof = data.length;
|
||||||
int top = 0;
|
int top = 0;
|
||||||
|
|
||||||
int[] stack = new int[8];
|
int[] stack = new int[8];
|
||||||
|
@ -77,12 +82,20 @@ public class Lexer extends RubyObject
|
||||||
|
|
||||||
public void callback(String name, byte[] data, Encoding enc, int ts, int te)
|
public void callback(String name, byte[] data, Encoding enc, int ts, int te)
|
||||||
{
|
{
|
||||||
|
ByteList bytelist = new ByteList(data, ts, te - ts, enc, true);
|
||||||
|
|
||||||
|
RubyString value = this.runtime.newString(bytelist);
|
||||||
|
|
||||||
|
ThreadContext context = this.runtime.getCurrentContext();
|
||||||
|
|
||||||
|
this.callMethod(context, name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void callback_simple(String name)
|
public void callback_simple(String name)
|
||||||
{
|
{
|
||||||
|
ThreadContext context = this.runtime.getCurrentContext();
|
||||||
|
|
||||||
|
this.callMethod(context, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue