bt2: rename `object` parameter -> `object_name`
[babeltrace.git] / src / bindings / python / bt2 / bt2 / query_executor.py
index 77b5857496fbae9b2143892734f5bb94c01df541..0b4cbc2fdcd17bf01a28d73c680131da0d3b69c0 100644 (file)
 
 from bt2 import native_bt, object, utils
 from bt2 import interrupter as bt2_interrupter
-from bt2 import component as bt2_component
-from bt2 import logging as bt2_logging
 from bt2 import value as bt2_value
 import bt2
 
 
+def _bt2_component():
+    from bt2 import component as bt2_component
+
+    return bt2_component
+
+
 class _QueryExecutorCommon:
     @property
     def _common_ptr(self):
@@ -50,12 +54,12 @@ class QueryExecutor(object._SharedObject, _QueryExecutorCommon):
     def _as_query_executor_ptr(self):
         return self._ptr
 
-    def __init__(self, component_class, object, params=None):
-        if not isinstance(component_class, bt2_component._ComponentClass):
+    def __init__(self, component_class, object_name, params=None, method_obj=None):
+        if not isinstance(component_class, _bt2_component()._ComponentClassConst):
             err = False
 
             try:
-                if not issubclass(component_class, bt2_component._UserComponent):
+                if not issubclass(component_class, _bt2_component()._UserComponent):
                     err = True
             except TypeError:
                 err = True
@@ -64,7 +68,7 @@ class QueryExecutor(object._SharedObject, _QueryExecutorCommon):
                 o = component_class
                 raise TypeError("'{}' is not a component class object".format(o))
 
-        utils._check_str(object)
+        utils._check_str(object_name)
 
         if params is None:
             params_ptr = native_bt.value_null
@@ -74,19 +78,36 @@ class QueryExecutor(object._SharedObject, _QueryExecutorCommon):
 
         cc_ptr = component_class._bt_component_class_ptr()
         assert cc_ptr is not None
-        ptr = native_bt.query_executor_create(cc_ptr, object, params_ptr)
+
+        if method_obj is not None and not native_bt.bt2_is_python_component_class(
+            cc_ptr
+        ):
+            raise ValueError(
+                'cannot pass a Python object to a non-Python component class'
+            )
+
+        ptr = native_bt.bt2_query_executor_create(
+            cc_ptr, object_name, params_ptr, method_obj
+        )
 
         if ptr is None:
             raise bt2._MemoryError('cannot create query executor object')
 
         super().__init__(ptr)
 
+        # Keep a reference of `method_obj` as the native query executor
+        # does not have any. This ensures that, when this object's
+        # query() method is called, the Python object still exists.
+        self._method_obj = method_obj
+
     def add_interrupter(self, interrupter):
         utils._check_type(interrupter, bt2_interrupter.Interrupter)
         native_bt.query_executor_add_interrupter(self._ptr, interrupter._ptr)
 
-    def interrupt(self):
-        native_bt.query_executor_interrupt(self._ptr)
+    @property
+    def default_interrupter(self):
+        ptr = native_bt.query_executor_borrow_default_interrupter(self._ptr)
+        return bt2_interrupter.Interrupter._create_from_ptr_and_get_ref(ptr)
 
     def _set_logging_level(self, log_level):
         utils._check_log_level(log_level)
@@ -106,7 +127,7 @@ class QueryExecutor(object._SharedObject, _QueryExecutorCommon):
         status, result_ptr = native_bt.query_executor_query(self._ptr)
         utils._handle_func_status(status, 'cannot query component class')
         assert result_ptr is not None
-        return bt2_value._create_from_ptr(result_ptr)
+        return bt2_value._create_from_const_ptr(result_ptr)
 
 
 class _PrivateQueryExecutor(_QueryExecutorCommon):
This page took 0.024088 seconds and 4 git commands to generate.