qore - 通过引用从 C++ 代码向 Qore 脚本函数传递值

标签 qore

我需要将 returnValue 作为通过引用传递的参数传递给方法,并在函数 id 完成时调整原始 var 值。因此使用 ReferenceArgumentHelper 类。

returnValue被无意删除(当它是一个节点,即字符串时)并且valgrind检测到它时,下面的代码出了什么问题。 callMethod("onFunctionExit" 调用 Qore 脚本方法,我可以看到正确的 returnValue 值。我怀疑它在退出 onFunctionExit 时被删除>ReferenceArgumentHelper已被销毁。rah.getArg()引用了引用变量,因此不应在callMethod中删除它。

   DLLLOCAL ThreadDebugEnum callMethod(const char* name, const ThreadDebugEnum defaultResult, QoreProgram *pgm, int paramCount, AbstractQoreNode** params, ExceptionSink* xsink) {
      int rv;
      QoreListNode* l = new QoreListNode();
      qore_program_to_object_map_t::iterator i = qore_program_to_object_map.find(pgm);
      if (i == qore_program_to_object_map.end()) {
         return defaultResult;
      }
      i->second->ref();
      l->push(i->second);
      for (int i=0; i<paramCount; i++) {
         if (params[i])
               params[i]->ref();
         l->push(params[i]);
      }
      rv = qo->intEvalMethod(name, l, xsink);
      l->deref(xsink);
      return (ThreadDebugEnum) rv;
   }

   DLLLOCAL virtual ThreadDebugEnum onFunctionExit(QoreProgram *pgm, const StatementBlock *blockStatement, QoreValue& returnValue, ExceptionSink* xsink) {
      AbstractQoreNode* params[2];
      params[0] = getLocation(blockStatement);
      ReferenceArgumentHelper rah(returnValue.takeNode(), xsink); // grab node from returnValue and pass to helper
      params[1] = rah.getArg(); // caller owns ref
      ThreadDebugEnum rv = callMethod("onFunctionExit", DBG_SB_RUN, pgm, 2, params, xsink);
      AbstractQoreNode* rc = rah.getOutputValue();  // caller owns ref
      returnValue.assign(rc);  // takes reference
//      returnValue.ref();
      }
      return rv;
   }

当深入研究时,我不明白为什么编译器对 /lib/ReferenceArgumentHelper.cpp 中的代码感到满意:

struct lvih_intern {
   LocalVar lv;
   ExceptionSink* xsink;
   ReferenceNode* ref;

   DLLLOCAL lvih_intern(AbstractQoreNode* val, ExceptionSink* xs) : lv("ref_arg_helper", 0), xsink(xs) {
      printd(5, "ReferenceArgumentHelper::ReferenceArgumentHelper() instantiating %p (val: %p type: '%s') \n", &lv, val, val ? val->getTypeName() : "n/a");
      lv.instantiate(val);   <--------------
      VarRefNode* vr = new VarRefNode(strdup("ref_arg_helper"), VT_LOCAL);
      vr->ref.id = &lv;
      ref = new ReferenceNode(vr, 0, vr, 0);
   }

class LocalVar {
....
   DLLLOCAL void instantiate(QoreValue nval) const {

在方法调用中将 AbstractQoreNode* 转换为 QoreValue 背后的原因是什么?我没有找到重载运算符之类的。我正在寻找引用文献到底发生了什么。

最佳答案

** 编辑 **

长话短说,ReferenceArgumentHelper 存在缺陷;它已经很多年没有使用过并且不是最新的。该类(class)已修复,希望可以解决您的问题。

感谢您指出这一点,如果您对此问题或受影响代码的修复有任何其他问题,请告诉我。

关于qore - 通过引用从 C++ 代码向 Qore 脚本函数传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42873644/

相关文章:

arrays - 如何在 Qore 中将长列表分成几部分

qore - 通过 QPP 实现的 Qore 函数的参数属性定义

unix - qore中的函数参数范围是什么?

integration - 如何从状态获取列表并在 qore 中修改它?

Qore:如何将哈希转换为对象

filesystems - 如何在 Qore/Qorus :/or\? 中获取文件分隔符

qore - 如何测试 Qore 对象是否继承自特定类

qore - 如何在此类内的方法中获取类名

Qore 双类实现 (C++/Qore) 并从 C++ 核心调用虚方法