mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
some optimize
This commit is contained in:
parent
d1b6a0932f
commit
3064aecde6
12
src/ceval.h
12
src/ceval.h
@ -30,7 +30,7 @@ PyVar VM::run_frame(Frame* frame){
|
|||||||
} continue;
|
} continue;
|
||||||
case OP_STORE_NAME: {
|
case OP_STORE_NAME: {
|
||||||
auto& p = frame->co->names[byte.arg];
|
auto& p = frame->co->names[byte.arg];
|
||||||
NameRef(p).set(this, frame, frame->pop_value(this));
|
NameRef(p).set(this, frame, frame->pop());
|
||||||
} continue;
|
} continue;
|
||||||
case OP_BUILD_ATTR: {
|
case OP_BUILD_ATTR: {
|
||||||
int name = byte.arg >> 1;
|
int name = byte.arg >> 1;
|
||||||
@ -113,8 +113,8 @@ PyVar VM::run_frame(Frame* frame){
|
|||||||
case OP_POP_TOP: frame->_pop(); continue;
|
case OP_POP_TOP: frame->_pop(); continue;
|
||||||
case OP_BINARY_OP: {
|
case OP_BINARY_OP: {
|
||||||
pkpy::Args args(2);
|
pkpy::Args args(2);
|
||||||
args[1] = frame->pop_value(this);
|
args[1] = frame->pop();
|
||||||
args[0] = frame->top_value(this);
|
args[0] = frame->top();
|
||||||
frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
|
frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
|
||||||
} continue;
|
} continue;
|
||||||
case OP_BITWISE_OP: {
|
case OP_BITWISE_OP: {
|
||||||
@ -125,7 +125,7 @@ PyVar VM::run_frame(Frame* frame){
|
|||||||
} continue;
|
} continue;
|
||||||
case OP_INPLACE_BINARY_OP: {
|
case OP_INPLACE_BINARY_OP: {
|
||||||
pkpy::Args args(2);
|
pkpy::Args args(2);
|
||||||
args[1] = frame->pop_value(this);
|
args[1] = frame->pop();
|
||||||
args[0] = frame->top_value(this);
|
args[0] = frame->top_value(this);
|
||||||
PyVar ret = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
|
PyVar ret = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
|
||||||
PyRef_AS_C(frame->top())->set(this, frame, std::move(ret));
|
PyRef_AS_C(frame->top())->set(this, frame, std::move(ret));
|
||||||
@ -141,8 +141,8 @@ PyVar VM::run_frame(Frame* frame){
|
|||||||
} continue;
|
} continue;
|
||||||
case OP_COMPARE_OP: {
|
case OP_COMPARE_OP: {
|
||||||
pkpy::Args args(2);
|
pkpy::Args args(2);
|
||||||
args[1] = frame->pop_value(this);
|
args[1] = frame->pop();
|
||||||
args[0] = frame->top_value(this);
|
args[0] = frame->top();
|
||||||
frame->top() = fast_call(CMP_SPECIAL_METHODS[byte.arg], std::move(args));
|
frame->top() = fast_call(CMP_SPECIAL_METHODS[byte.arg], std::move(args));
|
||||||
} continue;
|
} continue;
|
||||||
case OP_IS_OP: {
|
case OP_IS_OP: {
|
||||||
|
@ -90,7 +90,7 @@ struct CodeObject {
|
|||||||
|
|
||||||
/************************************************/
|
/************************************************/
|
||||||
int _curr_block_i = 0;
|
int _curr_block_i = 0;
|
||||||
bool _rvalue = false;
|
int _rvalue = 0;
|
||||||
bool _is_curr_block_loop() const {
|
bool _is_curr_block_loop() const {
|
||||||
return blocks[_curr_block_i].type == FOR_LOOP || blocks[_curr_block_i].type == WHILE_LOOP;
|
return blocks[_curr_block_i].type == FOR_LOOP || blocks[_curr_block_i].type == WHILE_LOOP;
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ private:
|
|||||||
}
|
}
|
||||||
func.code = pkpy::make_shared<CodeObject>(parser->src, func.name);
|
func.code = pkpy::make_shared<CodeObject>(parser->src, func.name);
|
||||||
this->codes.push(func.code);
|
this->codes.push(func.code);
|
||||||
EXPR_TUPLE();
|
co()->_rvalue += 1; EXPR_TUPLE(); co()->_rvalue -= 1;
|
||||||
emit(OP_RETURN_VALUE);
|
emit(OP_RETURN_VALUE);
|
||||||
func.code->optimize(vm);
|
func.code->optimize(vm);
|
||||||
this->codes.pop();
|
this->codes.pop();
|
||||||
@ -401,7 +401,7 @@ private:
|
|||||||
|
|
||||||
void exprAssign() {
|
void exprAssign() {
|
||||||
int lhs = co()->codes.empty() ? -1 : co()->codes.size() - 1;
|
int lhs = co()->codes.empty() ? -1 : co()->codes.size() - 1;
|
||||||
co()->_rvalue = true;
|
co()->_rvalue += 1;
|
||||||
TokenIndex op = parser->prev.type;
|
TokenIndex op = parser->prev.type;
|
||||||
if(op == TK("=")) { // a = (expr)
|
if(op == TK("=")) { // a = (expr)
|
||||||
EXPR_TUPLE();
|
EXPR_TUPLE();
|
||||||
@ -427,7 +427,7 @@ private:
|
|||||||
default: UNREACHABLE();
|
default: UNREACHABLE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
co()->_rvalue = false;
|
co()->_rvalue -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void exprComma() {
|
void exprComma() {
|
||||||
@ -602,11 +602,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("="));
|
||||||
co()->_rvalue=true; EXPR(); co()->_rvalue=false;
|
co()->_rvalue += 1; EXPR(); co()->_rvalue -= 1;
|
||||||
KWARGC++;
|
KWARGC++;
|
||||||
} else{
|
} else{
|
||||||
if(KWARGC > 0) SyntaxError("positional argument follows keyword argument");
|
if(KWARGC > 0) SyntaxError("positional argument follows keyword argument");
|
||||||
co()->_rvalue=true; EXPR(); co()->_rvalue=false;
|
co()->_rvalue += 1; EXPR(); co()->_rvalue -= 1;
|
||||||
ARGC++;
|
ARGC++;
|
||||||
}
|
}
|
||||||
match_newlines(mode()==REPL_MODE);
|
match_newlines(mode()==REPL_MODE);
|
||||||
@ -620,7 +620,7 @@ __LISTCOMP:
|
|||||||
void _exprName(bool force_lvalue) {
|
void _exprName(bool force_lvalue) {
|
||||||
Token tkname = parser->prev;
|
Token tkname = parser->prev;
|
||||||
int index = co()->add_name(tkname.str(), name_scope());
|
int index = co()->add_name(tkname.str(), name_scope());
|
||||||
bool fast_load = !force_lvalue && co()->_rvalue;
|
bool fast_load = !force_lvalue && co()->_rvalue>0;
|
||||||
emit(fast_load ? OP_LOAD_NAME : OP_LOAD_NAME_REF, index);
|
emit(fast_load ? OP_LOAD_NAME : OP_LOAD_NAME_REF, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -628,7 +628,7 @@ __LISTCOMP:
|
|||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
const Str& name = parser->prev.str();
|
const Str& name = parser->prev.str();
|
||||||
int index = co()->add_name(name, NAME_ATTR);
|
int index = co()->add_name(name, NAME_ATTR);
|
||||||
index = (index<<1) + (int)co()->_rvalue;
|
index = (index<<1) + (int)(co()->_rvalue>0);
|
||||||
emit(OP_BUILD_ATTR, index);
|
emit(OP_BUILD_ATTR, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -659,7 +659,7 @@ __LISTCOMP:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emit(OP_BUILD_INDEX, (int)co()->_rvalue);
|
emit(OP_BUILD_INDEX, (int)(co()->_rvalue>0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void exprValue() {
|
void exprValue() {
|
||||||
@ -766,9 +766,9 @@ __LISTCOMP:
|
|||||||
|
|
||||||
void compile_if_stmt() {
|
void compile_if_stmt() {
|
||||||
match_newlines();
|
match_newlines();
|
||||||
co()->_rvalue = true;
|
co()->_rvalue += 1;
|
||||||
EXPR_TUPLE(); // condition
|
EXPR_TUPLE(); // condition
|
||||||
co()->_rvalue = false;
|
co()->_rvalue -= 1;
|
||||||
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
||||||
compile_block_body();
|
compile_block_body();
|
||||||
|
|
||||||
@ -789,9 +789,9 @@ __LISTCOMP:
|
|||||||
|
|
||||||
void compile_while_loop() {
|
void compile_while_loop() {
|
||||||
co()->_enter_block(WHILE_LOOP);
|
co()->_enter_block(WHILE_LOOP);
|
||||||
co()->_rvalue = true;
|
co()->_rvalue += 1;
|
||||||
EXPR_TUPLE(); // condition
|
EXPR_TUPLE(); // condition
|
||||||
co()->_rvalue = false;
|
co()->_rvalue -= 1;
|
||||||
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);
|
||||||
@ -810,7 +810,7 @@ __LISTCOMP:
|
|||||||
|
|
||||||
void compile_for_loop() {
|
void compile_for_loop() {
|
||||||
EXPR_FOR_VARS();consume(TK("in"));
|
EXPR_FOR_VARS();consume(TK("in"));
|
||||||
co()->_rvalue = true; EXPR_TUPLE(); co()->_rvalue = false;
|
co()->_rvalue += 1; EXPR_TUPLE(); co()->_rvalue -= 1;
|
||||||
emit(OP_GET_ITER);
|
emit(OP_GET_ITER);
|
||||||
co()->_enter_block(FOR_LOOP);
|
co()->_enter_block(FOR_LOOP);
|
||||||
emit(OP_FOR_ITER);
|
emit(OP_FOR_ITER);
|
||||||
@ -856,9 +856,9 @@ __LISTCOMP:
|
|||||||
emit(OP_LOOP_CONTINUE);
|
emit(OP_LOOP_CONTINUE);
|
||||||
} else if (match(TK("yield"))) {
|
} else if (match(TK("yield"))) {
|
||||||
if (codes.size() == 1) SyntaxError("'yield' outside function");
|
if (codes.size() == 1) SyntaxError("'yield' outside function");
|
||||||
co()->_rvalue = true;
|
co()->_rvalue += 1;
|
||||||
EXPR_TUPLE();
|
EXPR_TUPLE();
|
||||||
co()->_rvalue = false;
|
co()->_rvalue -= 1;
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
co()->is_generator = true;
|
co()->is_generator = true;
|
||||||
emit(OP_YIELD_VALUE, -1, true);
|
emit(OP_YIELD_VALUE, -1, true);
|
||||||
@ -867,9 +867,9 @@ __LISTCOMP:
|
|||||||
if(match_end_stmt()){
|
if(match_end_stmt()){
|
||||||
emit(OP_LOAD_NONE);
|
emit(OP_LOAD_NONE);
|
||||||
}else{
|
}else{
|
||||||
co()->_rvalue = true;
|
co()->_rvalue += 1;
|
||||||
EXPR_TUPLE(); // return value
|
EXPR_TUPLE(); // return value
|
||||||
co()->_rvalue = false;
|
co()->_rvalue -= 1;
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
}
|
}
|
||||||
emit(OP_RETURN_VALUE, -1, true);
|
emit(OP_RETURN_VALUE, -1, true);
|
||||||
@ -887,10 +887,12 @@ __LISTCOMP:
|
|||||||
compile_function();
|
compile_function();
|
||||||
} else if (match(TK("try"))) {
|
} else if (match(TK("try"))) {
|
||||||
compile_try_except();
|
compile_try_except();
|
||||||
}else if(match(TK("assert"))){
|
} else if(match(TK("assert"))) {
|
||||||
|
co()->_rvalue += 1;
|
||||||
EXPR();
|
EXPR();
|
||||||
if (match(TK(","))) EXPR();
|
if (match(TK(","))) EXPR();
|
||||||
else emit(OP_LOAD_CONST, co()->add_const(vm->PyStr("")));
|
else emit(OP_LOAD_CONST, co()->add_const(vm->PyStr("")));
|
||||||
|
co()->_rvalue -= 1;
|
||||||
emit(OP_ASSERT);
|
emit(OP_ASSERT);
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
} else if(match(TK("with"))){
|
} else if(match(TK("with"))){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user