protected static void compileMembers(ByteCompiler context, int size, Enumeration types)
{
ClassRoom clazz = context.getClassRoom();
ConstantPool pool = clazz.getPool();
Field members = clazz.createField("_members", "[Ljava/lang/Object;", Code.ACC_PUBLIC|Code.ACC_STATIC);
Code code = clazz.getStatic().getCode();
context.pushCode(code);
int intclazz = pool.addClass("java/lang/Integer");
int intclazzctor = pool.addMethodRef(intclazz, "<init>", "(I)V");
code.iconst(size * 4);
code.anewarray("java/lang/Object");
for(int i=0; types.hasMoreElements();) {
Type type = (Type)types.nextElement();
switch(type.getType()) {
case Type.MODULE:
case Type.CLASS:
case Type.INTERFACE:
case Type.NAMESPACE:
case Type.FUNCTION:
case Type.METHOD:
case Type.INTERFACE_METHOD:
case Type.CONSTRUCTOR:
case Type.CONSTANT_VARIABLE:
case Type.STATIC_VARIABLE:
case Type.MEMBER_VARIABLE:
{
code.dup();
code.iconst(i++);
code.anew(intclazz);
code.dup();
code.iconst(type.getType());
code.invokespecial(intclazzctor);
code.aastore();
code.dup();
code.iconst(i++);
code.astring(type.getName());
code.aastore();
code.dup();
code.iconst(i++);
Doc doc = type.getDocument();
if (doc != null) {
doc.compile(code);
} else {
code.aconst_null();
}
code.aastore();
code.dup();
code.iconst(i++);
switch(type.getType()) {
case Type.FUNCTION:
case Type.METHOD:
case Type.INTERFACE_METHOD:
case Type.CONSTRUCTOR:
((FunctionStatement)type).compileDescriptor(context);
break;
default:
code.aconst_null();
}
code.aastore();
}
break;
default:
break;
}
}
code.putstatic(members);
context.popCode();
}