2.1 --- a/micropython/rsvp.py Sun Jun 12 00:57:03 2011 +0200
2.2 +++ b/micropython/rsvp.py Sun Jun 12 22:14:36 2011 +0200
2.3 @@ -537,7 +537,7 @@
2.4 "Store the source value as an argument of the current value for the parameter with the given index."
2.5 cost = 6
2.6
2.7 -class LoadContext(Instruction):
2.8 +class LoadContextIntoValue(Instruction):
2.9 "Load the context of an invocation."
2.10 cost = 2
2.11
2.12 @@ -674,7 +674,7 @@
2.13 LoadConst, LoadClass, LoadFunction, LoadName, LoadTemp,
2.14 LoadAddress, LoadAddressContext, LoadAddressContextCond,
2.15 LoadAttr, LoadAttrIndex, LoadAttrIndexContextCond,
2.16 - LoadCallable, LoadContext, LoadResult,
2.17 + LoadCallable, LoadContextIntoValue, LoadResult,
2.18 LoadException, MakeInstance, MakeFragment,
2.19 CopyExtra
2.20 )
2.21 @@ -693,7 +693,7 @@
2.22 CheckException, CheckFrame, FillDefaults,
2.23 MakeInstance,
2.24 CheckContext, CheckClass, CheckType,
2.25 - LoadContext # as the object providing the result
2.26 + LoadContextIntoValue # as the object providing the result
2.27 )
2.28
2.29 # vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/rsvp.py Sun Jun 12 00:57:03 2011 +0200
4.2 +++ b/rsvp.py Sun Jun 12 22:14:36 2011 +0200
4.3 @@ -44,11 +44,11 @@
4.4
4.5 * Exception handler PC stack refers to the state of the PC stack
4.6
4.7 - * Registers: current value,
4.8 + * Registers: current context/value,
4.9 + source context/value,
4.10 + current result context/value,
4.11 + current exception value,
4.12 boolean status value,
4.13 - source value,
4.14 - current result,
4.15 - current exception,
4.16 current callable
4.17 """
4.18
4.19 @@ -121,14 +121,21 @@
4.20
4.21 # Registers.
4.22
4.23 + self.value = None
4.24 + self.context = None
4.25 +
4.26 + self.source_value = None
4.27 + self.source_context = None
4.28 +
4.29 + self.result_value = None
4.30 + self.result_context = None
4.31 +
4.32 + self.exception = None
4.33 +
4.34 self.instruction = None
4.35 self.operand = None
4.36 - self.value = None
4.37 self.status = None
4.38 - self.source = None
4.39 self.callable = None
4.40 - self.result = None
4.41 - self.exception = None
4.42
4.43 # Constants.
4.44
4.45 @@ -173,14 +180,21 @@
4.46 print "Handler frame stack", self.handler_local_sp_stack
4.47 print "Handler PC stack", self.handler_pc_stack
4.48 print
4.49 + print "Value", self.value
4.50 + print "Context", self.context
4.51 + print
4.52 + print "Source value", self.source_value
4.53 + print "Source context", self.source_context
4.54 + print
4.55 + print "Result value", self.result_value
4.56 + print "Result context", self.result_context
4.57 + print
4.58 + print "Exception", self.exception
4.59 + print
4.60 print "Instruction", self.instruction
4.61 print "Operand", self.operand
4.62 - print "Value", self.value
4.63 print "Status", self.status
4.64 - print "Source", self.source
4.65 print "Callable", self.callable
4.66 - print "Result", self.result
4.67 - print "Exception", self.exception
4.68
4.69 def show(self, start=None, end=None):
4.70 self.show_memory(self.memory[start:end], self.coverage[start:end], start or 0)
4.71 @@ -387,11 +401,11 @@
4.72 instructions would otherwise have.
4.73 """
4.74
4.75 - value = self.value
4.76 + value, context = self.value, self.context
4.77 if self.instruction.source is not None:
4.78 self.perform(self.instruction.source, 1)
4.79 - self.source = self.value
4.80 - self.value = value
4.81 + self.source_value, self.source_context = self.value, self.context
4.82 + self.value, self.context = value, context
4.83 if self.instruction.input is not None:
4.84 self.perform(self.instruction.input, 1)
4.85
4.86 @@ -416,94 +430,111 @@
4.87 self.push_pc(self.pc + 1)
4.88 return addr
4.89
4.90 + # Low-level instructions.
4.91 +
4.92 + def LoadValue(self, operand):
4.93 + self.value = operand
4.94 +
4.95 + def LoadContext(self, operand):
4.96 + self.context = operand
4.97 +
4.98 # Instructions.
4.99
4.100 def LoadConst(self):
4.101 - self.value = DataValue(self.operand, self.operand)
4.102 + self.LoadContext(self.operand)
4.103 + self.LoadValue(self.operand)
4.104
4.105 def LoadClass(self):
4.106 - self.value = DataValue(PlaceholderContext, self.operand)
4.107 + self.LoadContext(PlaceholderContext)
4.108 + self.LoadValue(self.operand)
4.109
4.110 def LoadFunction(self):
4.111 - self.value = DataValue(ReplaceableContext, self.operand)
4.112 + self.LoadContext(ReplaceableContext)
4.113 + self.LoadValue(self.operand)
4.114
4.115 def LoadName(self):
4.116 frame = self.local_sp_stack[-1]
4.117 - self.value = self.frame_stack[frame + self.operand]
4.118 + data = self.frame_stack[frame + self.operand]
4.119 + self.LoadContext(data.context)
4.120 + self.LoadValue(data.ref)
4.121
4.122 def StoreName(self):
4.123 frame = self.local_sp_stack[-1]
4.124 - self.frame_stack[frame + self.operand] = self.source # uses the source value
4.125 + self.frame_stack[frame + self.operand] = DataValue(self.source_context, self.source_value)
4.126
4.127 LoadTemp = LoadName
4.128
4.129 def StoreTemp(self):
4.130 frame = self.local_sp_stack[-1]
4.131 - self.frame_stack[frame + self.operand] = self.value
4.132 + self.frame_stack[frame + self.operand] = DataValue(self.context, self.value)
4.133
4.134 def LoadAddress(self):
4.135 # Preserve context (potentially null).
4.136 - self.value = self.load(self.operand)
4.137 + data = self.load(self.operand)
4.138 + self.LoadContext(data.context)
4.139 + self.LoadValue(data.ref)
4.140
4.141 def LoadAddressContext(self):
4.142 - value = self.load(self.operand)
4.143 - inst_value = self.value
4.144 - self.value = DataValue(inst_value.ref, value.ref)
4.145 + # Value becomes context.
4.146 + data = self.load(self.operand)
4.147 + self.LoadContext(self.value)
4.148 + self.LoadValue(data.ref)
4.149
4.150 def LoadAddressContextCond(self):
4.151 - value = self.load(self.operand)
4.152 - inst_value = self.value
4.153 - self.value = self._LoadAddressContextCond(value.context, value.ref, inst_value.ref)
4.154 + data = self.load(self.operand)
4.155 + data = self._LoadAddressContextCond(data.context, data.ref, self.value)
4.156 + self.LoadContext(data.context)
4.157 + self.LoadValue(data.ref)
4.158
4.159 def StoreAddress(self):
4.160 # Preserve context.
4.161 - self.save(self.operand, self.source)
4.162 + self.save(self.operand, DataValue(self.source_context, self.source_value))
4.163
4.164 def StoreAddressContext(self):
4.165 # Overwrite context if null.
4.166 - context_value = self.value
4.167 - source_value = self.source
4.168 - self._StoreAddressContext(self.operand, context_value, source_value)
4.169 + self._StoreAddressContext(self.operand, self.context, self.value, self.source_context, self.source_value)
4.170
4.171 def MakeInstance(self):
4.172 size = self.operand
4.173 - value = self.value
4.174 # NOTE: Referencing the instance template.
4.175 - addr = self._MakeObject(size, value.ref - Library.instance_template_size)
4.176 + addr = self._MakeObject(size, self.value - Library.instance_template_size)
4.177 # Introduce object as context for the new object.
4.178 - self.value = DataValue(addr, addr)
4.179 + self.LoadContext(addr)
4.180 + self.LoadValue(addr)
4.181
4.182 def MakeFragment(self):
4.183 size = self.operand
4.184 # Reserve twice the amount of space.
4.185 addr = self._MakeFragment(size, size * 2)
4.186 # NOTE: Context is not relevant for fragments.
4.187 - self.value = DataValue(None, addr)
4.188 + self.LoadContext(None)
4.189 + self.LoadValue(addr)
4.190
4.191 def LoadAttr(self):
4.192 - value = self.value
4.193 # Retrieved context should already be appropriate for the instance.
4.194 # NOTE: Adding 1 to skip any header.
4.195 - self.value = self.load(value.ref + self.operand + 1)
4.196 + data = self.load(self.value + self.operand + 1)
4.197 + self.LoadContext(data.context)
4.198 + self.LoadValue(data.ref)
4.199
4.200 def StoreAttr(self):
4.201 - value = self.value
4.202 # Target should already be an instance.
4.203 # NOTE: Adding 1 to skip any header.
4.204 - self.save(value.ref + self.operand + 1, self.source)
4.205 + self.save(self.value + self.operand + 1, DataValue(self.source_context, self.source_value))
4.206
4.207 def LoadAttrIndex(self):
4.208 - value = self.value
4.209 - data = self.load(value.ref)
4.210 + data = self.load(self.value)
4.211 element = self.objlist[data.classcode + self.operand]
4.212
4.213 if element is not None:
4.214 attr_index, static_attr, offset = element
4.215 if attr_index == self.operand:
4.216 if static_attr:
4.217 - self.value = self.load(offset) # offset is address of class/module attribute
4.218 + data = self.load(offset) # offset is address of class/module attribute
4.219 else:
4.220 - self.value = self.load(value.ref + offset)
4.221 + data = self.load(self.value + offset)
4.222 + self.LoadContext(data.context)
4.223 + self.LoadValue(data.ref)
4.224 return
4.225
4.226 self.exception = self._MakeObject(Library.instance_size, self.attr_error_instance)
4.227 @@ -512,39 +543,38 @@
4.228 # LoadAttrIndexContext not defined.
4.229
4.230 def LoadAttrIndexContextCond(self):
4.231 - inst_value = self.value
4.232 - data = self.load(inst_value.ref)
4.233 + data = self.load(self.value)
4.234 element = self.objlist[data.classcode + self.operand]
4.235
4.236 if element is not None:
4.237 attr_index, static_attr, offset = element
4.238 if attr_index == self.operand:
4.239 if static_attr:
4.240 - loaded_value = self.load(offset) # offset is address of class/module attribute
4.241 - if data.attrcode is None: # absent attrcode == class/module
4.242 - self.value = loaded_value
4.243 - else:
4.244 - self.value = self._LoadAddressContextCond(loaded_value.context, loaded_value.ref, inst_value.ref)
4.245 + loaded_data = self.load(offset) # offset is address of class/module attribute
4.246 + # Absent attrcode == class/module.
4.247 + if data.attrcode is not None:
4.248 + loaded_data = self._LoadAddressContextCond(loaded_data.context, loaded_data.ref, self.value)
4.249 else:
4.250 - self.value = self.load(inst_value.ref + offset)
4.251 + loaded_data = self.load(self.value + offset)
4.252 + self.LoadContext(loaded_data.context)
4.253 + self.LoadValue(loaded_data.ref)
4.254 return
4.255
4.256 self.exception = self._MakeObject(Library.instance_size, self.attr_error_instance)
4.257 return self.RaiseException()
4.258
4.259 def StoreAttrIndex(self):
4.260 - value = self.value
4.261 - data = self.load(value.ref)
4.262 + data = self.load(self.value)
4.263 element = self.objlist[data.classcode + self.operand]
4.264
4.265 if element is not None:
4.266 attr_index, static_attr, offset = element
4.267 if attr_index == self.operand:
4.268 if static_attr:
4.269 - self._StoreAddressContext(offset, value, self.source)
4.270 + self._StoreAddressContext(offset, self.context, self.value, self.source_context, self.source_value)
4.271 return
4.272 else:
4.273 - self.save(value.ref + offset, self.source)
4.274 + self.save(self.value + offset, DataValue(self.source_context, self.source_value))
4.275 return
4.276
4.277 self.exception = self._MakeObject(Library.instance_size, self.attr_error_instance)
4.278 @@ -563,51 +593,46 @@
4.279
4.280 def StoreFrame(self):
4.281 frame = self.invocation_sp_stack[-1] # different from the current frame after MakeFrame
4.282 - self.frame_stack[frame + self.operand] = self.value
4.283 + self.frame_stack[frame + self.operand] = DataValue(self.context, self.value)
4.284
4.285 def StoreFrameIndex(self):
4.286 - value = self.value
4.287 frame = self.invocation_sp_stack[-1] # different from the current frame after MakeFrame
4.288 - data = self.load(value.ref)
4.289 + data = self.load(self.value)
4.290 element = self.paramlist[data.funccode + self.operand]
4.291
4.292 if element is not None:
4.293 # NOTE: Need to ensure correct positioning where a context has been generated.
4.294 param_index, offset = element
4.295 if param_index == self.operand:
4.296 - self.frame_stack[frame + offset] = self.source
4.297 + self.frame_stack[frame + offset] = DataValue(self.source_context, self.source_value)
4.298 return
4.299
4.300 self.exception = self._MakeObject(Library.instance_size, self.type_error_instance)
4.301 return self.RaiseException()
4.302
4.303 def LoadCallable(self):
4.304 - value = self.value
4.305 - data = self.load(value.ref)
4.306 + data = self.load(self.value)
4.307 self.callable = data.codeaddr
4.308
4.309 def StoreCallable(self):
4.310 - value = self.value
4.311 # NOTE: Should improve the representation and permit direct saving.
4.312 - data = self.load(value.ref)
4.313 - self.save(value.ref, data.with_callable(self.callable))
4.314 + data = self.load(self.value)
4.315 + self.save(self.value, data.with_callable(self.callable))
4.316
4.317 - def LoadContext(self):
4.318 - value = self.value
4.319 + def LoadContextIntoValue(self):
4.320 # NOTE: Omission of the context of the context would make things like
4.321 # NOTE: self() inside methods impossible.
4.322 - self.value = DataValue(value.context, value.context)
4.323 + self.LoadValue(self.context)
4.324
4.325 def CheckContext(self):
4.326 - self.status = self.value.ref is not ReplaceableContext
4.327 + self.status = self.value is not ReplaceableContext
4.328
4.329 def CheckClass(self):
4.330 - value = self.value
4.331 - if value.ref in (ReplaceableContext, PlaceholderContext):
4.332 + if self.value in (ReplaceableContext, PlaceholderContext):
4.333 self.status = 0
4.334 return
4.335
4.336 - data = self.load(value.ref)
4.337 + data = self.load(self.value)
4.338
4.339 # Classes are not themselves usable as the self argument.
4.340 # NOTE: This may change at some point.
4.341 @@ -645,7 +670,6 @@
4.342 self.frame_stack.extend([None]) # ExtendFrame(1)
4.343
4.344 def FillDefaults(self):
4.345 - value = self.value
4.346 (nargs, ndefaults) = self.operand
4.347
4.348 # The frame is actually installed as the locals.
4.349 @@ -661,7 +685,7 @@
4.350 pos = nlocals
4.351
4.352 while pos < nargs:
4.353 - self.frame_stack[frame + pos] = self.load(value.ref + default + 1) # skip header
4.354 + self.frame_stack[frame + pos] = self.load(self.value + default + 1) # skip header
4.355 default += 1
4.356 pos += 1
4.357
4.358 @@ -685,21 +709,13 @@
4.359 extra += 1
4.360 pos += 1
4.361
4.362 - self.value = DataValue(ref, ref)
4.363 + self.LoadContext(ref)
4.364 + self.LoadValue(ref)
4.365
4.366 def CheckInstance(self):
4.367 - value = self.value
4.368 - target_value = self.source
4.369 -
4.370 # For the 'self' parameter in an invoked function, the proposed context
4.371 # ('self') is checked against the target's context.
4.372 -
4.373 - self.status = self._CheckInstance(value.ref, target_value.ref)
4.374 -
4.375 - def CheckType(self):
4.376 - value = self.value
4.377 - target_value = self.operand
4.378 - self.status = self._CheckType(value.ref, target_value.ref)
4.379 + self.status = self._CheckInstance(self.value, self.source_value)
4.380
4.381 def JumpInFrame(self):
4.382 codeaddr = self.callable
4.383 @@ -725,10 +741,12 @@
4.384 return self.pull_pc()
4.385
4.386 def LoadResult(self):
4.387 - self.value = self.result
4.388 + self.LoadContext(self.result_context)
4.389 + self.LoadValue(self.result_value)
4.390
4.391 def StoreResult(self):
4.392 - self.result = self.value
4.393 + self.result_context = self.context
4.394 + self.result_value = self.value
4.395
4.396 def Jump(self):
4.397 return self.operand
4.398 @@ -742,10 +760,11 @@
4.399 return self.operand
4.400
4.401 def LoadException(self):
4.402 - self.value = DataValue(self.exception, self.exception)
4.403 + self.LoadContext(self.exception)
4.404 + self.LoadValue(self.exception)
4.405
4.406 def StoreException(self):
4.407 - self.exception = self.value.ref
4.408 + self.exception = self.value
4.409
4.410 def ClearException(self):
4.411 self.exception = None
4.412 @@ -783,13 +802,13 @@
4.413 del self.handler_stack[-nframes:]
4.414
4.415 def CheckException(self):
4.416 - self.status = self.exception is not None and self._CheckInstance(self.exception, self.value.ref)
4.417 + self.status = self.exception is not None and self._CheckInstance(self.exception, self.value)
4.418
4.419 def TestIdentity(self):
4.420 - self.status = self.value.ref == self.source.ref
4.421 + self.status = self.value == self.source_value
4.422
4.423 def TestIdentityAddress(self):
4.424 - self.status = self.value.ref == self.operand
4.425 + self.status = self.value == self.operand
4.426
4.427 # LoadBoolean is implemented in the generated code.
4.428 # StoreBoolean is implemented by testing against the True value.
4.429 @@ -821,22 +840,6 @@
4.430 else:
4.431 return 0
4.432
4.433 - def _CheckType(self, ref, cls):
4.434 - data = self.load(ref)
4.435 - target_data = self.load(cls)
4.436 -
4.437 - # Insist on instance vs. class.
4.438 -
4.439 - if data.attrcode is None: # absent attrcode == class/module
4.440 - return 0
4.441 -
4.442 - if target_data.attrcode is not None: # present attrcode == instance
4.443 - return 0
4.444 -
4.445 - # Return whether the types match.
4.446 -
4.447 - return data.classcode == target_data.classcode
4.448 -
4.449 def _MakeObject(self, size, ref):
4.450 # Load the template.
4.451 data = self.load(ref)
4.452 @@ -851,21 +854,21 @@
4.453 self.save(addr, FragmentObject(occupied, size))
4.454 return addr
4.455
4.456 - def _LoadAddressContextCond(self, context, ref, inst_ref):
4.457 + def _LoadAddressContextCond(self, context, value, inst_value):
4.458 # Check the instance context against the target's context.
4.459 # This provides the context overriding for methods.
4.460 - if context is ReplaceableContext or context is not PlaceholderContext and self._CheckInstance(inst_ref, context):
4.461 + if context is ReplaceableContext or context is not PlaceholderContext and self._CheckInstance(inst_value, context):
4.462 # Replace the context with the instance.
4.463 - return DataValue(inst_ref, ref)
4.464 + return DataValue(inst_value, value)
4.465 else:
4.466 - return DataValue(context, ref)
4.467 + return DataValue(context, value)
4.468
4.469 - def _StoreAddressContext(self, location, context_value, source_value):
4.470 - if source_value.context is ReplaceableContext:
4.471 - context = context_value.ref
4.472 + def _StoreAddressContext(self, location, context, value, source_context, source_value):
4.473 + if source_context is ReplaceableContext:
4.474 + context = value
4.475 else:
4.476 - context = source_value.context
4.477 - self.save(location, DataValue(context, source_value.ref))
4.478 + context = source_context
4.479 + self.save(location, DataValue(context, source_value))
4.480
4.481 # Convenience functions.
4.482
5.1 --- a/rsvplib.py Sun Jun 12 00:57:03 2011 +0200
5.2 +++ b/rsvplib.py Sun Jun 12 22:14:36 2011 +0200
5.3 @@ -101,7 +101,8 @@
5.4 # Return the new object.
5.5 # Introduce object as context for the new object.
5.6
5.7 - self.machine.result = DataValue(addr, addr)
5.8 + self.machine.result_context = addr
5.9 + self.machine.result_value = addr
5.10
5.11 def builtins_logical_op(self, operand_class, op):
5.12 frame = self.local_sp_stack[-1]
5.13 @@ -119,7 +120,8 @@
5.14 self.machine._CheckInstance(right_value.ref, operand_class)):
5.15
5.16 notimpl = self.constants[NotImplemented]
5.17 - self.machine.result = DataValue(notimpl, notimpl)
5.18 + self.machine.result_context = notimpl
5.19 + self.machine.result_value = notimpl
5.20 return
5.21
5.22 left_data = left_value.ref + self.instance_data_offset
5.23 @@ -129,9 +131,11 @@
5.24 # NOTE: The data is considered ready to use.
5.25
5.26 if op(self.machine.load(left_data), self.machine.load(right_data)):
5.27 - self.machine.result = DataValue(self.constants[True], self.constants[True])
5.28 + self.machine.result_context = self.constants[True]
5.29 + self.machine.result_value = self.constants[True]
5.30 else:
5.31 - self.machine.result = DataValue(self.constants[False], self.constants[False])
5.32 + self.machine.result_context = self.constants[False]
5.33 + self.machine.result_value = self.constants[False]
5.34
5.35 # Operators.
5.36 # Although this takes a short-cut by using the operator module, testing is
5.37 @@ -210,9 +214,11 @@
5.38 # NOTE: The data is considered ready to use.
5.39
5.40 if self.machine.load(left_data) != 0:
5.41 - self.machine.result = DataValue(self.constants[True], self.constants[True])
5.42 + self.machine.result_context = self.constants[True]
5.43 + self.machine.result_value = self.constants[True]
5.44 else:
5.45 - self.machine.result = DataValue(self.constants[False], self.constants[False])
5.46 + self.machine.result_context = self.constants[False]
5.47 + self.machine.result_value = self.constants[False]
5.48
5.49 def builtins_int_neg(self):
5.50 frame = self.local_sp_stack[-1]
5.51 @@ -241,7 +247,8 @@
5.52 # Return the new object.
5.53 # Introduce object as context for the new object.
5.54
5.55 - self.machine.result = DataValue(addr, addr)
5.56 + self.machine.result_context = addr
5.57 + self.machine.result_value = addr
5.58
5.59 # Various built-in methods.
5.60
5.61 @@ -251,7 +258,8 @@
5.62 # Get operands addresses.
5.63
5.64 left_value = self.frame_stack[frame]
5.65 - self.machine.result = DataValue(left_value.ref, left_value.ref)
5.66 + self.machine.result_context = left_value.ref
5.67 + self.machine.result_value = left_value.ref
5.68
5.69 def builtins_list_new(self):
5.70 frame = self.local_sp_stack[-1]
5.71 @@ -301,7 +309,9 @@
5.72
5.73 # Get the item itself.
5.74
5.75 - self.machine.result = self.machine.load(fragment.ref + self.fragment_data_offset + item_pos)
5.76 + data = self.machine.load(fragment.ref + self.fragment_data_offset + item_pos)
5.77 + self.machine.result_context = data.context
5.78 + self.machine.result_value = data.ref
5.79
5.80 def builtins_list_len(self):
5.81 frame = self.local_sp_stack[-1]
5.82 @@ -331,7 +341,8 @@
5.83 # Return the new object.
5.84 # Introduce object as context for the new object.
5.85
5.86 - self.machine.result = DataValue(addr, addr)
5.87 + self.machine.result_context = addr
5.88 + self.machine.result_value = addr
5.89
5.90 def builtins_list_append(self):
5.91 frame = self.local_sp_stack[-1]
5.92 @@ -399,7 +410,8 @@
5.93 def _builtins_tuple(self, obj_value):
5.94
5.95 if self.machine._CheckInstance(obj_value.ref, self.tuple_class):
5.96 - self.machine.result = obj_value
5.97 + self.machine.result_context = obj_value.context
5.98 + self.machine.result_value = obj_value.ref
5.99 return
5.100
5.101 # Reject non-list, non-tuple types.
5.102 @@ -430,7 +442,8 @@
5.103 # Return the new object.
5.104 # Introduce object as context for the new object.
5.105
5.106 - self.machine.result = DataValue(addr, addr)
5.107 + self.machine.result_context = addr
5.108 + self.machine.result_value = addr
5.109
5.110 def builtins_tuple_len(self):
5.111 frame = self.local_sp_stack[-1]
5.112 @@ -456,7 +469,8 @@
5.113 # Return the new object.
5.114 # Introduce object as context for the new object.
5.115
5.116 - self.machine.result = DataValue(addr, addr)
5.117 + self.machine.result_context = addr
5.118 + self.machine.result_value = addr
5.119
5.120 def builtins_tuple_get_single_item(self):
5.121 frame = self.local_sp_stack[-1]
5.122 @@ -484,7 +498,9 @@
5.123
5.124 # Get the item.
5.125
5.126 - self.machine.result = self.machine.load(obj_value.ref + self.instance_data_offset + item_pos)
5.127 + data = self.machine.load(obj_value.ref + self.instance_data_offset + item_pos)
5.128 + self.machine.result_context = data.context
5.129 + self.machine.result_value = data.ref
5.130
5.131 def builtins_object_init(self):
5.132 pass
5.133 @@ -514,13 +530,13 @@
5.134 attr_index, static_attr, offset = element
5.135 if attr_index == index:
5.136 if static_attr:
5.137 - loaded_value = self.machine.load(offset) # offset is address of class/module attribute
5.138 - if data.attrcode is None: # absent attrcode == class/module
5.139 - self.machine.result = loaded_value
5.140 - else:
5.141 - self.machine.result = self.machine._LoadAddressContextCond(loaded_value.context, loaded_value.ref, obj_value.ref)
5.142 + loaded_data = self.machine.load(offset) # offset is address of class/module attribute
5.143 + if data.attrcode is not None: # absent attrcode == class/module
5.144 + loaded_data = self.machine._LoadAddressContextCond(loaded_data.context, loaded_data.ref, obj_value.ref)
5.145 else:
5.146 - self.machine.result = self.machine.load(obj_value.ref + offset)
5.147 + loaded_data = self.machine.load(obj_value.ref + offset)
5.148 + self.machine.result_context = loaded_data.context
5.149 + self.machine.result_value = loaded_data.ref
5.150 return
5.151
5.152 self.machine.exception = self.machine._MakeObject(self.instance_size, self.attr_error_instance)
5.153 @@ -535,9 +551,11 @@
5.154 cls_value = self.frame_stack[frame + 1]
5.155
5.156 if self.machine._CheckInstance(obj_value.ref, cls_value.ref):
5.157 - self.machine.result = DataValue(self.constants[True], self.constants[True])
5.158 + self.machine.result_context = self.constants[True]
5.159 + self.machine.result_value = self.constants[True]
5.160 else:
5.161 - self.machine.result = DataValue(self.constants[False], self.constants[False])
5.162 + self.machine.result_context = self.constants[False]
5.163 + self.machine.result_value = self.constants[False]
5.164
5.165 def builtins_print(self):
5.166 # NOTE: Do nothing for now.