Exemple #1
0
 def listattr(self):
     listing = space.Object.listattr(self)
     listing.append(space.String(u"doc"))
     listing.append(space.String(u"loc"))
     listing.append(space.String(u"spec"))
     listing.append(space.String(u"code"))
     return listing
Exemple #2
0
 def getattr(self, name):
     if name == u"doc":
         return self.doc
     elif name == u"loc":
         source, start, stop = self.source_location
         obj = space.Exnihilo()
         obj.setattr(u"source", space.String(source))
         obj.setattr(u"start", space.Integer(start))
         obj.setattr(u"stop", space.Integer(stop))
         return obj
     elif name == u"spec":
         argc, optional, variadic, varnames, argtypes = self.spec
         varnames = [
             space.String(name.decode('utf-8')) for name in varnames
         ]
         spec = space.Exnihilo()
         spec.setattr(u'argc', space.Integer(rffi.r_long(argc)))
         spec.setattr(u'optional', space.Integer(rffi.r_long(optional)))
         spec.setattr(u'is_variadic', space.boolean(variadic))
         spec.setattr(u'varnames', space.List(list(varnames)))
         if argtypes is not None:
             spec.setattr(u'argtypes', space.List(list(argtypes)))
         else:
             spec.setattr(u'argtypes', space.null)
         return spec
     else:
         return Object.getattr(self, name)
Exemple #3
0
 def getattr(self, name):
     if name == u"name":
         return space.String(err_name.decode('utf-8'))
     elif name == u"strerror":
         return space.String(
             rffi.charp2str(uv.strerror(errno)).decode('utf-8'))
     else:
         return space.LException.getattr(self, name)
Exemple #4
0
 def setattr(self, name, value):
     custom_interface = jit.promote(self.custom_interface)
     method = custom_interface.lookup_method(u"+setattr")
     if method is None:
         return self.setattr_direct(name, value)
     else:
         return method.call([Id(self), space.String(name), value])
Exemple #5
0
def from_file(path):
    stream = bincode.decoder.open_file(path)
    assert stream.read(8) == bincode.common.header
    functions = []
    for i in range(stream.read_u16()):
        flags = stream.read_u16()
        regc = stream.read_u16()
        argc = stream.read_u16()
        localc = stream.read_u16()
        blocklen = stream.read_u16()
        block = lltype.malloc(u16_array, blocklen)
        for i in range(blocklen):
            block[i] = rffi.r_ushort(stream.read_u16())
        functions.append(Function(flags, regc, argc, localc, block))
    constants = []
    for i in range(stream.read_u16()):
        klass = stream.read_ubyte()
        if klass == 1:
            constants.append(space.String(stream.read_string()))
        elif klass == 2:
            constants.append(space.Integer(rffi.r_long(stream.read_u64())))
        elif klass == 3:
            constants.append(space.Integer(-rffi.r_long(stream.read_u64())))
        elif klass == 4:
            constants.append(space.Float(stream.read_double()))
        else:
            assert False, klass
    return Program(Unit(constants[:], functions[:]))
Exemple #6
0
 def listattr(self):
     listing = Object.listattr(self)
     for name, cell in self.cells.items():
         if isinstance(cell, ShadowCell) and cell.link is not None:
             continue
         listing.append(space.String(name))
     return listing
Exemple #7
0
def Integer_to_string(integer, base):
    base = 10 if base is None else base.value
    if base >= len(digits):
        raise space.unwind(space.LError(u"not enough digits to represent this base %d" % base))
    if base < 0:
        raise space.unwind(space.LError(u"negative base not supported"))
    return space.String(integer_to_string(integer.value, base))
Exemple #8
0
 def log(self, which, obj):
     entry = space.Exnihilo()
     entry.setattr(u"type", space.String(which))
     entry.setattr(u"value", obj)
     for logger in list(self.loggers):
         if logger.closed:
             self.loggers.remove(logger)
         else:
             logger.append(entry)
     return len(self.loggers)
