[Vm-dev] VM Maker: VMMaker.oscog-nice.1713.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Sat Mar 5 02:19:25 UTC 2016


Another explanation for VM foolproofing is here:

http://forum.world.st/VM-safety-td4816223.html

2016-03-05 3:16 GMT+01:00 <commits at source.squeak.org>:

>
> Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1713.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-nice.1713
> Author: nice
> Time: 5 March 2016, 3:15:22.817 am
> UUID: ac270981-d3ba-4c42-a2b1-3a83693776be
> Ancestors: VMMaker.oscog-nice.1712
>
> The size of [unsigned] long long was not infered...
>
> VM fool proofing:
>
> Fix a missing guard in SmartSyntaxPlugin like explained at
>
> http://forum.world.st/VM-safety-missing-failing-guards-in-SmartSyntaxPlugin-td4816518.html
>
> Fix two missing guards in VM profiling primitives: one should not use the
> result of stackObjectValue: before checking for success, otherwise a null
> pointer exception will occur in case of failure.
>
> =============== Diff against VMMaker.oscog-nice.1712 ===============
>
> Item was changed:
>   ----- Method: CCodeGenerator>>sizeOfIntegralCType: (in category
> 'inlining') -----
>   sizeOfIntegralCType: anIntegralCType "<String>"
>         "N.B. Only works for values for which isIntegralCType: answers
> true."
>         | prunedCType index |
>         (anIntegralCType beginsWith: 'register ') ifTrue:
>                 [^self sizeOfIntegralCType: (anIntegralCType allButFirst:
> 9)].
>         prunedCType := (anIntegralCType beginsWith: 'unsigned ')
>                                                 ifTrue: [(anIntegralCType
> allButFirst: 9) withBlanksTrimmed]
>                                                 ifFalse: [(anIntegralCType
> beginsWith: 'signed ')
>
> ifTrue: [(anIntegralCType allButFirst: 7) withBlanksTrimmed]
>
> ifFalse: [anIntegralCType]].
>         ^prunedCType asString caseOf: {
>                 ['sqLong']      ->      [8].
>                 ['usqLong']     ->      [8].
> +               ['long long']   ->      [8].
>                 ['sqInt']               ->      [BytesPerWord].
>                 ['usqInt']      ->      [BytesPerWord].
>                 ['int']         ->      [4].
>                 ['short']               ->      [2].
>                 ['short int']   ->      [2].
>                 ['char']                ->      [1].
>                 ['long']                ->      [BytesPerWord].
>                 ['size_t']              ->      [BytesPerWord].
>                 ['pid_t']               ->      [BytesPerWord].
>         }
>         otherwise:
>                 [((anIntegralCType beginsWith: 'unsigned') "e.g.
> 'unsigned  : 8'"
>                   and: [(anIntegralCType includesAnyOf: '[*]') not
>                   and: [(index := anIntegralCType indexOf: $:) > 0]])
>                         ifTrue: [(Integer readFrom: (anIntegralCType
> copyFrom: index + 1 to: anIntegralCType size) withBlanksTrimmed readStream)
> + 7 // 8]
>                         ifFalse: [self error: 'unrecognized integral
> type']]!
>
> Item was changed:
>   ----- Method: InterpreterPrimitives>>primitiveVMProfileInfoInto (in
> category 'process primitives') -----
>   primitiveVMProfileInfoInto
>         "Primitive. Answer whether the profiler is running or not.
>          If the argument is an Array of suitable size fill it with the
> following information:
>                 1. the addresses of the first element of the VM histogram
> (the first address in the executable)
>                 2. the address following the last element (the last
> address in the executable, excluding dynamically linked libraries)
>                 3. the size of the VM histogram in bins (each bin is a 4
> byte unsigned long)
>                 4. the size of the VM histogram in bins (each bin is a 4
> byte unsigned long)"
>         | info running exeStart exeLimit vmBins easBins |
>         <var: #exeStart type: #'char *'>
>         <var: #exeLimit type: #'char *'>
>         <var: #vmBins type: #long>
>         <var: #easBins type: #long>
>         self success: argumentCount = 1.
>         self successful ifTrue:
> +               [info := self stackObjectValue: 0].
> +       self successful ifTrue:
> +               [info ~= objectMemory nilObject ifTrue:
> -               [info := self stackObjectValue: 0.
> -                info ~= objectMemory nilObject ifTrue:
>                         [self assertClassOf: info is: (objectMemory
> splObj: ClassArray).
>                          self success: (objectMemory numSlotsOf: info) >=
> 4]].
>         self successful ifFalse:
>                 [^nil].
>
>         self cCode:
> 'ioProfileStatus(&running,&exeStart,&exeLimit,0,&vmBins,0,&easBins)'
>                 inSmalltalk: [running := exeStart := exeLimit := vmBins :=
> easBins := 0].
>         info ~= objectMemory nilObject ifTrue:
>                 [objectMemory storePointerUnchecked: 0
>                         ofObject: info
>                         withValue: (objectMemory integerObjectOf: (self
> oopForPointer: exeStart)).
>                 objectMemory storePointerUnchecked: 1
>                         ofObject: info
>                         withValue: (objectMemory integerObjectOf: (self
> oopForPointer: exeLimit)).
>                 objectMemory storePointerUnchecked: 2
>                         ofObject: info
>                         withValue: (objectMemory integerObjectOf: vmBins).
>                 objectMemory storePointerUnchecked: 3
>                         ofObject: info
>                         withValue: (objectMemory integerObjectOf:
> easBins)].
>         self pop: 2 thenPushBool: running!
>
> Item was changed:
>   ----- Method: InterpreterPrimitives>>primitiveVMProfileSamplesInto (in
> category 'process primitives') -----
>   primitiveVMProfileSamplesInto
>         "Primitive.
>          0 args: Answer whether the VM Profiler is running or not.
>          1 arg: Copy the sample data into the supplied argument, which
> must be a Bitmap
>                         of suitable size. Answer the number of samples
> copied into the buffer."
>         | sampleBuffer sampleBufferAddress running bufferSize numSamples |
>         <var: #bufferSize type: #long>
>         <var: #sampleBufferAddress type: #'unsigned long *'>
>         self cCode: 'ioNewProfileStatus(&running,&bufferSize)'
>                 inSmalltalk: [running := false. bufferSize := 0].
>         argumentCount = 0 ifTrue:
>                 [^self pop: 1 thenPushBool: running].
>         self success: argumentCount = 1.
>         self successful ifTrue:
> +               [sampleBuffer := self stackObjectValue: 0].
> +       self successful ifTrue:
> +               [self assertClassOf: sampleBuffer is: (objectMemory
> splObj: ClassBitmap).
> -               [sampleBuffer := self stackObjectValue: 0.
> -                self assertClassOf: sampleBuffer is: (objectMemory
> splObj: ClassBitmap).
>                  self success: (objectMemory numSlotsOf: sampleBuffer) >=
> bufferSize].
>         self successful ifFalse:
>                 [^nil].
>         sampleBufferAddress := objectMemory firstFixedField: sampleBuffer.
>         numSamples := self cCode:
> 'ioNewProfileSamplesInto(sampleBufferAddress)'
>                                                 inSmalltalk:
> [sampleBufferAddress := sampleBufferAddress].
>         self pop: argumentCount + 1 thenPushInteger: numSamples!
>
> Item was changed:
>   ----- Method: SmartSyntaxPluginTMethod>>fixUpReturnOneStmt:on: (in
> category 'transforming') -----
>   fixUpReturnOneStmt: stmt on: sStream
>
>         stmt isReturn ifFalse: [^sStream nextPut: stmt].
>         (stmt expression isSend
>          and: [#('primitiveFail' 'primitiveFailFor:') includes: stmt
> expression selector]) ifTrue:
>                 ["failure return"
>                  sStream nextPut: stmt expression.
>                  sStream nextPut: self nullReturnExpr.
>                  ^nil].
>         (stmt expression isVariable and: ['nil' = stmt expression name])
> ifTrue:
>                 ["^ nil -- this is never right unless automatically
> generated"
>                  sStream nextPut: stmt.
>                  ^nil].
>         (stmt expression isVariable and: ['self' = stmt expression name])
> ifTrue:
>                 ["^ self"
>                  self generateFailureGuardOn: sStream.
>                  fullArgs isEmpty ifFalse:[ sStream nextPut: (self
> popExpr: fullArgs size)].
>                  sStream nextPut: self nullReturnExpr.
>                  ^nil].
>         (stmt expression isVariable | stmt expression isConstant |
> suppressingFailureGuards) ifTrue:
>                 ["^ variable or ^ constant or ^ expr without guardchecking"
>                  self generateFailureGuardOn: sStream.
>                  sStream nextPut: (self pop: fullArgs size + 1
> thenReturnExpr: stmt expression).
>                  sStream nextPut: self nullReturnExpr.
>                  ^nil].
>         "^ expr with guardchecking"
> +       self generateFailureGuardOn: sStream.
>         sStream nextPut: (self assign: (self oopVariable: '_return_value')
> expression: stmt expression).
>         self generateFailureGuardOn: sStream.
>         sStream nextPut: (self pop: fullArgs size + 1 thenReturnExpr:
> (self oopVariable: '_return_value')).
>         sStream nextPut: self nullReturnExpr
>   !
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160305/5822b318/attachment-0001.htm


More information about the Vm-dev mailing list