Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validate if locals/args exist when adding a type declaration #603

Merged
12 changes: 12 additions & 0 deletions smalltalksrc/Slang-Tests/SLBasicTestDeclarationClass.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ Class {
#category : #'Slang-Tests'
}

{ #category : #translation }
SLBasicTestDeclarationClass class >> typeForSelf [

^#implicit
]
Comment on lines +7 to +11
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this necessary? Is it not always implicit (except for structs)?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The inherited behaviour from SlangClass is to return nil. Or are you saying that at some point that nil defaults to #implicit?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just asking for understanding, because this definition is in the tests, but maybe could be in a more general place? I don't know.
Anyway, it is out of the scope of this PR, so we can continue with our life.


{ #category : #'as yet unclassified' }
SLBasicTestDeclarationClass >> methodWithBlockLocalDeclaration [

Expand Down Expand Up @@ -31,3 +37,9 @@ SLBasicTestDeclarationClass >> methodWithNonExistingLocalDeclaration [
"var does not exist"
<var: 'var' type: 'toto'>
]

{ #category : #'as yet unclassified' }
SLBasicTestDeclarationClass >> methodWithUndefinedLocal [

<var: 'var' type: 'toto'>
]
ivojawer marked this conversation as resolved.
Show resolved Hide resolved
16 changes: 16 additions & 0 deletions smalltalksrc/Slang-Tests/SLTestDeclarations.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ SLTestDeclarations >> setUp [
ccg addClass: SLBasicTestDeclarationClass
]

{ #category : #tests }
SLTestDeclarations >> testAddTypeForSelfWithDeclarationsDoesNotThrowError [

| method |
method := ccg methodNamed: #methodWithUndefinedLocal.
self shouldnt: [ method addTypeForSelf ] raise: Error
PalumboN marked this conversation as resolved.
Show resolved Hide resolved
]

{ #category : #tests }
SLTestDeclarations >> testAllLocalsReturnsBlockLocals [

Expand Down Expand Up @@ -69,3 +77,11 @@ SLTestDeclarations >> testLocalsReturnsDirectLocals [
assertCollection: (ccg methodNamed: #methodWithLocal) locals
hasSameElements: #( 'var' )
]

{ #category : #tests }
SLTestDeclarations >> testUndefinedLocalWithDeclarationsThrowsError [

| method |
method := ccg methodNamed: #methodWithUndefinedLocal.
self should: [ method recordDeclarationsIn: ccg ] raise: TranslationError
]
114 changes: 75 additions & 39 deletions smalltalksrc/Slang-Tests/SlangBasicTranslationTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4217,7 +4217,9 @@ SlangBasicTranslationTest >> testSendIntegerObjectOfConstantValue [
SlangBasicTranslationTest >> testSendIntegerObjectOfSignedValue [

| translation send |
generator currentMethod declarationAt: 'var' put: 'long'.

generator currentMethod addLocal: 'var'; declarationAt: 'var' put: 'long'.

send := TSendNode new
setSelector: #integerObjectOf:
receiver: (TVariableNode named: 'self')
Expand All @@ -4231,7 +4233,7 @@ SlangBasicTranslationTest >> testSendIntegerObjectOfSignedValue [
SlangBasicTranslationTest >> testSendIntegerObjectOfUnsignedSmallValue [

| translation send |
generator currentMethod declarationAt: 'var' put: 'unsigned short'.
generator currentMethod addLocal: 'var'; declarationAt: 'var' put: 'unsigned short'.
send := TSendNode new
setSelector: #integerObjectOf:
receiver: (TVariableNode named: 'self')
Expand All @@ -4245,14 +4247,18 @@ SlangBasicTranslationTest >> testSendIntegerObjectOfUnsignedSmallValue [
SlangBasicTranslationTest >> testSendIntegerObjectOfUnsignedValue [

| translation send |
generator currentMethod declarationAt: 'var' put: 'unsigned long'.
generator currentMethod
addLocal: 'var';
declarationAt: 'var' put: 'unsigned long'.
send := TSendNode new
setSelector: #integerObjectOf:
receiver: (TVariableNode named: 'self')
arguments: { TVariableNode named: 'var' }.
setSelector: #integerObjectOf:
receiver: (TVariableNode named: 'self')
arguments: { (TVariableNode named: 'var') }.
translation := self translate: send.

self assert: translation equals: '((var << ', numSmallIntegerTagBits asString, ') | 1)'
self
assert: translation
equals: '((var << ' , numSmallIntegerTagBits asString , ') | 1)'
]

{ #category : #'tests-builtins' }
Expand Down Expand Up @@ -4353,7 +4359,7 @@ SlangBasicTranslationTest >> testSendLeftBitShifNegativeLitteralIntegerOverflow
SlangBasicTranslationTest >> testSendLeftBitShift [

| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
generator currentMethod addLocal:'a'; declarationAt: 'a' put: 'sqInt'.
send := TSendNode new
setSelector: #<<
receiver: (TVariableNode new setName: 'a')
Expand All @@ -4367,10 +4373,12 @@ SlangBasicTranslationTest >> testSendLeftBitShift [
SlangBasicTranslationTest >> testSendLeftBitShiftByVariable [

| translation send |
generator currentMethod declarationAt: 'a' put: 'unsigned short'.

generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'unsigned short'.

send := TSendNode new
setSelector: #<<
setSelector: #'<<'
PalumboN marked this conversation as resolved.
Show resolved Hide resolved
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
Expand All @@ -4382,9 +4390,11 @@ SlangBasicTranslationTest >> testSendLeftBitShiftByVariable [
SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn32Bits [

| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'sqInt'.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
Expand All @@ -4396,10 +4406,12 @@ SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn32Bits [
SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn64Bits [

| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'sqInt'.
generator wordSize: 8.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TConstantNode value: 3)
arguments: { (TVariableNode new setName: 'a') }.
translation := self translate: send.
Expand All @@ -4411,9 +4423,11 @@ SlangBasicTranslationTest >> testSendLeftBitShiftByVariableIn64Bits [
SlangBasicTranslationTest >> testSendLeftBitShiftLong [

| translation send |
generator currentMethod declarationAt: 'a' put: 'sqLong'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'sqLong'.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand All @@ -4425,9 +4439,11 @@ SlangBasicTranslationTest >> testSendLeftBitShiftLong [
SlangBasicTranslationTest >> testSendLeftBitShiftShortType [

| translation send |
generator currentMethod declarationAt: 'a' put: 'short'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'short'.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand All @@ -4439,9 +4455,11 @@ SlangBasicTranslationTest >> testSendLeftBitShiftShortType [
SlangBasicTranslationTest >> testSendLeftBitShiftUnsigned [

| translation send |
generator currentMethod declarationAt: 'a' put: 'usqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'usqInt'.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand All @@ -4453,9 +4471,11 @@ SlangBasicTranslationTest >> testSendLeftBitShiftUnsigned [
SlangBasicTranslationTest >> testSendLeftBitShiftUnsignedShortType [

| translation send |
generator currentMethod declarationAt: 'a' put: 'unsigned short'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'unsigned short'.
send := TSendNode new
setSelector: #<<
setSelector: #'<<'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand Down Expand Up @@ -4687,17 +4707,21 @@ SlangBasicTranslationTest >> testSendPerformWith [
SlangBasicTranslationTest >> testSendPerformWithAccessor [

| translation send |
generator currentMethod declarationAt: 'aPrimitiveDescriptor' put: #'PrimitiveDescriptor *'.
generator currentMethod
addLocal: 'aPrimitiveDescriptor';
declarationAt: 'aPrimitiveDescriptor' put: #'PrimitiveDescriptor *'.
send := TSendNode new
setSelector: #perform:
receiver: (TVariableNode named: 'objectRepresentation')
arguments: { TSendNode new
setSelector: #primitiveGenerator
receiver: (TVariableNode named: 'aPrimitiveDescriptor')
arguments: #() }.
arguments: { (TSendNode new
setSelector: #primitiveGenerator
receiver: (TVariableNode named: 'aPrimitiveDescriptor')
arguments: #( )) }.
translation := self translate: send.

self assert: translation equals: '(primitiveGenerator(aPrimitiveDescriptor))()'
self
assert: translation
equals: '(primitiveGenerator(aPrimitiveDescriptor))()'
]

{ #category : #'tests-builtins' }
Expand Down Expand Up @@ -4836,10 +4860,12 @@ SlangBasicTranslationTest >> testSendRepeat [
SlangBasicTranslationTest >> testSendRightBitShiftSignedIn64Bits [

| translation send |
generator currentMethod declarationAt: 'a' put: 'sqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'sqInt'.
generator wordSize: 8.
send := TSendNode new
setSelector: #>>
setSelector: #'>>'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand All @@ -4851,9 +4877,11 @@ SlangBasicTranslationTest >> testSendRightBitShiftSignedIn64Bits [
SlangBasicTranslationTest >> testSendRightBitShiftUnsigned [

| translation send |
generator currentMethod declarationAt: 'a' put: 'usqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'usqInt'.
send := TSendNode new
setSelector: #>>
setSelector: #'>>'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand All @@ -4865,10 +4893,12 @@ SlangBasicTranslationTest >> testSendRightBitShiftUnsigned [
SlangBasicTranslationTest >> testSendRightBitShiftUnsignedIn64Bits [

| translation send |
generator currentMethod declarationAt: 'a' put: 'usqInt'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'usqInt'.
generator wordSize: 8.
send := TSendNode new
setSelector: #>>
setSelector: #'>>'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand Down Expand Up @@ -5136,9 +5166,11 @@ SlangBasicTranslationTest >> testSendSignedIntToShort [
SlangBasicTranslationTest >> testSendSignedRightBitShiftVariable64Bits [

| translation send |
generator currentMethod declarationAt: 'a' put: 'long long'.
generator currentMethod
addLocal: 'a';
declarationAt: 'a' put: 'long long'.
send := TSendNode new
setSelector: #>>>
setSelector: #'>>>'
receiver: (TVariableNode new setName: 'a')
arguments: { (TConstantNode value: 3) }.
translation := self translate: send.
Expand Down Expand Up @@ -6163,7 +6195,9 @@ SlangBasicTranslationTest >> testSwitchStatementInAssignmentAddAssignmentToEndOf
SlangBasicTranslationTest >> testSwitchStatementInAssignmentAddAssignmentToEndOfCasesWithNoDefaultStatement [

| translation |
generator currentMethod declarationAt: 'toto' put: 'int toto'.
generator currentMethod
addLocal: 'toto';
declarationAt: 'toto' put: 'int toto'.
translation := self translate: (TAssignmentNode new
setVariable: (TVariableNode named: 'toto')
expression: (TSwitchStmtNode new
Expand Down Expand Up @@ -6197,7 +6231,9 @@ SlangBasicTranslationTest >> testSwitchStatementInAssignmentAddAssignmentToEndOf
SlangBasicTranslationTest >> testSwitchStatementInAssignmentAddAssignmentToEndOfCasesWithNoDefaultStatementAndAssignmentVariableIsPointer [

| translation |
generator currentMethod declarationAt: 'toto' put: 'int* toto'.
generator currentMethod
addLocal: 'toto';
declarationAt: 'toto' put: 'int* toto'.
translation := self translate: (TAssignmentNode new
setVariable: (TVariableNode named: 'toto')
expression: (TSwitchStmtNode new
Expand Down