2007-07-17 Stephen Compall * packages/stinst/compiler/STCompiler.st: Rename #compileString: et al to #primCompile:, and change uses accordingly. * kernel/Behavior.st: Rename #compileString: to #primCompile: and document; similarly with #compileString:ifError:. In evaluation methods, remove vacuous "code isMemberOf: String" cases in evaluation methods, remove some inlining, and fix the WriteStream cases. (#compile:, #compile:ifError:): Use #primCompile:. (#evalString:to:, #evalString:to:ifError:): Use #compile: and #compile:ifError:. * kernel/Metaclass.st: Mention #primCompile:. * unsupported/er2.st: Use #primCompile:. * unsupported/IfError.st: Likewise. * packages/httpd/STT.st: Use #compile:. * libgst/prims.def: Rename compileString primitives to primCompile. * libgst/xlat.c: Mention #primCompile:. --- orig/kernel/Behavior.st +++ mod/kernel/Behavior.st @@ -215,11 +215,11 @@ "Compile method source. If there are parsing errors, answer nil. Else, return a CompiledMethod result of compilation" (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ]. + ifTrue: [ ^self primCompile: code readStream ]. (code isKindOf: Stream) - ifTrue: [ ^self compileString: code ]. + ifTrue: [ ^self primCompile: code ]. - ^self compileString: code asString + ^self primCompile: code asString ! compile: code ifError: block @@ -227,11 +227,11 @@ exception block, 'block' passing file name, line number and error. Return a CompiledMethod result of compilation" (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ifError: block ]. + ifTrue: [ ^self primCompile: code readStream ifError: block ]. (code isKindOf: Stream) - ifTrue: [ ^self compileString: code ifError: block ]. + ifTrue: [ ^self primCompile: code ifError: block ]. - ^self compileString: code asString ifError: block + ^self primCompile: code asString ifError: block ! compile: code notifying: requestor @@ -378,7 +378,7 @@ [ next := self extractEvalChunk: s. method := anObject class - compileString: 'Doit ^ [ + compile: 'Doit ^ [ ', next, ' ] value ' ifError: [ :fname :line :error | nil ]. method isNil | (next allSatisfy: [ :each | each = Character space ]) @@ -393,14 +393,14 @@ evalString: aString to: anObject ifError: aBlock "Answer the stack top at the end of the evaluation of the code in aString. If aString cannot be parsed, evaluate aBlock (see - compileString:ifError:). The code is executed as part of anObject" + compile:ifError:). The code is executed as part of anObject" | s result next method | s := ReadStream on: aString. [ next := self extractEvalChunk: s. method := anObject class - compileString: 'Doit ^ [ + compile: 'Doit ^ [ ', next, ' ] value ' ifError: [:fname :lineNo :errorString | aBlock value: fname value: lineNo - 1 value: errorString. @@ -419,26 +419,14 @@ evaluate: code "Evaluate Smalltalk expression in 'code' and return result." - (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ]. - (code isKindOf: Stream) - ifTrue: [ ^self evalString: code contents to: nil ]. - (code isMemberOf: String) - ifFalse: [ ^self evalString: code asString to: nil ]. - ^self evalString: code to: nil + ^self evaluate: code to: nil ! evaluate: code ifError: block "Evaluate 'code'. If a parsing error is detected, invoke 'block'" - (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ]. - (code isKindOf: Stream) - ifTrue: [ ^self evalString: code contentsto: nil ifError: block ]. - (code isMemberOf: String) - ifFalse: [ ^self evalString: code asString to: nil ifError: block ]. - ^self evalString: code to: nil ifError: block. + ^self evaluate: code to: nil ifError: block ! evaluate: code to: anObject ifError: block @@ -446,24 +434,16 @@ method is used to support Inspector expression evaluation. If a parsing error is encountered, invoke error block, 'block'" - (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ]. - (code isKindOf: Stream) + (code isKindOf: Stream) ifTrue: [ ^self evalString: code contents to: anObject ifError: block ]. - (code isMemberOf: String) - ifFalse: [ ^self evalString: code asString to: anObject ifError: block ]. ^self evalString: code to: anObject ifError: block. ! evaluate: code to: anObject "Evaluate Smalltalk expression as part of anObject's method definition" - (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ]. (code isKindOf: Stream) ifTrue: [ ^self evalString: code contents to: anObject ]. - (code isMemberOf: String) - ifFalse: [ ^self evalString: code asString to: anObject ]. ^self evalString: code to: anObject. ! @@ -1401,19 +1381,24 @@ ^self primitiveFailed ! -compileString: aString - "Compile the code in aString, with no category. Fail if the code - does not obey Smalltalk syntax. Answer the generated CompiledMethod - if it does" - +primCompile: code + "Compile the code, a string or readable stream, with no + category. Fail if the code does not obey Smalltalk syntax. Answer + the generated CompiledMethod if it does. + + Do not send this in user code; use #compile: or related methods + instead." + ^self primitiveFailed ! -compileString: aString ifError: aBlock - "Compile the code in aString, with no category. Evaluate aBlock - (passing the file name, line number and description of the error) if - the code does not obey Smalltalk syntax. Answer the generated - CompiledMethod if it does" - +primCompile: code ifError: aBlock + "As with #primCompile:, but evaluate aBlock (passing the file + name, line number and description of the error) if the code does + not obey Smalltalk syntax. + + Do not send this in user code; use #compile:ifError: or related + methods instead." + ^self primitiveFailed ! ! --- orig/kernel/Metaclass.st +++ mod/kernel/Metaclass.st @@ -340,7 +340,7 @@ "Please note that I need to recompile the classes in this sequence; otherwise, the same error is propagated to each selector which is compiled after an error is detected even though there are no further compilation - errors. Apparently, there is a bug in the primitive compileString. This + errors. Apparently, there is a bug in the primitive #primCompile:. This can be cleaned up later" (needToRecompileClasses | needToRecompileMetaclasses) --- orig/libgst/prims.def +++ mod/libgst/prims.def @@ -4941,9 +4941,9 @@ PRIM_FAILED; } -/* Behavior compileString: aString */ +/* Behavior primCompile: aString */ -primitive VMpr_Behavior_compileString [succeed] +primitive VMpr_Behavior_primCompile [succeed] { OOP oop1; OOP oop2; @@ -4964,8 +4964,8 @@ PRIM_SUCCEEDED; } -/* Behavior compileString: aString ifError: aBlock */ -primitive VMpr_Behavior_compileStringIfError [fail,succeed,reload_ip] +/* Behavior primCompile: aString ifError: aBlock */ +primitive VMpr_Behavior_primCompileIfError [fail,succeed,reload_ip] { OOP oop1; OOP oop2; --- orig/libgst/xlat.c +++ mod/libgst/xlat.c @@ -3223,7 +3223,7 @@ /* If they don't, check if we came here because somebody called send_block_value. In this case, the number of arguments is surely valid and the inline cache's numArgs is bogus. This handles - #valueWithArguments:, #compileString:ifError: and other primitives + #valueWithArguments:, #primCompile:ifError: and other primitives in which send_block_value is used. */ jit_ldi_p (JIT_R2, &native_ip); jit_bnei_p (do_send_code, JIT_R2, current->nativeCode); --- orig/packages/httpd/STT.st +++ mod/packages/httpd/STT.st @@ -120,7 +120,7 @@ stream := String new writeStream. self writeSmalltalkCodeOn: stream. - method := anObject class compileString: stream contents. + method := anObject class compile: stream contents. self cache: method. anObject class removeSelector: method selector. ^method --- orig/packages/stinst/compiler/StartCompiler.st +++ mod/packages/stinst/compiler/StartCompiler.st @@ -324,14 +324,14 @@ compile: code for: self classified: nil parser: dummyParser]. (code isKindOf: WriteStream) - ifTrue: [ ^self compileString: code readStream ifError: block ]. + ifTrue: [ ^self primCompile: code readStream ifError: block ]. (code isKindOf: Stream) - ifTrue: [ ^self compileString: code ifError: block ]. + ifTrue: [ ^self primCompile: code ifError: block ]. - ^self compileString: code asString ifError: block + ^self primCompile: code asString ifError: block ! -compileString: aString +primCompile: aString "Compile aString, which should be a string or stream, as a method for my instances, installing it in my method dictionary. Signal an error if parsing or compilation fail, otherwise answer the @@ -350,7 +350,7 @@ parser: parser ! -compileString: aString ifError: aBlock +primCompile: aString ifError: aBlock | parser source | source := aString isString ifTrue: [ aString ] --- orig/unsupported/IfError.st +++ mod/unsupported/IfError.st @@ -1,5 +1,5 @@ -Object compileString: 'foo 3+'! -Object compileString: 'foo 3+' +Object primCompile: 'foo 3+'! +Object primCompile: 'foo 3+' ifError: [:a :b :c | a printNl. b printNl. c printNl]! --- orig/unsupported/er2.st +++ mod/unsupported/er2.st @@ -2,7 +2,7 @@ testInternal: aString block: aBlock ' in test internal' printNl. - self compileString: aString + self primCompile: aString ifError: aBlock. ' leaving test internal' printNl ! @@ -29,7 +29,7 @@ ']]]' printNl. ! ! -Object compileString: 'foo 3+'! +Object primCompile: 'foo 3+'! Object testExternal: 'foo 3+'! Object myTest: 'foo 3+'!