List l = (List)stack.peek();
String name = (String)l.get(0);
int arity = ((Double)l.get(1)).intValue();
Set<Type> ctors = ts.lookupConstructor(type, name);
Type ctor = null;
for (Type t: ctors) {
if (t.getArity() == arity) {
ctor = t;
break;
}
}
if (ctor == null) {
throw new IOException("no constructor " + name + "/" + arity+ " in " + type);
}
List argsList = (List) l.get(2);
IValue[] args = new IValue[arity];
for (int i = 0; i < arity; i++) {
stack.push(argsList.get(i));
args[i] = read(ctor.getFieldType(i));
stack.pop();
}
Map<String, IValue> kwargs = null;
if (ctor.hasKeywordParameters() && l.size() > 3) {
kwargs = new HashMap<>();
Map kw = (Map)l.get(3);
for (Object k: kw.keySet()) {
String label = (String)k;
Type kwType = ctor.getKeywordParameterType(label);
stack.push(kw.get(label));
kwargs.put(label, read(kwType));
stack.pop();
}
}