mirror of
https://github.com/pocketpy/pocketpy
synced 2025-11-08 20:50:16 +00:00
F
This commit is contained in:
parent
63a00d0faf
commit
7deb36a6de
@ -567,6 +567,8 @@ __LISTCOMP:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void exprMap() {
|
void exprMap() {
|
||||||
|
int _patch = emit(OP_NO_OP);\
|
||||||
|
int _body_start = co()->codes.size();
|
||||||
bool parsing_dict = false;
|
bool parsing_dict = false;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
do {
|
do {
|
||||||
@ -577,7 +579,7 @@ __LISTCOMP:
|
|||||||
if(parsing_dict){
|
if(parsing_dict){
|
||||||
consume(TK(":"));
|
consume(TK(":"));
|
||||||
EXPR();
|
EXPR();
|
||||||
}
|
} else {if (match(TK("for"))) goto __SETCOMP;}
|
||||||
size++;
|
size++;
|
||||||
match_newlines(mode()==REPL_MODE);
|
match_newlines(mode()==REPL_MODE);
|
||||||
} while (match(TK(",")));
|
} while (match(TK(",")));
|
||||||
@ -585,6 +587,48 @@ __LISTCOMP:
|
|||||||
|
|
||||||
if(size == 0 || parsing_dict) emit(OP_BUILD_MAP, size);
|
if(size == 0 || parsing_dict) emit(OP_BUILD_MAP, size);
|
||||||
else emit(OP_BUILD_SET, size);
|
else emit(OP_BUILD_SET, size);
|
||||||
|
return;
|
||||||
|
__SETCOMP:
|
||||||
|
int _body_end_return = emit(OP_JUMP_ABSOLUTE, -1);
|
||||||
|
int _body_end = co()->codes.size();
|
||||||
|
co()->codes[_patch].op = OP_JUMP_ABSOLUTE;
|
||||||
|
co()->codes[_patch].arg = _body_end;
|
||||||
|
emit(OP_BUILD_LIST, 0);
|
||||||
|
EXPR_FOR_VARS();consume(TK("in"));EXPR_TUPLE();
|
||||||
|
match_newlines(mode()==REPL_MODE);
|
||||||
|
|
||||||
|
int _skipPatch = emit(OP_JUMP_ABSOLUTE);
|
||||||
|
int _cond_start = co()->codes.size();
|
||||||
|
int _cond_end_return = -1;
|
||||||
|
if(match(TK("if"))) {
|
||||||
|
EXPR_TUPLE();
|
||||||
|
_cond_end_return = emit(OP_JUMP_ABSOLUTE, -1);
|
||||||
|
}
|
||||||
|
patch_jump(_skipPatch);
|
||||||
|
|
||||||
|
emit(OP_GET_ITER);
|
||||||
|
co()->_enter_block(FOR_LOOP);
|
||||||
|
emit(OP_FOR_ITER);
|
||||||
|
|
||||||
|
if(_cond_end_return != -1) { // there is an if condition
|
||||||
|
emit(OP_JUMP_ABSOLUTE, _cond_start);
|
||||||
|
patch_jump(_cond_end_return);
|
||||||
|
int ifpatch = emit(OP_POP_JUMP_IF_FALSE);
|
||||||
|
emit(OP_JUMP_ABSOLUTE, _body_start);
|
||||||
|
patch_jump(_body_end_return);
|
||||||
|
emit(OP_LIST_APPEND);
|
||||||
|
patch_jump(ifpatch);
|
||||||
|
}else{
|
||||||
|
emit(OP_JUMP_ABSOLUTE, _body_start);
|
||||||
|
patch_jump(_body_end_return);
|
||||||
|
emit(OP_LIST_APPEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(OP_LOOP_CONTINUE, -1, true);
|
||||||
|
co()->_exit_block();
|
||||||
|
match_newlines(mode()==REPL_MODE);
|
||||||
|
consume(TK("}"));
|
||||||
|
emit(OP_BUILD_SET, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void exprCall() {
|
void exprCall() {
|
||||||
|
|||||||
8
src/vm.h
8
src/vm.h
@ -217,9 +217,15 @@ public:
|
|||||||
} break;
|
} break;
|
||||||
case OP_BUILD_SET:
|
case OP_BUILD_SET:
|
||||||
{
|
{
|
||||||
PyVar list = PyList(
|
PyVar list;
|
||||||
|
if (byte.arg == -1) {
|
||||||
|
list = frame->pop_value(this);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
list = PyList(
|
||||||
frame->pop_n_values_reversed(this, byte.arg).to_list()
|
frame->pop_n_values_reversed(this, byte.arg).to_list()
|
||||||
);
|
);
|
||||||
|
}
|
||||||
PyVar obj = call(builtins->attr("set"), pkpy::one_arg(list));
|
PyVar obj = call(builtins->attr("set"), pkpy::one_arg(list));
|
||||||
frame->push(obj);
|
frame->push(obj);
|
||||||
} break;
|
} break;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user