Skip to content

Commit 096fa99

Browse files
authored
Merge pull request #767 from Raku/fix_all_returned_native_integers_getting_treated_as_signed
Fix all returned native integers getting treated as signed
2 parents 6a1c699 + 0fd161c commit 096fa99

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

src/vm/moar/QAST/QASTCompilerMAST.nqp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -734,10 +734,10 @@ my class MASTCompilerInstance {
734734
'return_s',
735735
'return_o',
736736
'','','','','','','','',
737-
'return_i', #FIXME need a return_u
738-
'return_i',
739-
'return_i',
740-
'return_i'
737+
'return_u',
738+
'return_u',
739+
'return_u',
740+
'return_u'
741741
];
742742

743743
my @attr_opnames := [
@@ -1086,11 +1086,13 @@ my class MASTCompilerInstance {
10861086
$ins := self.coerce($ins, $MVM_reg_num64);
10871087
}
10881088
elsif $ins_result_kind == $MVM_reg_int32 || $ins_result_kind == $MVM_reg_int16 ||
1089-
$ins_result_kind == $MVM_reg_int8 || $ins_result_kind == $MVM_reg_uint64 ||
1090-
$ins_result_kind == $MVM_reg_uint32 || $ins_result_kind == $MVM_reg_uint16 ||
1091-
$ins_result_kind == $MVM_reg_uint8 {
1089+
$ins_result_kind == $MVM_reg_int8 {
10921090
$ins := self.coerce($ins, $MVM_reg_int64);
10931091
}
1092+
elsif $ins_result_kind == $MVM_reg_uint32 || $ins_result_kind == $MVM_reg_uint16 ||
1093+
$ins_result_kind == $MVM_reg_uint8 {
1094+
$ins := self.coerce($ins, $MVM_reg_uint64);
1095+
}
10941096

10951097
$block.return_kind($ins.result_kind);
10961098
# generate a return statement
@@ -1422,6 +1424,9 @@ my class MASTCompilerInstance {
14221424
elsif $result-kind == $MVM_reg_int64 {
14231425
op_dispatch_i($!mast_frame, $result-reg, $disp-name, $callsite-id, [$code-reg]);
14241426
}
1427+
elsif $result-kind == $MVM_reg_uint64 {
1428+
op_dispatch_u($!mast_frame, $result-reg, $disp-name, $callsite-id, [$code-reg]);
1429+
}
14251430
elsif $result-kind == $MVM_reg_num64 {
14261431
op_dispatch_n($!mast_frame, $result-reg, $disp-name, $callsite-id, [$code-reg]);
14271432
}

src/vm/moar/QAST/QASTOperationsMAST.nqp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,17 +2109,14 @@ QAST::MASTOperations.add_hll_unbox('', $MVM_reg_str, -> $qastcomp, $reg {
21092109
QAST::MASTOperations.add_hll_unbox('', $MVM_reg_uint64, -> $qastcomp, $reg {
21102110
my $regalloc := $qastcomp.regalloc;
21112111
my $frame := $qastcomp.mast_frame;
2112-
my $tmp_reg := $regalloc.fresh_register($MVM_reg_int64);
21132112
my $res_reg := $regalloc.fresh_register($MVM_reg_uint64);
21142113
$regalloc.release_register($reg, $MVM_reg_obj);
21152114
my $dc := $regalloc.fresh_register($MVM_reg_obj);
21162115
op_decont($frame, $dc, $reg);
21172116
my uint $callsite_id := $frame.callsites.get_callsite_id_from_args(
21182117
$FAKE_OBJECT_ARG, [MAST::InstructionList.new($dc, $MVM_reg_obj)]);
2119-
op_dispatch_i($frame, $tmp_reg, 'nqp-uintify', $callsite_id, [$dc]);
2118+
op_dispatch_u($frame, $res_reg, 'nqp-uintify', $callsite_id, [$dc]);
21202119
$regalloc.release_register($dc, $MVM_reg_obj);
2121-
%core_op_generators{'coerce_iu'}($frame, $res_reg, $tmp_reg);
2122-
$regalloc.release_register($tmp_reg, $MVM_reg_int64);
21232120
MAST::InstructionList.new($res_reg, $MVM_reg_uint64)
21242121
});
21252122
sub boxer($kind, $type_op, $op) {

src/vm/moar/QAST/QASTRegexCompilerMAST.nqp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ my %core_op_generators := MAST::Ops.WHO<%generators>;
5656

5757
my &op_dispatch_v := %core_op_generators<dispatch_v>;
5858
my &op_dispatch_i := %core_op_generators<dispatch_i>;
59+
my &op_dispatch_u := %core_op_generators<dispatch_u>;
5960
my &op_dispatch_n := %core_op_generators<dispatch_n>;
6061
my &op_dispatch_s := %core_op_generators<dispatch_s>;
6162
my &op_dispatch_o := %core_op_generators<dispatch_o>;
@@ -78,7 +79,7 @@ sub emit_dispatch_instruction($qastcomp, str $dispatcher_name, uint $callsite_id
7879
$res_reg := $qastcomp.regalloc.fresh_register($res_kind);
7980
op_dispatch_o($frame, $res_reg, $dispatcher_name, $callsite_id, @arg_idxs);
8081
}
81-
elsif $primspec == 1 || $primspec == 10 {
82+
elsif $primspec == 1 {
8283
if $res_kind == $MVM_reg_int64 {
8384
$res_reg := $qastcomp.regalloc.fresh_register($res_kind);
8485
op_dispatch_i($frame, $res_reg, $dispatcher_name, $callsite_id, @arg_idxs);
@@ -90,6 +91,18 @@ sub emit_dispatch_instruction($qastcomp, str $dispatcher_name, uint $callsite_id
9091
MAST::InstructionList.new($temp_reg, $MVM_reg_int64), $res_kind).result_reg;
9192
}
9293
}
94+
elsif $primspec == 10 {
95+
if $res_kind == $MVM_reg_uint64 {
96+
$res_reg := $qastcomp.regalloc.fresh_register($res_kind);
97+
op_dispatch_u($frame, $res_reg, $dispatcher_name, $callsite_id, @arg_idxs);
98+
}
99+
else {
100+
my $temp_reg := $qastcomp.regalloc.fresh_register($MVM_reg_uint64);
101+
op_dispatch_u($frame, $temp_reg, $dispatcher_name, $callsite_id, @arg_idxs);
102+
$res_reg := $qastcomp.coerce(
103+
MAST::InstructionList.new($temp_reg, $MVM_reg_uint64), $res_kind).result_reg;
104+
}
105+
}
93106
elsif $primspec == 2 {
94107
if $res_kind == $MVM_reg_num64 {
95108
$res_reg := $qastcomp.regalloc.fresh_register($res_kind);

0 commit comments

Comments
 (0)