Jelajahi Sumber

some refactor

blueloveTH 1 tahun lalu
induk
melakukan
508cbfdb75

+ 2 - 2
include/pocketpy/bindings.h

@@ -16,7 +16,7 @@ struct NativeProxyFuncC final: NativeProxyFuncCBase {
     NativeProxyFuncC(_Fp func) : func(func) {}
 
     PyObject* operator()(VM* vm, ArgsView args) override {
-        PK_ASSERT(args.size() == N);
+        PK_DEBUG_ASSERT(args.size() == N);
         return call<Ret>(vm, args, std::make_index_sequence<N>());
     }
 
@@ -40,7 +40,7 @@ struct NativeProxyMethodC final: NativeProxyFuncCBase {
     NativeProxyMethodC(_Fp func) : func(func) {}
 
     PyObject* operator()(VM* vm, ArgsView args) override {
-        PK_ASSERT(args.size() == N+1);
+        PK_DEBUG_ASSERT(args.size() == N+1);
         return call<Ret>(vm, args, std::make_index_sequence<N>());
     }
 

+ 1 - 3
include/pocketpy/codeobject.h

@@ -136,9 +136,7 @@ struct UserData{
     T get() const{
         static_assert(std::is_trivially_copyable_v<T>);
         static_assert(sizeof(T) <= sizeof(data));
-#if PK_DEBUG_EXTRA_CHECK
-        PK_ASSERT(!empty);
-#endif
+        PK_DEBUG_ASSERT(!empty);
         return reinterpret_cast<const T&>(data);
     }
 };

+ 6 - 0
include/pocketpy/common.h

@@ -117,6 +117,12 @@ struct Type {
 
 #define PK_ASSERT(x) if(!(x)) PK_FATAL_ERROR();
 
+#if PK_DEBUG_EXTRA_CHECK
+#define PK_DEBUG_ASSERT(x) if(!(x)) PK_FATAL_ERROR();
+#else
+#define PK_DEBUG_ASSERT(x)
+#endif
+
 struct PyObject;
 #define PK_BITS(p) (reinterpret_cast<i64>(p))
 #define PK_SMALL_INT(val) (reinterpret_cast<PyObject*>(val << 2 | 0b10))

+ 7 - 13
include/pocketpy/frame.h

@@ -55,12 +55,7 @@ struct ValueStack {
     bool empty() const { return _sp == _begin; }
     PyObject** begin() { return _begin; }
     PyObject** end() { return _sp; }
-    void reset(PyObject** sp) {
-#if PK_DEBUG_EXTRA_CHECK
-        if(sp < _begin || sp > _begin + MAX_SIZE) PK_FATAL_ERROR();
-#endif
-        _sp = sp;
-    }
+    void reset(PyObject** sp) { _sp = sp; }
     void clear() { _sp = _begin; }
     bool is_overflow() const { return _sp >= _max_end; }
 
@@ -101,9 +96,7 @@ struct Frame {
 
     int next_bytecode() {
         _ip = _next_ip++;
-#if PK_DEBUG_EXTRA_CHECK
-        if(_ip >= co->codes.size()) PK_FATAL_ERROR();
-#endif
+        PK_DEBUG_ASSERT(_ip >= 0 && _ip < co->codes.size());
         return _ip;
     }
 
@@ -152,16 +145,17 @@ struct CallStack{
     }
 
     void pop(){
-#if PK_DEBUG_EXTRA_CHECK
-        if(empty()) PK_FATAL_ERROR();
-#endif
+        PK_DEBUG_ASSERT(!empty())
         LinkedFrame* p = _tail;
         _tail = p->f_back;
         pool64_dealloc(p);
         --_size;
     }
 
-    Frame& top() const { return _tail->frame; }
+    Frame& top() const {
+        PK_DEBUG_ASSERT(!empty())
+        return _tail->frame;
+    }
 
     template<typename Func>
     void apply(Func&& f){

+ 11 - 5
include/pocketpy/obj.h

@@ -100,8 +100,16 @@ struct PyObject{
     NameDict* _attr;
 
     bool is_attr_valid() const noexcept { return _attr != nullptr; }
-    NameDict& attr() { return *_attr; }
-    PyObject* attr(StrName name) const { return (*_attr)[name]; }
+
+    NameDict& attr() {
+        PK_DEBUG_ASSERT(is_attr_valid())
+        return *_attr;
+    }
+
+    PyObject* attr(StrName name) const {
+        PK_DEBUG_ASSERT(is_attr_valid())
+        return (*_attr)[name];
+    }
 
     virtual void _obj_gc_mark() = 0;
 
@@ -132,9 +140,7 @@ inline bool is_float(PyObject* p) noexcept { return !is_tagged(p) && p->type.ind
 inline bool is_int(PyObject* p) noexcept { return is_small_int(p) || is_heap_int(p); }
 
 inline bool is_type(PyObject* obj, Type type) {
-#if PK_DEBUG_EXTRA_CHECK
-    if(obj == nullptr) throw std::runtime_error("is_type() called with nullptr");
-#endif
+    PK_DEBUG_ASSERT(obj != nullptr)
     return is_small_int(obj) ? type.index == kTpIntIndex : obj->type == type;
 }
 

+ 1 - 1
src/expr.cpp

@@ -397,7 +397,7 @@ namespace pkpy{
         int for_codei = ctx->emit_(OP_FOR_ITER, BC_NOARG, BC_KEEPLINE);
         bool ok = vars->emit_store(ctx);
         // this error occurs in `vars` instead of this line, but...nevermind
-        PK_ASSERT(ok);  // TODO: raise a SyntaxError instead
+        if(!ok) throw std::runtime_error("SyntaxError");
         ctx->try_merge_for_iter_store(for_codei);
         if(cond){
             cond->emit_(ctx);

+ 1 - 1
src/pocketpy.cpp

@@ -518,7 +518,7 @@ void init_builtins(VM* _vm) {
         char* p_end;
         try{
             float_out = std::strtod(s.data, &p_end);
-            PK_ASSERT(p_end == s.end());
+            if(p_end != s.end()) throw 1;
         }catch(...){
             vm->ValueError("invalid literal for float(): " + s.escape());
         }

+ 1 - 3
src/vm.cpp

@@ -953,9 +953,7 @@ PyObject* VM::vectorcall(int ARGC, int KWARGC, bool op_call){
         // [type, NULL, args..., kwargs...]
         PyObject* new_f = find_name_in_mro(PK_OBJ_GET(Type, callable), __new__);
         PyObject* obj;
-#if PK_DEBUG_EXTRA_CHECK
-        PK_ASSERT(new_f != nullptr && !method_call);
-#endif
+        PK_DEBUG_ASSERT(new_f != nullptr && !method_call);
         if(new_f == cached_object__new__) {
             // fast path for object.__new__
             obj = vm->heap.gcnew<DummyInstance>(PK_OBJ_GET(Type, callable));

+ 5 - 0
tests/02_float.py

@@ -90,3 +90,8 @@ assert -2e-3j == -0.002j
 assert 3.4e-3 == 0.0034
 assert 3.4e+3 == 3400.0
 
+try:
+    float('-x13')
+    exit(1)
+except ValueError:
+    pass