@@ -26,52 +26,12 @@ def _compile(code, pattern, flags):
2626 # internal: compile a (sub)pattern
2727 emit = code .append
2828 for op , av in pattern :
29- if op is ANY :
30- if flags & SRE_FLAG_DOTALL :
31- emit (OPCODES [op ])
32- else :
33- emit (OPCODES [CATEGORY ])
34- emit (CHCODES [CATEGORY_NOT_LINEBREAK ])
35- elif op in (SUCCESS , FAILURE ):
36- emit (OPCODES [op ])
37- elif op is AT :
38- emit (OPCODES [op ])
39- if flags & SRE_FLAG_MULTILINE :
40- emit (ATCODES [AT_MULTILINE [av ]])
41- else :
42- emit (ATCODES [av ])
43- elif op is BRANCH :
44- emit (OPCODES [op ])
45- tail = []
46- for av in av [1 ]:
47- skip = len (code ); emit (0 )
48- _compile (code , av , flags )
49- emit (OPCODES [JUMP ])
50- tail .append (len (code )); emit (0 )
51- code [skip ] = len (code ) - skip
52- emit (0 ) # end of branch
53- for tail in tail :
54- code [tail ] = len (code ) - tail
55- elif op is CALL :
56- emit (OPCODES [op ])
57- skip = len (code ); emit (0 )
58- _compile (code , av , flags )
59- emit (OPCODES [SUCCESS ])
60- code [skip ] = len (code ) - skip
61- elif op is CATEGORY :
62- emit (OPCODES [op ])
63- if flags & SRE_FLAG_LOCALE :
64- emit (CHCODES [CH_LOCALE [av ]])
65- elif flags & SRE_FLAG_UNICODE :
66- emit (CHCODES [CH_UNICODE [av ]])
67- else :
68- emit (CHCODES [av ])
69- elif op is GROUP :
29+ if op in (LITERAL , NOT_LITERAL ):
7030 if flags & SRE_FLAG_IGNORECASE :
7131 emit (OPCODES [OP_IGNORE [op ]])
7232 else :
7333 emit (OPCODES [op ])
74- emit (av - 1 )
34+ emit (ord ( av ) )
7535 elif op is IN :
7636 if flags & SRE_FLAG_IGNORECASE :
7737 emit (OPCODES [OP_IGNORE [op ]])
@@ -101,15 +61,12 @@ def fixup(literal, flags=flags):
10161 raise error , "internal: unsupported set operator"
10262 emit (OPCODES [FAILURE ])
10363 code [skip ] = len (code ) - skip
104- elif op in (LITERAL , NOT_LITERAL ):
105- if flags & SRE_FLAG_IGNORECASE :
106- emit (OPCODES [OP_IGNORE [op ]])
107- else :
64+ elif op is ANY :
65+ if flags & SRE_FLAG_DOTALL :
10866 emit (OPCODES [op ])
109- emit (ord (av ))
110- elif op is MARK :
111- emit (OPCODES [op ])
112- emit (av )
67+ else :
68+ emit (OPCODES [CATEGORY ])
69+ emit (CHCODES [CATEGORY_NOT_LINEBREAK ])
11370 elif op in (REPEAT , MIN_REPEAT , MAX_REPEAT ):
11471 if flags & SRE_FLAG_TEMPLATE :
11572 emit (OPCODES [REPEAT ])
@@ -150,6 +107,49 @@ def fixup(literal, flags=flags):
150107 if group :
151108 emit (OPCODES [MARK ])
152109 emit ((group - 1 )* 2 + 1 )
110+ elif op in (SUCCESS , FAILURE ):
111+ emit (OPCODES [op ])
112+ elif op in (ASSERT , ASSERT_NOT , CALL ):
113+ emit (OPCODES [op ])
114+ skip = len (code ); emit (0 )
115+ _compile (code , av , flags )
116+ emit (OPCODES [SUCCESS ])
117+ code [skip ] = len (code ) - skip
118+ elif op is AT :
119+ emit (OPCODES [op ])
120+ if flags & SRE_FLAG_MULTILINE :
121+ emit (ATCODES [AT_MULTILINE [av ]])
122+ else :
123+ emit (ATCODES [av ])
124+ elif op is BRANCH :
125+ emit (OPCODES [op ])
126+ tail = []
127+ for av in av [1 ]:
128+ skip = len (code ); emit (0 )
129+ _compile (code , av , flags )
130+ emit (OPCODES [JUMP ])
131+ tail .append (len (code )); emit (0 )
132+ code [skip ] = len (code ) - skip
133+ emit (0 ) # end of branch
134+ for tail in tail :
135+ code [tail ] = len (code ) - tail
136+ elif op is CATEGORY :
137+ emit (OPCODES [op ])
138+ if flags & SRE_FLAG_LOCALE :
139+ emit (CHCODES [CH_LOCALE [av ]])
140+ elif flags & SRE_FLAG_UNICODE :
141+ emit (CHCODES [CH_UNICODE [av ]])
142+ else :
143+ emit (CHCODES [av ])
144+ elif op is GROUP :
145+ if flags & SRE_FLAG_IGNORECASE :
146+ emit (OPCODES [OP_IGNORE [op ]])
147+ else :
148+ emit (OPCODES [op ])
149+ emit (av - 1 )
150+ elif op is MARK :
151+ emit (OPCODES [op ])
152+ emit (av )
153153 else :
154154 raise ValueError , ("unsupported operand type" , op )
155155
0 commit comments