2017-03-18 44 views
2

我需要將returnValue作爲參數傳遞給參數,並在函數id完成時調整原始var值。所以使用ReferenceArgumentHelper類。通過引用來自C++代碼的Qore腳本函數傳遞值

代碼錯誤代碼如下當returnValue被無意中刪除(當它是一個節點,即字符串)並且valgrind檢測到它時出錯。 callMethod(「onFunctionExit」調用一個Qore腳本方法,我可以看到有正確的returnValue價值。我懷疑這是退出onFunctionExitReferenceArgumentHelper被破壞。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在方法調用?我沒有找到一個重載的操作符等。我正在查看引用發生了什麼。

回答

3

**編輯**

爲了使長話短說,ReferenceArgumentHelper是越野車;它已經有數年沒有使用過,並且沒有及時更新。這個班已經修好了,應該可以解決你希望的問題。

感謝您指出這一點,並讓我知道如果您有任何進一步的問題或對受影響的代碼的修復。

+0

我正在考慮* lv.instantiate(val); *其中* val *是* AbstractCoreNode **,但方法參數是* QoreValue *類型。 – TMa