1.1 --- a/micropython/data.py Sat Oct 10 01:52:27 2009 +0200
1.2 +++ b/micropython/data.py Sat Oct 10 03:09:29 2009 +0200
1.3 @@ -44,7 +44,7 @@
1.4 where each such object is defined.
1.5 """
1.6
1.7 -from micropython.program import DataObject, ReplaceableContext, PlaceholderContext
1.8 +from micropython.program import DataObject, DataValue, ReplaceableContext, PlaceholderContext
1.9
1.10 def shortrepr(obj):
1.11 if obj is None:
1.12 @@ -433,7 +433,7 @@
1.13
1.14 def as_raw(self, objtable, paramtable):
1.15 return [
1.16 - (
1.17 + DataValue(
1.18 self.get_context() and self.get_context().location,
1.19 self.get_value() and self.get_value().location
1.20 )
2.1 --- a/micropython/program.py Sat Oct 10 01:52:27 2009 +0200
2.2 +++ b/micropython/program.py Sat Oct 10 03:09:29 2009 +0200
2.3 @@ -36,6 +36,19 @@
2.4 item.location = location + i
2.5 return self.code
2.6
2.7 +class DataValue:
2.8 +
2.9 + "A representation of a raw program value."
2.10 +
2.11 + def __init__(self, context, ref):
2.12 + self.context = context
2.13 + self.ref = ref
2.14 +
2.15 + def __repr__(self):
2.16 + return "%r, %r" % (
2.17 + self.context, self.ref
2.18 + )
2.19 +
2.20 class DataObject:
2.21
2.22 "A representation of a raw program data object."
3.1 --- a/rsvp.py Sat Oct 10 01:52:27 2009 +0200
3.2 +++ b/rsvp.py Sat Oct 10 03:09:29 2009 +0200
3.3 @@ -52,7 +52,7 @@
3.4 current callable
3.5 """
3.6
3.7 -from micropython.program import ReplaceableContext, PlaceholderContext, FragmentObject
3.8 +from micropython.program import DataValue, ReplaceableContext, PlaceholderContext, FragmentObject
3.9 from rsvplib import Library
3.10
3.11 class IllegalInstruction(Exception):
3.12 @@ -281,10 +281,10 @@
3.13 # NOTE: Assumptions about headers and content made.
3.14
3.15 attr_location = module.location + 1 + attr.position
3.16 - context, ref = self.load(attr_location)
3.17 + value = self.load(attr_location)
3.18
3.19 - if ref is not None:
3.20 - content = self.load(ref + 1)
3.21 + if value is not None:
3.22 + content = self.load(value.ref + 1)
3.23 print label, expected, content
3.24 success = success and (int(expected) == content)
3.25 else:
3.26 @@ -380,13 +380,13 @@
3.27 # Instructions.
3.28
3.29 def LoadConst(self):
3.30 - self.value = self.operand, self.operand
3.31 + self.value = DataValue(self.operand, self.operand)
3.32
3.33 def LoadClass(self):
3.34 - self.value = PlaceholderContext, self.operand
3.35 + self.value = DataValue(PlaceholderContext, self.operand)
3.36
3.37 def LoadFunction(self):
3.38 - self.value = ReplaceableContext, self.operand
3.39 + self.value = DataValue(ReplaceableContext, self.operand)
3.40
3.41 def LoadName(self):
3.42 frame = self.local_sp_stack[-1]
3.43 @@ -407,14 +407,14 @@
3.44 self.value = self.load(self.operand)
3.45
3.46 def LoadAddressContext(self):
3.47 - context, ref = self.load(self.operand)
3.48 - inst_context, inst_ref = self.value
3.49 - self.value = inst_ref, ref
3.50 + value = self.load(self.operand)
3.51 + inst_value = self.value
3.52 + self.value = DataValue(inst_value.ref, value.ref)
3.53
3.54 def LoadAddressContextCond(self):
3.55 - context, ref = self.load(self.operand)
3.56 - inst_context, inst_ref = self.value
3.57 - self.value = self._LoadAddressContextCond(context, ref, inst_ref)
3.58 + value = self.load(self.operand)
3.59 + inst_value = self.value
3.60 + self.value = self._LoadAddressContextCond(value.context, value.ref, inst_value.ref)
3.61
3.62 def StoreAddress(self):
3.63 # Preserve context.
3.64 @@ -422,43 +422,43 @@
3.65
3.66 def StoreAddressContext(self):
3.67 # Overwrite context if null.
3.68 - context_context, context_ref = self.value
3.69 - source_context, source_ref = self.source
3.70 - if source_context is ReplaceableContext:
3.71 - context = context_ref
3.72 + context_value = self.value
3.73 + source_value = self.source
3.74 + if source_value.context is ReplaceableContext:
3.75 + context = context_value.ref
3.76 else:
3.77 - context = source_context
3.78 - self.save(self.operand, (context, source_ref))
3.79 + context = source_value.context
3.80 + self.save(self.operand, DataValue(context, source_value.ref))
3.81
3.82 def MakeInstance(self):
3.83 size = self.operand
3.84 - context, ref = self.value
3.85 + value = self.value
3.86 # NOTE: Referencing the instance template.
3.87 - addr = self._MakeObject(size, ref - 1)
3.88 + addr = self._MakeObject(size, value.ref - 1)
3.89 # Introduce object as context for the new object.
3.90 - self.value = addr, addr
3.91 + self.value = DataValue(addr, addr)
3.92
3.93 def MakeFragment(self):
3.94 size = self.operand
3.95 addr = self._MakeFragment(size)
3.96 # NOTE: Context is not relevant for fragments.
3.97 - self.value = None, addr
3.98 + self.value = DataValue(None, addr)
3.99
3.100 def LoadAttr(self):
3.101 - context, ref = self.value
3.102 + value = self.value
3.103 # Retrieved context should already be appropriate for the instance.
3.104 # NOTE: Adding 1 to skip any header.
3.105 - self.value = self.load(ref + self.operand + 1)
3.106 + self.value = self.load(value.ref + self.operand + 1)
3.107
3.108 def StoreAttr(self):
3.109 - context, ref = self.value
3.110 + value = self.value
3.111 # Target should already be an instance.
3.112 # NOTE: Adding 1 to skip any header.
3.113 - self.save(ref + self.operand + 1, self.source)
3.114 + self.save(value.ref + self.operand + 1, self.source)
3.115
3.116 def LoadAttrIndex(self):
3.117 - context, ref = self.value
3.118 - data = self.load(ref)
3.119 + value = self.value
3.120 + data = self.load(value.ref)
3.121 element = self.objlist[data.classcode + self.operand]
3.122
3.123 if element is not None:
3.124 @@ -467,7 +467,7 @@
3.125 if static_attr:
3.126 self.value = self.load(offset) # offset is address of class/module attribute
3.127 else:
3.128 - self.value = self.load(ref + offset)
3.129 + self.value = self.load(value.ref + offset)
3.130 return
3.131
3.132 self.exception = self._MakeObject(2, self.attr_error_instance)
3.133 @@ -476,29 +476,29 @@
3.134 # LoadAttrIndexContext not defined.
3.135
3.136 def LoadAttrIndexContextCond(self):
3.137 - inst_context, inst_ref = self.value
3.138 - data = self.load(inst_ref)
3.139 + inst_value = self.value
3.140 + data = self.load(inst_value.ref)
3.141 element = self.objlist[data.classcode + self.operand]
3.142
3.143 if element is not None:
3.144 attr_index, static_attr, offset = element
3.145 if attr_index == self.operand:
3.146 if static_attr:
3.147 - loaded_context, loaded_ref = self.load(offset) # offset is address of class/module attribute
3.148 + loaded_value = self.load(offset) # offset is address of class/module attribute
3.149 if data.attrcode is None: # absent attrcode == class/module
3.150 - self.value = loaded_context, loaded_ref
3.151 + self.value = loaded_value
3.152 else:
3.153 - self.value = self._LoadAddressContextCond(loaded_context, loaded_ref, inst_ref)
3.154 + self.value = self._LoadAddressContextCond(loaded_value.context, loaded_value.ref, inst_value.ref)
3.155 else:
3.156 - self.value = self.load(inst_ref + offset)
3.157 + self.value = self.load(inst_value.ref + offset)
3.158 return
3.159
3.160 self.exception = self._MakeObject(2, self.attr_error_instance)
3.161 return self.RaiseException()
3.162
3.163 def StoreAttrIndex(self):
3.164 - context, ref = self.value
3.165 - data = self.load(ref)
3.166 + value = self.value
3.167 + data = self.load(value.ref)
3.168 element = self.objlist[data.classcode + self.operand]
3.169
3.170 if element is not None:
3.171 @@ -508,7 +508,7 @@
3.172 self.exception = self._MakeObject(2, self.type_error_instance)
3.173 return self.RaiseException()
3.174 else:
3.175 - self.save(ref + offset, self.source)
3.176 + self.save(value.ref + offset, self.source)
3.177 return
3.178
3.179 self.exception = self._MakeObject(2, self.attr_error_instance)
3.180 @@ -530,9 +530,9 @@
3.181 self.frame_stack[frame + self.operand] = self.value
3.182
3.183 def StoreFrameIndex(self):
3.184 - context, ref = self.value
3.185 + value = self.value
3.186 frame = self.invocation_sp_stack[-1] # different from the current frame after MakeFrame
3.187 - data = self.load(ref)
3.188 + data = self.load(value.ref)
3.189 element = self.paramlist[data.funccode + self.operand]
3.190
3.191 if element is not None:
3.192 @@ -546,32 +546,32 @@
3.193 return self.RaiseException()
3.194
3.195 def LoadCallable(self):
3.196 - context, ref = self.value
3.197 - data = self.load(ref)
3.198 + value = self.value
3.199 + data = self.load(value.ref)
3.200 self.callable = data.codeaddr
3.201
3.202 def StoreCallable(self):
3.203 - context, ref = self.value
3.204 + value = self.value
3.205 # NOTE: Should improve the representation and permit direct saving.
3.206 - data = self.load(ref)
3.207 - self.save(ref, data.with_callable(self.callable))
3.208 + data = self.load(value.ref)
3.209 + self.save(value.ref, data.with_callable(self.callable))
3.210
3.211 def LoadContext(self):
3.212 - context, ref = self.value
3.213 + value = self.value
3.214 # NOTE: Omission of the context of the context would make things like
3.215 # NOTE: self() inside methods impossible.
3.216 - self.value = context, context
3.217 + self.value = DataValue(value.context, value.context)
3.218
3.219 def CheckContext(self):
3.220 - self.status = self.value[1] is not ReplaceableContext
3.221 + self.status = self.value.ref is not ReplaceableContext
3.222
3.223 def CheckClass(self):
3.224 - context, ref = self.value
3.225 - if ref in (ReplaceableContext, PlaceholderContext):
3.226 + value = self.value
3.227 + if value.ref in (ReplaceableContext, PlaceholderContext):
3.228 self.status = 0
3.229 return
3.230
3.231 - data = self.load(ref)
3.232 + data = self.load(value.ref)
3.233
3.234 # Classes are not themselves usable as the self argument.
3.235 # NOTE: This may change at some point.
3.236 @@ -609,7 +609,7 @@
3.237 self.frame_stack.extend([None]) # ExtendFrame(1)
3.238
3.239 def FillDefaults(self):
3.240 - context, ref = self.value
3.241 + value = self.value
3.242 (nargs, ndefaults) = self.operand
3.243
3.244 # The frame is actually installed as the locals.
3.245 @@ -625,7 +625,7 @@
3.246 pos = nlocals
3.247
3.248 while pos < nargs:
3.249 - self.frame_stack[frame + pos] = self.load(ref + default + 1) # skip header
3.250 + self.frame_stack[frame + pos] = self.load(value.ref + default + 1) # skip header
3.251 default += 1
3.252 pos += 1
3.253
3.254 @@ -649,15 +649,15 @@
3.255 extra += 1
3.256 pos += 1
3.257
3.258 - self.value = ref, ref
3.259 + self.value = DataValue(ref, ref)
3.260
3.261 def CheckSelf(self):
3.262 - context, ref = self.value
3.263 - context_context, context_ref = self.source
3.264 + value = self.value
3.265 + context_value = self.source
3.266
3.267 # Check the details of the proposed context and the target's context.
3.268
3.269 - self.status = self._CheckInstance(ref, context_ref)
3.270 + self.status = self._CheckInstance(value.ref, context_value.ref)
3.271
3.272 def JumpInFrame(self):
3.273 codeaddr = self.callable
3.274 @@ -700,10 +700,10 @@
3.275 return self.operand
3.276
3.277 def LoadException(self):
3.278 - self.value = self.exception, self.exception
3.279 + self.value = DataValue(self.exception, self.exception)
3.280
3.281 def StoreException(self):
3.282 - self.exception = self.value[1]
3.283 + self.exception = self.value.ref
3.284
3.285 def ClearException(self):
3.286 self.exception = None
3.287 @@ -729,13 +729,13 @@
3.288 self.handler_stack.pop()
3.289
3.290 def CheckException(self):
3.291 - self.status = self.exception is not None and self._CheckInstance(self.exception, self.value[1])
3.292 + self.status = self.exception is not None and self._CheckInstance(self.exception, self.value.ref)
3.293
3.294 def TestIdentity(self):
3.295 - self.status = self.value[1] == self.source[1]
3.296 + self.status = self.value.ref == self.source.ref
3.297
3.298 def TestIdentityAddress(self):
3.299 - self.status = self.value[1] == self.operand
3.300 + self.status = self.value.ref == self.operand
3.301
3.302 # LoadBoolean is implemented in the generated code.
3.303 # StoreBoolean is implemented by testing against the True value.
3.304 @@ -787,9 +787,9 @@
3.305 # This provides the context overriding for methods.
3.306 if context is ReplaceableContext or context is not PlaceholderContext and self._CheckInstance(inst_ref, context):
3.307 # Replace the context with the instance.
3.308 - return inst_ref, ref
3.309 + return DataValue(inst_ref, ref)
3.310 else:
3.311 - return context, ref
3.312 + return DataValue(context, ref)
3.313
3.314 # Convenience functions.
3.315
4.1 --- a/rsvplib.py Sat Oct 10 01:52:27 2009 +0200
4.2 +++ b/rsvplib.py Sat Oct 10 03:09:29 2009 +0200
4.3 @@ -19,6 +19,7 @@
4.4 this program. If not, see <http://www.gnu.org/licenses/>.
4.5 """
4.6
4.7 +from micropython.program import DataValue
4.8 import operator
4.9
4.10 class Library:
4.11 @@ -62,20 +63,22 @@
4.12
4.13 # Get operands addresses.
4.14
4.15 - left_context, left = self.frame_stack[frame]
4.16 - right_context, right = self.frame_stack[frame + 1]
4.17 + left_value = self.frame_stack[frame]
4.18 + right_value = self.frame_stack[frame + 1]
4.19
4.20 # Test operand suitability.
4.21 # NOTE: Support other types.
4.22
4.23 - if not (self.machine._CheckInstance(left, self.int_class) and self.machine._CheckInstance(right, self.int_class)):
4.24 + if not (self.machine._CheckInstance(left_value.ref, self.int_class) and
4.25 + self.machine._CheckInstance(right_value.ref, self.int_class)):
4.26 +
4.27 self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
4.28 return self.machine.RaiseException()
4.29
4.30 # NOTE: Assume single location for data.
4.31
4.32 - left_data = left + 1
4.33 - right_data = right + 1
4.34 + left_data = left_value.ref + 1
4.35 + right_data = right_value.ref + 1
4.36
4.37 # Make a new object.
4.38
4.39 @@ -89,38 +92,40 @@
4.40 # Return the new object.
4.41 # Introduce object as context for the new object.
4.42
4.43 - self.machine.result = addr, addr
4.44 + self.machine.result = DataValue(addr, addr)
4.45
4.46 def builtins_logical_op(self, operand_class, op, true_if_incompatible):
4.47 frame = self.local_sp_stack[-1]
4.48
4.49 # Get operands addresses.
4.50
4.51 - left_context, left = self.frame_stack[frame]
4.52 - right_context, right = self.frame_stack[frame + 1]
4.53 + left_value = self.frame_stack[frame]
4.54 + right_value = self.frame_stack[frame + 1]
4.55
4.56 # Test operand suitability.
4.57 # NOTE: Handle comparisons of incompatible types more appropriately.
4.58
4.59 - if not (self.machine._CheckInstance(left, operand_class) and self.machine._CheckInstance(right, operand_class)):
4.60 + if not (self.machine._CheckInstance(left_value.ref, operand_class) and
4.61 + self.machine._CheckInstance(right_value.ref, operand_class)):
4.62 +
4.63 if true_if_incompatible:
4.64 - self.machine.result = self.true_constant, self.true_constant
4.65 + self.machine.result = DataValue(self.true_constant, self.true_constant)
4.66 else:
4.67 - self.machine.result = self.false_constant, self.false_constant
4.68 + self.machine.result = DataValue(self.false_constant, self.false_constant)
4.69 return
4.70
4.71 # NOTE: Assume single location for data.
4.72
4.73 - left_data = left + 1
4.74 - right_data = right + 1
4.75 + left_data = left_value.ref + 1
4.76 + right_data = right_value.ref + 1
4.77
4.78 # Test the data.
4.79 # NOTE: The data is considered ready to use.
4.80
4.81 if op(self.machine.load(left_data), self.machine.load(right_data)):
4.82 - self.machine.result = self.true_constant, self.true_constant
4.83 + self.machine.result = DataValue(self.true_constant, self.true_constant)
4.84 else:
4.85 - self.machine.result = self.false_constant, self.false_constant
4.86 + self.machine.result = DataValue(self.false_constant, self.false_constant)
4.87
4.88 # Operators.
4.89 # Although this takes a short-cut by using the operator module, testing is
4.90 @@ -185,42 +190,42 @@
4.91
4.92 # Get operands addresses.
4.93
4.94 - left_context, left = self.frame_stack[frame]
4.95 + left_value = self.frame_stack[frame]
4.96
4.97 # Test operand suitability.
4.98
4.99 - if not self.machine._CheckInstance(left, self.int_class):
4.100 + if not self.machine._CheckInstance(left_value.ref, self.int_class):
4.101 self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
4.102 return self.machine.RaiseException()
4.103
4.104 # NOTE: Assume single location for data.
4.105
4.106 - left_data = left + 1
4.107 + left_data = left_value.ref + 1
4.108
4.109 # Test the data.
4.110 # NOTE: The data is considered ready to use.
4.111
4.112 if self.machine.load(left_data) != 0:
4.113 - self.machine.result = self.true_constant, self.true_constant
4.114 + self.machine.result = DataValue(self.true_constant, self.true_constant)
4.115 else:
4.116 - self.machine.result = self.false_constant, self.false_constant
4.117 + self.machine.result = DataValue(self.false_constant, self.false_constant)
4.118
4.119 def builtins_int_neg(self):
4.120 frame = self.local_sp_stack[-1]
4.121
4.122 # Get operands addresses.
4.123
4.124 - left_context, left = self.frame_stack[frame]
4.125 + left_value = self.frame_stack[frame]
4.126
4.127 # Test operand suitability.
4.128
4.129 - if not self.machine._CheckInstance(left, self.int_class):
4.130 + if not self.machine._CheckInstance(left_value.ref, self.int_class):
4.131 self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
4.132 return self.machine.RaiseException()
4.133
4.134 # NOTE: Assume single location for data.
4.135
4.136 - left_data = left + 1
4.137 + left_data = left_value.ref + 1
4.138
4.139 # Make a new object.
4.140
4.141 @@ -234,7 +239,7 @@
4.142 # Return the new object.
4.143 # Introduce object as context for the new object.
4.144
4.145 - self.machine.result = addr, addr
4.146 + self.machine.result = DataValue(addr, addr)
4.147
4.148 # Various built-in methods.
4.149
4.150 @@ -243,8 +248,8 @@
4.151
4.152 # Get operands addresses.
4.153
4.154 - left_context, left = self.frame_stack[frame]
4.155 - self.machine.result = left, left
4.156 + left_value = self.frame_stack[frame]
4.157 + self.machine.result = DataValue(left_value.ref, left_value.ref)
4.158
4.159 def builtins_list_new(self):
4.160 frame = self.local_sp_stack[-1]
4.161 @@ -252,16 +257,16 @@
4.162 # The first parameter should be empty.
4.163 # NOTE: Specific copying of tuples/lists.
4.164
4.165 - args_context, args = self.frame_stack[frame + 1]
4.166 + args_value = self.frame_stack[frame + 1]
4.167
4.168 # Test operand suitability.
4.169
4.170 - if self.machine._CheckInstance(args, self.list_class):
4.171 - _x, sequence = self.machine.load(args + 1)
4.172 - header = self.machine.load(sequence)
4.173 + if self.machine._CheckInstance(args_value.ref, self.list_class):
4.174 + sequence = self.machine.load(args_value.ref + 1)
4.175 + header = self.machine.load(sequence.ref)
4.176 size = header.occupied_size
4.177 - elif self.machine._CheckInstance(args, self.tuple_class):
4.178 - sequence = args
4.179 + elif self.machine._CheckInstance(args_value.ref, self.tuple_class):
4.180 + sequence = args_value.ref
4.181 header = self.machine.load(sequence)
4.182 size = header.size
4.183 else:
4.184 @@ -277,34 +282,34 @@
4.185 # Make the list instance.
4.186
4.187 addr = self.machine._MakeObject(2, self.list_instance)
4.188 - self.machine.save(addr + 1, (None, new_fragment))
4.189 + self.machine.save(addr + 1, DataValue(None, new_fragment))
4.190
4.191 - self.machine.result = addr, addr
4.192 + self.machine.result = DataValue(addr, addr)
4.193
4.194 def builtins_list_getitem(self):
4.195 frame = self.local_sp_stack[-1]
4.196
4.197 # Get the operand address.
4.198
4.199 - item_context, item = self.frame_stack[frame + 1]
4.200 + item_value = self.frame_stack[frame + 1]
4.201
4.202 # Get the list address.
4.203
4.204 - obj_context, obj = self.frame_stack[frame]
4.205 + obj_value = self.frame_stack[frame]
4.206
4.207 # Get the fragment address.
4.208 # NOTE: Assume single location for header.
4.209
4.210 - _x, fragment = self.machine.load(obj + 1)
4.211 + fragment = self.machine.load(obj_value.ref + 1)
4.212
4.213 # Get the fragment header.
4.214
4.215 - header = self.machine.load(fragment)
4.216 + header = self.machine.load(fragment.ref)
4.217 nelements = header.occupied_size - 1
4.218
4.219 # NOTE: Assume single location for data and header.
4.220
4.221 - item_pos = self.machine.load(item + 1)
4.222 + item_pos = self.machine.load(item_value.ref + 1)
4.223
4.224 if item_pos >= 0 and item_pos < nelements:
4.225 pass
4.226 @@ -316,23 +321,23 @@
4.227
4.228 # NOTE: Assume single location for header.
4.229
4.230 - self.machine.result = self.machine.load(fragment + 1 + item_pos)
4.231 + self.machine.result = self.machine.load(fragment.ref + 1 + item_pos)
4.232
4.233 def builtins_list_len(self):
4.234 frame = self.local_sp_stack[-1]
4.235
4.236 # Get the list address.
4.237
4.238 - obj_context, obj = self.frame_stack[frame]
4.239 + obj_value = self.frame_stack[frame]
4.240
4.241 # Get the fragment address.
4.242 # NOTE: Assume single location for header.
4.243
4.244 - _x, fragment = self.machine.load(obj + 1)
4.245 + fragment = self.machine.load(obj_value.ref + 1)
4.246
4.247 # Get the fragment header.
4.248
4.249 - header = self.machine.load(fragment)
4.250 + header = self.machine.load(fragment.ref)
4.251 nelements = header.occupied_size - 1
4.252
4.253 # Make a new object.
4.254 @@ -347,32 +352,32 @@
4.255 # Return the new object.
4.256 # Introduce object as context for the new object.
4.257
4.258 - self.machine.result = addr, addr
4.259 + self.machine.result = DataValue(addr, addr)
4.260
4.261 def builtins_list_append(self):
4.262 frame = self.local_sp_stack[-1]
4.263
4.264 # Get operand address.
4.265
4.266 - arg_context, arg = self.frame_stack[frame + 1]
4.267 + arg_value = self.frame_stack[frame + 1]
4.268
4.269 # Get the list address.
4.270
4.271 - obj_context, obj = self.frame_stack[frame]
4.272 + obj_value = self.frame_stack[frame]
4.273
4.274 # Get the fragment address.
4.275 # NOTE: Assume single location for header.
4.276
4.277 - _x, fragment = self.machine.load(obj + 1)
4.278 + fragment = self.machine.load(obj_value.ref + 1)
4.279
4.280 # Get the fragment header.
4.281
4.282 - header = self.machine.load(fragment)
4.283 + header = self.machine.load(fragment.ref)
4.284
4.285 # Attempt to add the reference.
4.286
4.287 if header.occupied_size < header.allocated_size:
4.288 - self.machine.save(fragment + header.occupied_size, (arg_context, arg))
4.289 + self.machine.save(fragment.ref + header.occupied_size, arg_value)
4.290 header.occupied_size += 1
4.291 else:
4.292
4.293 @@ -384,26 +389,26 @@
4.294 # Copy existing elements.
4.295
4.296 for i in range(1, header.allocated_size):
4.297 - self.machine.save(new_fragment + i, self.machine.load(fragment + i))
4.298 + self.machine.save(new_fragment + i, self.machine.load(fragment.ref + i))
4.299
4.300 - self.machine.save(new_fragment + header.allocated_size, (arg_context, arg))
4.301 + self.machine.save(new_fragment + header.allocated_size, arg_value)
4.302
4.303 # Set the new fragment in the object.
4.304 # NOTE: The old fragment could be deallocated.
4.305
4.306 - self.machine.save(obj + 1, (None, new_fragment))
4.307 + self.machine.save(obj_value.ref + 1, DataValue(None, new_fragment))
4.308
4.309 def builtins_tuple_len(self):
4.310 frame = self.local_sp_stack[-1]
4.311
4.312 # Get the tuple address.
4.313
4.314 - obj_context, obj = self.frame_stack[frame]
4.315 + obj_value = self.frame_stack[frame]
4.316
4.317 # Get the header.
4.318 # NOTE: Assume single location for header.
4.319
4.320 - header = self.machine.load(obj)
4.321 + header = self.machine.load(obj_value.ref)
4.322 nelements = header.size - 1
4.323
4.324 # Make a new object.
4.325 @@ -418,28 +423,28 @@
4.326 # Return the new object.
4.327 # Introduce object as context for the new object.
4.328
4.329 - self.machine.result = addr, addr
4.330 + self.machine.result = DataValue(addr, addr)
4.331
4.332 def builtins_tuple_getitem(self):
4.333 frame = self.local_sp_stack[-1]
4.334
4.335 # Get the operand address.
4.336
4.337 - item_context, item = self.frame_stack[frame + 1]
4.338 + item_value = self.frame_stack[frame + 1]
4.339
4.340 # Get the tuple address.
4.341
4.342 - obj_context, obj = self.frame_stack[frame]
4.343 + obj_value = self.frame_stack[frame]
4.344
4.345 # Get the header.
4.346 # NOTE: Assume single location for header.
4.347
4.348 - header = self.machine.load(obj)
4.349 + header = self.machine.load(obj_value.ref)
4.350 nelements = header.size - 1
4.351
4.352 # NOTE: Assume single location for data and header.
4.353
4.354 - item_pos = self.machine.load(item + 1)
4.355 + item_pos = self.machine.load(item_value.ref + 1)
4.356
4.357 if item_pos >= 0 and item_pos < nelements:
4.358 pass
4.359 @@ -451,7 +456,7 @@
4.360
4.361 # NOTE: Assume single location for header.
4.362
4.363 - self.machine.result = self.machine.load(obj + 1 + item_pos)
4.364 + self.machine.result = self.machine.load(obj_value.ref + 1 + item_pos)
4.365
4.366 def builtins_object_init(self):
4.367 pass