# Path: javadecompiler/Krakatau/classfile.py
# class ClassFile(object):
#     flagVals = {'PUBLIC':0x0001,
#                 'FINAL':0x0010,
#                 'SUPER':0x0020,
#                 'INTERFACE':0x0200,
#                 'ABSTRACT':0x0400,
#                 'SYNTHETIC':0x1000,
#                 'ANNOTATION':0x2000,
#                 'ENUM':0x4000,
# 
#                 # These flags are only used for InnerClasses attributes
#                 'PRIVATE':0x0002,
#                 'PROTECTED':0x0004,
#                 'STATIC':0x0008,
#                 }
# 
#     def __init__(self, bytestream):
#         magic, minor, major = bytestream.get('>LHH')
#         assert(magic == 0xCAFEBABE)
#         self.version = major,minor
# 
#         const_pool_raw = get_cp_raw(bytestream)
#         flags, self.this, self.super = bytestream.get('>HHH')
# 
#         interface_count = bytestream.get('>H')
#         self.interfaces_raw = [bytestream.get('>H') for _ in range(interface_count)]
# 
#         self.fields_raw = get_fields_raw(bytestream)
#         self.methods_raw = get_methods_raw(bytestream)
# 
#         ic_indices = [i for i,x in enumerate(const_pool_raw) if x == (1, ("InnerClasses",))]
#         self.attributes_raw = get_attributes_raw(bytestream, ic_indices)
#         assert(bytestream.size() == 0)
# 
#         self.flags = set(name for name,mask in ClassFile.flagVals.items() if (mask & flags))
#         self.cpool = constant_pool.ConstPool(const_pool_raw)
#         self.name = self.cpool.getArgsCheck('Class', self.this)
#         self.elementsLoaded = False
# 
#         self.env = self.supername = self.hierarchy = None
#         self.fields = self.methods = self.attributes = None
# 
#     def loadSupers(self, env, name, subclasses):
#         self.env = env
#         assert(self.name == name)
# 
#         if self.super:
#             self.supername = self.cpool.getArgsCheck('Class', self.super)
#             # if superclass is cached, we can assume it is free from circular inheritance
#             # since it must have been loaded successfully on a previous run
#             if not self.env.isCached(self.supername):
#                 self.env.getClass(self.supername, subclasses + (name,), partial=True)
#             self.hierarchy = self.env.getSupers(self.supername) + (self.name,)
#         else:
#             assert(name == 'java/lang/Object')
#             self.supername = None
#             self.hierarchy = (self.name,)
# 
#     def loadElements(self, keepRaw=False):
#         if self.elementsLoaded:
#             return
#         self.fields = [field.Field(m, self, keepRaw) for m in self.fields_raw]
#         self.methods = [method.Method(m, self, keepRaw) for m in self.methods_raw]
#         self.attributes = fixAttributeNames(self.attributes_raw, self.cpool)
# 
#         self.fields_raw = self.methods_raw = None
#         if not keepRaw:
#             self.attributes_raw = None
#         self.elementsLoaded = True
# 
#     def getSuperclassHierarchy(self):
#         return self.hierarchy


import collections
import struct, operator
from . import instructions, codes
from .. import constant_pool
from ..classfile import ClassFile
from ..method import Method
from ..field import Field
        fattrs = []
        if const is not None:
            attr = struct.pack('>HIH', pool.Utf8("ConstantValue"), 2, const.toIndex(pool))
            fattrs.append(attr)

        assembleClassFieldMethodAttributes(fattrs.append, groupList(field_directives), pool)

        field_code = struct.pack('>HHHH', flagbits, name, desc, len(fattrs)) + ''.join(fattrs)
        fields.append(field_code)

    for header, statements in top_d['method']:
        methods.append(assembleMethod(header, statements, pool, version, addLineNumbers, jasmode))

    if pool.bootstrap:
        entries = [struct.pack('>H' + 'H'*len(bsargs), bsargs[0], len(bsargs)-1, *bsargs[1:]) for bsargs in pool.bootstrap]
        attrbody = ''.join(entries)
        attrhead = struct.pack('>HIH', pool.Utf8("BootstrapMethods"), 2+len(attrbody), len(entries))
        attributes.append(attrhead + attrbody)

    #Explicit class attributes
    assembleClassAttributes(attributes.append, directive_dict, pool, addLineNumbers, jasmode, filename)

    interfaces = [struct.pack('>H', x.toIndex(pool)) for x in interface_decs]
    intf, cflags, this = classdec
    cflags = set(cflags)
    if intf:
        cflags.add('INTERFACE')
    if jasmode:
        cflags.add('SUPER')


