mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
up
up Update codeobject.h
This commit is contained in:
parent
e36eb9ff19
commit
c35eff5a21
@ -86,34 +86,7 @@ struct CodeObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void optimize(){
|
void optimize(){
|
||||||
for(int i=0; i<codes.size(); i++){
|
for(int i=0; i<codes.size(); i++){}
|
||||||
if(codes[i].op >= OP_BINARY_OP && codes[i].op <= OP_CONTAINS_OP){
|
|
||||||
for(int j=0; j<2; j++){
|
|
||||||
Bytecode& bc = codes[i-j-1];
|
|
||||||
if(bc.op >= OP_LOAD_CONST && bc.op <= OP_LOAD_NAME_REF){
|
|
||||||
if(bc.op == OP_LOAD_NAME_REF){
|
|
||||||
bc.op = OP_LOAD_NAME;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else if(codes[i].op == OP_CALL){
|
|
||||||
int ARGC = codes[i].arg & 0xFFFF;
|
|
||||||
int KWARGC = (codes[i].arg >> 16) & 0xFFFF;
|
|
||||||
if(KWARGC != 0) continue;
|
|
||||||
for(int j=0; j<ARGC+1; j++){
|
|
||||||
Bytecode& bc = codes[i-j-1];
|
|
||||||
if(bc.op >= OP_LOAD_CONST && bc.op <= OP_LOAD_NAME_REF){
|
|
||||||
if(bc.op == OP_LOAD_NAME_REF){
|
|
||||||
bc.op = OP_LOAD_NAME;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************/
|
/************************************************/
|
||||||
|
@ -597,11 +597,11 @@ __LISTCOMP:
|
|||||||
const _Str& key = parser->prev.str();
|
const _Str& key = parser->prev.str();
|
||||||
emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(key)));
|
emit(OP_LOAD_CONST, co()->add_const(vm->PyStr(key)));
|
||||||
consume(TK("="));
|
consume(TK("="));
|
||||||
EXPR();
|
co()->_rvalue=true; EXPR(); co()->_rvalue=false;
|
||||||
KWARGC++;
|
KWARGC++;
|
||||||
} else{
|
} else{
|
||||||
if(KWARGC > 0) SyntaxError("positional argument follows keyword argument");
|
if(KWARGC > 0) SyntaxError("positional argument follows keyword argument");
|
||||||
EXPR();
|
co()->_rvalue=true; EXPR(); co()->_rvalue=false;
|
||||||
ARGC++;
|
ARGC++;
|
||||||
}
|
}
|
||||||
match_newlines(mode()==REPL_MODE);
|
match_newlines(mode()==REPL_MODE);
|
||||||
@ -758,8 +758,9 @@ __LISTCOMP:
|
|||||||
|
|
||||||
void compile_if_stmt() {
|
void compile_if_stmt() {
|
||||||
match_newlines();
|
match_newlines();
|
||||||
EXPR_TUPLE();
|
co()->_rvalue = true;
|
||||||
|
EXPR_TUPLE(); // condition
|
||||||
|
co()->_rvalue = false;
|
||||||
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
|
|
||||||
@ -780,7 +781,9 @@ __LISTCOMP:
|
|||||||
|
|
||||||
void compile_while_loop() {
|
void compile_while_loop() {
|
||||||
co()->_enter_block(WHILE_LOOP);
|
co()->_enter_block(WHILE_LOOP);
|
||||||
EXPR_TUPLE();
|
co()->_rvalue = true;
|
||||||
|
EXPR_TUPLE(); // condition
|
||||||
|
co()->_rvalue = false;
|
||||||
int patch = emit(OP_POP_JUMP_IF_FALSE);
|
int patch = emit(OP_POP_JUMP_IF_FALSE);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
emit(OP_LOOP_CONTINUE, -1, true);
|
emit(OP_LOOP_CONTINUE, -1, true);
|
||||||
@ -848,7 +851,9 @@ __LISTCOMP:
|
|||||||
if(match_end_stmt()){
|
if(match_end_stmt()){
|
||||||
emit(OP_LOAD_NONE);
|
emit(OP_LOAD_NONE);
|
||||||
}else{
|
}else{
|
||||||
EXPR_TUPLE();
|
co()->_rvalue = true;
|
||||||
|
EXPR_TUPLE(); // return value
|
||||||
|
co()->_rvalue = false;
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
}
|
}
|
||||||
emit(OP_RETURN_VALUE, -1, true);
|
emit(OP_RETURN_VALUE, -1, true);
|
||||||
|
@ -13,4 +13,8 @@ def test(n):
|
|||||||
k += 1
|
k += 1
|
||||||
return k
|
return k
|
||||||
|
|
||||||
|
# from dis import dis
|
||||||
|
# dis(test)
|
||||||
|
# dis(is_prime)
|
||||||
|
|
||||||
print(test(10000))
|
print(test(10000))
|
Loading…
x
Reference in New Issue
Block a user