protected void FinishClass(Context cx, final QName name, final QName basename, boolean is_dynamic, boolean is_final, boolean is_interface, boolean is_nullable)
{
ObjectList<ByteList> static_traits = new ObjectList<ByteList>();
ObjectList<ByteList> instance_traits = new ObjectList<ByteList>();
IntList interfaces = new IntList();
int scope_depth = cx.getScopes().size();
ObjectValue protected_namespace = null;
// Iterate through the members of the class and define the traits
if( !is_interface )
{
// Class traits
ObjectValue obj = cx.scope(scope_depth-2);
Builder bui = obj.builder;
protected_namespace = ((ClassBuilder)bui).protected_namespace;
FinishTraits(obj, static_traits);
}
{
// Instance vars
ObjectValue obj = cx.scope(scope_depth-1);
InstanceBuilder bui = obj.builder instanceof InstanceBuilder ? (InstanceBuilder) obj.builder : null;
// interfaces can implement other interfaces, must express this in abc
{
for (ReferenceValue ref : bui.interface_refs)
{
interfaces.add(makeMultiname(ref.name,ref.getImmutableNamespaces()));
}
}
FinishTraits(obj, instance_traits);
}
// Make a multiname
int qname_index = addClassName(name);
int base_index = basename == null ? 0 : addClassName(basename);
int iinit_info = 0;
//if( !is_interface )
{
ObjectValue obj = cx.scope();
int slot_id = obj.getSlotIndex(cx,GET_TOKEN,"$construct",cx.publicNamespace());
slot_id = obj.getImplicitIndex(cx,slot_id,EMPTY_TOKEN);
Slot slot = obj.getSlot(cx,slot_id);
iinit_info = GetMethodInfo(slot.getMethodName());
}
/*else
{
iinit_info = GetMethodInfo(name+"$iinit");
}*/
int class_info = GetClassInfo(name);
int flags = 0;
if (!is_dynamic)
flags |= CLASS_FLAG_sealed;
if (is_final)
flags |= CLASS_FLAG_final;
if (is_interface)
flags |= CLASS_FLAG_interface;
if (!is_nullable)
flags |= CLASS_FLAG_non_nullable;
int protected_index = (protected_namespace != null) ? addNamespace(protected_namespace) : 0;
if (protected_index != 0)
flags |= CLASS_FLAG_protected;
ab.addBytesToTable(ab.instances,bytecodeFactory.InstanceInfo(ab.instances.at(class_info),qname_index,base_index,flags,protected_index,
interfaces.size(),interfaces,
iinit_info /*GetMethodInfo(name+"$"+name)*/,instance_traits,class_info));
int cinit_info = GetMethodInfo(name+"$cinit");
ab.addBytesToTable(ab.classes,bytecodeFactory.ClassInfo(ab.classes.at(class_info),
cinit_info,static_traits,class_info));