Update 2.py

Update 2.py

up
This commit is contained in:
blueloveTH 2023-02-01 00:34:44 +08:00
parent 78922a11b1
commit d1f12ee90c
6 changed files with 32 additions and 16 deletions

View File

@ -12,6 +12,7 @@ jobs:
CL -std:c++17 -GR- -EHsc -O2 -Fe:pocketpy src/main.cpp CL -std:c++17 -GR- -EHsc -O2 -Fe:pocketpy src/main.cpp
python3 scripts/run_tests.py python3 scripts/run_tests.py
./pocketpy tests/1.py ./pocketpy tests/1.py
./pocketpy tests/2.py
build_linux: build_linux:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@ -21,6 +22,7 @@ jobs:
bash build_cpp.sh bash build_cpp.sh
python3 scripts/run_tests.py python3 scripts/run_tests.py
./pocketpy tests/1.py ./pocketpy tests/1.py
./pocketpy tests/2.py
build_web: build_web:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:

View File

@ -155,6 +155,8 @@ def __iterable4__eq__(self, other):
return True return True
list.__eq__ = __iterable4__eq__ list.__eq__ = __iterable4__eq__
tuple.__eq__ = __iterable4__eq__ tuple.__eq__ = __iterable4__eq__
list.__ne__ = lambda self, other: not self.__eq__(other)
tuple.__ne__ = lambda self, other: not self.__eq__(other)
del __iterable4__eq__ del __iterable4__eq__
def __iterable4count(self, x): def __iterable4count(self, x):
@ -396,6 +398,9 @@ class set:
def __eq__(self, other): def __eq__(self, other):
return self.__xor__(other).__len__() == 0 return self.__xor__(other).__len__() == 0
def __ne__(self, other):
return self.__xor__(other).__len__() != 0
def isdisjoint(self, other): def isdisjoint(self, other):
return self.__and__(other).__len__() == 0 return self.__and__(other).__len__() == 0

View File

