146,147c146,147
< def isSimObjSequence(value):
< if not isinstance(value, (list, tuple)):
---
> def isSimObjectSequence(value):
> if not isinstance(value, (list, tuple)) or len(value) == 0:
156,157c156,157
< def isSimObjClassSequence(value):
< if not isinstance(value, (list, tuple)):
---
> def isSimObjectClassSequence(value):
> if not isinstance(value, (list, tuple)) or len(value) == 0:
165a166,171
> def isSimObjectOrSequence(value):
> return isSimObject(value) or isSimObjectSequence(value)
>
> def isSimObjectClassOrSequence(value):
> return isSimObjectClass(value) or isSimObjectClassSequence(value)
>
168a175,190
> # Apply method to object.
> # applyMethod(obj, 'meth', <args>) is equivalent to obj.meth(<args>)
> def applyMethod(obj, meth, *args, **kwargs):
> return getattr(obj, meth)(*args, **kwargs)
>
> # If the first argument is an (non-sequence) object, apply the named
> # method with the given arguments. If the first argument is a
> # sequence, apply the method to each element of the sequence (a la
> # 'map').
> def applyOrMap(objOrSeq, meth, *args, **kwargs):
> if not isinstance(objOrSeq, (list, tuple)):
> return applyMethod(objOrSeq, meth, *args, **kwargs)
> else:
> return [applyMethod(o, meth, *args, **kwargs) for o in objOrSeq]
>
>
258c280
< if isSimObject(val):
---
> if isSimObjectOrSequence(val):
260,263c282
< cls._values[key] = val.makeClass(memo)
< elif isSimObjSequence(val) and len(val):
< assert(val == cls._values.local[key])
< cls._values[key] = [ v.makeClass(memo) for v in val ]
---
> cls._values[key] = applyOrMap(val, 'makeClass', memo)
267c286
< elif isSimObjectClass(val):
---
> elif isSimObjectClassOrSequence(val):
269,272c288
< cls._values[key] = val.makeSubclass({}, memo)
< elif isSimObjClassSequence(val) and len(val):
< assert(not cls._values.local.has_key(key))
< cls._values[key] = [ v.makeSubclass({}, memo) for v in val ]
---
> cls._values[key] = applyOrMap(val, 'makeSubclass', {}, memo)
304,305c320
< if (isSimObject(value) or isSimObjSequence(value)) \
< and cls._instantiated:
---
> if isSimObjectOrSequence(value) and cls._instantiated:
318c333
< elif isSimObject(value) or isSimObjSequence(value):
---
> elif isSimObjectOrSequence(value):
410c425
< elif isSimObjClassSequence(val) and len(val):
---
> elif isSimObjectClassSequence(val) and len(val):
457c472
< elif isSimObject(value) or isSimObjSequence(value):
---
> elif isSimObjectOrSequence(value):
468c483
< elif isSimObjSequence(value):
---
> elif isSimObjectSequence(value):
891c906
< if isSimObjSequence(tmp_list):
---
> if isSimObjectSequence(tmp_list):