# HG changeset patch # User Paul Boddie # Date 1314654318 -7200 # Node ID f78fbedff1b0e6ae70f36ca7a9cd57a04b2a5574 # Parent e31cb064ed8de59e62fd40ef56b389bd650819ff Replaced the instance attributes for the object and parameter lists with special registers, permitting direct usage from generated code. diff -r e31cb064ed8d -r f78fbedff1b0 rsvp.py --- a/rsvp.py Mon Aug 29 23:39:18 2011 +0200 +++ b/rsvp.py Mon Aug 29 23:45:18 2011 +0200 @@ -47,7 +47,9 @@ * Registers: working context/value, assignment source context/value, current exception value, - boolean status value + boolean status value, + object list start (constant), + parameter list start (constant) """ from micropython.program import DataValue, ReplaceableContext, PlaceholderContext, FragmentObject @@ -92,12 +94,12 @@ # Add the object list. - self.objlist_start = len(self.memory) + objlist_start = len(self.memory) self.memory += objlist.as_raw() # Add the parameter list. - self.paramlist_start = len(self.memory) + paramlist_start = len(self.memory) self.memory += paramlist.as_raw() # A reference to the native library. @@ -139,13 +141,18 @@ "source", "source_context", "exception", - "status" + "status", + "objlist", + "paramlist" ) self.registers = {} for name in self.register_names: self.registers[name] = None + self.registers["objlist"] = objlist_start + self.registers["paramlist"] = paramlist_start + self.instruction = None # Constants. @@ -530,7 +537,7 @@ def LoadAttrIndex(self, index, instruction): data = self.load(self.registers[instruction.working]) - element = self.load(self.objlist_start + data.classcode + index) + element = self.load(self.registers["objlist"] + data.classcode + index) if element is not None: attr_index, static_attr, offset = element @@ -550,7 +557,7 @@ def LoadAttrIndexContextCond(self, index, instruction): data = self.load(self.registers[instruction.working]) - element = self.load(self.objlist_start + data.classcode + index) + element = self.load(self.registers["objlist"] + data.classcode + index) if element is not None: attr_index, static_attr, offset = element @@ -573,7 +580,7 @@ def StoreAttrIndex(self, index, instruction): data = self.load(self.registers[instruction.working]) - element = self.load(self.objlist_start + data.classcode + index) + element = self.load(self.registers["objlist"] + data.classcode + index) if element is not None: attr_index, static_attr, offset = element @@ -614,7 +621,7 @@ def StoreFrameIndex(self, index, instruction): frame = self.invocation_sp_stack[-1] # different from the current frame after MakeFrame data = self.load(self.registers[instruction.working]) - element = self.load(self.paramlist_start + data.funccode + index) + element = self.load(self.registers["paramlist"] + data.funccode + index) if element is not None: # NOTE: Need to ensure correct positioning where a context has been generated. @@ -832,7 +839,7 @@ # Find the table entry for the descendant. - element = self.load(self.objlist_start + target_data.classcode + data.attrcode) + element = self.load(self.registers["objlist"] + target_data.classcode + data.attrcode) if element is not None: attr_index, static_attr, offset = element diff -r e31cb064ed8d -r f78fbedff1b0 rsvplib.py --- a/rsvplib.py Mon Aug 29 23:39:18 2011 +0200 +++ b/rsvplib.py Mon Aug 29 23:45:18 2011 +0200 @@ -401,7 +401,7 @@ # NOTE: This is very much like LoadAttrIndexContextCond. data = self.machine.load(obj_value.ref) - element = self.machine.load(self.machine.objlist_start + data.classcode + index) + element = self.machine.load(self.machine.registers["objlist"] + data.classcode + index) if element is not None: attr_index, static_attr, offset = element