mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
rename
This commit is contained in:
parent
a31def320c
commit
02f8ad43b0
@ -24,7 +24,7 @@ class Compiler {
|
||||
int lexing_count = 0;
|
||||
bool used = false;
|
||||
VM* vm;
|
||||
emhash8::HashMap<_TokenType, GrammarRule> rules;
|
||||
emhash8::HashMap<TokenIndex, GrammarRule> rules;
|
||||
|
||||
_Code co() const{ return codes.top(); }
|
||||
CompileMode mode() const{ return parser->src->mode; }
|
||||
@ -39,7 +39,7 @@ public:
|
||||
// http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
|
||||
#define METHOD(name) &Compiler::name
|
||||
#define NO_INFIX nullptr, PREC_NONE
|
||||
for(_TokenType i=0; i<__TOKENS_LEN; i++) rules[i] = { nullptr, NO_INFIX };
|
||||
for(TokenIndex i=0; i<kTokenCount; i++) rules[i] = { nullptr, NO_INFIX };
|
||||
rules[TK(".")] = { nullptr, METHOD(exprAttrib), PREC_ATTRIB };
|
||||
rules[TK("(")] = { METHOD(exprGrouping), METHOD(exprCall), PREC_CALL };
|
||||
rules[TK("[")] = { METHOD(exprList), METHOD(exprSubscript), PREC_SUBSCRIPT };
|
||||
@ -112,7 +112,7 @@ private:
|
||||
break;
|
||||
}
|
||||
if (c == '\0'){
|
||||
if(quote3 && parser->src->mode == SINGLE_MODE){
|
||||
if(quote3 && parser->src->mode == REPL_MODE){
|
||||
throw NeedMoreLines(false);
|
||||
}
|
||||
SyntaxError("EOL while scanning string literal");
|
||||
@ -301,23 +301,23 @@ private:
|
||||
parser->set_next_token(TK("@eof"));
|
||||
}
|
||||
|
||||
inline _TokenType peek() {
|
||||
inline TokenIndex peek() {
|
||||
return parser->curr.type;
|
||||
}
|
||||
|
||||
// not sure this will work
|
||||
_TokenType peek_next() {
|
||||
TokenIndex peek_next() {
|
||||
if(parser->nexts.empty()) return TK("@eof");
|
||||
return parser->nexts.front().type;
|
||||
}
|
||||
|
||||
bool match(_TokenType expected) {
|
||||
bool match(TokenIndex expected) {
|
||||
if (peek() != expected) return false;
|
||||
lex_token();
|
||||
return true;
|
||||
}
|
||||
|
||||
void consume(_TokenType expected) {
|
||||
void consume(TokenIndex expected) {
|
||||
if (!match(expected)){
|
||||
_StrStream ss;
|
||||
ss << "expected '" << TK_STR(expected) << "', but got '" << TK_STR(peek()) << "'";
|
||||
@ -400,7 +400,7 @@ private:
|
||||
}
|
||||
|
||||
void exprAssign() {
|
||||
_TokenType op = parser->prev.type;
|
||||
TokenIndex op = parser->prev.type;
|
||||
if(op == TK("=")) { // a = (expr)
|
||||
EXPR_TUPLE();
|
||||
emit(OP_STORE_REF);
|
||||
@ -455,7 +455,7 @@ private:
|
||||
}
|
||||
|
||||
void exprBinaryOp() {
|
||||
_TokenType op = parser->prev.type;
|
||||
TokenIndex op = parser->prev.type;
|
||||
parse_expression((Precedence)(rules[op].precedence + 1));
|
||||
|
||||
switch (op) {
|
||||
@ -488,7 +488,7 @@ private:
|
||||
}
|
||||
|
||||
void exprUnaryOp() {
|
||||
_TokenType op = parser->prev.type;
|
||||
TokenIndex op = parser->prev.type;
|
||||
parse_expression((Precedence)(PREC_UNARY + 1));
|
||||
switch (op) {
|
||||
case TK("-"): emit(OP_UNARY_NEGATIVE); break;
|
||||
@ -499,9 +499,9 @@ private:
|
||||
}
|
||||
|
||||
void exprGrouping() {
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
EXPR_TUPLE();
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
consume(TK(")"));
|
||||
}
|
||||
|
||||
@ -510,13 +510,13 @@ private:
|
||||
int _body_start = co()->co_code.size();
|
||||
int ARGC = 0;
|
||||
do {
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
if (peek() == TK("]")) break;
|
||||
EXPR(); ARGC++;
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
if(ARGC == 1 && match(TK("for"))) goto __LISTCOMP;
|
||||
} while (match(TK(",")));
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
consume(TK("]"));
|
||||
emit(OP_BUILD_LIST, ARGC);
|
||||
return;
|
||||
@ -528,7 +528,7 @@ __LISTCOMP:
|
||||
co()->co_code[_patch].arg = _body_end;
|
||||
emit(OP_BUILD_LIST, 0);
|
||||
EXPR_FOR_VARS();consume(TK("in"));EXPR_TUPLE();
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
|
||||
int _skipPatch = emit(OP_JUMP_ABSOLUTE);
|
||||
int _cond_start = co()->co_code.size();
|
||||
@ -559,7 +559,7 @@ __LISTCOMP:
|
||||
|
||||
emit(OP_LOOP_CONTINUE, -1, true);
|
||||
co()->_exit_block();
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
consume(TK("]"));
|
||||
}
|
||||
|
||||
@ -567,7 +567,7 @@ __LISTCOMP:
|
||||
bool parsing_dict = false;
|
||||
int size = 0;
|
||||
do {
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
if (peek() == TK("}")) break;
|
||||
EXPR();
|
||||
if(peek() == TK(":")) parsing_dict = true;
|
||||
@ -576,7 +576,7 @@ __LISTCOMP:
|
||||
EXPR();
|
||||
}
|
||||
size++;
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
} while (match(TK(",")));
|
||||
consume(TK("}"));
|
||||
|
||||
@ -588,7 +588,7 @@ __LISTCOMP:
|
||||
int ARGC = 0;
|
||||
int KWARGC = 0;
|
||||
do {
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
if (peek() == TK(")")) break;
|
||||
if(peek() == TK("@id") && peek_next() == TK("=")) {
|
||||
consume(TK("@id"));
|
||||
@ -602,7 +602,7 @@ __LISTCOMP:
|
||||
EXPR();
|
||||
ARGC++;
|
||||
}
|
||||
match_newlines(mode()==SINGLE_MODE);
|
||||
match_newlines(mode()==REPL_MODE);
|
||||
} while (match(TK(",")));
|
||||
consume(TK(")"));
|
||||
emit(OP_CALL, (KWARGC << 16) | ARGC);
|
||||
@ -654,7 +654,7 @@ __LISTCOMP:
|
||||
}
|
||||
|
||||
void exprValue() {
|
||||
_TokenType op = parser->prev.type;
|
||||
TokenIndex op = parser->prev.type;
|
||||
switch (op) {
|
||||
case TK("None"): emit(OP_LOAD_NONE); break;
|
||||
case TK("True"): emit(OP_LOAD_TRUE); break;
|
||||
@ -682,7 +682,7 @@ __LISTCOMP:
|
||||
void compile_block_body(CompilerAction action=nullptr) {
|
||||
if(action == nullptr) action = &Compiler::compile_stmt;
|
||||
consume(TK(":"));
|
||||
if(!match_newlines(mode()==SINGLE_MODE)){
|
||||
if(!match_newlines(mode()==REPL_MODE)){
|
||||
SyntaxError("expected a new line after ':'");
|
||||
}
|
||||
consume(TK("@indent"));
|
||||
@ -744,7 +744,7 @@ __LISTCOMP:
|
||||
(this->*prefix)();
|
||||
while (rules[peek()].precedence >= precedence) {
|
||||
lex_token();
|
||||
_TokenType op = parser->prev.type;
|
||||
TokenIndex op = parser->prev.type;
|
||||
GrammarFn infix = rules[op].infix;
|
||||
if(infix == nullptr) throw std::runtime_error("(infix == nullptr) is true");
|
||||
(this->*infix)();
|
||||
@ -914,7 +914,7 @@ __LISTCOMP:
|
||||
// If last op is not an assignment, pop the result.
|
||||
uint8_t last_op = co()->co_code.back().op;
|
||||
if( last_op!=OP_STORE_NAME && last_op!=OP_STORE_REF){
|
||||
if(mode()==SINGLE_MODE && parser->indents.top()==0) emit(OP_PRINT_EXPR, -1, true);
|
||||
if(mode()==REPL_MODE && parser->indents.top()==0) emit(OP_PRINT_EXPR, -1, true);
|
||||
emit(OP_POP_TOP, -1, true);
|
||||
}
|
||||
}
|
||||
|
26
src/error.h
26
src/error.h
@ -3,8 +3,8 @@
|
||||
#include "safestl.h"
|
||||
|
||||
struct NeedMoreLines {
|
||||
NeedMoreLines(bool isClassDef) : isClassDef(isClassDef) {}
|
||||
bool isClassDef;
|
||||
NeedMoreLines(bool is_compiling_class) : is_compiling_class(is_compiling_class) {}
|
||||
bool is_compiling_class;
|
||||
};
|
||||
|
||||
struct HandledException {};
|
||||
@ -14,21 +14,21 @@ struct ToBeRaisedException {};
|
||||
enum CompileMode {
|
||||
EXEC_MODE,
|
||||
EVAL_MODE,
|
||||
SINGLE_MODE, // for REPL
|
||||
REPL_MODE,
|
||||
JSON_MODE,
|
||||
};
|
||||
|
||||
struct SourceData {
|
||||
const char* source;
|
||||
_Str filename;
|
||||
std::vector<const char*> lineStarts;
|
||||
std::vector<const char*> line_starts;
|
||||
CompileMode mode;
|
||||
|
||||
std::pair<const char*,const char*> getLine(int lineno) const {
|
||||
std::pair<const char*,const char*> get_line(int lineno) const {
|
||||
if(lineno == -1) return {nullptr, nullptr};
|
||||
lineno -= 1;
|
||||
if(lineno < 0) lineno = 0;
|
||||
const char* _start = lineStarts.at(lineno);
|
||||
const char* _start = line_starts.at(lineno);
|
||||
const char* i = _start;
|
||||
while(*i != '\n' && *i != '\0') i++;
|
||||
return {_start, i};
|
||||
@ -40,32 +40,30 @@ struct SourceData {
|
||||
if (strncmp(source, "\xEF\xBB\xBF", 3) == 0) source += 3;
|
||||
this->filename = filename;
|
||||
this->source = source;
|
||||
lineStarts.push_back(source);
|
||||
line_starts.push_back(source);
|
||||
this->mode = mode;
|
||||
}
|
||||
|
||||
_Str snapshot(int lineno, const char* cursor=nullptr){
|
||||
_StrStream ss;
|
||||
ss << " " << "File \"" << filename << "\", line " << lineno << '\n';
|
||||
std::pair<const char*,const char*> pair = getLine(lineno);
|
||||
std::pair<const char*,const char*> pair = get_line(lineno);
|
||||
_Str line = "<?>";
|
||||
int removedSpaces = 0;
|
||||
int removed_spaces = 0;
|
||||
if(pair.first && pair.second){
|
||||
line = _Str(pair.first, pair.second-pair.first).lstrip();
|
||||
removedSpaces = pair.second - pair.first - line.size();
|
||||
removed_spaces = pair.second - pair.first - line.size();
|
||||
if(line.empty()) line = "<?>";
|
||||
}
|
||||
ss << " " << line;
|
||||
if(cursor && line != "<?>" && cursor >= pair.first && cursor <= pair.second){
|
||||
auto column = cursor - pair.first - removedSpaces;
|
||||
auto column = cursor - pair.first - removed_spaces;
|
||||
if(column >= 0) ss << "\n " << std::string(column, ' ') << "^";
|
||||
}
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
~SourceData(){
|
||||
free((void*)source);
|
||||
}
|
||||
~SourceData() { free((void*)source); }
|
||||
};
|
||||
|
||||
class _Exception {
|
||||
|
32
src/parser.h
32
src/parser.h
@ -2,9 +2,9 @@
|
||||
|
||||
#include "obj.h"
|
||||
|
||||
typedef uint8_t _TokenType;
|
||||
typedef uint8_t TokenIndex;
|
||||
|
||||
constexpr const char* __TOKENS[] = {
|
||||
constexpr const char* kTokens[] = {
|
||||
"@error", "@eof", "@eol", "@sof",
|
||||
".", ",", ":", ";", "#", "(", ")", "[", "]", "{", "}", "%",
|
||||
"+", "-", "*", "/", "//", "**", "=", ">", "<", "...", "->",
|
||||
@ -22,11 +22,11 @@ constexpr const char* __TOKENS[] = {
|
||||
"@indent", "@dedent"
|
||||
};
|
||||
|
||||
const _TokenType __TOKENS_LEN = sizeof(__TOKENS) / sizeof(__TOKENS[0]);
|
||||
const TokenIndex kTokenCount = sizeof(kTokens) / sizeof(kTokens[0]);
|
||||
|
||||
constexpr _TokenType TK(const char* const token) {
|
||||
for(int k=0; k<__TOKENS_LEN; k++){
|
||||
const char* i = __TOKENS[k];
|
||||
constexpr TokenIndex TK(const char* const token) {
|
||||
for(int k=0; k<kTokenCount; k++){
|
||||
const char* i = kTokens[k];
|
||||
const char* j = token;
|
||||
while(*i && *j && *i == *j) { i++; j++;}
|
||||
if(*i == *j) return k;
|
||||
@ -34,19 +34,19 @@ constexpr _TokenType TK(const char* const token) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define TK_STR(t) __TOKENS[t]
|
||||
const _TokenType __KW_BEGIN = TK("class");
|
||||
const _TokenType __KW_END = TK("raise");
|
||||
#define TK_STR(t) kTokens[t]
|
||||
const TokenIndex kTokenKwBegin = TK("class");
|
||||
const TokenIndex kTokenKwEnd = TK("raise");
|
||||
|
||||
const emhash8::HashMap<std::string_view, _TokenType> __KW_MAP = [](){
|
||||
emhash8::HashMap<std::string_view, _TokenType> map;
|
||||
for(int k=__KW_BEGIN; k<=__KW_END; k++) map[__TOKENS[k]] = k;
|
||||
const emhash8::HashMap<std::string_view, TokenIndex> __KW_MAP = [](){
|
||||
emhash8::HashMap<std::string_view, TokenIndex> map;
|
||||
for(int k=kTokenKwBegin; k<=kTokenKwEnd; k++) map[kTokens[k]] = k;
|
||||
return map;
|
||||
}();
|
||||
|
||||
|
||||
struct Token{
|
||||
_TokenType type;
|
||||
TokenIndex type;
|
||||
|
||||
const char* start; //< Begining of the token in the source.
|
||||
int length; //< Number of chars of the token.
|
||||
@ -173,7 +173,7 @@ struct Parser {
|
||||
curr_char++;
|
||||
if (c == '\n'){
|
||||
current_line++;
|
||||
src->lineStarts.push_back(curr_char);
|
||||
src->line_starts.push_back(curr_char);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
@ -266,7 +266,7 @@ struct Parser {
|
||||
return true;
|
||||
}
|
||||
|
||||
void set_next_token(_TokenType type, PyVar value=nullptr) {
|
||||
void set_next_token(TokenIndex type, PyVar value=nullptr) {
|
||||
switch(type){
|
||||
case TK("{"): case TK("["): case TK("("): brackets_level++; break;
|
||||
case TK(")"): case TK("]"): case TK("}"): brackets_level--; break;
|
||||
@ -280,7 +280,7 @@ struct Parser {
|
||||
});
|
||||
}
|
||||
|
||||
void set_next_token_2(char c, _TokenType one, _TokenType two) {
|
||||
void set_next_token_2(char c, TokenIndex one, TokenIndex two) {
|
||||
if (matchchar(c)) set_next_token(two);
|
||||
else set_next_token(one);
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ void init_builtins(VM* _vm) {
|
||||
|
||||
_vm->bind_builtin_func<1>("repr", CPP_LAMBDA(vm->asRepr(args[0])));
|
||||
_vm->bind_builtin_func<1>("hash", CPP_LAMBDA(vm->PyInt(vm->hash(args[0]))));
|
||||
_vm->bind_builtin_func<1>("len", CPP_LAMBDA(vm->call(args[0], __len__, pkpy::noArg())));
|
||||
_vm->bind_builtin_func<1>("len", CPP_LAMBDA(vm->call(args[0], __len__, pkpy::no_arg())));
|
||||
|
||||
_vm->bind_builtin_func<1>("chr", [](VM* vm, const pkpy::Args& args) {
|
||||
i64 i = vm->PyInt_AS_C(args[0]);
|
||||
|
@ -16,21 +16,21 @@ public:
|
||||
}
|
||||
|
||||
bool input(std::string line){
|
||||
CompileMode mode = SINGLE_MODE;
|
||||
CompileMode mode = REPL_MODE;
|
||||
if(need_more_lines){
|
||||
buffer += line;
|
||||
buffer += '\n';
|
||||
int n = buffer.size();
|
||||
if(n>=need_more_lines){
|
||||
for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
|
||||
if(buffer[i] != '\n') goto __NOT_ENOUGH_LINES;
|
||||
// no enough lines
|
||||
if(buffer[i] != '\n') return true;
|
||||
}
|
||||
need_more_lines = 0;
|
||||
line = buffer;
|
||||
buffer.clear();
|
||||
mode = EXEC_MODE;
|
||||
}else{
|
||||
__NOT_ENOUGH_LINES:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -40,7 +40,7 @@ __NOT_ENOUGH_LINES:
|
||||
}catch(NeedMoreLines& ne){
|
||||
buffer += line;
|
||||
buffer += '\n';
|
||||
need_more_lines = ne.isClassDef ? 3 : 2;
|
||||
need_more_lines = ne.is_compiling_class ? 3 : 2;
|
||||
if (need_more_lines) return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -36,43 +36,43 @@ typedef emhash8::HashMap<_Str, PyVar> PyVarDict;
|
||||
|
||||
namespace pkpy {
|
||||
const int kMaxPoolSize = 10;
|
||||
static thread_local std::vector<PyVar*>* _poolArgs = new std::vector<PyVar*>[kMaxPoolSize];
|
||||
static thread_local std::vector<PyVar*>* _args_pool = new std::vector<PyVar*>[kMaxPoolSize];
|
||||
|
||||
class Args {
|
||||
PyVar* _args;
|
||||
int _size;
|
||||
|
||||
void __tryAlloc(size_t n){
|
||||
void _alloc(int n){
|
||||
if(n == 0){
|
||||
this->_args = nullptr;
|
||||
this->_size = 0;
|
||||
return;
|
||||
}
|
||||
if(n >= kMaxPoolSize || _poolArgs[n].empty()){
|
||||
if(n >= kMaxPoolSize || _args_pool[n].empty()){
|
||||
this->_args = new PyVar[n];
|
||||
this->_size = n;
|
||||
}else{
|
||||
this->_args = _poolArgs[n].back();
|
||||
this->_args = _args_pool[n].back();
|
||||
this->_size = n;
|
||||
_poolArgs[n].pop_back();
|
||||
_args_pool[n].pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
void __tryRelease(){
|
||||
void _release(){
|
||||
if(_size == 0 || _args == nullptr) return;
|
||||
if(_size >= kMaxPoolSize || _poolArgs[_size].size() > 32){
|
||||
if(_size >= kMaxPoolSize || _args_pool[_size].size() > 32){
|
||||
delete[] _args;
|
||||
}else{
|
||||
for(int i = 0; i < _size; i++) _args[i].reset();
|
||||
_poolArgs[_size].push_back(_args);
|
||||
_args_pool[_size].push_back(_args);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
Args(size_t n){ __tryAlloc(n); }
|
||||
Args(int n){ _alloc(n); }
|
||||
|
||||
Args(const Args& other){
|
||||
__tryAlloc(other._size);
|
||||
_alloc(other._size);
|
||||
for(int i=0; i<_size; i++) _args[i] = other._args[i];
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ namespace pkpy {
|
||||
}
|
||||
|
||||
Args(PyVarList&& other) noexcept {
|
||||
__tryAlloc(other.size());
|
||||
_alloc(other.size());
|
||||
for(int i=0; i<_size; i++) _args[i] = std::move(other[i]);
|
||||
other.clear();
|
||||
}
|
||||
@ -93,7 +93,7 @@ namespace pkpy {
|
||||
const PyVar& operator[](int i) const { return _args[i]; }
|
||||
|
||||
Args& operator=(Args&& other) noexcept {
|
||||
__tryRelease();
|
||||
_release();
|
||||
this->_args = other._args;
|
||||
this->_size = other._size;
|
||||
other._args = nullptr;
|
||||
@ -103,7 +103,7 @@ namespace pkpy {
|
||||
|
||||
inline int size() const { return _size; }
|
||||
|
||||
PyVarList toList() const {
|
||||
PyVarList to_list() const {
|
||||
PyVarList ret(_size);
|
||||
for(int i=0; i<_size; i++) ret[i] = _args[i];
|
||||
return ret;
|
||||
@ -113,36 +113,36 @@ namespace pkpy {
|
||||
static_assert(std::is_standard_layout_v<PyVar>);
|
||||
PyVar* old_args = _args;
|
||||
int old_size = _size;
|
||||
__tryAlloc(old_size+1);
|
||||
_alloc(old_size+1);
|
||||
_args[0] = self;
|
||||
if(old_size == 0) return;
|
||||
|
||||
memcpy((void*)(_args+1), (void*)old_args, sizeof(PyVar)*old_size);
|
||||
memset((void*)old_args, 0, sizeof(PyVar)*old_size);
|
||||
if(old_size >= kMaxPoolSize || _poolArgs[old_size].size() > 32){
|
||||
if(old_size >= kMaxPoolSize || _args_pool[old_size].size() > 32){
|
||||
delete[] old_args;
|
||||
}else{
|
||||
_poolArgs[old_size].push_back(old_args);
|
||||
_args_pool[old_size].push_back(old_args);
|
||||
}
|
||||
}
|
||||
|
||||
~Args(){ __tryRelease(); }
|
||||
~Args(){ _release(); }
|
||||
};
|
||||
|
||||
const Args& noArg(){
|
||||
const Args& no_arg(){
|
||||
static const Args ret(0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Args oneArg(T&& a) {
|
||||
Args one_arg(T&& a) {
|
||||
Args ret(1);
|
||||
ret[0] = std::forward<T>(a);
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<typename T1, typename T2>
|
||||
Args twoArgs(T1&& a, T2&& b) {
|
||||
Args two_args(T1&& a, T2&& b) {
|
||||
Args ret(2);
|
||||
ret[0] = std::forward<T1>(a);
|
||||
ret[1] = std::forward<T2>(b);
|
||||
|
10
src/str.h
10
src/str.h
@ -181,13 +181,13 @@ const _Str BITWISE_SPECIAL_METHODS[] = {
|
||||
"__lshift__", "__rshift__", "__and__", "__or__", "__xor__"
|
||||
};
|
||||
|
||||
const uint32_t __LoRangeA[] = {170,186,443,448,660,1488,1519,1568,1601,1646,1649,1749,1774,1786,1791,1808,1810,1869,1969,1994,2048,2112,2144,2208,2230,2308,2365,2384,2392,2418,2437,2447,2451,2474,2482,2486,2493,2510,2524,2527,2544,2556,2565,2575,2579,2602,2610,2613,2616,2649,2654,2674,2693,2703,2707,2730,2738,2741,2749,2768,2784,2809,2821,2831,2835,2858,2866,2869,2877,2908,2911,2929,2947,2949,2958,2962,2969,2972,2974,2979,2984,2990,3024,3077,3086,3090,3114,3133,3160,3168,3200,3205,3214,3218,3242,3253,3261,3294,3296,3313,3333,3342,3346,3389,3406,3412,3423,3450,3461,3482,3507,3517,3520,3585,3634,3648,3713,3716,3718,3724,3749,3751,3762,3773,3776,3804,3840,3904,3913,3976,4096,4159,4176,4186,4193,4197,4206,4213,4238,4352,4682,4688,4696,4698,4704,4746,4752,4786,4792,4800,4802,4808,4824,4882,4888,4992,5121,5743,5761,5792,5873,5888,5902,5920,5952,5984,5998,6016,6108,6176,6212,6272,6279,6314,6320,6400,6480,6512,6528,6576,6656,6688,6917,6981,7043,7086,7098,7168,7245,7258,7401,7406,7413,7418,8501,11568,11648,11680,11688,11696,11704,11712,11720,11728,11736,12294,12348,12353,12447,12449,12543,12549,12593,12704,12784,13312,19968,40960,40982,42192,42240,42512,42538,42606,42656,42895,42999,43003,43011,43015,43020,43072,43138,43250,43259,43261,43274,43312,43360,43396,43488,43495,43514,43520,43584,43588,43616,43633,43642,43646,43697,43701,43705,43712,43714,43739,43744,43762,43777,43785,43793,43808,43816,43968,44032,55216,55243,63744,64112,64285,64287,64298,64312,64318,64320,64323,64326,64467,64848,64914,65008,65136,65142,65382,65393,65440,65474,65482,65490,65498,65536,65549,65576,65596,65599,65616,65664,66176,66208,66304,66349,66370,66384,66432,66464,66504,66640,66816,66864,67072,67392,67424,67584,67592,67594,67639,67644,67647,67680,67712,67808,67828,67840,67872,67968,68030,68096,68112,68117,68121,68192,68224,68288,68297,68352,68416,68448,68480,68608,68864,69376,69415,69424,69600,69635,69763,69840,69891,69956,69968,70006,70019,70081,70106,70108,70144,70163,70272,70280,70282,70287,70303,70320,70405,70415,70419,70442,70450,70453,70461,70480,70493,70656,70727,70751,70784,70852,70855,71040,71128,71168,71236,71296,71352,71424,71680,71935,72096,72106,72161,72163,72192,72203,72250,72272,72284,72349,72384,72704,72714,72768,72818,72960,72968,72971,73030,73056,73063,73066,73112,73440,73728,74880,77824,82944,92160,92736,92880,92928,93027,93053,93952,94032,94208,100352,110592,110928,110948,110960,113664,113776,113792,113808,123136,123214,123584,124928,126464,126469,126497,126500,126503,126505,126516,126521,126523,126530,126535,126537,126539,126541,126545,126548,126551,126553,126555,126557,126559,126561,126564,126567,126572,126580,126585,126590,126592,126603,126625,126629,126635,131072,173824,177984,178208,183984,194560};
|
||||
const uint32_t __LoRangeB[] = {170,186,443,451,660,1514,1522,1599,1610,1647,1747,1749,1775,1788,1791,1808,1839,1957,1969,2026,2069,2136,2154,2228,2237,2361,2365,2384,2401,2432,2444,2448,2472,2480,2482,2489,2493,2510,2525,2529,2545,2556,2570,2576,2600,2608,2611,2614,2617,2652,2654,2676,2701,2705,2728,2736,2739,2745,2749,2768,2785,2809,2828,2832,2856,2864,2867,2873,2877,2909,2913,2929,2947,2954,2960,2965,2970,2972,2975,2980,2986,3001,3024,3084,3088,3112,3129,3133,3162,3169,3200,3212,3216,3240,3251,3257,3261,3294,3297,3314,3340,3344,3386,3389,3406,3414,3425,3455,3478,3505,3515,3517,3526,3632,3635,3653,3714,3716,3722,3747,3749,3760,3763,3773,3780,3807,3840,3911,3948,3980,4138,4159,4181,4189,4193,4198,4208,4225,4238,4680,4685,4694,4696,4701,4744,4749,4784,4789,4798,4800,4805,4822,4880,4885,4954,5007,5740,5759,5786,5866,5880,5900,5905,5937,5969,5996,6000,6067,6108,6210,6264,6276,6312,6314,6389,6430,6509,6516,6571,6601,6678,6740,6963,6987,7072,7087,7141,7203,7247,7287,7404,7411,7414,7418,8504,11623,11670,11686,11694,11702,11710,11718,11726,11734,11742,12294,12348,12438,12447,12538,12543,12591,12686,12730,12799,19893,40943,40980,42124,42231,42507,42527,42539,42606,42725,42895,42999,43009,43013,43018,43042,43123,43187,43255,43259,43262,43301,43334,43388,43442,43492,43503,43518,43560,43586,43595,43631,43638,43642,43695,43697,43702,43709,43712,43714,43740,43754,43762,43782,43790,43798,43814,43822,44002,55203,55238,55291,64109,64217,64285,64296,64310,64316,64318,64321,64324,64433,64829,64911,64967,65019,65140,65276,65391,65437,65470,65479,65487,65495,65500,65547,65574,65594,65597,65613,65629,65786,66204,66256,66335,66368,66377,66421,66461,66499,66511,66717,66855,66915,67382,67413,67431,67589,67592,67637,67640,67644,67669,67702,67742,67826,67829,67861,67897,68023,68031,68096,68115,68119,68149,68220,68252,68295,68324,68405,68437,68466,68497,68680,68899,69404,69415,69445,69622,69687,69807,69864,69926,69956,70002,70006,70066,70084,70106,70108,70161,70187,70278,70280,70285,70301,70312,70366,70412,70416,70440,70448,70451,70457,70461,70480,70497,70708,70730,70751,70831,70853,70855,71086,71131,71215,71236,71338,71352,71450,71723,71935,72103,72144,72161,72163,72192,72242,72250,72272,72329,72349,72440,72712,72750,72768,72847,72966,72969,73008,73030,73061,73064,73097,73112,73458,74649,75075,78894,83526,92728,92766,92909,92975,93047,93071,94026,94032,100343,101106,110878,110930,110951,111355,113770,113788,113800,113817,123180,123214,123627,125124,126467,126495,126498,126500,126503,126514,126519,126521,126523,126530,126535,126537,126539,126543,126546,126548,126551,126553,126555,126557,126559,126562,126564,126570,126578,126583,126588,126590,126601,126619,126627,126633,126651,173782,177972,178205,183969,191456,195101};
|
||||
const uint32_t kLoRangeA[] = {170,186,443,448,660,1488,1519,1568,1601,1646,1649,1749,1774,1786,1791,1808,1810,1869,1969,1994,2048,2112,2144,2208,2230,2308,2365,2384,2392,2418,2437,2447,2451,2474,2482,2486,2493,2510,2524,2527,2544,2556,2565,2575,2579,2602,2610,2613,2616,2649,2654,2674,2693,2703,2707,2730,2738,2741,2749,2768,2784,2809,2821,2831,2835,2858,2866,2869,2877,2908,2911,2929,2947,2949,2958,2962,2969,2972,2974,2979,2984,2990,3024,3077,3086,3090,3114,3133,3160,3168,3200,3205,3214,3218,3242,3253,3261,3294,3296,3313,3333,3342,3346,3389,3406,3412,3423,3450,3461,3482,3507,3517,3520,3585,3634,3648,3713,3716,3718,3724,3749,3751,3762,3773,3776,3804,3840,3904,3913,3976,4096,4159,4176,4186,4193,4197,4206,4213,4238,4352,4682,4688,4696,4698,4704,4746,4752,4786,4792,4800,4802,4808,4824,4882,4888,4992,5121,5743,5761,5792,5873,5888,5902,5920,5952,5984,5998,6016,6108,6176,6212,6272,6279,6314,6320,6400,6480,6512,6528,6576,6656,6688,6917,6981,7043,7086,7098,7168,7245,7258,7401,7406,7413,7418,8501,11568,11648,11680,11688,11696,11704,11712,11720,11728,11736,12294,12348,12353,12447,12449,12543,12549,12593,12704,12784,13312,19968,40960,40982,42192,42240,42512,42538,42606,42656,42895,42999,43003,43011,43015,43020,43072,43138,43250,43259,43261,43274,43312,43360,43396,43488,43495,43514,43520,43584,43588,43616,43633,43642,43646,43697,43701,43705,43712,43714,43739,43744,43762,43777,43785,43793,43808,43816,43968,44032,55216,55243,63744,64112,64285,64287,64298,64312,64318,64320,64323,64326,64467,64848,64914,65008,65136,65142,65382,65393,65440,65474,65482,65490,65498,65536,65549,65576,65596,65599,65616,65664,66176,66208,66304,66349,66370,66384,66432,66464,66504,66640,66816,66864,67072,67392,67424,67584,67592,67594,67639,67644,67647,67680,67712,67808,67828,67840,67872,67968,68030,68096,68112,68117,68121,68192,68224,68288,68297,68352,68416,68448,68480,68608,68864,69376,69415,69424,69600,69635,69763,69840,69891,69956,69968,70006,70019,70081,70106,70108,70144,70163,70272,70280,70282,70287,70303,70320,70405,70415,70419,70442,70450,70453,70461,70480,70493,70656,70727,70751,70784,70852,70855,71040,71128,71168,71236,71296,71352,71424,71680,71935,72096,72106,72161,72163,72192,72203,72250,72272,72284,72349,72384,72704,72714,72768,72818,72960,72968,72971,73030,73056,73063,73066,73112,73440,73728,74880,77824,82944,92160,92736,92880,92928,93027,93053,93952,94032,94208,100352,110592,110928,110948,110960,113664,113776,113792,113808,123136,123214,123584,124928,126464,126469,126497,126500,126503,126505,126516,126521,126523,126530,126535,126537,126539,126541,126545,126548,126551,126553,126555,126557,126559,126561,126564,126567,126572,126580,126585,126590,126592,126603,126625,126629,126635,131072,173824,177984,178208,183984,194560};
|
||||
const uint32_t kLoRangeB[] = {170,186,443,451,660,1514,1522,1599,1610,1647,1747,1749,1775,1788,1791,1808,1839,1957,1969,2026,2069,2136,2154,2228,2237,2361,2365,2384,2401,2432,2444,2448,2472,2480,2482,2489,2493,2510,2525,2529,2545,2556,2570,2576,2600,2608,2611,2614,2617,2652,2654,2676,2701,2705,2728,2736,2739,2745,2749,2768,2785,2809,2828,2832,2856,2864,2867,2873,2877,2909,2913,2929,2947,2954,2960,2965,2970,2972,2975,2980,2986,3001,3024,3084,3088,3112,3129,3133,3162,3169,3200,3212,3216,3240,3251,3257,3261,3294,3297,3314,3340,3344,3386,3389,3406,3414,3425,3455,3478,3505,3515,3517,3526,3632,3635,3653,3714,3716,3722,3747,3749,3760,3763,3773,3780,3807,3840,3911,3948,3980,4138,4159,4181,4189,4193,4198,4208,4225,4238,4680,4685,4694,4696,4701,4744,4749,4784,4789,4798,4800,4805,4822,4880,4885,4954,5007,5740,5759,5786,5866,5880,5900,5905,5937,5969,5996,6000,6067,6108,6210,6264,6276,6312,6314,6389,6430,6509,6516,6571,6601,6678,6740,6963,6987,7072,7087,7141,7203,7247,7287,7404,7411,7414,7418,8504,11623,11670,11686,11694,11702,11710,11718,11726,11734,11742,12294,12348,12438,12447,12538,12543,12591,12686,12730,12799,19893,40943,40980,42124,42231,42507,42527,42539,42606,42725,42895,42999,43009,43013,43018,43042,43123,43187,43255,43259,43262,43301,43334,43388,43442,43492,43503,43518,43560,43586,43595,43631,43638,43642,43695,43697,43702,43709,43712,43714,43740,43754,43762,43782,43790,43798,43814,43822,44002,55203,55238,55291,64109,64217,64285,64296,64310,64316,64318,64321,64324,64433,64829,64911,64967,65019,65140,65276,65391,65437,65470,65479,65487,65495,65500,65547,65574,65594,65597,65613,65629,65786,66204,66256,66335,66368,66377,66421,66461,66499,66511,66717,66855,66915,67382,67413,67431,67589,67592,67637,67640,67644,67669,67702,67742,67826,67829,67861,67897,68023,68031,68096,68115,68119,68149,68220,68252,68295,68324,68405,68437,68466,68497,68680,68899,69404,69415,69445,69622,69687,69807,69864,69926,69956,70002,70006,70066,70084,70106,70108,70161,70187,70278,70280,70285,70301,70312,70366,70412,70416,70440,70448,70451,70457,70461,70480,70497,70708,70730,70751,70831,70853,70855,71086,71131,71215,71236,71338,71352,71450,71723,71935,72103,72144,72161,72163,72192,72242,72250,72272,72329,72349,72440,72712,72750,72768,72847,72966,72969,73008,73030,73061,73064,73097,73112,73458,74649,75075,78894,83526,92728,92766,92909,92975,93047,93071,94026,94032,100343,101106,110878,110930,110951,111355,113770,113788,113800,113817,123180,123214,123627,125124,126467,126495,126498,126500,126503,126514,126519,126521,126523,126530,126535,126537,126539,126543,126546,126548,126551,126553,126555,126557,126559,126562,126564,126570,126578,126583,126588,126590,126601,126619,126627,126633,126651,173782,177972,178205,183969,191456,195101};
|
||||
|
||||
bool is_unicode_Lo_char(uint32_t c) {
|
||||
auto index = std::lower_bound(__LoRangeA, __LoRangeA + 476, c) - __LoRangeA;
|
||||
if(c == __LoRangeA[index]) return true;
|
||||
auto index = std::lower_bound(kLoRangeA, kLoRangeA + 476, c) - kLoRangeA;
|
||||
if(c == kLoRangeA[index]) return true;
|
||||
index -= 1;
|
||||
if(index < 0) return false;
|
||||
return c >= __LoRangeA[index] && c <= __LoRangeB[index];
|
||||
return c >= kLoRangeA[index] && c <= kLoRangeB[index];
|
||||
}
|
||||
|
28
src/vm.h
28
src/vm.h
@ -75,14 +75,14 @@ class VM {
|
||||
for(int i=0; i<items.size(); i++){
|
||||
if(!items[i]->is_type(_tp_ref)) {
|
||||
done = true;
|
||||
PyVarList values = items.toList();
|
||||
PyVarList values = items.to_list();
|
||||
for(int j=i; j<values.size(); j++) frame->try_deref(this, values[j]);
|
||||
frame->push(PyTuple(values));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(done) break;
|
||||
frame->push(PyRef(TupleRef(items.toList())));
|
||||
frame->push(PyRef(TupleRef(items.to_list())));
|
||||
} break;
|
||||
case OP_BUILD_STRING:
|
||||
{
|
||||
@ -161,7 +161,7 @@ class VM {
|
||||
case OP_CONTAINS_OP:
|
||||
{
|
||||
PyVar rhs = frame->pop_value(this);
|
||||
bool ret_c = PyBool_AS_C(call(rhs, __contains__, pkpy::oneArg(frame->pop_value(this))));
|
||||
bool ret_c = PyBool_AS_C(call(rhs, __contains__, pkpy::one_arg(frame->pop_value(this))));
|
||||
if(byte.arg == 1) ret_c = !ret_c;
|
||||
frame->push(PyBool(ret_c));
|
||||
} break;
|
||||
@ -202,23 +202,23 @@ class VM {
|
||||
case OP_RE_RAISE: _raise(); break;
|
||||
case OP_BUILD_LIST:
|
||||
frame->push(PyList(
|
||||
frame->pop_n_values_reversed(this, byte.arg).toList()));
|
||||
frame->pop_n_values_reversed(this, byte.arg).to_list()));
|
||||
break;
|
||||
case OP_BUILD_MAP:
|
||||
{
|
||||
pkpy::Args items = frame->pop_n_values_reversed(this, byte.arg*2);
|
||||
PyVar obj = call(builtins->attribs["dict"]);
|
||||
for(int i=0; i<items.size(); i+=2){
|
||||
call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
|
||||
call(obj, __setitem__, pkpy::two_args(items[i], items[i+1]));
|
||||
}
|
||||
frame->push(obj);
|
||||
} break;
|
||||
case OP_BUILD_SET:
|
||||
{
|
||||
PyVar list = PyList(
|
||||
frame->pop_n_values_reversed(this, byte.arg).toList()
|
||||
frame->pop_n_values_reversed(this, byte.arg).to_list()
|
||||
);
|
||||
PyVar obj = call(builtins->attribs["set"], pkpy::oneArg(list));
|
||||
PyVar obj = call(builtins->attribs["set"], pkpy::one_arg(list));
|
||||
frame->push(obj);
|
||||
} break;
|
||||
case OP_DUP_TOP: frame->push(frame->top_value(this)); break;
|
||||
@ -411,23 +411,23 @@ public:
|
||||
}
|
||||
|
||||
inline PyVar call(const PyVar& _callable){
|
||||
return call(_callable, pkpy::noArg(), pkpy::noArg(), false);
|
||||
return call(_callable, pkpy::no_arg(), pkpy::no_arg(), false);
|
||||
}
|
||||
|
||||
template<typename ArgT>
|
||||
inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::Args>, PyVar>
|
||||
call(const PyVar& _callable, ArgT&& args){
|
||||
return call(_callable, std::forward<ArgT>(args), pkpy::noArg(), false);
|
||||
return call(_callable, std::forward<ArgT>(args), pkpy::no_arg(), false);
|
||||
}
|
||||
|
||||
template<typename ArgT>
|
||||
inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::Args>, PyVar>
|
||||
call(const PyVar& obj, const _Str& func, ArgT&& args){
|
||||
return call(getattr(obj, func), std::forward<ArgT>(args), pkpy::noArg(), false);
|
||||
return call(getattr(obj, func), std::forward<ArgT>(args), pkpy::no_arg(), false);
|
||||
}
|
||||
|
||||
inline PyVar call(const PyVar& obj, const _Str& func){
|
||||
return call(getattr(obj, func), pkpy::noArg(), pkpy::noArg(), false);
|
||||
return call(getattr(obj, func), pkpy::no_arg(), pkpy::no_arg(), false);
|
||||
}
|
||||
|
||||
PyVar call(const PyVar& _callable, pkpy::Args args, const pkpy::Args& kwargs, bool opCall){
|
||||
@ -1028,15 +1028,15 @@ void AttrRef::del(VM* vm, Frame* frame) const{
|
||||
}
|
||||
|
||||
PyVar IndexRef::get(VM* vm, Frame* frame) const{
|
||||
return vm->call(obj, __getitem__, pkpy::oneArg(index));
|
||||
return vm->call(obj, __getitem__, pkpy::one_arg(index));
|
||||
}
|
||||
|
||||
void IndexRef::set(VM* vm, Frame* frame, PyVar val) const{
|
||||
vm->call(obj, __setitem__, pkpy::twoArgs(index, val));
|
||||
vm->call(obj, __setitem__, pkpy::two_args(index, val));
|
||||
}
|
||||
|
||||
void IndexRef::del(VM* vm, Frame* frame) const{
|
||||
vm->call(obj, __delitem__, pkpy::oneArg(index));
|
||||
vm->call(obj, __delitem__, pkpy::one_arg(index));
|
||||
}
|
||||
|
||||
PyVar TupleRef::get(VM* vm, Frame* frame) const{
|
||||
|
Loading…
x
Reference in New Issue
Block a user