Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit18a6967

Browse files
authored
1 parenta694b82 commit18a6967

File tree

1 file changed

+41
-23
lines changed

1 file changed

+41
-23
lines changed

‎Python/compile.c‎

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,24 @@ struct instr {
171171
structbasicblock_*i_except;/* target block when exception is raised */
172172
};
173173

174+
/* One arg*/
175+
#defineINSTR_SET_OP1(I,OP,ARG) \
176+
do { \
177+
assert(HAS_ARG(OP)); \
178+
struct instr *_instr__ptr_ = (I); \
179+
_instr__ptr_->i_opcode = (OP); \
180+
_instr__ptr_->i_oparg = (ARG); \
181+
} while (0);
182+
183+
/* No args*/
184+
#defineINSTR_SET_OP0(I,OP) \
185+
do { \
186+
assert(!HAS_ARG(OP)); \
187+
struct instr *_instr__ptr_ = (I); \
188+
_instr__ptr_->i_opcode = (OP); \
189+
_instr__ptr_->i_oparg = 0; \
190+
} while (0);
191+
174192
typedefstructexceptstack {
175193
structbasicblock_*handlers[CO_MAXBLOCKS+1];
176194
intdepth;
@@ -218,7 +236,8 @@ instr_size(struct instr *instruction)
218236
{
219237
intopcode=instruction->i_opcode;
220238
assert(!IS_PSEUDO_OPCODE(opcode));
221-
intoparg=HAS_ARG(opcode) ?instruction->i_oparg :0;
239+
intoparg=instruction->i_oparg;
240+
assert(HAS_ARG(opcode)||oparg==0);
222241
intextended_args= (0xFFFFFF<oparg)+ (0xFFFF<oparg)+ (0xFF<oparg);
223242
intcaches=_PyOpcode_Caches[opcode];
224243
returnextended_args+1+caches;
@@ -229,7 +248,8 @@ write_instr(_Py_CODEUNIT *codestr, struct instr *instruction, int ilen)
229248
{
230249
intopcode=instruction->i_opcode;
231250
assert(!IS_PSEUDO_OPCODE(opcode));
232-
intoparg=HAS_ARG(opcode) ?instruction->i_oparg :0;
251+
intoparg=instruction->i_oparg;
252+
assert(HAS_ARG(opcode)||oparg==0);
233253
intcaches=_PyOpcode_Caches[opcode];
234254
switch (ilen-caches) {
235255
case4:
@@ -7598,7 +7618,7 @@ convert_exception_handlers_to_nops(basicblock *entryblock) {
75987618
for (inti=0;i<b->b_iused;i++) {
75997619
structinstr*instr=&b->b_instr[i];
76007620
if (is_block_push(instr)||instr->i_opcode==POP_BLOCK) {
7601-
instr->i_opcode=NOP;
7621+
INSTR_SET_OP0(instr,NOP);
76027622
}
76037623
}
76047624
}
@@ -8723,7 +8743,7 @@ remove_redundant_jumps(cfg_builder *g) {
87238743
}
87248744
if (last->i_target==b->b_next) {
87258745
assert(b->b_next->b_iused);
8726-
last->i_opcode=NOP;
8746+
INSTR_SET_OP0(last,NOP);
87278747
}
87288748
}
87298749
}
@@ -8999,10 +9019,9 @@ fold_tuple_on_constants(PyObject *const_cache,
89999019
}
90009020
Py_DECREF(newconst);
90019021
for (inti=0;i<n;i++) {
9002-
inst[i].i_opcode=NOP;
9022+
INSTR_SET_OP0(&inst[i],NOP);
90039023
}
9004-
inst[n].i_opcode=LOAD_CONST;
9005-
inst[n].i_oparg= (int)index;
9024+
INSTR_SET_OP1(&inst[n],LOAD_CONST, (int)index);
90069025
return0;
90079026
}
90089027

@@ -9099,7 +9118,7 @@ swaptimize(basicblock *block, int *ix)
90999118
}
91009119
// NOP out any unused instructions:
91019120
while (0 <=current) {
9102-
instructions[current--].i_opcode=NOP;
9121+
INSTR_SET_OP0(&instructions[current--],NOP);
91039122
}
91049123
PyMem_Free(stack);
91059124
*ix+=len-1;
@@ -9165,7 +9184,7 @@ apply_static_swaps(basicblock *block, int i)
91659184
}
91669185
}
91679186
// Success!
9168-
swap->i_opcode=NOP;
9187+
INSTR_SET_OP0(swap,NOP);
91699188
structinstrtemp=block->b_instr[j];
91709189
block->b_instr[j]=block->b_instr[k];
91719190
block->b_instr[k]=temp;
@@ -9202,7 +9221,7 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
92029221
assert(PyDict_CheckExact(const_cache));
92039222
assert(PyList_CheckExact(consts));
92049223
structinstrnop;
9205-
nop.i_opcode=NOP;
9224+
INSTR_SET_OP0(&nop,NOP);
92069225
structinstr*target;
92079226
for (inti=0;i<bb->b_iused;i++) {
92089227
structinstr*inst=&bb->b_instr[i];
@@ -9236,13 +9255,13 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
92369255
if (is_true==-1) {
92379256
gotoerror;
92389257
}
9239-
inst->i_opcode=NOP;
9258+
INSTR_SET_OP0(inst,NOP);
92409259
jump_if_true=nextop==POP_JUMP_IF_TRUE;
92419260
if (is_true==jump_if_true) {
92429261
bb->b_instr[i+1].i_opcode=JUMP;
92439262
}
92449263
else {
9245-
bb->b_instr[i+1].i_opcode=NOP;
9264+
INSTR_SET_OP0(&bb->b_instr[i+1],NOP);
92469265
}
92479266
break;
92489267
caseJUMP_IF_FALSE_OR_POP:
@@ -9261,8 +9280,8 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
92619280
bb->b_instr[i+1].i_opcode=JUMP;
92629281
}
92639282
else {
9264-
inst->i_opcode=NOP;
9265-
bb->b_instr[i+1].i_opcode=NOP;
9283+
INSTR_SET_OP0(inst,NOP);
9284+
INSTR_SET_OP0(&bb->b_instr[i+1],NOP);
92669285
}
92679286
break;
92689287
caseIS_OP:
@@ -9273,8 +9292,8 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
92739292
intjump_op=i+2<bb->b_iused ?bb->b_instr[i+2].i_opcode :0;
92749293
if (Py_IsNone(cnt)&& (jump_op==POP_JUMP_IF_FALSE||jump_op==POP_JUMP_IF_TRUE)) {
92759294
unsignedcharnextarg=bb->b_instr[i+1].i_oparg;
9276-
inst->i_opcode=NOP;
9277-
bb->b_instr[i+1].i_opcode=NOP;
9295+
INSTR_SET_OP0(inst,NOP);
9296+
INSTR_SET_OP0(&bb->b_instr[i+1],NOP);
92789297
bb->b_instr[i+2].i_opcode=nextarg ^ (jump_op==POP_JUMP_IF_FALSE) ?
92799298
POP_JUMP_IF_NOT_NONE :POP_JUMP_IF_NONE;
92809299
}
@@ -9292,12 +9311,12 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
92929311
if (nextop==UNPACK_SEQUENCE&&oparg==bb->b_instr[i+1].i_oparg) {
92939312
switch(oparg) {
92949313
case1:
9295-
inst->i_opcode=NOP;
9296-
bb->b_instr[i+1].i_opcode=NOP;
9314+
INSTR_SET_OP0(inst,NOP);
9315+
INSTR_SET_OP0(&bb->b_instr[i+1],NOP);
92979316
continue;
92989317
case2:
92999318
case3:
9300-
inst->i_opcode=NOP;
9319+
INSTR_SET_OP0(inst,NOP);
93019320
bb->b_instr[i+1].i_opcode=SWAP;
93029321
continue;
93039322
}
@@ -9406,7 +9425,7 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
94069425
break;
94079426
caseSWAP:
94089427
if (oparg==1) {
9409-
inst->i_opcode=NOP;
9428+
INSTR_SET_OP0(inst,NOP);
94109429
break;
94119430
}
94129431
if (swaptimize(bb,&i)) {
@@ -9418,8 +9437,7 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
94189437
break;
94199438
casePUSH_NULL:
94209439
if (nextop==LOAD_GLOBAL&& (inst[1].i_opcode&1)==0) {
9421-
inst->i_opcode=NOP;
9422-
inst->i_oparg=0;
9440+
INSTR_SET_OP0(inst,NOP);
94239441
inst[1].i_oparg |=1;
94249442
}
94259443
break;
@@ -9448,7 +9466,7 @@ inline_small_exit_blocks(basicblock *bb) {
94489466
}
94499467
basicblock*target=last->i_target;
94509468
if (basicblock_exits_scope(target)&&target->b_iused <=MAX_COPY_SIZE) {
9451-
last->i_opcode=NOP;
9469+
INSTR_SET_OP0(last,NOP);
94529470
if (basicblock_append_instructions(bb,target)<0) {
94539471
return-1;
94549472
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp