On Tuesday 11 December 2007 20:41:08 chromatic wrote: > Here's a first step. I added a stripped-down version of the code in RT > #48467 as a second test, and it fails for me with: > > set_pmc() not implemented in class 'Num' > > I tried to debug it, but I have what they call "Stupid Fingers" tonight, > and as such can't tell if I need to add assign_pmc() to Class, Object, or > PMCProxy, or just go take a nap. Also holophoner lessons.
This snail is just grumpy enough. -- c
=== MANIFEST ================================================================== --- MANIFEST (revision 23869) +++ MANIFEST (local) @@ -3313,6 +3313,7 @@ t/op/cc_state.t [] t/op/cmp-nonbranch.t [] t/op/comp.t [] +t/op/copy.t [] t/op/debuginfo.t [] t/op/exceptions.t [] t/op/gc.t [] === PBC_COMPAT ================================================================== --- PBC_COMPAT (revision 23869) +++ PBC_COMPAT (local) @@ -28,6 +28,7 @@ # please insert tab separated entries at the top of the list +3.09 2007.12.13 chromatic added copy_p_p opcode 3.08 2007.12.12 allison added addhandler_p opcode 3.07 2007.12.12 tewk added die_s die_sc die_p die_pc opcodes 3.06 2007.11.28 coke remove classname opcode === src/ops/ops.num ================================================================== --- src/ops/ops.num (revision 23869) +++ src/ops/ops.num (local) @@ -945,309 +945,310 @@ clone_p_p 915 clone_p_p_p 916 clone_p_p_pc 917 -null_s 918 -null_i 919 -null_p 920 -null_n 921 -cleari 922 -clearn 923 -clears 924 -clearp 925 -saveall 926 -restoreall 927 -entrytype_i_i 928 -entrytype_i_ic 929 -depth_i 930 -lookback_i_i 931 -lookback_i_ic 932 -lookback_s_i 933 -lookback_s_ic 934 -lookback_n_i 935 -lookback_n_ic 936 -lookback_p_i 937 -lookback_p_ic 938 -save_i 939 -save_ic 940 -save_n 941 -save_nc 942 -save_p 943 -save_s 944 -save_sc 945 -savec_s 946 -savec_sc 947 -restore_i 948 -restore_n 949 -restore_p 950 -restore_s 951 -rotate_up_i 952 -rotate_up_ic 953 -ord_i_s 954 -ord_i_sc 955 -ord_i_s_i 956 -ord_i_sc_i 957 -ord_i_s_ic 958 -ord_i_sc_ic 959 -chr_s_i 960 -chr_s_ic 961 -chopn_s_i 962 -chopn_s_ic 963 -chopn_s_s_i 964 -chopn_s_sc_i 965 -chopn_s_s_ic 966 -chopn_s_sc_ic 967 -concat_s_s 968 -concat_s_sc 969 -concat_s_s_s 970 -concat_s_sc_s 971 -concat_s_s_sc 972 -concat_s_sc_sc 973 -repeat_s_s_i 974 -repeat_s_sc_i 975 -repeat_s_s_ic 976 -repeat_s_sc_ic 977 -length_i_s 978 -length_i_sc 979 -bytelength_i_s 980 -bytelength_i_sc 981 -pin_s 982 -unpin_s 983 -substr_s_s_i 984 -substr_s_sc_i 985 -substr_s_s_ic 986 -substr_s_sc_ic 987 -substr_s_s_i_i 988 -substr_s_sc_i_i 989 -substr_s_s_ic_i 990 -substr_s_sc_ic_i 991 -substr_s_s_i_ic 992 -substr_s_sc_i_ic 993 -substr_s_s_ic_ic 994 -substr_s_sc_ic_ic 995 -substr_s_s_i_i_s 996 -substr_s_s_ic_i_s 997 -substr_s_s_i_ic_s 998 -substr_s_s_ic_ic_s 999 -substr_s_s_i_i_sc 1000 -substr_s_s_ic_i_sc 1001 -substr_s_s_i_ic_sc 1002 -substr_s_s_ic_ic_sc 1003 -substr_s_i_i_s 1004 -substr_s_ic_i_s 1005 -substr_s_i_ic_s 1006 -substr_s_ic_ic_s 1007 -substr_s_i_i_sc 1008 -substr_s_ic_i_sc 1009 -substr_s_i_ic_sc 1010 -substr_s_ic_ic_sc 1011 -substr_s_p_i_i 1012 -substr_s_p_ic_i 1013 -substr_s_p_i_ic 1014 -substr_s_p_ic_ic 1015 -index_i_s_s 1016 -index_i_sc_s 1017 -index_i_s_sc 1018 -index_i_sc_sc 1019 -index_i_s_s_i 1020 -index_i_sc_s_i 1021 -index_i_s_sc_i 1022 -index_i_sc_sc_i 1023 -index_i_s_s_ic 1024 -index_i_sc_s_ic 1025 -index_i_s_sc_ic 1026 -index_i_sc_sc_ic 1027 -sprintf_s_s_p 1028 -sprintf_s_sc_p 1029 -sprintf_p_p_p 1030 -new_s 1031 -new_s_i 1032 -new_s_ic 1033 -stringinfo_i_s_i 1034 -stringinfo_i_sc_i 1035 -stringinfo_i_s_ic 1036 -stringinfo_i_sc_ic 1037 -upcase_s_s 1038 -upcase_s_sc 1039 -upcase_s 1040 -downcase_s_s 1041 -downcase_s_sc 1042 -downcase_s 1043 -titlecase_s_s 1044 -titlecase_s_sc 1045 -titlecase_s 1046 -join_s_s_p 1047 -join_s_sc_p 1048 -split_p_s_s 1049 -split_p_sc_s 1050 -split_p_s_sc 1051 -split_p_sc_sc 1052 -charset_i_s 1053 -charset_i_sc 1054 -charsetname_s_i 1055 -charsetname_s_ic 1056 -find_charset_i_s 1057 -find_charset_i_sc 1058 -trans_charset_s_i 1059 -trans_charset_s_ic 1060 -trans_charset_s_s_i 1061 -trans_charset_s_sc_i 1062 -trans_charset_s_s_ic 1063 -trans_charset_s_sc_ic 1064 -encoding_i_s 1065 -encoding_i_sc 1066 -encodingname_s_i 1067 -encodingname_s_ic 1068 -find_encoding_i_s 1069 -find_encoding_i_sc 1070 -trans_encoding_s_i 1071 -trans_encoding_s_ic 1072 -trans_encoding_s_s_i 1073 -trans_encoding_s_sc_i 1074 -trans_encoding_s_s_ic 1075 -trans_encoding_s_sc_ic 1076 -is_cclass_i_i_s_i 1077 -is_cclass_i_ic_s_i 1078 -is_cclass_i_i_sc_i 1079 -is_cclass_i_ic_sc_i 1080 -is_cclass_i_i_s_ic 1081 -is_cclass_i_ic_s_ic 1082 -is_cclass_i_i_sc_ic 1083 -is_cclass_i_ic_sc_ic 1084 -find_cclass_i_i_s_i_i 1085 -find_cclass_i_ic_s_i_i 1086 -find_cclass_i_i_sc_i_i 1087 -find_cclass_i_ic_sc_i_i 1088 -find_cclass_i_i_s_ic_i 1089 -find_cclass_i_ic_s_ic_i 1090 -find_cclass_i_i_sc_ic_i 1091 -find_cclass_i_ic_sc_ic_i 1092 -find_cclass_i_i_s_i_ic 1093 -find_cclass_i_ic_s_i_ic 1094 -find_cclass_i_i_sc_i_ic 1095 -find_cclass_i_ic_sc_i_ic 1096 -find_cclass_i_i_s_ic_ic 1097 -find_cclass_i_ic_s_ic_ic 1098 -find_cclass_i_i_sc_ic_ic 1099 -find_cclass_i_ic_sc_ic_ic 1100 -find_not_cclass_i_i_s_i_i 1101 -find_not_cclass_i_ic_s_i_i 1102 -find_not_cclass_i_i_sc_i_i 1103 -find_not_cclass_i_ic_sc_i_i 1104 -find_not_cclass_i_i_s_ic_i 1105 -find_not_cclass_i_ic_s_ic_i 1106 -find_not_cclass_i_i_sc_ic_i 1107 -find_not_cclass_i_ic_sc_ic_i 1108 -find_not_cclass_i_i_s_i_ic 1109 -find_not_cclass_i_ic_s_i_ic 1110 -find_not_cclass_i_i_sc_i_ic 1111 -find_not_cclass_i_ic_sc_i_ic 1112 -find_not_cclass_i_i_s_ic_ic 1113 -find_not_cclass_i_ic_s_ic_ic 1114 -find_not_cclass_i_i_sc_ic_ic 1115 -find_not_cclass_i_ic_sc_ic_ic 1116 -escape_s_s 1117 -compose_s_s 1118 -compose_s_sc 1119 -spawnw_i_s 1120 -spawnw_i_sc 1121 -spawnw_i_p 1122 -err_i 1123 -err_s 1124 -err_s_i 1125 -err_s_ic 1126 -time_i 1127 -time_n 1128 -gmtime_s_i 1129 -gmtime_s_ic 1130 -localtime_s_i 1131 -localtime_s_ic 1132 -decodetime_p_i 1133 -decodetime_p_ic 1134 -decodelocaltime_p_i 1135 -decodelocaltime_p_ic 1136 -sysinfo_s_i 1137 -sysinfo_s_ic 1138 -sysinfo_i_i 1139 -sysinfo_i_ic 1140 -sleep_i 1141 -sleep_ic 1142 -sleep_n 1143 -sleep_nc 1144 -sizeof_i_i 1145 -sizeof_i_ic 1146 -store_lex_s_p 1147 -store_lex_sc_p 1148 -find_lex_p_s 1149 -find_lex_p_sc 1150 -get_namespace_p 1151 -get_namespace_p_p 1152 -get_namespace_p_pc 1153 -get_hll_namespace_p 1154 -get_hll_namespace_p_p 1155 -get_hll_namespace_p_pc 1156 -get_root_namespace_p 1157 -get_root_namespace_p_p 1158 -get_root_namespace_p_pc 1159 -get_global_p_s 1160 -get_global_p_sc 1161 -get_global_p_p_s 1162 -get_global_p_pc_s 1163 -get_global_p_p_sc 1164 -get_global_p_pc_sc 1165 -get_hll_global_p_s 1166 -get_hll_global_p_sc 1167 -get_hll_global_p_p_s 1168 -get_hll_global_p_pc_s 1169 -get_hll_global_p_p_sc 1170 -get_hll_global_p_pc_sc 1171 -get_root_global_p_s 1172 -get_root_global_p_sc 1173 -get_root_global_p_p_s 1174 -get_root_global_p_pc_s 1175 -get_root_global_p_p_sc 1176 -get_root_global_p_pc_sc 1177 -set_global_s_p 1178 -set_global_sc_p 1179 -set_global_p_s_p 1180 -set_global_pc_s_p 1181 -set_global_p_sc_p 1182 -set_global_pc_sc_p 1183 -set_hll_global_s_p 1184 -set_hll_global_sc_p 1185 -set_hll_global_p_s_p 1186 -set_hll_global_pc_s_p 1187 -set_hll_global_p_sc_p 1188 -set_hll_global_pc_sc_p 1189 -set_root_global_s_p 1190 -set_root_global_sc_p 1191 -set_root_global_p_s_p 1192 -set_root_global_pc_s_p 1193 -set_root_global_p_sc_p 1194 -set_root_global_pc_sc_p 1195 -store_global_s_p 1196 -store_global_sc_p 1197 -store_global_s_s_p 1198 -store_global_sc_s_p 1199 -store_global_s_sc_p 1200 -store_global_sc_sc_p 1201 -store_global_p_s_p 1202 -store_global_pc_s_p 1203 -store_global_p_sc_p 1204 -store_global_pc_sc_p 1205 -find_global_p_s 1206 -find_global_p_sc 1207 -find_global_p_s_s 1208 -find_global_p_sc_s 1209 -find_global_p_s_sc 1210 -find_global_p_sc_sc 1211 -find_global_p_p_s 1212 -find_global_p_pc_s 1213 -find_global_p_p_sc 1214 -find_global_p_pc_sc 1215 -find_name_p_s 1216 -find_name_p_sc 1217 -stm_start 1218 -stm_validate_ic 1219 -stm_commit_ic 1220 -stm_wait_ic 1221 -stm_abort 1222 -stm_depth_i 1223 +copy_p_p 918 +null_s 919 +null_i 920 +null_p 921 +null_n 922 +cleari 923 +clearn 924 +clears 925 +clearp 926 +saveall 927 +restoreall 928 +entrytype_i_i 929 +entrytype_i_ic 930 +depth_i 931 +lookback_i_i 932 +lookback_i_ic 933 +lookback_s_i 934 +lookback_s_ic 935 +lookback_n_i 936 +lookback_n_ic 937 +lookback_p_i 938 +lookback_p_ic 939 +save_i 940 +save_ic 941 +save_n 942 +save_nc 943 +save_p 944 +save_s 945 +save_sc 946 +savec_s 947 +savec_sc 948 +restore_i 949 +restore_n 950 +restore_p 951 +restore_s 952 +rotate_up_i 953 +rotate_up_ic 954 +ord_i_s 955 +ord_i_sc 956 +ord_i_s_i 957 +ord_i_sc_i 958 +ord_i_s_ic 959 +ord_i_sc_ic 960 +chr_s_i 961 +chr_s_ic 962 +chopn_s_i 963 +chopn_s_ic 964 +chopn_s_s_i 965 +chopn_s_sc_i 966 +chopn_s_s_ic 967 +chopn_s_sc_ic 968 +concat_s_s 969 +concat_s_sc 970 +concat_s_s_s 971 +concat_s_sc_s 972 +concat_s_s_sc 973 +concat_s_sc_sc 974 +repeat_s_s_i 975 +repeat_s_sc_i 976 +repeat_s_s_ic 977 +repeat_s_sc_ic 978 +length_i_s 979 +length_i_sc 980 +bytelength_i_s 981 +bytelength_i_sc 982 +pin_s 983 +unpin_s 984 +substr_s_s_i 985 +substr_s_sc_i 986 +substr_s_s_ic 987 +substr_s_sc_ic 988 +substr_s_s_i_i 989 +substr_s_sc_i_i 990 +substr_s_s_ic_i 991 +substr_s_sc_ic_i 992 +substr_s_s_i_ic 993 +substr_s_sc_i_ic 994 +substr_s_s_ic_ic 995 +substr_s_sc_ic_ic 996 +substr_s_s_i_i_s 997 +substr_s_s_ic_i_s 998 +substr_s_s_i_ic_s 999 +substr_s_s_ic_ic_s 1000 +substr_s_s_i_i_sc 1001 +substr_s_s_ic_i_sc 1002 +substr_s_s_i_ic_sc 1003 +substr_s_s_ic_ic_sc 1004 +substr_s_i_i_s 1005 +substr_s_ic_i_s 1006 +substr_s_i_ic_s 1007 +substr_s_ic_ic_s 1008 +substr_s_i_i_sc 1009 +substr_s_ic_i_sc 1010 +substr_s_i_ic_sc 1011 +substr_s_ic_ic_sc 1012 +substr_s_p_i_i 1013 +substr_s_p_ic_i 1014 +substr_s_p_i_ic 1015 +substr_s_p_ic_ic 1016 +index_i_s_s 1017 +index_i_sc_s 1018 +index_i_s_sc 1019 +index_i_sc_sc 1020 +index_i_s_s_i 1021 +index_i_sc_s_i 1022 +index_i_s_sc_i 1023 +index_i_sc_sc_i 1024 +index_i_s_s_ic 1025 +index_i_sc_s_ic 1026 +index_i_s_sc_ic 1027 +index_i_sc_sc_ic 1028 +sprintf_s_s_p 1029 +sprintf_s_sc_p 1030 +sprintf_p_p_p 1031 +new_s 1032 +new_s_i 1033 +new_s_ic 1034 +stringinfo_i_s_i 1035 +stringinfo_i_sc_i 1036 +stringinfo_i_s_ic 1037 +stringinfo_i_sc_ic 1038 +upcase_s_s 1039 +upcase_s_sc 1040 +upcase_s 1041 +downcase_s_s 1042 +downcase_s_sc 1043 +downcase_s 1044 +titlecase_s_s 1045 +titlecase_s_sc 1046 +titlecase_s 1047 +join_s_s_p 1048 +join_s_sc_p 1049 +split_p_s_s 1050 +split_p_sc_s 1051 +split_p_s_sc 1052 +split_p_sc_sc 1053 +charset_i_s 1054 +charset_i_sc 1055 +charsetname_s_i 1056 +charsetname_s_ic 1057 +find_charset_i_s 1058 +find_charset_i_sc 1059 +trans_charset_s_i 1060 +trans_charset_s_ic 1061 +trans_charset_s_s_i 1062 +trans_charset_s_sc_i 1063 +trans_charset_s_s_ic 1064 +trans_charset_s_sc_ic 1065 +encoding_i_s 1066 +encoding_i_sc 1067 +encodingname_s_i 1068 +encodingname_s_ic 1069 +find_encoding_i_s 1070 +find_encoding_i_sc 1071 +trans_encoding_s_i 1072 +trans_encoding_s_ic 1073 +trans_encoding_s_s_i 1074 +trans_encoding_s_sc_i 1075 +trans_encoding_s_s_ic 1076 +trans_encoding_s_sc_ic 1077 +is_cclass_i_i_s_i 1078 +is_cclass_i_ic_s_i 1079 +is_cclass_i_i_sc_i 1080 +is_cclass_i_ic_sc_i 1081 +is_cclass_i_i_s_ic 1082 +is_cclass_i_ic_s_ic 1083 +is_cclass_i_i_sc_ic 1084 +is_cclass_i_ic_sc_ic 1085 +find_cclass_i_i_s_i_i 1086 +find_cclass_i_ic_s_i_i 1087 +find_cclass_i_i_sc_i_i 1088 +find_cclass_i_ic_sc_i_i 1089 +find_cclass_i_i_s_ic_i 1090 +find_cclass_i_ic_s_ic_i 1091 +find_cclass_i_i_sc_ic_i 1092 +find_cclass_i_ic_sc_ic_i 1093 +find_cclass_i_i_s_i_ic 1094 +find_cclass_i_ic_s_i_ic 1095 +find_cclass_i_i_sc_i_ic 1096 +find_cclass_i_ic_sc_i_ic 1097 +find_cclass_i_i_s_ic_ic 1098 +find_cclass_i_ic_s_ic_ic 1099 +find_cclass_i_i_sc_ic_ic 1100 +find_cclass_i_ic_sc_ic_ic 1101 +find_not_cclass_i_i_s_i_i 1102 +find_not_cclass_i_ic_s_i_i 1103 +find_not_cclass_i_i_sc_i_i 1104 +find_not_cclass_i_ic_sc_i_i 1105 +find_not_cclass_i_i_s_ic_i 1106 +find_not_cclass_i_ic_s_ic_i 1107 +find_not_cclass_i_i_sc_ic_i 1108 +find_not_cclass_i_ic_sc_ic_i 1109 +find_not_cclass_i_i_s_i_ic 1110 +find_not_cclass_i_ic_s_i_ic 1111 +find_not_cclass_i_i_sc_i_ic 1112 +find_not_cclass_i_ic_sc_i_ic 1113 +find_not_cclass_i_i_s_ic_ic 1114 +find_not_cclass_i_ic_s_ic_ic 1115 +find_not_cclass_i_i_sc_ic_ic 1116 +find_not_cclass_i_ic_sc_ic_ic 1117 +escape_s_s 1118 +compose_s_s 1119 +compose_s_sc 1120 +spawnw_i_s 1121 +spawnw_i_sc 1122 +spawnw_i_p 1123 +err_i 1124 +err_s 1125 +err_s_i 1126 +err_s_ic 1127 +time_i 1128 +time_n 1129 +gmtime_s_i 1130 +gmtime_s_ic 1131 +localtime_s_i 1132 +localtime_s_ic 1133 +decodetime_p_i 1134 +decodetime_p_ic 1135 +decodelocaltime_p_i 1136 +decodelocaltime_p_ic 1137 +sysinfo_s_i 1138 +sysinfo_s_ic 1139 +sysinfo_i_i 1140 +sysinfo_i_ic 1141 +sleep_i 1142 +sleep_ic 1143 +sleep_n 1144 +sleep_nc 1145 +sizeof_i_i 1146 +sizeof_i_ic 1147 +store_lex_s_p 1148 +store_lex_sc_p 1149 +find_lex_p_s 1150 +find_lex_p_sc 1151 +get_namespace_p 1152 +get_namespace_p_p 1153 +get_namespace_p_pc 1154 +get_hll_namespace_p 1155 +get_hll_namespace_p_p 1156 +get_hll_namespace_p_pc 1157 +get_root_namespace_p 1158 +get_root_namespace_p_p 1159 +get_root_namespace_p_pc 1160 +get_global_p_s 1161 +get_global_p_sc 1162 +get_global_p_p_s 1163 +get_global_p_pc_s 1164 +get_global_p_p_sc 1165 +get_global_p_pc_sc 1166 +get_hll_global_p_s 1167 +get_hll_global_p_sc 1168 +get_hll_global_p_p_s 1169 +get_hll_global_p_pc_s 1170 +get_hll_global_p_p_sc 1171 +get_hll_global_p_pc_sc 1172 +get_root_global_p_s 1173 +get_root_global_p_sc 1174 +get_root_global_p_p_s 1175 +get_root_global_p_pc_s 1176 +get_root_global_p_p_sc 1177 +get_root_global_p_pc_sc 1178 +set_global_s_p 1179 +set_global_sc_p 1180 +set_global_p_s_p 1181 +set_global_pc_s_p 1182 +set_global_p_sc_p 1183 +set_global_pc_sc_p 1184 +set_hll_global_s_p 1185 +set_hll_global_sc_p 1186 +set_hll_global_p_s_p 1187 +set_hll_global_pc_s_p 1188 +set_hll_global_p_sc_p 1189 +set_hll_global_pc_sc_p 1190 +set_root_global_s_p 1191 +set_root_global_sc_p 1192 +set_root_global_p_s_p 1193 +set_root_global_pc_s_p 1194 +set_root_global_p_sc_p 1195 +set_root_global_pc_sc_p 1196 +store_global_s_p 1197 +store_global_sc_p 1198 +store_global_s_s_p 1199 +store_global_sc_s_p 1200 +store_global_s_sc_p 1201 +store_global_sc_sc_p 1202 +store_global_p_s_p 1203 +store_global_pc_s_p 1204 +store_global_p_sc_p 1205 +store_global_pc_sc_p 1206 +find_global_p_s 1207 +find_global_p_sc 1208 +find_global_p_s_s 1209 +find_global_p_sc_s 1210 +find_global_p_s_sc 1211 +find_global_p_sc_sc 1212 +find_global_p_p_s 1213 +find_global_p_pc_s 1214 +find_global_p_p_sc 1215 +find_global_p_pc_sc 1216 +find_name_p_s 1217 +find_name_p_sc 1218 +stm_start 1219 +stm_validate_ic 1220 +stm_commit_ic 1221 +stm_wait_ic 1222 +stm_abort 1223 +stm_depth_i 1224 === src/ops/set.ops ================================================================== --- src/ops/set.ops (revision 23869) +++ src/ops/set.ops (local) @@ -514,7 +514,6 @@ goto NEXT(); } - =item B<clone>(out PMC, invar PMC) Makes a copy of the PMC in $2 and puts it in $1. @@ -526,7 +525,6 @@ goto NEXT(); } - =item B<clone>(out PMC, invar PMC, in PMC) Makes a copy of the PMC in $2 and puts it in $1, using the arguments in $3. @@ -538,6 +536,32 @@ goto NEXT(); } +=item B<copy>(inout PMC, invar PMC) + +Morphs the PMC in $1 to the type of the PMC in $2, then assigns $2 to $1. + +=cut + +inline op copy(inout PMC, invar PMC) :base_mem { + PMC * const clone = VTABLE_clone(interp, $2); + const INTVAL type = VTABLE_type(interp, $2); + + /* avoid leaks and unreachable memory by destroying the destination PMC */ + if (PObj_active_destroy_TEST($1)) + VTABLE_destroy(interp, $1); + + VTABLE_morph(interp, $1, type); + + /* the source PMC knows how to clone itself, but we must reuse the + destination header */ + STRUCT_COPY($1, clone); + + /* don't let the clone's destruction destroy the destination's data */ + PObj_active_destroy_CLEAR(clone); + + goto NEXT(); +} + =back =cut === t/op/copy.t ================================================================== --- t/op/copy.t (revision 23869) +++ t/op/copy.t (local) @@ -0,0 +1,128 @@ +#! parrot +# Copyright (C) 2007, The Perl Foundation. +# $Id: /mirror/trunk/t/op/say.t 20627 2007-08-14T23:50:55.898359Z chromatic $ + +=head1 NAME + +t/op/copy - Testing the copy opcode + +=head1 SYNOPSIS + + % prove t/op/copy.t + +=head1 DESCRIPTION + +Tests various PMCs with copy. + +=cut + +.sub 'main' :main + .include 'include/test_more.pir' + + plan(3) + + test_basic() + test_rt48467() +.end + +.sub 'test_basic' + .local pmc dest + dest = new 'Integer' + dest = 2 + + .local pmc src + src = new 'Float' + src = 1.28 + + dest = copy src + isa_ok( dest, 'Float', 'copy should change type of PMC' ) + is( dest, 1.28, '... and its value' ) +.end + +.sub 'test_rt48467' + .local pmc my_float + my_float = subclass 'Float', 'Num' + + ## my $x = 0; + .local pmc dest + dest = new 'Integer' + dest = 0 + + ## my $y = 3.2; + .local pmc src + src = new 'Num' + src = 3.2 + + ## $x = $y; + dest = copy src + + ## $y++; + inc src + + ## say '$x = ', $x; + is( dest, 3.2, 'copy should make independent copies' ) +.end