mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-25 05:50:17 +00:00
up
This commit is contained in:
parent
a6673e0c5e
commit
1578d66569
@ -315,7 +315,8 @@ PyVar VM::run_frame(Frame* frame){
|
|||||||
if(frame->_data.size() != 1) throw std::runtime_error("_data.size() != 1 in EVAL/JSON_MODE");
|
if(frame->_data.size() != 1) throw std::runtime_error("_data.size() != 1 in EVAL/JSON_MODE");
|
||||||
return frame->pop_value(this);
|
return frame->pop_value(this);
|
||||||
}
|
}
|
||||||
|
#ifdef PK_EXTRA_CHECK
|
||||||
if(!frame->_data.empty()) throw std::runtime_error("_data.size() != 0 in EXEC_MODE");
|
if(!frame->_data.empty()) throw std::runtime_error("_data.size() != 0 in EXEC_MODE");
|
||||||
|
#endif
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,3 +74,6 @@ struct Type {
|
|||||||
const float kLocalsLoadFactor = 0.67;
|
const float kLocalsLoadFactor = 0.67;
|
||||||
const float kInstAttrLoadFactor = 0.67;
|
const float kInstAttrLoadFactor = 0.67;
|
||||||
const float kTypeAttrLoadFactor = 0.5;
|
const float kTypeAttrLoadFactor = 0.5;
|
||||||
|
|
||||||
|
// do extra check for debug
|
||||||
|
// #define PK_EXTRA_CHECK
|
||||||
@ -763,9 +763,14 @@ __LISTCOMP:
|
|||||||
GrammarFn prefix = rules[parser->prev.type].prefix;
|
GrammarFn prefix = rules[parser->prev.type].prefix;
|
||||||
if (prefix == nullptr) SyntaxError(Str("expected an expression, but got ") + TK_STR(parser->prev.type));
|
if (prefix == nullptr) SyntaxError(Str("expected an expression, but got ") + TK_STR(parser->prev.type));
|
||||||
(this->*prefix)();
|
(this->*prefix)();
|
||||||
|
bool meet_assign_token = false;
|
||||||
while (rules[peek()].precedence >= precedence) {
|
while (rules[peek()].precedence >= precedence) {
|
||||||
lex_token();
|
lex_token();
|
||||||
TokenIndex op = parser->prev.type;
|
TokenIndex op = parser->prev.type;
|
||||||
|
if (op == TK("=")){
|
||||||
|
if(meet_assign_token) SyntaxError("invalid syntax");
|
||||||
|
meet_assign_token = true;
|
||||||
|
}
|
||||||
GrammarFn infix = rules[op].infix;
|
GrammarFn infix = rules[op].infix;
|
||||||
if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
|
if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
|
||||||
(this->*infix)();
|
(this->*infix)();
|
||||||
|
|||||||
@ -56,14 +56,18 @@ struct Frame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline PyVar pop(){
|
inline PyVar pop(){
|
||||||
|
#ifdef PK_EXTRA_CHECK
|
||||||
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
||||||
|
#endif
|
||||||
PyVar v = std::move(_data.back());
|
PyVar v = std::move(_data.back());
|
||||||
_data.pop_back();
|
_data.pop_back();
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _pop(){
|
inline void _pop(){
|
||||||
|
#ifdef PK_EXTRA_CHECK
|
||||||
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
||||||
|
#endif
|
||||||
_data.pop_back();
|
_data.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,12 +86,16 @@ struct Frame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline PyVar& top(){
|
inline PyVar& top(){
|
||||||
|
#ifdef PK_EXTRA_CHECK
|
||||||
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
if(_data.empty()) throw std::runtime_error("_data.empty() is true");
|
||||||
|
#endif
|
||||||
return _data.back();
|
return _data.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PyVar& top_1(){
|
inline PyVar& top_1(){
|
||||||
|
#ifdef PK_EXTRA_CHECK
|
||||||
if(_data.size() < 2) throw std::runtime_error("_data.size() < 2");
|
if(_data.size() < 2) throw std::runtime_error("_data.size() < 2");
|
||||||
|
#endif
|
||||||
return _data[_data.size()-2];
|
return _data[_data.size()-2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user