Showing with 20 additions and 25 deletions.
  1. +6 −2 typhon/objects/printers.py
  2. +14 −23 typhon/objects/refs.py
@@ -19,7 +19,7 @@
from typhon.errors import Refused, UserException
from typhon.objects.constants import NullObject
from typhon.objects.data import CharObject, StrObject, unwrapStr
from typhon.objects.refs import resolution
from typhon.objects.refs import Promise, resolution
from typhon.objects.root import Object

INDENT_1 = getAtom(u"indent", 1)
@@ -94,7 +94,11 @@ def recv(self, atom, args):
raise Refused(self, atom, args)

def objPrint(self, item):
if item in self.context:
item = resolution(item)
if isinstance(item, Promise):
self.ub.append(u"<promise>")
return
elif item in self.context:
self.ub.append(u"<**CYCLE**>")
return
self.context[item] = None
@@ -406,11 +406,6 @@ class Promise(Object):

def recv(self, atom, args):
from typhon.objects.collections.maps import EMPTY_MAP
if atom is _PRINTON_1:
out = args[0]
self.printOn(out)
return NullObject

if atom is _WHENMORERESOLVED_1:
return self._whenMoreResolved(args[0])

@@ -425,8 +420,6 @@ def _whenMoreResolved(self, callback):
vat.sendOnly(callback, RUN_1, [self], EMPTY_MAP)
return NullObject

# Synchronous calls.

# Eventual sends.

def send(self, atom, args, namedArgs):
@@ -470,12 +463,14 @@ class SwitchableRef(Promise):
def __init__(self, target):
self._target = target

def printOn(self, printer):
def toString(self):
if self.isSwitchable:
printer.call(u"print", [StrObject(u"<Promise>")])
# NB: This should be an exceptional state, but some stuff in our
# stack can't handle it yet. ~ C.
return u"<unsafely-printed promise>"
else:
self.resolutionRef()
self._target.printOn(printer)
return self._target.toString()

def callAll(self, atom, args, namedArgs):
if self.isSwitchable:
@@ -548,8 +543,8 @@ def __init__(self, buf):
# Note to self: Weakref.
self._buf = weakref.ref(buf)

def printOn(self, out):
out.call(u"print", [StrObject(u"<bufferingRef>")])
def toString(self):
return u"<bufferingRef>"

def callAll(self, atom, args, namedArgs):
raise userError(u"not synchronously callable (%s)" %
@@ -594,8 +589,8 @@ def __init__(self, target, vat):
self.target = target
self.vat = vat

def printOn(self, out):
out.call(u"print", [self.target])
def toString(self):
return self.target.toString()

def hash(self):
return self.target.hash()
@@ -666,12 +661,9 @@ def __init__(self, target, targetVat, originVat):
self.targetVat = targetVat
self.originVat = originVat

def printOn(self, out):
out.call(u"print", [StrObject(u"<farref from vat ")])
out.call(u"print", [StrObject(self.originVat.name)])
out.call(u"print", [StrObject(u" into vat ")])
out.call(u"print", [StrObject(self.targetVat.name)])
out.call(u"print", [StrObject(u">")])
def toString(self):
return u"<farRef from vat %s into vat %s>" % (
self.originVat.name, self.targetVat.name)

def hash(self):
# XXX shouldn't this simply be unhashable?
@@ -726,9 +718,8 @@ def __init__(self, problem):
assert isinstance(problem, Object)
self._problem = problem

def printOn(self, out):
out.call(u"print", [StrObject(u"<ref broken by " +
self._problem.toString() + u">")])
def toString(self):
return u"<ref broken by %s>" % self._problem.toString()

def callAll(self, atom, args, namedArgs):
self._doBreakage(atom, args, namedArgs)