Use a new temp for return values from call and new operations

Change-Id: Ic95ab3b2f866b68cbdc04299d1c983beb0e46387
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Lars Knoll 2017-06-14 15:21:12 +02:00
parent cd770a6b59
commit 241ccd8fe3
1 changed files with 14 additions and 6 deletions

View File

@ -1635,6 +1635,10 @@ bool Codegen::visit(CallExpression *ast)
if (hasError)
return false;
Reference r = Reference::fromTemp(this, bytecodeGenerator->newTemp());
TempScope scope(_function);
Reference base = expression(ast->base);
if (hasError)
return false;
@ -1647,8 +1651,9 @@ bool Codegen::visit(CallExpression *ast)
call.dest = base.asRValue();
call.argc = argc;
call.callData = 0;
call.result = Moth::Param::createTemp(0); bytecodeGenerator->addInstruction(call);
_expr.result = Reference::fromTemp(this, 0);
call.result = r.asLValue();
bytecodeGenerator->addInstruction(call);
_expr.result = r;
return false;
}
@ -1880,6 +1885,8 @@ bool Codegen::visit(NewExpression *ast)
{
if (hasError)
return false;
Reference r = Reference::fromTemp(this, bytecodeGenerator->newTemp());
TempScope scope(_function);
Reference base = expression(ast->expression);
@ -1890,9 +1897,9 @@ bool Codegen::visit(NewExpression *ast)
create.func = base.asRValue();
create.argc = 0;
create.callData = 0;
create.result = Moth::Param::createTemp(0);
create.result = r.asLValue();
bytecodeGenerator->addInstruction(create);
_expr.result = Reference::fromTemp(this, 0);
_expr.result = r;
return false;
}
@ -1901,6 +1908,7 @@ bool Codegen::visit(NewMemberExpression *ast)
if (hasError)
return false;
Reference r = Reference::fromTemp(this, bytecodeGenerator->newTemp());
TempScope scope(_function);
Reference base = expression(ast->base);
@ -1915,9 +1923,9 @@ bool Codegen::visit(NewMemberExpression *ast)
create.func = base.asRValue();
create.argc = argc;
create.callData = 0;
create.result = Moth::Param::createTemp(0);
create.result = r.asRValue();
bytecodeGenerator->addInstruction(create);
_expr.result = Reference::fromTemp(this, 0);
_expr.result = r;
return false;
}