Exemple #9
0
 def pc_location(self):
     pc = self.pc
     sources = self.sources
     sourcemap = self.sourcemap
     if not isinstance(sourcemap, space.Uint8Data):
         return space.String(u"<no sourcemap>"), 0, 0, -1, -1
     i = 0
     while i < sourcemap.length:
         i, count = dec_vlq(sourcemap, i)
         i, file_id = dec_vlq(sourcemap, i)
         i, col0 = dec_vlq(sourcemap, i)
         i, lno0 = dec_vlq(sourcemap, i)
         i, col1 = dec_vlq(sourcemap, i)
         i, lno1 = dec_vlq(sourcemap, i)
         if pc <= count and file_id < len(sources):
             return sources[file_id], col0, lno0, col1, lno1
         else:
             pc -= count
     return space.String(u"<over sourcemap>"), 0, 0, -1, -1
Exemple #10
0
def decode_string(stream):
    string = u''
    stream.expect(u'"')
    while not stream.shift(u'"'):
        ch = stream.advance()
        if ch == u'\\':
            ch = stream.advance()
            string += escape_ch(ch)
        else:
            string += ch
    return space.String(string)
Exemple #11
0
 def log(self, which, obj):
     entry = space.Exnihilo()
     entry.setattr(u"type", space.String(which))
     entry.setattr(u"value", obj)
     if core.g.ec.get(
     ) is not self.ec:  # TODO: Fix this using 'async' signaling?
         return 0  #  user logs are not getting
         #  cross-thread log messages.
     for logger in list(self.loggers):
         if logger.closed:
             self.loggers.remove(logger)
         else:
             logger.append(entry)
     return len(self.loggers)
Exemple #12
0
def from_object(obj):
    constants_list = obj.getitem(space.String(u"constants"))
    assert isinstance(constants_list, space.List)
    constants = constants_list.contents

    functions = []
    functions_list = obj.getitem(space.String(u"functions"))
    assert isinstance(functions_list, space.List)
    for function_list in functions_list.contents:
        flags = as_i(function_list.getitem(space.Integer(0)))
        regc = as_i(function_list.getitem(space.Integer(1)))
        argc = rffi.r_ulong(as_i(function_list.getitem(space.Integer(2))))
        topc = rffi.r_ulong(as_i(function_list.getitem(space.Integer(3))))
        localc = as_i(function_list.getitem(space.Integer(4)))
        block_list = function_list.getitem(space.Integer(5))
        sourcemap = function_list.getitem(space.Integer(6))
        exc_table = function_list.getitem(space.Integer(7))
        assert isinstance(exc_table, space.List)
        assert isinstance(block_list, space.List)
        block = lltype.malloc(u16_array, len(block_list.contents))
        i = 0
        for n in block_list.contents:
            block[i] = rffi.r_ushort(as_i(n))
            i += 1
        excs = []
        for n in exc_table.contents:
            excs.append(
                Exc(
                    rffi.r_ulong(as_i(n.getitem(space.Integer(0)))),
                    rffi.r_ulong(as_i(n.getitem(space.Integer(1)))),
                    rffi.r_ulong(as_i(n.getitem(space.Integer(2)))),
                    rffi.r_ulong(as_i(n.getitem(space.Integer(3)))),
                ))
        functions.append(
            Function(flags, regc, argc, topc, localc, block, sourcemap,
                     excs[:]))
    return Program(Unit(constants[:], functions[:]))
Exemple #13
0
def normal_startup(argv):
    if len(argv) > 0:
        main_script = argv[0]
    else:
        main_script = pathobj.concat(core.get_ec().lever_path,
                                     pathobj.parse(u"app/main.lc"))
        main_script = space.String(pathobj.os_stringify(main_script))
    module = module_resolution.start(main_script)
    try:
        main_func = module.getattr(u"main")
    except space.Unwinder as unwinder:
        pass  # in this case main_func just isn't in the module.
    else:
        main_func.call([space.List(argv)])
    return space.null
