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

Reply via email to