Skip to content

Commit fc727ea

Browse files
committed
Correct type conversion for default arguments.
The code didn't take into account of the possible truncation of the argument, we don't want to convert the default value to the type of the register but rather to the type of the destination one.
1 parent 2df0a06 commit fc727ea

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

src/vm/moar/QAST/QASTCompilerMAST.nqp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,41 +1163,50 @@ my class MASTCompilerInstance {
11631163
?? $block.lexical_param($var.name)
11641164
!! $block.local($var.name);
11651165
my $valreg;
1166+
my $valreg_kind;
11661167
my $truncop;
1168+
11671169
if $param_kind == $MVM_reg_obj || $param_kind == $MVM_reg_int64 ||
11681170
$param_kind == $MVM_reg_num64 || $param_kind == $MVM_reg_str ||
11691171
$param_kind == $MVM_reg_uint64 {
1172+
$valreg_kind := $param_kind;
11701173
$valreg := $targetreg;
11711174
}
11721175
elsif $param_kind == $MVM_reg_num32 {
1173-
$valreg := $*REGALLOC.fresh_register($MVM_reg_num64);
1176+
$valreg_kind := $MVM_reg_num64;
11741177
$truncop := 'trunc_n32';
11751178
}
11761179
elsif $param_kind == $MVM_reg_int32 {
1177-
$valreg := $*REGALLOC.fresh_register($MVM_reg_int64);
1180+
$valreg_kind := $MVM_reg_int64;
11781181
$truncop := 'trunc_i32';
11791182
}
11801183
elsif $param_kind == $MVM_reg_int16 {
1181-
$valreg := $*REGALLOC.fresh_register($MVM_reg_int64);
1184+
$valreg_kind := $MVM_reg_int64;
11821185
$truncop := 'trunc_i16';
11831186
}
11841187
elsif $param_kind == $MVM_reg_int8 {
1185-
$valreg := $*REGALLOC.fresh_register($MVM_reg_int64);
1188+
$valreg_kind := $MVM_reg_int64;
11861189
$truncop := 'trunc_i8';
11871190
}
11881191
elsif $param_kind == $MVM_reg_uint32 {
1189-
$valreg := $*REGALLOC.fresh_register($MVM_reg_uint64);
1192+
$valreg_kind := $MVM_reg_uint64;
11901193
$truncop := 'trunc_u32';
11911194
}
11921195
elsif $param_kind == $MVM_reg_uint16 {
1193-
$valreg := $*REGALLOC.fresh_register($MVM_reg_uint64);
1196+
$valreg_kind := $MVM_reg_uint64;
11941197
$truncop := 'trunc_u16';
11951198
}
11961199
elsif $param_kind == $MVM_reg_uint8 {
1197-
$valreg := $*REGALLOC.fresh_register($MVM_reg_uint64);
1200+
$valreg_kind := $MVM_reg_uint64;
11981201
$truncop := 'trunc_u8';
11991202
}
12001203

1204+
# Get a fresh register to store the result of the
1205+
# truncation, but only if needed
1206+
if $valreg_kind != $param_kind {
1207+
$valreg := $*REGALLOC.fresh_register($valreg_kind);
1208+
}
1209+
12011210
# NQP->QAST always provides a default value for optional NQP params
12021211
# even if no default initializer expression is provided.
12031212
if $var.default {
@@ -1206,7 +1215,7 @@ my class MASTCompilerInstance {
12061215

12071216
# generate default initialization code. Could also be
12081217
# wrapped in another QAST::Block.
1209-
my $default_mast := self.as_mast($var.default, :want($param_kind));
1218+
my $default_mast := self.as_mast($var.default, :want($valreg_kind));
12101219

12111220
# emit param grabbing op
12121221
$val2

0 commit comments

Comments
 (0)