Exemple #14
0
def decode_json(action, ch, ctx):
    if action == 0x1:  # push list
        ctx.ds.append(space.List([]))
    # Push object to ds
    elif action == 0x2:  # push object
        ctx.ds.append(space.Dict())
    elif action == 0x3:  # pop & append
        val = ctx.ds.pop()
        top = ctx.ds[len(ctx.ds) - 1]
        assert isinstance(top, List)  # we can trust this.
        top.contents.append(val)
    elif action == 0x4:  # pop pop & setitem
        val = ctx.ds.pop()
        key = ctx.ds.pop()
        top = ctx.ds[len(ctx.ds) - 1]
        assert isinstance(top, Dict)  # again..
        top.data[key] = val
    elif action == 0x5:  # push null
        ctx.ds.append(space.null)
    elif action == 0x6:  # push true
        ctx.ds.append(space.true)
    elif action == 0x7:  # push false
        ctx.ds.append(space.false)
    elif action == 0x8:  # push string
        val = ctx.ss.build()
        ctx.ds.append(space.String(val))
        ctx.ss = UnicodeBuilder()
        ctx.es = UnicodeBuilder()
    elif action == 0x9:
        val = int(ctx.ss.build().encode('utf-8'))  # push int
        ctx.ds.append(space.Integer(val))
        ctx.ss = UnicodeBuilder()
    elif action == 0xA:
        val = float(ctx.ss.build().encode('utf-8'))  # push float
        ctx.ds.append(space.Float(val))
        ctx.ss = UnicodeBuilder()
    elif action == 0xB:  # push ch to ss
        ctx.ss.append(ch)
    elif action == 0xC:  # push ch to es
        ctx.es.append(ch)
    elif action == 0xD:  # push escape
        ctx.ss.append(unichr(escape_characters[ch]))
    elif action == 0xE:  # push unicode point
        ctx.ss.append(unichr(int(ctx.es.build().encode('utf-8'), 16)))
        ctx.es = UnicodeBuilder()
    else:  # This is very unlikely to happen.
        assert False, "JSON decoder bug"
Exemple #15
0
def Dict_update(self, other):
    if isinstance(other, Dict):
        self.data.update(other.data)
    elif isinstance(other, space.Exnihilo):
        for name in other.map.attribute_indexes:
            self.setitem(space.String(name), other.getattr(name))
    else:
        it = other.iter()
        try:
            while True:
                item = it.callattr(u"next", [])
                key = item.getitem(Integer(0))
                val = item.getitem(Integer(1))
                self.setitem(key, val)
        except StopIteration as stop:
            pass
    return space.null
Exemple #16
0
def instantiate(other):
    dict_ = Dict()
    if other is not None:
        if isinstance(other, Dict):
            dict_.data.update(other.data)
        elif isinstance(other, space.Exnihilo):
            for name in other.map.attribute_indexes:
                dict_.setitem(space.String(name), other.getattr(name))
        else:
            it = other.iter()
            try:
                while True:
                    item = it.callattr(u"next", [])
                    key = item.getitem(Integer(0))
                    val = item.getitem(Integer(1))
                    dict_.setitem(key, val)
            except StopIteration as stop:
                pass
    return dict_
Exemple #17
0
 def other(self, which, obj):
     if self.log(which, obj) == 0:
         std = self.stderr if which != u"info" else self.stdout
         if which == u"info" and isinstance(obj, space.List):
             sep = u''
             out = u""
             for arg in obj.contents:
                 if isinstance(arg, space.String):
                     string = arg.string
                 else:
                     string = arg.repr()
                 out += sep + string
                 sep = u' '
             obj = space.String(out)
         if isinstance(obj, space.String):
             data = obj.string.encode('utf-8') + "\n"
         else:
             data = obj.repr().encode('utf-8') + "\n"
         self.write_message(std, data)
Exemple #18
0
    def entry_point(raw_argv):
        lever_path = os.environ.get('LEVER_PATH')
        if lever_path is None:
            lever_path = pathobj.parse(default_lever_path)
        else:
            lever_path = pathobj.os_parse(lever_path.decode('utf-8'))
        lever_path = pathobj.concat(pathobj.getcwd(), lever_path)

        # This should happen only once.
        uv_loop = uv.default_loop()
        uv_idler = uv.malloc_bytes(uv.idle_ptr, uv.handle_size(uv.IDLE))
        uv.idle_init(uv_loop, uv_idler)

        uv_stdin = initialize_stdio(uv_loop, 0, 1)
        uv_stdout = initialize_stdio(uv_loop, 1, 0)
        uv_stderr = initialize_stdio(uv_loop, 2, 0)

        base.module.setattr_force(u"stdin", uv_stdin)
        base.module.setattr_force(u"stdout", uv_stdout)
        base.module.setattr_force(u"stderr", uv_stderr)
        base.module.setattr_force(u"runtime_path", lever_path)

        ec = core.init_executioncontext(config, lever_path, uv_loop, uv_idler)
        core.g.log = log = uv_logging.Logger(ec, uv_stdout, uv_stderr)
        api.init(lever_path)
        vectormath.init_random()

        argv = [normal_startup]
        for arg in raw_argv[1:]:
            argv.append(space.String(arg.decode('utf-8')))
        core.schedule(argv)

        uv.run(ec.uv_loop, uv.RUN_DEFAULT)

        #uv.loop_close(ec.uv_loop)

        uv.tty_reset_mode()
        log.last_chance_logging()
        return ec.exit_status
