Beispiel #1
0
    def build_core(self):
        core = {
            'header': {
                'entries':
                None,  # number of labeled objects (top-levels, behaviors, cclasses)
                'names_size': None,  # size in bytes of NAMES section
                'st_size': None,  # size of Symbols table
                'ot_size': None
            },  # size of OBJECT TABLE in bytes
            'names': [],
            'index': [],  # index of top level entities
            'object_table': [],
            'symbols': [],  # Symbol references
            'reloc_table': []
        }

        self.core_compiled_module.fill(self.vmem)

        # -- HEADER and NAMES section
        labels = self.core_compiled_module.entry_labels()
        core['header']['entries'] = len(labels)

        # names :: [(string, alloc-size in bytes, self-ptr)]
        names_list = set([l + "\0" for l in labels] +
                         [n + "\0" for n in self.vmem.external_names()])

        core['names'] = [(name_t, bits.string_block_size(name_t))
                         for name_t in names_list]

        core['header']['names_size'] = sum([x[1] for x in core['names']])

        index_size = core['header'][
            'entries'] * 2 * bits.WSIZE  # *2: pair (name, entry),
        base = self.HEADER_SIZE + core['header']['names_size'] + index_size
        self.vmem.set_base(base)

        # - OBJECT TABLE
        core['object_table'] = self.vmem.object_table()

        # - HEADER ot_size
        core['header']['ot_size'] = len(core['object_table'])

        # symbols
        for pair in self.vmem.symbols_references():
            core['symbols'].append(self.name_ptr_for_name(pair[0], core))
            core['symbols'].append(pair[1])

        core['header']['st_size'] = len(core['symbols']) * bits.WSIZE

        # reloc
        core['reloc_table'] = self.vmem.reloc_table()

        # - INDEX section
        for name in labels:
            core['index'].append(self.name_ptr_for_name(name,
                                                        core))  # ptr to string
            core['index'].append(self.vmem.index_for(name))  # ptr to object

        return core
Beispiel #2
0
    def __init__(self, etable, string):
        self.etable = etable

        string_with_term = string + "\0"
        # words_needed = int(math.ceil(len(string_with_term) / float(utils.WSIZE)))
        # to_fill = (words_needed * utils.WSIZE) - len(string_with_term)
        to_fill = bits.string_block_size(string_with_term) - len(string_with_term)
        # br()
        self.data = map(ord, string_with_term) + ([0] * to_fill)
Beispiel #3
0
    def __init__(self, etable, string):
        self.etable = etable

        string_with_term = string + "\0"
        # words_needed = int(math.ceil(len(string_with_term) / float(utils.WSIZE)))
        # to_fill = (words_needed * utils.WSIZE) - len(string_with_term)
        to_fill = bits.string_block_size(string_with_term) - len(string_with_term)
        # br()
        self.data = map(ord, string_with_term) + ([0] * to_fill)
Beispiel #4
0
    def build_core(self):
        core = {
            'header': {
                'entries': None,             # number of labeled objects (top-levels, behaviors, cclasses)
                'names_size': None,          # size in bytes of NAMES section
                'st_size': None,             # size of Symbols table
                'ot_size': None},            # size of OBJECT TABLE in bytes
            'object_table': [],
            'names': [],
            'index': [],                     # index of top level entities
            # 'object_table': [],
            'symbols': [],                   # Symbol references
            'reloc_table': []}

        self.HEADER_SIZE = len(core['header']) * bits.WSIZE # bytes. 3 = entries, names_size, es_size, ot_size
        vmem = core_vmem.CoreVirtualMemory()
        # base = self.HEADER_SIZE + core['header']['names_size'] + index_size
        vmem.set_base(self.HEADER_SIZE)
        self.core_compiled_module.fill(vmem)

        # -- HEADER and NAMES section
        labels = self.core_compiled_module.entry_labels()
        core['header']['entries'] = len(labels)

        # names :: [(string, alloc-size in bytes, self-ptr)]
        names_list = sorted(set([l + "\0" for l in labels] + [n + "\0" for n in vmem.external_names()]))

        core['names'] = [(name_t, bits.string_block_size(name_t)) for name_t in names_list]

        core['header']['names_size'] = sum([x[1] for x in core['names']])

        index_size = core['header']['entries'] * 2 * bits.WSIZE # *2: pair (name, entry),

        # - OBJECT TABLE
        core['object_table'] = vmem.object_table()

        # - HEADER ot_size
        core['header']['ot_size'] = len(core['object_table'])

        # symbols
        for pair in vmem.symbols_references():
            core['symbols'].append(self.name_ptr_for_name(pair[0], core))
            core['symbols'].append(pair[1])

        core['header']['st_size'] = len(core['symbols']) * bits.WSIZE

        # reloc
        core['reloc_table'] = vmem.reloc_table()

        # - INDEX section
        for name in labels:
            core['index'].append(self.name_ptr_for_name(name, core))  # ptr to string
            core['index'].append(vmem.index_for(name))           # ptr to object

        return core