# Path: javadecompiler/Krakatau/classfile.py
# class ClassFile(object):
#     flagVals = {'PUBLIC':0x0001,
#                 'FINAL':0x0010,
#                 'SUPER':0x0020,
#                 'INTERFACE':0x0200,
#                 'ABSTRACT':0x0400,
#                 'SYNTHETIC':0x1000,
#                 'ANNOTATION':0x2000,
#                 'ENUM':0x4000,
# 
#                 # These flags are only used for InnerClasses attributes
#                 'PRIVATE':0x0002,
#                 'PROTECTED':0x0004,
#                 'STATIC':0x0008,
#                 }
# 
#     def __init__(self, bytestream):
#         magic, minor, major = bytestream.get('>LHH')
#         assert(magic == 0xCAFEBABE)
#         self.version = major,minor
# 
#         const_pool_raw = get_cp_raw(bytestream)
#         flags, self.this, self.super = bytestream.get('>HHH')
# 
#         interface_count = bytestream.get('>H')
#         self.interfaces_raw = [bytestream.get('>H') for _ in range(interface_count)]
# 
#         self.fields_raw = get_fields_raw(bytestream)
#         self.methods_raw = get_methods_raw(bytestream)
# 
#         ic_indices = [i for i,x in enumerate(const_pool_raw) if x == (1, ("InnerClasses",))]
#         self.attributes_raw = get_attributes_raw(bytestream, ic_indices)
#         assert(bytestream.size() == 0)
# 
#         self.flags = set(name for name,mask in ClassFile.flagVals.items() if (mask & flags))
#         self.cpool = constant_pool.ConstPool(const_pool_raw)
#         self.name = self.cpool.getArgsCheck('Class', self.this)
#         self.elementsLoaded = False
# 
#         self.env = self.supername = self.hierarchy = None
#         self.fields = self.methods = self.attributes = None
# 
#     def loadSupers(self, env, name, subclasses):
#         self.env = env
#         assert(self.name == name)
# 
#         if self.super:
#             self.supername = self.cpool.getArgsCheck('Class', self.super)
#             # if superclass is cached, we can assume it is free from circular inheritance
#             # since it must have been loaded successfully on a previous run
#             if not self.env.isCached(self.supername):
#                 self.env.getClass(self.supername, subclasses + (name,), partial=True)
#             self.hierarchy = self.env.getSupers(self.supername) + (self.name,)
#         else:
#             assert(name == 'java/lang/Object')
#             self.supername = None
#             self.hierarchy = (self.name,)
# 
#     def loadElements(self, keepRaw=False):
#         if self.elementsLoaded:
#             return
#         self.fields = [field.Field(m, self, keepRaw) for m in self.fields_raw]
#         self.methods = [method.Method(m, self, keepRaw) for m in self.methods_raw]
#         self.attributes = fixAttributeNames(self.attributes_raw, self.cpool)
# 
#         self.fields_raw = self.methods_raw = None
#         if not keepRaw:
#             self.attributes_raw = None
#         self.elementsLoaded = True
# 
#     def getSuperclassHierarchy(self):
#         return self.hierarchy


# Path: javadecompiler/Krakatau/assembler/assembler.py
import collections
import struct, operator
from . import instructions, codes
from .. import constant_pool
from ..classfile import ClassFile
from ..method import Method
from ..field import Field

        fattrs = []
        if const is not None:
            attr = struct.pack('>HIH', pool.Utf8("ConstantValue"), 2, const.toIndex(pool))
            fattrs.append(attr)

        assembleClassFieldMethodAttributes(fattrs.append, groupList(field_directives), pool)

        field_code = struct.pack('>HHHH', flagbits, name, desc, len(fattrs)) + ''.join(fattrs)
        fields.append(field_code)

    for header, statements in top_d['method']:
        methods.append(assembleMethod(header, statements, pool, version, addLineNumbers, jasmode))

    if pool.bootstrap:
        entries = [struct.pack('>H' + 'H'*len(bsargs), bsargs[0], len(bsargs)-1, *bsargs[1:]) for bsargs in pool.bootstrap]
        attrbody = ''.join(entries)
        attrhead = struct.pack('>HIH', pool.Utf8("BootstrapMethods"), 2+len(attrbody), len(entries))
        attributes.append(attrhead + attrbody)

    #Explicit class attributes
    assembleClassAttributes(attributes.append, directive_dict, pool, addLineNumbers, jasmode, filename)

    interfaces = [struct.pack('>H', x.toIndex(pool)) for x in interface_decs]
    intf, cflags, this = classdec
    cflags = set(cflags)
    if intf:
        cflags.add('INTERFACE')
    if jasmode:
        cflags.add('SUPER')


    flagbits = map(ClassFile.flagVals.get, cflags)