blueloveTH 1 год назад
Родитель
Сommit
a634d046be

+ 5 - 2
include/pocketpy/compiler/expr.hpp

@@ -64,12 +64,14 @@ struct CodeEmitContext{
     int level;
     vector<StrName> global_names;
 
-    CodeEmitContext(VM* vm, CodeObject_ co, int level) : vm(vm), co(co), level(level) {}
+    CodeEmitContext(VM* vm, CodeObject_ co, int level) : vm(vm), co(co), level(level) {
+        c11_smallmap_s2n__ctor(&_co_consts_string_dedup_map);
+    }
 
     int curr_iblock = 0;
     bool is_compiling_class = false;
 
-    small_map<std::string_view, int> _co_consts_string_dedup_map;
+    c11_smallmap_s2n _co_consts_string_dedup_map;
 
     int get_loop() const noexcept;
     CodeBlock* enter_block(CodeBlockType type) noexcept;
@@ -119,6 +121,7 @@ struct CodeEmitContext{
     // clean
     void s_clean() noexcept{
         s_debug_info("s_clean");
+        c11_smallmap_s2n__dtor(&_co_consts_string_dedup_map);
         for(Expr* e: _s_expr) delete_expr(e);
         _s_expr.clear();
     }

+ 0 - 1
include/pocketpy/interpreter/vm.hpp

@@ -188,7 +188,6 @@ public:
     PyObject* __last_exception;
     PyObject* __curr_class;
     PyVar __cached_object_new;
-    small_map<std::string_view, PyVar> __cached_op_funcs;
     FuncDecl_ __dynamic_func_decl;
     PyVar __vectorcall_buffer[PK_MAX_CO_VARNAMES];
 

+ 2 - 2
src/compiler/expr.cpp

@@ -123,14 +123,14 @@ int CodeEmitContext::add_varname(StrName name) noexcept{
 }
 
 int CodeEmitContext::add_const_string(std::string_view key) noexcept{
-    int* val = _co_consts_string_dedup_map.try_get(key);
+    uint16_t* val = c11_smallmap_s2n__try_get(&_co_consts_string_dedup_map, {key.data(), (int)key.size()});
     if(val) {
         return *val;
     } else {
         co->consts.push_back(VAR(key));
         int index = co->consts.size() - 1;
         key = co->consts.back().obj_get<Str>().sv();
-        _co_consts_string_dedup_map.insert(key, index);
+        c11_smallmap_s2n__set(&_co_consts_string_dedup_map, {key.data(), (int)key.size()}, index);
         return index;
     }
 }

+ 2 - 9
src/interpreter/vm.cpp

@@ -265,15 +265,8 @@ bool VM::py_eq(PyVar lhs, PyVar rhs) {
 }
 
 PyVar VM::py_op(std::string_view name) {
-    PyVar func;
-    auto it = __cached_op_funcs.try_get(name);
-    if(it == nullptr) {
-        func = py_import("operator")->attr()[StrName::get(name)];
-        __cached_op_funcs.insert(name, func);
-    } else {
-        func = *it;
-    }
-    return func;
+    // TODO: cache the result
+    return py_import("operator")->attr()[StrName::get(name)];
 }
 
 i64 VM::normalized_index(i64 index, int size) {