Beispiel #5
0
    def create_mec_struct(self, vmem):
        mec = {'header':
               {'magic_number': None,
                'ot_size': None,
                'er_size': None,
                'st_size': None,
                'names_size': None},
               'object_table': [],         # the loaded objects of this module
               'names': [],
               'external_references': [],  # references to core objects
               'symbol_table': [],         # Symbol objects needed
               'reloc_table': []           # addresses within the OT that need relocation on load
            }


        self.HEADER_SIZE = len(mec['header']) * bits.WSIZE
        #base = self.HEADER_SIZE + mec['header']['names_size']
        vmem.set_base(self.HEADER_SIZE)
        bench("cmodule.fill", lambda: self.cmodule.fill(vmem))

        mec['header']['magic_number'] = self.MAGIC_NUMBER

        # mec['names'] = [(name_t, bits.string_block_size(name_t)) for name_t in [name + '\0' for name in vmem.external_names()]]

        # labels = self.cmodule.entry_labels()
        names_list = [n + "\0" for n in vmem.external_names()]

        mec['object_table'] = vmem.object_table()

        mec['header']['ot_size'] = len(mec['object_table'])

        mec['names'] = [(name_t, bits.string_block_size(name_t)) for name_t in names_list]
        mec['header']['names_size'] = sum([x[1] for x in mec['names']])

        ext_ref = vmem.external_references()
        for pair in ext_ref:
            mec['external_references'].append(self.name_ptr_for(pair[0], mec))
            mec['external_references'].append(pair[1])

        mec['header']['er_size'] = len(mec['external_references']) * bits.WSIZE

        sym_ref = vmem.symbols_references()
        for pair in sym_ref:
            mec['symbol_table'].append(self.name_ptr_for(pair[0], mec))
            mec['symbol_table'].append(pair[1])

        mec['header']['st_size'] = len(mec['symbol_table']) * bits.WSIZE

        mec['reloc_table'] = vmem.reloc_table()

        return mec
Beispiel #6
0
    def create_mec_struct(self, vmem):
        mec = {'header':
               {'magic_number': None,
                'ot_size': None,
                'er_size': None,
                'st_size': None,
                'names_size': None,
                'cfun_addr': None},
               'names': [],
               'object_table': [],
               'external_references': [],
               'symbol_table': [],
               'reloc_table': []
            }


        self.HEADER_SIZE = len(mec['header']) * bits.WSIZE
        self.cmod.fill(vmem)

        mec['header']['magic_number'] = self.MAGIC_NUMBER

        names_list = set([n + "\0" for n in vmem.external_names()])

        mec['names'] = [(name_t, bits.string_block_size(name_t)) for name_t in names_list]
        mec['header']['names_size'] = sum([x[1] for x in mec['names']])

        base = self.HEADER_SIZE + mec['header']['names_size']
        vmem.set_base(base)

        mec['object_table'] = vmem.object_table()
        mec['header']['ot_size'] = len(mec['object_table'])

        for pair in vmem.external_references():
            mec['external_references'].append(self.name_ptr_for(pair[0], mec))
            mec['external_references'].append(pair[1])

        mec['header']['er_size'] = len(mec['external_references']) * bits.WSIZE

        for pair in vmem.symbols_references():
            mec['symbol_table'].append(self.name_ptr_for(pair[0], mec))
            mec['symbol_table'].append(pair[1])

        mec['header']['st_size'] = len(mec['symbol_table']) * bits.WSIZE

        mec['reloc_table'] = vmem.reloc_table()

        mec['header']['cfun_addr'] = vmem.physical_address(self.cfun.oop)
        return mec
