Пример #1
0
 def emit_assignment(self, target, value):
     """Emit an assignment of a value to the given target."""
     assert isinstance(target, jsval.Variable)
     self.emit(target.varname)
     self.emit("=")
     if jsval.istype(target, jsval.Double):
         if not jsval.istype(value, jsval.Double):
             self.emit("+")
     self.emit("(")
     self.emit_value(value)
     self.emit(")")
     if jsval.istype(target, jsval.Int):
         if not jsval.istype(value, jsval.Int):
             self.emit("|0")
     self.emit(";\n")
Пример #2
0
 def emit_assignment(self, target, value):
     """Emit an assignment of a value to the given target."""
     assert isinstance(target, jsval.Variable)
     self.emit(target.varname)
     self.emit("=")
     if jsval.istype(target, jsval.Double):
         if not jsval.istype(value, jsval.Double):
             self.emit("+")
     self.emit("(")
     self.emit_value(value)
     self.emit(")")
     if jsval.istype(target, jsval.Int):
         if not jsval.istype(value, jsval.Int):
             self.emit("|0")
     self.emit(";\n")
Пример #3
0
    def emit_load(self, target, addr, typ):
        """Emit a typed load operation from the heap into a target.

        Given a result-storing target, a heap address, and an optional heap
        type, this method generates a generic "load from heap" instruction of
        the following form:

            target = HEAPVIEW[(addr) >> shift];

        """
        assert isinstance(addr, jsval.AbstractValue)
        # When running untranslated, we can't guarantee alignment of doubles.
        # Read it as two 32bit ints into a properly aligned chunk.
        if not we_are_translated() and typ is jsval.Float64:
            tempaddr = self.allocate_intvar()
            self.emit_assignment(tempaddr, addr)
            addr = jsval.tempDoublePtr
            pt1 = jsval.HeapData(jsval.Int32, tempaddr)
            self.emit_store(pt1, addr, jsval.Int32)
            pt2 = jsval.HeapData(jsval.Int32, jsval.Plus(tempaddr, jsval.word))
            self.emit_store(pt2, jsval.Plus(addr, jsval.word), jsval.Int32)
            self.free_intvar(tempaddr)
        # Now we can do the actual load.
        assert isinstance(target, jsval.Variable)
        self.emit(target.varname)
        self.emit("=")
        if jsval.istype(target, jsval.Double):
            self.emit("+")
        self.emit("(")
        self.emit(typ.heap_name)
        self.emit("[(")
        self.emit_value(addr)
        self.emit(")>>")
        self.emit(str(typ.shift))
        self.emit("])")
        if jsval.istype(target, jsval.Int):
            self.emit("|0")
        self.emit(";\n")
Пример #4
0
    def emit_load(self, target, addr, typ):
        """Emit a typed load operation from the heap into a target.

        Given a result-storing target, a heap address, and an optional heap
        type, this method generates a generic "load from heap" instruction of
        the following form:

            target = HEAPVIEW[(addr) >> shift];

        """
        assert isinstance(addr, jsval.AbstractValue)
        # When running untranslated, we can't guarantee alignment of doubles.
        # Read it as two 32bit ints into a properly aligned chunk.
        if not we_are_translated() and typ is jsval.Float64:
            tempaddr = self.allocate_intvar()
            self.emit_assignment(tempaddr, addr)
            addr = jsval.tempDoublePtr
            pt1 = jsval.HeapData(jsval.Int32, tempaddr)
            self.emit_store(pt1, addr, jsval.Int32)
            pt2 = jsval.HeapData(jsval.Int32, jsval.Plus(tempaddr, jsval.word))
            self.emit_store(pt2, jsval.Plus(addr, jsval.word), jsval.Int32)
            self.free_intvar(tempaddr)
        # Now we can do the actual load.
        assert isinstance(target, jsval.Variable)
        self.emit(target.varname)
        self.emit("=")
        if jsval.istype(target, jsval.Double):
            self.emit("+")
        self.emit("(")
        self.emit(typ.heap_name)
        self.emit("[(")
        self.emit_value(addr)
        self.emit(")>>")
        self.emit(str(typ.shift))
        self.emit("])")
        if jsval.istype(target, jsval.Int):
            self.emit("|0")
        self.emit(";\n")
Пример #5
0
 def __init__(self, bldr, value):
     self.bldr = bldr
     if not jsval.istype(value, jsval.Signed):
         value = jsval.SignedCast(value)
     self.value = value
Пример #6
0
 def __init__(self, bldr, test, label=""):
     self.bldr = bldr
     if not jsval.istype(test, jsval.Int):
         test = jsval.IntCast(test)
     self.test = test
     self.label = label
Пример #7
0
 def __init__(self, bldr, value):
     self.bldr = bldr
     if not jsval.istype(value, jsval.Signed):
         value = jsval.SignedCast(value)
     self.value = value
Пример #8
0
 def __init__(self, bldr, test, label=""):
     self.bldr = bldr
     if not jsval.istype(test, jsval.Int):
         test = jsval.IntCast(test)
     self.test = test
     self.label = label