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