Ticket #1148: callsignature_clone.patch

File callsignature_clone.patch, 3.7 KB (added by flh, 5 years ago)
  • src/pmc/callsignature.pmc

     
    281281    Parrot_CallSignature_attributes * const attrs = PARROT_CALLSIGNATURE(SELF); 
    282282 
    283283    if (!attrs->hash) 
    284         attrs->hash = parrot_new_hash(interp); 
     284        attrs->hash = parrot_create_hash(interp, 
     285            enum_type_ptr, 
     286            Hash_key_type_STRING, 
     287            STRING_compare, 
     288            (hash_hash_key_fn)key_hash_STRING); 
    285289 
    286290    return attrs->hash; 
    287291} 
     
    11441148 
    11451149/* 
    11461150 
     1151=item C<PMC *clone()> 
     1152 
     1153Creates and returns a clone of the signature. 
     1154 
     1155=cut 
     1156 
     1157*/ 
     1158    VTABLE PMC *clone() { 
     1159        struct Parrot_CallSignature_attributes *sig, *dest_sig; 
     1160        PMC * const dest = pmc_new(INTERP, SELF->vtable->base_type); 
     1161        Pcc_cell *cell; 
     1162 
     1163        sig = PARROT_CALLSIGNATURE(SELF); 
     1164        dest_sig = PARROT_CALLSIGNATURE(dest); 
     1165 
     1166        /* Copy all positional cells (thanks to APPEND_CELL, this also 
     1167         * sets num_positionals). */ 
     1168        for (cell = sig->positionals; cell; cell = NEXT_CELL(cell)) { 
     1169            Pcc_cell *cloned_cell; 
     1170 
     1171            switch (CELL_TYPE_MASK(cell)) { 
     1172              case INTCELL: 
     1173                cloned_cell = CREATE_INTVAL_CELL(INTERP); 
     1174                CELL_INT(cloned_cell) = CELL_INT(cell); 
     1175                break; 
     1176              case FLOATCELL: 
     1177                cloned_cell = CREATE_FLOATVAL_CELL(INTERP); 
     1178                CELL_FLOAT(cloned_cell) = CELL_FLOAT(cell); 
     1179                break; 
     1180              case STRINGCELL: 
     1181                cloned_cell = CREATE_STRING_CELL(INTERP); 
     1182                CELL_STRING(cloned_cell) = CELL_STRING(cell); 
     1183                break; 
     1184              case PMCCELL: 
     1185                cloned_cell = CREATE_PMC_CELL(INTERP); 
     1186                CELL_PMC(cloned_cell) = CELL_PMC(cell); 
     1187                break; 
     1188            } 
     1189            APPEND_CELL(dest, cloned_cell); 
     1190        } 
     1191 
     1192        if (!PMC_IS_NULL(sig->results)) 
     1193            dest_sig->results = VTABLE_clone(INTERP, sig->results); 
     1194 
     1195        if (!PMC_IS_NULL(sig->type_tuple)) 
     1196            dest_sig->type_tuple = VTABLE_clone(INTERP, sig->type_tuple); 
     1197 
     1198        if (sig->short_sig) 
     1199            dest_sig->short_sig = Parrot_str_copy(INTERP, sig->short_sig); 
     1200 
     1201        if (!PMC_IS_NULL(sig->arg_flags)) 
     1202            dest_sig->arg_flags = VTABLE_clone(INTERP, sig->arg_flags); 
     1203 
     1204        if (!PMC_IS_NULL(sig->return_flags)) 
     1205            dest_sig->return_flags = VTABLE_clone(INTERP, sig->return_flags); 
     1206 
     1207        parrot_hash_clone(INTERP, get_hash(INTERP, SELF), 
     1208            get_hash(INTERP, dest)); 
     1209 
     1210        return dest; 
     1211    } 
     1212 
     1213/* 
     1214 
    11471215=back 
    11481216 
    11491217=cut 
  • t/pmc/callsignature.t

     
    1919.sub 'main' :main 
    2020    .include 'test_more.pir' 
    2121 
    22     plan(65) 
     22    plan(68) 
    2323 
    2424    test_instantiate() 
    2525    test_get_set_attrs() 
     
    2929    test_indexed_boxing() 
    3030    test_keyed_access() 
    3131    test_exists() 
     32    test_clone() 
    3233.end 
    3334 
    3435.sub 'test_instantiate' 
     
    285286    nok( $I0, 'exists_keyed_str -- non-existant' ) 
    286287.end 
    287288 
     289.sub 'test_clone' 
     290    $P0 = new ['CallSignature'] 
     291    $P0[0] = 42 
     292    $P0[1] = "Hello Parrot" 
     293    $P0['floatval'] = 3.14159 
     294 
     295    $P1 = clone $P0 
     296 
     297    $I2 = $P1[0] 
     298    is($I2, 42, 'clone - integer positional cloned') 
     299    $S2 = $P1[1] 
     300    is($S2, "Hello Parrot", 'clone - string positional cloned') 
     301    $N2 = $P1['floatval'] 
     302    is($N2, 3.14159, 'clone - named number cloned') 
     303.end 
     304 
    288305# Local Variables: 
    289306#   mode: pir 
    290307#   fill-column: 100