From 69b23893cfe9cce5a077fe1ec1e669700c542b96 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 13 Nov 2017 00:52:13 -0600 Subject: [PATCH] First pass at JRuby support. This commit has no build smarts. Here's the process: ``` $ cd ext/java/ $ javac -cp ../../../jruby/lib/jruby.jar fast_blank.java $ jar cvf ../../lib/fast_blank.jar fast_blank.class added manifest adding: fast_blank.class(in = 2182) (out= 1121)(deflated 48%) $ cd ../.. $ jruby -Ilib -e 'require "fast_blank"; p "".blank?' true ``` --- ext/java/fast_blank.class | Bin 0 -> 2182 bytes ext/java/fast_blank.java | 100 ++++++++++++++++++++++++++++++++++++++ lib/fast_blank.jar | Bin 0 -> 1587 bytes lib/fast_blank.rb | 7 +++ 4 files changed, 107 insertions(+) create mode 100644 ext/java/fast_blank.class create mode 100644 ext/java/fast_blank.java create mode 100644 lib/fast_blank.jar create mode 100644 lib/fast_blank.rb diff --git a/ext/java/fast_blank.class b/ext/java/fast_blank.class new file mode 100644 index 0000000000000000000000000000000000000000..87904d459c5daba932bd5ebd9cf51e74f71b3656 GIT binary patch literal 2182 zcmb_c-%}e^6#i}!a>=ql%da*CgsR1aR)V%-O(^Au&;|pv1ZYcC*n|a^h7D#n9jh;Ee9fz2Dt)&%NiI@0@dg-TU!p z0M}5^a2A&%xPmt&1~debP}87>xA3-_uBzW_O5q*#JEY-VTvxyEX-FcaVHh_gMl{^S zsKl5+c-XQncSIl#Dv8A5|a{BBtzns#BG7-eAS;N%dzPBm~EF_!?jAbBhYoon!%04v~p#} zbT>VQ)oIND(H`dYA)sO-k{nWlNQE!JM)bXU*$|{iXhk?An8RbHPS=>le$rtFUd2nhL1umV`I3)R= z8>U;kKN|BZ=(uU7Q)$+2?tH0PrVEK9W|eNmc8qmXsk2T(vAFWPE^lsFw$~c;D&$z7 zF{wefTww&q92+l{il$-nrh0ZkG3%)wqSv!$l@6F$WY{#+V%i1OaXTf;b~C2E;cf~H zo~W$ccsiX+S52M>G_HJGH`H~lwG>Zm8fBy4nq|gjIoTbfU@DP{EgfHGk&~Qi#W9#8 z)F_@OiiYDbnATdN4#WZ-YvwxN2fwwf<=n=< zZlWO8_5T3z9TzMk&S6ieA%YH^LqMsDKPhb>&h>wfKr(#!7X*_sDt8f@QFC3gK3czv zaI#K;98t3RC#a`(SB0!F;A7CokdJjfhJBPi z*8AxD)$9A!8}sFH9}_;VRB@1i7tcI0bdnJX4y=wm+uQTF;a0#Seag$wS<>7Jos_pw z8f5}{nSwr?$5m1?j806Viw{&cpPe3Y9VwB*4Ka$F;uc25G{&e2Oe4I{0}+X+#07~? zb~L&qx+Pwb=mGX=OsnmR!@H6u@i+bufzV$}!A0KJ#DaL0 z|E(}EaH24tqwxtE+qJKbk+}ccQ4&X3=wA59ki=P%I7briFrvF8F-uMsN#YVoyhjr6 zlf-2dk%Pn6`w?GmMc!?M{xf-f;&kfzNZlKVkxJEmeN4R|YW=%tYH8lZnOYBO+ynB| MFHlESRsj9~0K~c1nE(I) literal 0 HcmV?d00001 diff --git a/ext/java/fast_blank.java b/ext/java/fast_blank.java new file mode 100644 index 0000000..faf6a6e --- /dev/null +++ b/ext/java/fast_blank.java @@ -0,0 +1,100 @@ +import org.jcodings.Encoding; +import org.jruby.Ruby; +import org.jruby.RubyString; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.io.EncodingUtils; + +public class fast_blank { + @JRubyMethod(name = "blank_as?") + public static IRubyObject blank_as_p(ThreadContext context, IRubyObject self) { + Encoding enc; + int s, e; + byte[] sBytes; + + Ruby runtime = context.runtime; + + RubyString str = (RubyString) self; + enc = str.getEncoding(); + ByteList sByteList = str.getByteList(); + sBytes = sByteList.unsafeBytes(); + s = sByteList.begin(); + if (str.size() == 0) return context.tru; + + e = s + sByteList.realSize(); + int[] n = {0}; + while (s < e) { + int cc = EncodingUtils.encCodepointLength(runtime, sBytes, s, e, n, enc); + + switch (cc) { + case 9: + case 0xa: + case 0xb: + case 0xc: + case 0xd: + case 0x20: + case 0x85: + case 0xa0: + case 0x1680: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200a: + case 0x2028: + case 0x2029: + case 0x202f: + case 0x205f: + case 0x3000: + case 0x180e: + /* found */ + break; + default: + return context.fals; + } + s += n[0]; + } + return context.tru; + } + + @JRubyMethod(name = "blank?") + public static IRubyObject blank_p(ThreadContext context, IRubyObject self) { + Encoding enc; + int s, e; + byte[] sBytes; + + Ruby runtime = context.runtime; + + RubyString str = (RubyString) self; + + enc = str.getEncoding(); + ByteList sByteList = str.getByteList(); + sBytes = sByteList.unsafeBytes(); + s = sByteList.begin(); + + if (str.size() == 0) return context.tru; + + e = s + sByteList.realSize(); + int[] n = {0}; + while (s < e) { + int cc = EncodingUtils.encCodepointLength(runtime, sBytes, s, e, n, enc); + + if (!Character.isSpaceChar(cc) && cc != 0) return context.fals; + s += n[0]; + } + + return context.tru; + } + + public static void init(Ruby runtime) { + runtime.getString().defineAnnotatedMethods(fast_blank.class); + } +} diff --git a/lib/fast_blank.jar b/lib/fast_blank.jar new file mode 100644 index 0000000000000000000000000000000000000000..a5b92ad530ef05514bad919088fc90a681cc1456 GIT binary patch literal 1587 zcmWIWW@Zs#;Nak3aAnK&W*(j{<{BKL=j-;__snS@Z(Y5MyxzK6=gyqp9At3C_`%a6JuhD!Pv48Bt5`TA zUPvC1mXg-W_#v*U_I!z!#dC4dC*rEp7_Mf2D*9N&2zEsvmzIwU&<MLWr)~mQ5Mj*IGUWXEZZL zF>O)R%9*69!@GON-I6u?ems&-oG%mq>p}N9i!GN6W#-p@xheUdJ$_E1%!fO7vzbMX zpUX)5R`-2gb@j;>0)A8mf;YiwKpB+KPt7q@4BeZ;&sY`bmt@hj7}XDthySC(`B&yCY_ z9t5n34n4o=>l>j+@$TDcCr>YlyU@ST^1bBJ>d(j4`FA9DCC_>s+b7uNs!P zk)VPztDZ(ZvBa7MCobEDE>O-D!dXjguh)EB>}N2l!g;B@`)g_pml&M{j0;FWQiK{AKvGKr`@ zwNnMl5?54*h0d>fFw^q%*OvNeF4Grwd@k&joTatwx`qA3DWWAdTfXGXxii-$CfofG z*Zo~@rDiYN5HMHc&!CGk~`~?Z^oV5qJ2;7@Q325p)*dUao?=>xbl2kX2;`O(&09H zQ?K+)O24LIe){ZtDb?T^E_pYvNQqi@3Wvz37Q09Z7VgU0p{IJeu4(4N)j4^Wek(+u z)?w#$k(NDqN0IHHZkI8>DNmxwgR!~o|6JglG$v( zIDEad`SS5~N{5Yh98)tmw=TKqY~m!FMoSm|7yN~NEXOVT@?K?pDfm*f=g38NnE-{Y z8&C7SFH*cR|3`1@6#Exk=Pp<3h6w0i{_e$i=IH8_y&u*X2stJ`xcq;ufx(xUL>tG? z&L-un;$?(CK6t)ZsV{Kh@0ZH%N_rDIx>X+eo_ZnHIYZqy%;QL?&_}b*iguS6XHnK2 zU#jjepB~*&&U~s~EWcr{&RvGcc;}#P_Zc>Rv(7Ex*Uep9ZE^L5qv#^5?kDj|-lxtN ze9#9Kk{r_|_a?G1Fth=S%K&diCJ_eIG8R^Vg34G_053E_B`&&F