--- parser3/src/classes/array.C 2024/09/30 19:03:53 1.13 +++ parser3/src/classes/array.C 2024/10/02 17:58:15 1.16 @@ -17,7 +17,7 @@ #include "pa_vbool.h" #include "pa_vmethod_frame.h" -volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.13 2024/09/30 19:03:53 moko Exp $"; +volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.16 2024/10/02 17:58:15 moko Exp $"; // class @@ -46,10 +46,17 @@ static void _create_or_add(Request& r, M if(VArray* src=dynamic_cast(&vsrc)) { if(src==&self) - throw Exception(PARSER_RUNTIME, 0, "source and destination are the same array"); - self_array.append(src->array()); + return; + if(self_array.count()){ + for(ArrayValue::Iterator i(src->array()); i; i.next()){ + if(i.value()) + self_array.put(i.index(), i.value()); + } + } else { + self_array.append(src->array()); + } } else { - HashStringValue* src_hash=vsrc.get_hash(); + HashStringValue* src_hash=vsrc.as_hash("param must be array or"); if(!src_hash) return; for(HashStringValue::Iterator i(*src_hash); i; i.next()){ @@ -119,7 +126,7 @@ static void _join(Request& r, MethodPara } } } else { - HashStringValue* src_hash=vsrc.get_hash(); + HashStringValue* src_hash=vsrc.as_hash("param must be array or"); if(!src_hash) return; if(o.defined){ @@ -859,7 +866,7 @@ enum AtResultType { AtResultTypeHash = 2 }; -inline Value& SingleElementHash(String::Body akey, Value* avalue) { +static Value& SingleElementHash(String::Body akey, Value* avalue) { Value& result=*new VHash; result.put_element(*new String(akey, String::L_TAINTED), avalue); return result; @@ -1092,7 +1099,7 @@ MArray::MArray(): Methoded(VARRAY_TYPE) #ifdef FEATURE_GET_ELEMENT4CALL // aliases without "_" add_native_method("keys", Method::CT_DYNAMIC, _keys, 0, 1); - add_native_method("count", Method::CT_DYNAMIC, _count, 0, 0); + add_native_method("count", Method::CT_DYNAMIC, _count, 0, 1); add_native_method("at", Method::CT_DYNAMIC, _at, 1, 2); #endif