首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++代码中引用Qore脚本函数传递值

从C++代码中引用Qore脚本函数传递值
EN

Stack Overflow用户
提问于 2017-03-18 11:16:23
回答 1查看 39关注 0票数 2

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

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

代码语言:javascript
复制
   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中的代码很满意。

代码语言:javascript
复制
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 {

在方法调用中将抽象QoreValue *转换为QoreValue的背后是什么?我没有找到一个过载的操作员。我在看推荐信到底发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-18 11:33:47

编辑**

长话短说,ReferenceArgumentHelper是有缺陷的;它已经很多年没有使用过了,也不是最新的。这门课已经修好了,我希望它能解决你的问题。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42873644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档