On Sun, 26 Sep 2010, commits@source.squeak.org wrote:
Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.501.mcz
==================== Summary ====================
Name: Kernel-eem.501 Author: eem Time: 25 September 2010, 7:55:34.708 pm UUID: 5b55eae3-594b-4416-9d47-5a4ebaabb238 Ancestors: Kernel-ul.500
Add mirror primitives which can be used for accurate execution simulation (a.k.a. debugging) of proxies.
#objectSize: seems to be missing.
Levente
=============== Diff against Kernel-ul.500 ===============
Item was added:
- ----- Method: ContextPart>>object:basicAt: (in category 'mirror primitives') -----
- object: anObject basicAt: index
- "Answer the value of an indexable element in the argument anObject without sending
it a message. Fail if the argument index is not an Integer or is out of bounds, or if
anObject is not indexable. This mimics the action of the VM when it indexes an object.
Used to simulate the execution machinery by, for example, the debugger.
Primitive. See Object documentation whatIsAPrimitive."
- <primitive: 60>
- index isInteger ifTrue: [self errorSubscriptBounds: index].
- index isNumber
ifTrue: [^self object: anObject basicAt: index asInteger]
ifFalse: [self errorNonIntegerIndex]!
Item was added:
- ----- Method: ContextPart>>object:basicAt:put: (in category 'mirror primitives') -----
- object: anObject basicAt: index put: value
- "Store the last argument
value in the indexable element of the argument anObject indicated by index without sending
anObject a message. Fail if the argument index is not an Integer or is out of bounds, or if
anObject is not indexable, or if value is an inappropriate value for anObject's indexable slots.
This mimics the action of the VM when it indexes an object.
Used to simulate the execution machinery by, for example, the debugger.
Primitive. See Object documentation whatIsAPrimitive."
- <primitive: 61>
- index isInteger
ifTrue: [(index >= 1 and: [index <= (self objectSize: anObject)])
ifTrue: [self errorImproperStore]
ifFalse: [self errorSubscriptBounds: index]].
- index isNumber
ifTrue: [^self object: anObject basicAt: index asInteger put: value]
ifFalse: [self errorNonIntegerIndex]!
Item was added:
- ----- Method: ContextPart>>object:eqeq: (in category 'mirror primitives') -----
- object: anObject eqeq: anOtherObject
- "Answer whether the first and second arguments are the same object (have the
same object pointer) without sending a message to the first argument. This
mimics the action of the VM when it compares two object pointers. Used to
simulate the execution machinery by, for example, the debugger.
Primitive. See Object documentation whatIsAPrimitive."
- <primitive: 110>
- self primitiveFailed!
Item was added:
- ----- Method: ContextPart>>object:instVarAt: (in category 'mirror primitives') -----
- object: anObject instVarAt: anIndex
- "Primitive. Answer a fixed variable in an object. The numbering of the
variables corresponds to the named instance variables. Fail if the index
is not an Integer or is not the index of a fixed variable. Essential for the
debugger. See Object documentation whatIsAPrimitive."
- <primitive: 73>
- "Access beyond fixed variables."
- ^self object: anObject basicAt: anIndex - (self objectClass: anObject) instSize!
Item was added:
- ----- Method: ContextPart>>object:instVarAt:put: (in category 'mirror primitives') -----
- object: anObject instVarAt: anIndex put: aValue
- "Primitive. Store a value into a fixed variable in the argument anObject.
The numbering of the variables corresponds to the named instance
variables. Fail if the index is not an Integer or is not the index of a
fixed variable. Answer the value stored as the result. Using this
message violates the principle that each object has sovereign control
over the storing of values into its instance variables. Essential for the
debugger. See Object documentation whatIsAPrimitive."
- <primitive: 74>
- "Access beyond fixed fields"
- ^self object: anObject basicAt: anIndex - (self objectClass: anObject) instSize put: aValue!
Item was added:
- ----- Method: ContextPart>>object:perform:withArguments:inClass: (in category 'mirror primitives') -----
- object: anObject perform: selector withArguments: argArray inClass: lookupClass
- "Send the selector, aSymbol, to anObject with arguments in argArray.
Fail if the number of arguments expected by the selector
does not match the size of argArray, or if lookupClass
cannot be found among the anObject's superclasses.
Primitive. Essential for the debugger."
- <primitive: 100 error: error>
- (selector isMemberOf: Symbol) ifFalse:
[^self error: 'selector argument must be a Symbol'].
- (argArray isMemberOf: Array) ifFalse:
[^self error: 'argArray must be an Array'].
- (selector numArgs = argArray size)
ifFalse: [^self error: 'incorrect number of arguments'].
- ((self objectClass: anObject) == lookupClass
or: [(self objectClass: anObject) inheritsFrom: lookupClass]) ifFalse:
[^self error: 'lookupClass is not in anObject''s inheritance chain'].
- self primitiveFailed!
On Sat, Sep 25, 2010 at 8:27 PM, Levente Uzonyi leves@elte.hu wrote:
On Sun, 26 Sep 2010, commits@source.squeak.org wrote:
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.501.mcz
==================== Summary ====================
Name: Kernel-eem.501 Author: eem Time: 25 September 2010, 7:55:34.708 pm UUID: 5b55eae3-594b-4416-9d47-5a4ebaabb238 Ancestors: Kernel-ul.500
Add mirror primitives which can be used for accurate execution simulation (a.k.a. debugging) of proxies.
#objectSize: seems to be missing.
Superb catch. In trying to collect the mirror primitives and only the mirror primitives I stupidly did SystemNavigation new browseAllSelect: [:m| m beginsWith: 'object:'] and so missed this.
Thanks!
Levente
=============== Diff against Kernel-ul.500 ===============
Item was added:
- ----- Method: ContextPart>>object:basicAt: (in category 'mirror
primitives') -----
- object: anObject basicAt: index
"Answer the value of an indexable element in the argument anObject
without sending
it a message. Fail if the argument index is not an Integer or is
out of bounds, or if
anObject is not indexable. This mimics the action of the VM when
it indexes an object.
Used to simulate the execution machinery by, for example, the
debugger.
Primitive. See Object documentation whatIsAPrimitive."
<primitive: 60>
index isInteger ifTrue: [self errorSubscriptBounds: index].
index isNumber
ifTrue: [^self object: anObject basicAt: index asInteger]
ifFalse: [self errorNonIntegerIndex]!
Item was added:
- ----- Method: ContextPart>>object:basicAt:put: (in category 'mirror
primitives') -----
- object: anObject basicAt: index put: value
"Store the last argument
value in the indexable element of the argument anObject indicated
by index without sending
anObject a message. Fail if the argument index is not an Integer
or is out of bounds, or if
anObject is not indexable, or if value is an inappropriate value
for anObject's indexable slots.
This mimics the action of the VM when it indexes an object.
Used to simulate the execution machinery by, for example, the
debugger.
Primitive. See Object documentation whatIsAPrimitive."
<primitive: 61>
index isInteger
ifTrue: [(index >= 1 and: [index <= (self objectSize:
anObject)])
ifTrue: [self errorImproperStore]
ifFalse: [self
errorSubscriptBounds: index]].
index isNumber
ifTrue: [^self object: anObject basicAt: index asInteger
put: value]
ifFalse: [self errorNonIntegerIndex]!
Item was added:
- ----- Method: ContextPart>>object:eqeq: (in category 'mirror
primitives') -----
- object: anObject eqeq: anOtherObject
"Answer whether the first and second arguments are the same object
(have the
same object pointer) without sending a message to the first
argument. This
mimics the action of the VM when it compares two object pointers.
Used to
simulate the execution machinery by, for example, the debugger.
Primitive. See Object documentation whatIsAPrimitive."
<primitive: 110>
self primitiveFailed!
Item was added:
- ----- Method: ContextPart>>object:instVarAt: (in category 'mirror
primitives') -----
- object: anObject instVarAt: anIndex
"Primitive. Answer a fixed variable in an object. The numbering of
the
variables corresponds to the named instance variables. Fail if
the index
is not an Integer or is not the index of a fixed variable.
Essential for the
debugger. See Object documentation whatIsAPrimitive."
<primitive: 73>
"Access beyond fixed variables."
^self object: anObject basicAt: anIndex - (self objectClass:
anObject) instSize!
Item was added:
- ----- Method: ContextPart>>object:instVarAt:put: (in category 'mirror
primitives') -----
- object: anObject instVarAt: anIndex put: aValue
"Primitive. Store a value into a fixed variable in the argument
anObject.
The numbering of the variables corresponds to the named instance
variables. Fail if the index is not an Integer or is not the
index of a
fixed variable. Answer the value stored as the result. Using
this
message violates the principle that each object has sovereign
control
over the storing of values into its instance variables. Essential
for the
debugger. See Object documentation whatIsAPrimitive."
<primitive: 74>
"Access beyond fixed fields"
^self object: anObject basicAt: anIndex - (self objectClass:
anObject) instSize put: aValue!
Item was added:
- ----- Method: ContextPart>>object:perform:withArguments:inClass: (in
category 'mirror primitives') -----
- object: anObject perform: selector withArguments: argArray inClass:
lookupClass
"Send the selector, aSymbol, to anObject with arguments in
argArray.
Fail if the number of arguments expected by the selector
does not match the size of argArray, or if lookupClass
cannot be found among the anObject's superclasses.
Primitive. Essential for the debugger."
<primitive: 100 error: error>
(selector isMemberOf: Symbol) ifFalse:
[^self error: 'selector argument must be a Symbol'].
(argArray isMemberOf: Array) ifFalse:
[^self error: 'argArray must be an Array'].
(selector numArgs = argArray size)
ifFalse: [^self error: 'incorrect number of arguments'].
((self objectClass: anObject) == lookupClass
or: [(self objectClass: anObject) inheritsFrom: lookupClass])
ifFalse:
[^self error: 'lookupClass is not in anObject''s
inheritance chain'].
self primitiveFailed!
squeak-dev@lists.squeakfoundation.org