Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1079.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1079 Author: eem Time: 24 February 2015, 1:06:45.228 pm UUID: fdd342f3-6d47-4bbe-be50-86e2865b8b3b Ancestors: VMMaker.oscog-eem.1078
Avoid casting nil to pointers
=============== Diff against VMMaker.oscog-eem.1078 ===============
Item was added: + ----- Method: CCodeGenerator>>variableOfType:acceptsValue:ofType: (in category 'inlining') ----- + variableOfType: variableType acceptsValue: exprNode ofType: expressionType + "Simple type checking for assignment/return values" + + ^variableType isNil "means as yet untyped, hence can adapt" + or: [expressionType isNil "means we don't know. Potentially dangerous to say yes, but Slang is traditionally lax :(" + or: [variableType = expressionType + or: [variableType notNil + and: [(variableType includes: $*) + ifTrue: + [(exprNode isVariable and: [exprNode name = 'nil']) + or: [expressionType last = $* + and: [(self isVoidPointer: variableType) + or: [self isVoidPointer: expressionType]]]] + ifFalse: "Require a cast if assigning integral with floating-point but not the other way around" + [((self isIntegralCType: variableType) + and: [(self isIntegralCType: expressionType) + and: [(self sizeOfIntegralCType: variableType) >= (self sizeOfIntegralCType: expressionType)]]) + or: [(self isFloatingPointCType: variableType) + and: [(self isFloatingPointCType: expressionType) + or: [self isIntegralCType: expressionType]]]]]]]]!
Item was removed: - ----- Method: CCodeGenerator>>variableOfType:acceptsValueOfType: (in category 'inlining') ----- - variableOfType: variableType acceptsValueOfType: expressionType - "Simple type checking for assignment/return values" - - ^variableType isNil "means as yet untyped, hence can adapt" - or: [expressionType isNil "means we don't know. Potentially dangerous to say yes, but Slang is traditionally lax :(" - or: [variableType = expressionType - or: [variableType notNil - and: [(variableType includes: $*) - ifTrue: - [expressionType last = $* - and: [(self isVoidPointer: variableType) - or: [self isVoidPointer: expressionType]]] - ifFalse: "Require a cast if assigning integral with floating-point but not the other way around" - [((self isIntegralCType: variableType) - and: [(self isIntegralCType: expressionType) - and: [(self sizeOfIntegralCType: variableType) >= (self sizeOfIntegralCType: expressionType)]]) - or: [(self isFloatingPointCType: variableType) - and: [(self isFloatingPointCType: expressionType) - or: [self isIntegralCType: expressionType]]]]]]]]!
Item was changed: ----- Method: TMethod>>node:typeCompatibleWith:inliningInto:in: (in category 'inlining') ----- node: exprNode typeCompatibleWith: argName inliningInto: inlineSelector in: aCodeGen "Answer either exprNode or, iff argName is typed and exprNode is untyped, a cast of exprNode to the type of argName." | formalType actualType | ^((exprNode isSend or: [exprNode isVariable]) and: [(formalType := self typeFor: argName in: aCodeGen) notNil and: [(actualType := aCodeGen typeFor: exprNode in: self) isNil + or: [(aCodeGen variableOfType: formalType acceptsValue: exprNode ofType: actualType) not]]]) - or: [(aCodeGen variableOfType: formalType acceptsValueOfType: actualType) not]]]) ifTrue: [aCodeGen nodeToCast: exprNode to: formalType] ifFalse: [((exprNode isSend or: [exprNode isVariable]) and: [(aCodeGen variableOfType: (aCodeGen typeFor: exprNode in: self) + acceptsValue: exprNode + ofType: (self typeFor: argName in: aCodeGen)) not]) ifTrue: - acceptsValueOfType: (self typeFor: argName in: aCodeGen)) not]) ifTrue: [aCodeGen logger nextPutAll: 'type mismatch for formal ', argName, ' and actual ', exprNode asString, ' when inlining ', inlineSelector, ' in ', selector, '. Use a cast.'; cr; flush]. exprNode]!
vm-dev@lists.squeakfoundation.org