Last active
June 13, 2018 18:14
-
-
Save overthink/c9408d72e52a45a2a33015221b551788 to your computer and use it in GitHub Desktop.
Compile Clojure regex literals.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Classfile /home/mark/src/clj-re/target/classes/clj_re/core$simple.class | |
Last modified 13-Jun-2018; size 1119 bytes | |
MD5 checksum 7a8f0ea3a3b22a33c335acffef1eda0a | |
Compiled from "core.clj" | |
public final class clj_re.core$simple extends clojure.lang.AFunction | |
minor version: 0 | |
major version: 49 | |
flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER | |
Constant pool: | |
#1 = Utf8 clj_re/core$simple | |
#2 = Class #1 // clj_re/core$simple | |
#3 = Utf8 clojure/lang/AFunction | |
#4 = Class #3 // clojure/lang/AFunction | |
#5 = Utf8 core.clj | |
#6 = Utf8 <init> | |
#7 = Utf8 ()V | |
#8 = NameAndType #6:#7 // "<init>":()V | |
#9 = Methodref #4.#8 // clojure/lang/AFunction."<init>":()V | |
#10 = Utf8 invokeStatic | |
#11 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object; | |
#12 = Utf8 const__0 | |
#13 = Utf8 Lclojure/lang/Var; | |
#14 = NameAndType #12:#13 // const__0:Lclojure/lang/Var; | |
#15 = Fieldref #2.#14 // clj_re/core$simple.const__0:Lclojure/lang/Var; | |
#16 = Utf8 clojure/lang/Var | |
#17 = Class #16 // clojure/lang/Var | |
#18 = Utf8 getRawRoot | |
#19 = Utf8 ()Ljava/lang/Object; | |
#20 = NameAndType #18:#19 // getRawRoot:()Ljava/lang/Object; | |
#21 = Methodref #17.#20 // clojure/lang/Var.getRawRoot:()Ljava/lang/Object; | |
#22 = Utf8 clojure/lang/IFn | |
#23 = Class #22 // clojure/lang/IFn | |
#24 = Utf8 const__1 | |
#25 = Utf8 Ljava/lang/Object; | |
#26 = NameAndType #24:#25 // const__1:Ljava/lang/Object; | |
#27 = Fieldref #2.#26 // clj_re/core$simple.const__1:Ljava/lang/Object; | |
#28 = Utf8 invoke | |
#29 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
#30 = NameAndType #28:#29 // invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
#31 = InterfaceMethodref #23.#30 // clojure/lang/IFn.invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
#32 = Utf8 x | |
#33 = NameAndType #10:#11 // invokeStatic:(Ljava/lang/Object;)Ljava/lang/Object; | |
#34 = Methodref #2.#33 // clj_re/core$simple.invokeStatic:(Ljava/lang/Object;)Ljava/lang/Object; | |
#35 = Utf8 <clinit> | |
#36 = Utf8 clojure.core | |
#37 = String #36 // clojure.core | |
#38 = Utf8 re-find | |
#39 = String #38 // re-find | |
#40 = Utf8 clojure/lang/RT | |
#41 = Class #40 // clojure/lang/RT | |
#42 = Utf8 var | |
#43 = Utf8 (Ljava/lang/String;Ljava/lang/String;)Lclojure/lang/Var; | |
#44 = NameAndType #42:#43 // var:(Ljava/lang/String;Ljava/lang/String;)Lclojure/lang/Var; | |
#45 = Methodref #41.#44 // clojure/lang/RT.var:(Ljava/lang/String;Ljava/lang/String;)Lclojure/lang/Var; | |
#46 = Utf8 some.*regex.*literal | |
#47 = String #46 // some.*regex.*literal | |
#48 = Utf8 java/util/regex/Pattern | |
#49 = Class #48 // java/util/regex/Pattern | |
#50 = Utf8 compile | |
#51 = Utf8 (Ljava/lang/String;)Ljava/util/regex/Pattern; | |
#52 = NameAndType #50:#51 // compile:(Ljava/lang/String;)Ljava/util/regex/Pattern; | |
#53 = Methodref #49.#52 // java/util/regex/Pattern.compile:(Ljava/lang/String;)Ljava/util/regex/Pattern; | |
#54 = Utf8 Code | |
#55 = Utf8 LineNumberTable | |
#56 = Utf8 LocalVariableTable | |
#57 = Utf8 SourceFile | |
#58 = Utf8 SourceDebugExtension | |
{ | |
public static final clojure.lang.Var const__0; | |
descriptor: Lclojure/lang/Var; | |
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL | |
public static final java.lang.Object const__1; | |
descriptor: Ljava/lang/Object; | |
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL | |
public clj_re.core$simple(); | |
descriptor: ()V | |
flags: ACC_PUBLIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokespecial #9 // Method clojure/lang/AFunction."<init>":()V | |
4: return | |
LineNumberTable: | |
line 4: 0 | |
public static java.lang.Object invokeStatic(java.lang.Object); | |
descriptor: (Ljava/lang/Object;)Ljava/lang/Object; | |
flags: ACC_PUBLIC, ACC_STATIC | |
Code: | |
stack=4, locals=1, args_size=1 | |
0: getstatic #15 // Field const__0:Lclojure/lang/Var; | |
3: invokevirtual #21 // Method clojure/lang/Var.getRawRoot:()Ljava/lang/Object; | |
6: checkcast #23 // class clojure/lang/IFn | |
9: getstatic #27 // Field const__1:Ljava/lang/Object; | |
12: aload_0 | |
13: aconst_null | |
14: astore_0 | |
15: invokeinterface #31, 3 // InterfaceMethod clojure/lang/IFn.invoke:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; | |
20: areturn | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 20 0 x Ljava/lang/Object; | |
LineNumberTable: | |
line 4: 0 | |
line 5: 6 | |
line 5: 15 | |
public java.lang.Object invoke(java.lang.Object); | |
descriptor: (Ljava/lang/Object;)Ljava/lang/Object; | |
flags: ACC_PUBLIC | |
Code: | |
stack=2, locals=2, args_size=2 | |
0: aload_1 | |
1: aconst_null | |
2: astore_1 | |
3: invokestatic #34 // Method invokeStatic:(Ljava/lang/Object;)Ljava/lang/Object; | |
6: areturn | |
LineNumberTable: | |
line 4: 3 | |
public static {}; | |
descriptor: ()V | |
flags: ACC_PUBLIC, ACC_STATIC | |
Code: | |
stack=2, locals=0, args_size=0 | |
0: ldc #37 // String clojure.core | |
2: ldc #39 // String re-find | |
4: invokestatic #45 // Method clojure/lang/RT.var:(Ljava/lang/String;Ljava/lang/String;)Lclojure/lang/Var; | |
7: checkcast #17 // class clojure/lang/Var | |
10: putstatic #15 // Field const__0:Lclojure/lang/Var; | |
13: ldc #47 // String some.*regex.*literal | |
15: invokestatic #53 // Method java/util/regex/Pattern.compile:(Ljava/lang/String;)Ljava/util/regex/Pattern; | |
18: putstatic #27 // Field const__1:Ljava/lang/Object; | |
21: return | |
LineNumberTable: | |
line 4: 0 | |
} | |
SourceFile: "core.clj" | |
SourceDebugExtension: | |
SMAP | |
core.java | |
Clojure | |
*S Clojure | |
*F | |
+ 1 core.clj | |
clj_re/core.clj | |
*L | |
2#1,4:2 | |
*E |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns clj-re.core | |
(:gen-class)) | |
(defn simple [x] | |
(re-find #"some.*regex.*literal" x)) ;; this regex ends up as a `static final Pattern ...` in the compiled code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In the compiled code,
public static final clojure.lang.Var const__0
ends up as a var containing theclojure.core/re-find
function (IFn instance).public static final java.lang.Object const__1
ends up as the compiledPattern
object for#"some.*regex.*literal"
(https://gist.github.com/overthink/c9408d72e52a45a2a33015221b551788#file-core-simple-class-L134-L135). So each invocation ofsimple
just references the compiled regex.