2009-05-30 | Paul Boddie | raw annotate files changeset graph | Changed instantiator invocation reserving a frame slot regardless of whether the target is known in advance. In the instantiator, the first frame slot is then overwritten with the new instance, and the RecoverFrame instruction is no longer required. Instead, a new JumpInFrame instruction maintains the existing locals, jumping to the initialiser method for the class. Updated various tests, renaming and enhancing the classes test. |
1 Object contexts: 2 3 Object Context 4 ------ ------- 5 function overridable 6 method defining/originating class 7 class null 8 instance self 9 module null 10 11 Assignment types: 12 13 Assignment of stored value to... Effect on context 14 -------------------------------- ----------------- 15 local preserved 16 global (module) preserved 17 class overridden (if overridable) 18 instance preserved 19 20 Assignment to a namespace preserves the context except for some class 21 assignments 22 23 Assigning to classes: 24 25 Assignment of... Effect on context 26 ---------------- ----------------- 27 function (overridable context) overridden by class (becomes method) 28 method (existing context) preserved 29 class (null context) preserved 30 instance (self context) preserved 31 module (null context) preserved 32 33 With run-time restrictions on assignment targets: 34 35 Assignment of stored value to... Effect on context Optimised instruction Unoptimised instruction 36 -------------------------------- ----------------- --------------------- ----------------------- 37 local preserved StoreName 38 global (module) preserved StoreAddress StoreAttrIndex 39 instance preserved StoreAttr StoreAttrIndex 40 class -> class StoreAddressContext 41 42 Class assignments are not permitted except during initialisation and hence 43 employ no unoptimised instruction 44 45 Access types: 46 47 Access to stored value from... Effect on context Optimised instruction Unoptimised instruction 48 ------------------------------ ----------------- --------------------- ----------------------- 49 local preserved LoadName 50 global (module) preserved LoadAddress LoadAttrIndex 51 class preserved LoadAddress LoadAttrIndex 52 class via instance -> instance LoadAddressContext(Cond) LoadAttrIndexContext(Cond) 53 instance preserved LoadAttr LoadAttrIndex 54 55 Access to a namespace may not preserve the stored context 56 57 Access to class attributes via instances: 58 59 Access to stored value with... Effect on context 60 ------------------------------ ----------------- 61 compatible class as context -> instance 62 incompatible class as context preserved 63 null context preserved 64 other context (instance) preserved 65 66 Optimisation possibilities for class attribute access via instances: 67 68 Class Class attribute Context of attribute Instruction 69 ----- --------------- -------------------- ----------- 70 known constant preserved LoadAddress 71 known constant -> instance LoadAddressContext 72 known not constant preserved LoadAddress (attribute may always be preserved) 73 known not constant -> instance LoadAddressContext (attribute may always be overridden) 74 known not constant not known LoadAddressContextCond (perform context check) 75 not known not known preserved LoadAttrIndex (attribute may have preserved context in all classes) 76 not known not known -> instance LoadAttrIndexContext (attribute may have overridden context in all classes) 77 not known not known not known LoadAttrIndexContextCond (perform context check for class attribute access) 78 79 Since the object table encodes sufficient information (an instance must be 80 compatible to access the class attribute, and compatibility information is 81 stored), an explicit compatibility test may not always be required at 82 run-time