1.1 --- a/rsvp.py Mon Jan 26 01:25:30 2009 +0100
1.2 +++ b/rsvp.py Mon Feb 02 01:34:35 2009 +0100
1.3 @@ -52,6 +52,8 @@
1.4 current callable
1.5 """
1.6
1.7 +from micropython.common import DataObject # for creating "nice" new objects
1.8 +
1.9 class IllegalInstruction(Exception):
1.10 pass
1.11
1.12 @@ -114,7 +116,8 @@
1.13
1.14 # Native class constants.
1.15
1.16 - self.int_class = objlist.access("__builtins__", "int").value.location
1.17 + cls = objlist.access("__builtins__", "int")
1.18 + self.int_class = cls and cls.value.location
1.19
1.20 # Debugging methods.
1.21
1.22 @@ -342,8 +345,8 @@
1.23
1.24 def LoadAttrIndex(self):
1.25 context, ref = self.value
1.26 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.27 - element = self.objlist[classcode + self.operand]
1.28 + data = self.load(ref)
1.29 + element = self.objlist[data.classcode + self.operand]
1.30 attr_index, class_attr, replace_context, offset = element
1.31 if attr_index == self.operand:
1.32 if class_attr:
1.33 @@ -359,8 +362,8 @@
1.34
1.35 def StoreAttrIndex(self):
1.36 context, ref = self.value
1.37 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.38 - element = self.objlist[classcode + self.operand]
1.39 + data = self.load(ref)
1.40 + element = self.objlist[data.classcode + self.operand]
1.41 attr_index, class_attr, replace_context, offset = element
1.42 if attr_index == self.operand:
1.43 if class_attr:
1.44 @@ -390,8 +393,8 @@
1.45
1.46 def StoreFrameIndex(self):
1.47 frame = self.invocation_sp_stack[-1] # different from the current frame after MakeFrame
1.48 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.49 - element = self.objlist[classcode + self.operand]
1.50 + data = self.load(ref)
1.51 + element = self.objlist[data.classcode + self.operand]
1.52 attr_index, offset = element
1.53 if attr_index == self.operand:
1.54 self.frame_stack[frame + offset] = self.value
1.55 @@ -400,14 +403,14 @@
1.56
1.57 def LoadCallable(self):
1.58 context, ref = self.value
1.59 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.60 - self.callable = codeaddr, codedetails
1.61 + data = self.load(ref)
1.62 + self.callable = data.codeaddr, data.codedetails
1.63
1.64 def StoreCallable(self):
1.65 context, ref = self.value
1.66 # NOTE: Should improve the representation and permit direct saving.
1.67 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.68 - self.save(ref, (classcode, attrcode) + self.callable + (instance,))
1.69 + data = self.load(ref)
1.70 + self.save(ref, (data.classcode, data.attrcode) + self.callable + (data.instance,))
1.71
1.72 def LoadContext(self):
1.73 context, ref = self.value
1.74 @@ -417,7 +420,7 @@
1.75 operand = self.operand
1.76 frame = self.invocation_sp_stack[-1]
1.77 context, ref = self.value
1.78 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.79 + data = self.load(ref)
1.80
1.81 # Support sliding of the frame to exclude any inappropriate context.
1.82
1.83 @@ -425,12 +428,12 @@
1.84 self.invocation_sp_stack[-1] += 1
1.85 operand -= 1
1.86 else:
1.87 - context_classcode, context_attrcode, context_codeaddr, context_codedetails, context_instance = self.load(context)
1.88 - if not context_instance:
1.89 + context_data = self.load(context)
1.90 + if not context_data.instance:
1.91 self.invocation_sp_stack[-1] += 1
1.92 operand -= 1
1.93
1.94 - nargs, ndefaults = codedetails
1.95 + nargs, ndefaults = data.codedetails
1.96 if not (nargs - ndefaults <= operand <= nargs):
1.97 raise Exception, "CheckFrame %r" % (nargs - ndefaults, self.operand, nargs)
1.98
1.99 @@ -519,20 +522,20 @@
1.100 # Common implementation details.
1.101
1.102 def _CheckInstance(self, ref, cls):
1.103 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.104 - target_classcode, target_attrcode, target_codeaddr, target_codedetails, target_instance = self.load(cls)
1.105 + data = self.load(ref)
1.106 + target_data = self.load(cls)
1.107
1.108 # Find the table entry for the descendant.
1.109
1.110 - element = self.objlist[target_classcode + attrcode]
1.111 + element = self.objlist[target_data.classcode + data.attrcode]
1.112 attr_index, class_attr, replace_context, offset = element
1.113 - return attr_index == attrcode
1.114 + return attr_index == data.attrcode
1.115
1.116 def _MakeObject(self, size, ref):
1.117 - classcode, attrcode, codeaddr, codedetails, instance = self.load(ref)
1.118 + data = self.load(ref)
1.119 addr = self.new(size)
1.120 # Set the header to resemble the class.
1.121 - self.save(addr, (classcode, attrcode, None, None, 1)) # NOTE: __call__ method not yet provided.
1.122 + self.save(addr, DataObject(data.classcode, data.attrcode, None, None, 1, data.name)) # NOTE: __call__ method not yet provided.
1.123 return addr
1.124
1.125 # Native function implementations.