[squeak-dev] The Trunk: Compiler-eem.395.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Oct 15 19:38:10 UTC 2018
Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.395.mcz
==================== Summary ====================
Name: Compiler-eem.395
Author: eem
Time: 15 October 2018, 12:37:16.203042 pm
UUID: 2f7c8f3a-4e2d-413b-8651-b05b5683f89d
Ancestors: Compiler-eem.394
Implement markerOrNil: for the SistaV1 bytecode set and firm up both implementations so that e.g.
aMethod
self fooClass new
is not interpreted as a marker method (because #new is a special selector and hence does not cayse a literal to be allocated).
=============== Diff against Compiler-eem.394 ===============
Item was added:
+ ----- Method: EncoderForSistaV1 class>>markerOrNilFor: (in category 'compiled method support') -----
+ markerOrNilFor: aMethod
+ "If aMethod is a marker method, answer the symbol used to mark it. Otherwise
+ answer nil. What is a marker method? It is method with body like
+ 'self subclassResponsibility' or '^ self subclassResponsibility'
+ used to indicate ('mark') a special property.
+
+ Marker methods compile to two bytecode forms, this:
+ self
+ send: <literal 1>
+ pop
+ returnSelf
+ or this:
+ self
+ send: <literal 1>
+ returnTop"
+ | expectedHeaderPlusLliteralSize e byte |
+ expectedHeaderPlusLliteralSize := Smalltalk wordSize * 4.
+ ^(((e := aMethod endPC - expectedHeaderPlusLliteralSize) = 3 or: [e = 4])
+ and: [aMethod numLiterals = 3
+ and: [(aMethod at: expectedHeaderPlusLliteralSize + 1) = 16r4C "push self"
+ and: [(aMethod at: expectedHeaderPlusLliteralSize + 2) = 16r80
+ and: [(byte := aMethod at: expectedHeaderPlusLliteralSize + 3) = 16rD8 or: [byte = 16r5C]]]]]) "pop or returnSelf"
+ ifTrue: [aMethod literalAt: 1]!
Item was changed:
----- Method: EncoderForV3 class>>markerOrNilFor: (in category 'compiled method support') -----
markerOrNilFor: aMethod
"If aMethod is a marker method, answer the symbol used to mark it. Otherwise
answer nil. What is a marker method? It is method with body like
'self subclassResponsibility' or '^ self subclassResponsibility'
used to indicate ('mark') a special property.
Marker methods compile to two bytecode forms, this:
self
send: <literal 1>
pop
returnSelf
or this:
self
send: <literal 1>
returnTop"
+ | expectedHeaderPlusLliteralSize e byte |
- | expectedHeaderPlusLliteralSize e |
expectedHeaderPlusLliteralSize := Smalltalk wordSize * 4.
^(((e := aMethod endPC - expectedHeaderPlusLliteralSize) = 3 or: [e = 4])
and: [aMethod numLiterals = 3
+ and: [(aMethod at: expectedHeaderPlusLliteralSize + 1) = 16r70 "push self"
+ and: [(aMethod at: expectedHeaderPlusLliteralSize + 2) = 16rD0
+ and: [(byte := aMethod at: expectedHeaderPlusLliteralSize + 3) = 16r87 or: [byte = 16r78]]]]]) "pop or returnSelf"
- and: [(aMethod at: expectedHeaderPlusLliteralSize + 1) = 16r70 "push self"
- and: [(aMethod at: expectedHeaderPlusLliteralSize + 2) = 16rD0]]]) "send <literal 1>"
ifTrue: [aMethod literalAt: 1]!
More information about the Squeak-dev
mailing list
|