Beispiel #7
0
    def append_string_instance(self, string):
        if string in self.string_table:
            return self.string_table[string]
        else:
            delegate = self.append_object_instance()

            self.append_int(pyutils.FRAME_TYPE_BVAR_OBJECT)
            self.append_int((3 * bits.WSIZE) + bits.string_block_size(string + "\0"))

            oop = self.append_external_ref('String')
            self.append_pointer_to(delegate)        # delegate
            self.append_int(len(string))
            self.append_string(string)

            self.string_table[string] = oop
            return oop
Beispiel #8
0
    def append_symbol_instance(self, string):
        # We only need a dummy/word-sized placeholder here.
        # (actually, not event this. We only need to return a dummy cell. All we need
        #  its the PointerCell's pointing to our dummy to construct the symbols_reference())
        # In any case, the full data is only used by dump to display the text of the symbol
        delegate = self.append_object_instance() # Assumed to be object! if source change, this breaks

        self.append_int(pyutils.FRAME_TYPE_BVAR_OBJECT)
        self.append_int((3 * bits.WSIZE) + bits.string_block_size(string + "\0"))

        oop = self.append_label_ref(utils.class_label('Symbol'))   # vt
        self.append_pointer_to(delegate)                           # delegate
        self.append_int(len(string))
        self.append_string(string)

        self.symb_table[oop] = string
        return oop
Beispiel #9
0
    def append_string_instance(self, string):
        if string in self.string_table:
            return self.string_table[string]
        else:
            delegate = self.append_object_instance()

            self.append_int(pyutils.FRAME_TYPE_BVAR_OBJECT)
            self.append_int((3 * bits.WSIZE) +
                            bits.string_block_size(string + "\0"))

            oop = self.append_external_ref('String')
            self.append_pointer_to(delegate)  # delegate
            self.append_int(len(string))
            self.append_string(string)

            self.string_table[string] = oop
            return oop
Beispiel #10
0
    def append_string_instance(self, string):
        if string in self.string_table:
            return self.string_table[string]
        else:
            delegate = self.append_object_instance(
            )  # Assumed to be object! if source change, this breaks

            self.append_int(pyutils.FRAME_TYPE_BVAR_OBJECT)
            self.append_int((3 * bits.WSIZE) +
                            bits.string_block_size(string + "\0"))

            oop = self.append_label_ref(utils.class_label('String'))  # vt
            self.append_pointer_to(delegate)  # delegate
            self.append_int(len(string))
            self.append_string(string)

            self.string_table[string] = oop
            return oop
Beispiel #11
0
    def append_symbol_instance(self, string):
        # We only need a dummy/word-sized placeholder here.
        # (actually, not event this. We only need to return a dummy cell. All we need
        #  its the PointerCell's pointing to our dummy to construct the symbols_reference())
        # In any case, the full data is only used by dump to display the text of the symbol
        delegate = self.append_object_instance(
        )  # Assumed to be object! if source change, this breaks

        self.append_int(pyutils.FRAME_TYPE_BVAR_OBJECT)
        self.append_int((3 * bits.WSIZE) +
                        bits.string_block_size(string + "\0"))

        oop = self.append_label_ref(utils.class_label('Symbol'))  # vt
        self.append_pointer_to(delegate)  # delegate
        self.append_int(len(string))
        self.append_string(string)

        self.symb_table[oop] = string
        return oop