@ -29,7 +29,7 @@ _Code VM::compile(_Str source, _Str filename, CompileMode mode) {
bool _0 = args[0]->is_type(vm->_tp_int) || args[0]->is_type(vm->_tp_float); \ bool _0 = args[0]->is_type(vm->_tp_int) || args[0]->is_type(vm->_tp_float); \
bool _1 = args[1]->is_type(vm->_tp_int) || args[1]->is_type(vm->_tp_float); \ bool _1 = args[1]->is_type(vm->_tp_int) || args[1]->is_type(vm->_tp_float); \
if(!_0 || !_1){ \ if(!_0 || !_1){ \
if constexpr(is_eq) return vm->PyBool(args[0] == args[1]); \ if constexpr(is_eq) return vm->PyBool(args[0].get() op args[1].get()); \
vm->typeError("unsupported operand type(s) for " #op ); \ vm->typeError("unsupported operand type(s) for " #op ); \
} \ } \
return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \
@ -46,6 +46,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
BIND_NUM_LOGICAL_OPT(__gt__, >, false) BIND_NUM_LOGICAL_OPT(__gt__, >, false)
BIND_NUM_LOGICAL_OPT(__ge__, >=, false) BIND_NUM_LOGICAL_OPT(__ge__, >=, false)
BIND_NUM_LOGICAL_OPT(__eq__, ==, true) BIND_NUM_LOGICAL_OPT(__eq__, ==, true)
BIND_NUM_LOGICAL_OPT(__ne__, !=, true)
#undef BIND_NUM_ARITH_OPT #undef BIND_NUM_ARITH_OPT
#undef BIND_NUM_LOGICAL_OPT #undef BIND_NUM_LOGICAL_OPT
@ -133,7 +134,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
}); });
_vm->bindMethod<1>("object", "__eq__", CPP_LAMBDA(vm->PyBool(args[0] == args[1]))); _vm->bindMethod<1>("object", "__eq__", CPP_LAMBDA(vm->PyBool(args[0] == args[1])));
_vm->bindMethod<1>("object", "__ne__", CPP_LAMBDA(vm->PyBool(args[0] != args[1])));
_vm->bindStaticMethod<1>("type", "__new__", CPP_LAMBDA(args[0]->_type)); _vm->bindStaticMethod<1>("type", "__new__", CPP_LAMBDA(args[0]->_type));
_vm->bindStaticMethod<-1>("range", "__new__", [](VM* vm, const pkpy::ArgList& args) { _vm->bindStaticMethod<-1>("range", "__new__", [](VM* vm, const pkpy::ArgList& args) {
@ -299,6 +300,12 @@ void __initializeBuiltinFunctions(VM* _vm) {
return vm->PyBool(args[0] == args[1]); return vm->PyBool(args[0] == args[1]);
}); });
_vm->bindMethod<1>("str", "__ne__", [](VM* vm, const pkpy::ArgList& args) {
if(args[0]->is_type(vm->_tp_str) && args[1]->is_type(vm->_tp_str))
return vm->PyBool(vm->PyStr_AS_C(args[0]) != vm->PyStr_AS_C(args[1]));
return vm->PyBool(args[0] != args[1]);
});
_vm->bindMethod<1>("str", "__getitem__", [](VM* vm, const pkpy::ArgList& args) { _vm->bindMethod<1>("str", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
const _Str& _self (vm->PyStr_AS_C(args[0])); const _Str& _self (vm->PyStr_AS_C(args[0]));

View File

@ -44,7 +44,7 @@ public:
} }
} }
size_t hash() const{ inline size_t hash() const{
if(!hash_initialized){ if(!hash_initialized){
_hash = std::hash<std::string>()(*this); _hash = std::hash<std::string>()(*this);
hash_initialized = true; hash_initialized = true;
@ -141,7 +141,7 @@ public:
namespace std { namespace std {
template<> template<>
struct hash<_Str> { struct hash<_Str> {
std::size_t operator()(const _Str& s) const { inline std::size_t operator()(const _Str& s) const {
return s.hash(); return s.hash();
} }
}; };
@ -171,7 +171,7 @@ const _Str& __exit__ = _Str("__exit__");
const _Str CMP_SPECIAL_METHODS[] = { const _Str CMP_SPECIAL_METHODS[] = {
"__lt__", "__le__", "__eq__", "__ne__", "__gt__", "__ge__" "__lt__", "__le__", "__eq__", "__ne__", "__gt__", "__ge__"
}; // __ne__ should not be used };
const _Str BINARY_SPECIAL_METHODS[] = { const _Str BINARY_SPECIAL_METHODS[] = {
"__add__", "__sub__", "__mul__", "__truediv__", "__floordiv__", "__mod__", "__pow__" "__add__", "__sub__", "__mul__", "__truediv__", "__floordiv__", "__mod__", "__pow__"

View File

@ -147,17 +147,17 @@ protected:
} break; } break;
case OP_COMPARE_OP: case OP_COMPARE_OP:
{ {
// for __ne__ we use the negation of __eq__ pkpy::ArgList args(2);
int op = byte.arg == 3 ? 2 : byte.arg; args[1] = frame->pop_value(this);
PyVar res = fast_call(CMP_SPECIAL_METHODS[op], frame->pop_n_values_reversed(this, 2)); args[0] = frame->top_value(this);
if(op != byte.arg) res = PyBool(!PyBool_AS_C(res)); frame->top() = fast_call(CMP_SPECIAL_METHODS[byte.arg], std::move(args));
frame->push(std::move(res));
} break; } break;
case OP_IS_OP: case OP_IS_OP:
{ {
bool ret_c = frame->pop_value(this) == frame->pop_value(this); PyVar rhs = frame->pop_value(this);
bool ret_c = rhs == frame->top_value(this);
if(byte.arg == 1) ret_c = !ret_c; if(byte.arg == 1) ret_c = !ret_c;
frame->push(PyBool(ret_c)); frame->top() = PyBool(ret_c);
} break; } break;
case OP_CONTAINS_OP: case OP_CONTAINS_OP:
{ {
@ -167,10 +167,8 @@ protected:
frame->push(PyBool(ret_c)); frame->push(PyBool(ret_c));
} break; } break;
case OP_UNARY_NEGATIVE: case OP_UNARY_NEGATIVE:
{ frame->top() = num_negated(frame->top_value(this));
PyVar obj = frame->pop_value(this); break;
frame->push(num_negated(obj));
} break;
case OP_UNARY_NOT: case OP_UNARY_NOT:
{ {
PyVar obj = frame->pop_value(this); PyVar obj = frame->pop_value(this);

4
tests/2.py Normal file
View File

@ -0,0 +1,4 @@
import random
a = [random.randint(-100000, 100000) for i in range(1500)]
a = sorted(a)