Hi Jacek,
thank you for the review and the testcase.
It seems it cannot be solved in interpreter alone, because bytecode for y=f and y=f() is same in following example.
I would be glad on advice how to fix this...
Thanks, Robert
function f y = f ' y =Empty y = f() ' recursive call end function call f()
00f4:trace:vbscript_disas:dump_code 1: icallv L"f" 0 00f4:trace:vbscript_disas:dump_code 2: catch 2 0 00f4:trace:vbscript_disas:dump_code 3: ret 00f4:trace:vbscript_disas:dump_code 4: icall L"f" 0 00f4:trace:vbscript_disas:dump_code 5: assign_ident L"y" 0 00f4:trace:vbscript_disas:dump_code 6: catch 6 0 00f4:trace:vbscript_disas:dump_code 7: icall L"f" 0 00f4:trace:vbscript_disas:dump_code 8: assign_ident L"y" 0 00f4:trace:vbscript_disas:dump_code 9: catch 9 0 00f4:trace:vbscript_disas:dump_code 10: ret
On Thu, 2021-09-23 at 14:39 +0200, Jacek Caban wrote:
Hi Robert,
Sorry for the delay.
On 9/16/21 10:25 PM, Robert Wilhelm wrote:
if((ctx->func->type == FUNC_FUNCTION || ctx->func->type == FUNC_PROPGET) - && !wcsicmp(name, ctx->func->name)) { + && !wcsicmp(name, ctx->func->name) + /* you must not use return value for recursive call */ + && ((invoke_type != VBDISP_CALLGET) || ((invoke_type == VBDISP_CALLGET) && ( V_VT(&ctx->ret_val) == VT_DISPATCH)))) {
I experimented a bit with this, see attached test. It seems that we should use the current function even if ret_val is modified and not an object.
Thanks,
Jacek