Exemple #19
0
def utf8_decoder_call(self, data):
    return space.String(utf8_decoder_operate(self, data.to_str(), False))
Exemple #20
0
def get_config(config, text, default):
    return config.data.get(space.String(text), default)
Exemple #21
0
 def listattr(self):
     listing = space.Object.listattr(self)
     listing.append(space.String(u"doc"))
     listing.append(space.String(u"source_location"))
     listing.append(space.String(u"spec"))
     return listing
Exemple #22
0
def from_object(obj, path):
    if as_i(obj.getitem(space.String(u"version"))) != 0:
        raise space.unwind(space.LError(u"bytecode version=0 required"))

    sources = as_list(obj.getitem(space.String(u"sources")))
    constants = as_list(obj.getitem(space.String(u"constants")))

    functions = []
    for function_list in as_list(obj.getitem(space.String(u"functions"))):
        flags = as_i(function_list.getitem(space.String(u"flags")))
        regc = as_i(function_list.getitem(space.String(u"regc")))
        argc = rffi.r_ulong(as_i(function_list.getitem(space.String(u"argc"))))
        topc = rffi.r_ulong(as_i(function_list.getitem(space.String(u"topc"))))
        localc = as_i(function_list.getitem(space.String(u"localc")))
        block_list = as_u8a(function_list.getitem(space.String(u"code")))
        sourcemap = function_list.getitem(space.String(u"sourcemap"))
        exc_table = as_list(function_list.getitem(space.String(u"exceptions")))
        block = [
            getindex_u16(block_list, i) for i in range(block_list.length / 2)
        ]
        #block = lltype.malloc(u16_array, block_list.length/2)
        #for i in range(block_list.length/2):
        #    a = rffi.r_long(block_list.uint8data[i*2+0])
        #    b = rffi.r_long(block_list.uint8data[i*2+1])
        #    block[i] = rffi.r_ushort((a << 8) | b)
        excs = [
            Exc(rffi.r_ulong(as_i(n.getitem(space.Integer(0)))),
                rffi.r_ulong(as_i(n.getitem(space.Integer(1)))),
                rffi.r_ulong(as_i(n.getitem(space.Integer(2)))),
                rffi.r_ulong(as_i(n.getitem(space.Integer(3)))))
            for n in exc_table
        ]
        #excs = []
        #for n in exc_table:
        #    excs.append()
        varnames = space.null  # TODO: #function_list.getitem(space.String(u"varnames"))
        functions.append(
            Function(flags, regc, argc, topc, localc, block, sourcemap,
                     excs[:], varnames))
    return Program(Unit(constants[:], functions[:], sources[:], path))
Exemple #23
0
 def listattr(self):
     listing = []
     for name in self.__class__.interface.methods.keys():
         listing.append(space.String(name))
     return listing
Exemple #24
0
 def listattr(self):
     listing = []
     listing.append(space.String(u"doc"))
     for methodname in self.methods.keys():
         listing.append(space.String(methodname))
     return listing
Exemple #25
0
def write_string(obj, config):
    return space.String(configured_stringify(obj, config))
Exemple #26
0
def Utf8Decoder_finish(self):
    return space.String(utf8_decoder_operate(self, '', True))
Exemple #27
0
 def listattr(self):
     listing = Object.listattr(self)
     listing.append(space.String(u"link"))
     listing.append(space.String(u"name"))
     listing.append(space.String(u"parent"))
     return listing
Exemple #28
0
 def listattr(self):
     listing = Object.listattr(self)
     for name in self.cells:
         listing.append(space.String(name))
     return listing
Exemple #29
0
def Float_to_string(self):
    return space.String(float_to_string(self.number))
Exemple #30
0
 def listattr(self):
     listing = Object.listattr(self)
     for name in self.map.attribute_indexes:
         listing.append(space.String(name))
     return listing