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")
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")
def __init__(self, bldr, value): self.bldr = bldr if not jsval.istype(value, jsval.Signed): value = jsval.SignedCast(value) self.value = value
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