blueloveTH преди 1 година
родител
ревизия
a6a834da29
променени са 2 файла, в които са добавени 16 реда и са изтрити 1 реда
  1. 4 1
      include/pocketpy/vm.h
  2. 12 0
      src/vm.cpp

+ 4 - 1
include/pocketpy/vm.h

@@ -156,6 +156,7 @@ public:
     PyObject* __curr_class; 
     PyObject* __cached_object_new;
     std::map<std::string_view, CodeObject_> __cached_codes;
+    std::map<std::string_view, PyObject*> __cached_op_funcs;
     FuncDecl_ __dynamic_func_decl;
 
 #if PK_ENABLE_PROFILER
@@ -205,10 +206,12 @@ public:
     bool py_le(PyObject* lhs, PyObject* rhs);               // (lhs, rhs) -> lhs <= rhs
     bool py_gt(PyObject* lhs, PyObject* rhs);               // (lhs, rhs) -> lhs > rhs
     bool py_ge(PyObject* lhs, PyObject* rhs);               // (lhs, rhs) -> lhs >= rhs
-    bool py_ne(PyObject* lhs, PyObject* rhs) {              // (lhs, rhs) -> lhs != rhs
+    bool py_ne(PyObject* lhs, PyObject* rhs){               // (lhs, rhs) -> lhs != rhs
         return !py_eq(lhs, rhs);
     }
 
+    PyObject* py_op(std::string_view name);                 // (name) -> operator.name
+
     void py_exec(std::string_view, PyObject*, PyObject*);       // exec(source, globals, locals)
     PyObject* py_eval(std::string_view, PyObject*, PyObject*);  // eval(source, globals, locals)
 #endif

+ 12 - 0
src/vm.cpp

@@ -244,6 +244,18 @@ namespace pkpy{
         return false;
     }
 
+    PyObject* VM::py_op(std::string_view name){
+        PyObject* func;
+        auto it = __cached_op_funcs.find(name);
+        if(it == __cached_op_funcs.end()){
+            func = py_import("operator")->attr(StrName::get(name));
+            __cached_op_funcs[name] = func;
+        }else{
+            func = it->second;
+        }
+        return func;
+    }
+
     i64 VM::normalized_index(i64 index, int size){
         if(index < 0) index += size;
         if(index < 0 || index >= size){