JavaContext.st
author cg
Mon, 05 Jan 1998 18:49:32 +0000
changeset 252 04b330744577
parent 228 18ed0b234062
child 255 2d8b3948a08a
permissions -rw-r--r--
new javaVM stuff & back to pre-stefans changes

'From Smalltalk/X, Version:3.3.1 on 5-jan-1998 at 2:09:56 pm'                   !

Context subclass:#JavaContext
	instanceVariableNames:'exArg byteCode constPool method'
	classVariableNames:''
	poolDictionaries:''
	category:'Java-Support'
!


!JavaContext methodsFor:'ST context mimicri'!

argAt:n
    |arg0Index|

    self method isStatic ifTrue:[
        arg0Index := 0
    ] ifFalse:[
        arg0Index := 1
    ].
    ^ self at:arg0Index+n

    "Created: / 2.1.1998 / 17:54:13 / cg"
    "Modified: / 2.1.1998 / 21:39:30 / cg"
!

argAt:n put:value
    |arg0Index|

    self method isStatic ifTrue:[
        arg0Index := 0
    ] ifFalse:[
        arg0Index := 1
    ].
    ^ super argAt:arg0Index+n put:value

    "Created: / 2.1.1998 / 17:54:34 / cg"
    "Modified: / 2.1.1998 / 21:35:19 / cg"
!

args
    "return an array filled with the arguments of this context"

    |n arg1Index|

    n := self numArgs.
    n == 0 ifTrue:[
        "/ little optimization here - avaoid creating empty containers
        ^ #()
    ].

    self method isStatic ifTrue:[
        arg1Index := 1
    ] ifFalse:[
        arg1Index := 2
    ].
    ^ (Array new:n) replaceFrom:1 to:n with:self startingAt:arg1Index.

    "Created: / 2.1.1998 / 17:54:57 / cg"
    "Modified: / 2.1.1998 / 21:34:44 / cg"
!

argsAndVars
    "return an array filled with the arguments and variables of this context"

    |n arg1Index|

    n := self numArgs + self numVars.
    n == 0 ifTrue:[
        "/ little optimization here - avaoid creating empty containers
        ^ #()
    ].
    self method isStatic ifTrue:[
        arg1Index := 1
    ] ifFalse:[
        arg1Index := 2
    ].
    ^ (Array new:n) replaceFrom:1 to:n with:self startingAt:arg1Index.

    "Created: / 2.1.1998 / 17:55:14 / cg"
    "Modified: / 2.1.1998 / 21:35:39 / cg"
!

canReturn
    ^ false

    "Created: 1.5.1996 / 15:05:36 / cg"
!

lineNumber
    |nr pc|

    pc := self pc.

"/ 'ask line for pc:' print. pc printCR.
    pc isNil ifTrue:[" '-> 0 [a]' printCR. " ^0].

    nr := self method lineNumberForPC:pc.
    nr isNil ifTrue:[" '-> 0 [b]' printCR. " ^ 0].
"/ '-> ' print. nr printCR.
     ^ nr.

    "Created: / 1.5.1996 / 15:05:47 / cg"
    "Modified: / 4.1.1998 / 23:35:38 / cg"
!

lineNumberFromMethod
    |m|

    m := self method.
    m notNil ifTrue:[
        ^ m lineNumber
    ].
    ^ nil

    "Created: / 4.1.1998 / 23:34:45 / cg"
    "Modified: / 4.1.1998 / 23:35:55 / cg"
!

method
    "the method may be found in the interpreter temps ..."

    (method isMemberOf:JavaMethod) ifTrue:[^ method].
    ^ super method

    "Created: / 1.5.1996 / 15:03:43 / cg"
    "Modified: / 2.1.1998 / 21:38:00 / cg"
!

methodHome
    ^ self
!

numArgs
    "return the number of args.
     Redefined since Java keeps the receiver of a non-static method
     at local slot 0."

    |n|

    n := super numArgs.
    self method isStatic ifFalse:[
        n := n - 1
    ].
    ^ n

    "Created: / 2.1.1998 / 22:21:24 / cg"
!

pc
    lineNr isNil ifTrue:[^ nil].
    ^ super lineNumber

    "Created: / 4.1.1998 / 23:33:48 / cg"
!

selector
    "the selector can be extracted from the method.
     the method may be found in the interpreter temps ..."

    |s m|

    selector isNil ifTrue:[
	m := self method.
	m notNil ifTrue:[
	    ^ m name
	]
    ].
    ^ super selector

    "Modified: / 30.12.1997 / 17:22:06 / cg"
    "Created: / 30.12.1997 / 17:23:47 / cg"
!

setPC:newPC
    lineNr := newPC

    "Created: / 5.1.1998 / 00:09:02 / cg"
! !

!JavaContext methodsFor:'exception handler support'!

markForException
    "set the exception handler flag in the receiver.
     The JVM needs this to enter an exception handler instead of restarting
     from the beginning (when the context is restarted).
     - a highly internal mechanism and not for public use."

%{  /* NOCONTEXT */
     __INST(flags) = (OBJ)((INT)__INST(flags) | __MASKSMALLINT(__JAVA_EX_PEND));
%}

    "Modified: 13.12.1995 / 19:05:22 / cg"
! !

!JavaContext methodsFor:'printing & storing'!

receiverPrintString
    "return a string describing the receiver of the context" 

    |receiverClass receiverClassName newString implementorClass|

%{
    /*
     * special handling for (invalid) free objects.
     * these only appear if some primitiveCode does not correctly use SEND macros,
     * which may lead to sends to free objects. In normal operation, this 'cannot' happen.
     */ 
    if (__isNonNilObject(__INST(receiver)) && (__qClass(__INST(receiver))==nil)) {
	receiverClassName = __MKSTRING("FreeObject");
    }
%}.
    receiverClassName notNil ifTrue:[^ receiverClassName].

    receiverClass := receiver class.
    receiverClassName := receiverClass name.
    (receiverClass == SmallInteger) ifTrue:[
	newString := '(' , receiver printString , ') ' , receiverClassName
    ] ifFalse:[
	newString := receiverClassName
    ].

    "
     kludge to avoid slow search for containing class
    "
    (selector ~~ #doIt and:[selector ~~ #doIt:]) ifTrue:[
	implementorClass := self methodClass. 
    ].
    implementorClass notNil ifTrue: [
	(implementorClass ~~ receiverClass) ifTrue: [
	    newString := newString , '>>>',
			 implementorClass name printString
	]
    ] ifFalse:[
	self searchClass ~~ receiverClass ifTrue:[
	    newString := newString , '>>>' , self searchClass name
	].
"/        "
"/         kludge for doIt - these unbound methods are not
"/         found in the classes methodDictionary
"/        "
"/        (selector ~~ #doIt and:[selector ~~ #doIt:]) ifTrue:[
"/            newString := newString , '>>>**NONE**'
"/        ]
    ].

    ^ newString

! !

!JavaContext class methodsFor:'documentation'!

version
    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaContext.st,v 1.18 1998/01/05 18:47:12 cg Exp $'
! !