Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.418.mcz ==================== Summary ==================== Name: Compiler-eem.418 Author: eem Time: 11 March 2020, 6:58:07.871201 pm UUID: 2e87ec87-7501-451f-88a5-3049d9cebf02 Ancestors: Compiler-nice.417 Enable read-only literals, and set all literals to be read-only via a paxkage postscript which avoids the recompile step. =============== Diff against Compiler-nice.417 =============== Item was changed: ----- Method: Encoder>>litIndex: (in category 'encoding') ----- litIndex: literal | p | p := literalStream position. p = self maxNumLiterals ifTrue: [self notify: 'More than ', self maxNumLiterals printString, ' literals referenced.\You must split or otherwise simplify this method.\The ' withCRs, (self maxNumLiterals + 1) printString, 'th literal is: ', literal printString. ^nil]. + literal isLiteral ifTrue: "filters out BlockClosures, ExternalLibraryFunctions" + [(literal isReadOnlyObject + or: [literal isVariableBinding]) ifFalse: + [literal setIsReadOnlyObject: true]]. "Would like to show where it is in the source code, but that info is hard to get." literalStream nextPut: literal. ^p! Item was changed: ----- Method: Parser>>externalFunctionDeclaration (in category 'primitives') ----- externalFunctionDeclaration "Parse the function declaration for a call to an external library." | descriptorClass callType modifier retType externalName args argType module fn | descriptorClass := cue environment valueOf: #ExternalFunction ifAbsent: [^ false]. callType := descriptorClass callingConventionFor: here. callType == nil ifTrue:[^false]. [modifier := descriptorClass callingConventionModifierFor: token. modifier notNil] whileTrue: [self advance. callType := callType bitOr: modifier]. "Parse return type" self advance. retType := self externalType: descriptorClass. retType == nil ifTrue:[^self expected:'return type']. "Parse function name or index" externalName := here. (self match: #string) ifTrue:[externalName := externalName asSymbol] ifFalse:[(self match:#number) ifFalse:[^self expected:'function name or index']]. (self match: #leftParenthesis) ifFalse:[^self expected:'argument list']. args := WriteStream on: Array new. [self match: #rightParenthesis] whileFalse:[ argType := self externalType: descriptorClass. argType == nil ifTrue:[^self expected:'argument']. argType isVoid & argType isPointerType not ifFalse:[args nextPut: argType]]. (self matchToken: 'module:') ifTrue:[ module := here. (self match: #string) ifFalse:[^self expected: 'String']. module := module asSymbol]. Smalltalk at: #ExternalLibraryFunction ifPresent:[:xfn| fn := xfn name: externalName module: module callType: callType returnType: retType argumentTypes: args contents. + self litIndex: fn. + fn beWritableObject. "Undo the read-only setting in litIndex:"]. - self allocateLiteral: fn]. (self matchToken: 'error:') ifTrue: [| errorCodeVariable | errorCodeVariable := here. (hereType == #string or: [hereType == #word]) ifFalse:[^self expected: 'error code (a variable or string)']. self advance. self addPragma: (Pragma keyword: #primitive:error: arguments: (Array with: 120 with: errorCodeVariable)). fn ifNotNil: [fn setErrorCodeName: errorCodeVariable]] ifFalse: [self addPragma: (Pragma keyword: #primitive: arguments: #(120))]. ^true! Item was changed: ----- Method: Parser>>primitive:module:error: (in category 'primitives') ----- primitive: aNameString module: aModuleStringOrNil error: errorCodeVariableOrNil "Create named primitive with optional error code." + | firstLiteral | - (aNameString isString and: [ aModuleStringOrNil isNil or: [ aModuleStringOrNil isString ] ]) ifFalse: [ ^ self expected: 'Named primitive' ]. + firstLiteral := { aModuleStringOrNil ifNotNil: [aModuleStringOrNil asSymbol]. + aNameString asSymbol. + 0. + 0 }. + (encoder litIndex: firstLiteral) ~= 0 ifTrue: + [self error: 'parser failed to allocate [primitive binding array as first literal']. + firstLiteral beWritableObject. "Undo the read-only setting in litIndex:" - self allocateLiteral: (Array - with: (aModuleStringOrNil isNil - ifFalse: [ aModuleStringOrNil asSymbol ]) - with: aNameString asSymbol - with: 0 with: 0). errorCodeVariableOrNil ifNotNil: [encoder floatTemp: (encoder bindTemp: errorCodeVariableOrNil) nowHasDef]. ^117! Item was changed: (PackageInfo named: 'Compiler') postscript: '"below, add code to be run after the loading of this package" + + "Make all relevant literals read-only, avoiding the recompile step, so as to avoid unbound methods" + self systemNavigation allSelect: + [:m| + m allLiteralsDo: + [:l| + (l isLiteral + and: [(l isCollection or: [l isNumber and: [l isReadOnlyObject not]]) + and: [(l isArray and: [m primitive == 117 and: [l == (m literalAt: 1)]]) not]]) ifTrue: + [l beReadOnlyObject]]. + false]'! - "Make sure that all those ``code generation (closures)'''' categoies disappear" - ParseNode withAllSubclasses do: - [:pnc| pnc organization removeEmptyCategories]'! |
Free forum by Nabble | Edit this page |