JavaVM.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 16 Jan 2013 21:31:50 +0000
branchrefactoring-vmdata
changeset 1973 617e6a088dd1
parent 1968 9ad4e27233cb
child 1970 a78cd5a84c77
child 1971 e75c1790521c
permissions -rw-r--r--
- JavaListInspectorView class: JavaListInspectorView - JavaFormalParameterNode class: JavaFormalParameterNode - JavaTypeNode class: JavaTypeNode - JavaScanner class: JavaScanner - JavaArrayTypeNode class: JavaArrayTypeNode - JavaParser class: JavaParser - JavaCommentNode class: JavaCommentNode - JavaIntTypeNode class: JavaIntTypeNode - JavaParseNodeBuilder class: JavaParseNodeBuilder - JavaMethodDeclaratorNode class: JavaMethodDeclaratorNode - JavaScannerBase class: JavaScannerBase - JavaFloatTypeNode class: JavaFloatTypeNode - JavaDocNode class: JavaDocNode - JavaClassOrInterfaceTypeNode class: JavaClassOrInterfaceTypeNode - stx_libjava_tools class: stx_libjava_tools - JavaSettingsApplication class: JavaSettingsApplication - JavaLongTypeNode class: JavaLongTypeNode - JavaParserII class: JavaParserII - JavaSourceReference class: JavaSourceReference - JavaCharTypeNode class: JavaCharTypeNode - JavaParser_Eclipse class: JavaParser_Eclipse - JavaSyntaxHighlighter class: JavaSyntaxHighlighter - JavaMethodNode class: JavaMethodNode - JavaBooleanTypeNode class: JavaBooleanTypeNode - JavaDoubleTypeNode class: JavaDoubleTypeNode - JavaSetInspectorView class: JavaSetInspectorView - JavaParseNode class: JavaParseNode - JavaVoidTypeNode class: JavaVoidTypeNode - JavaMapInspectorView class: JavaMapInspectorView - JavaParserI class: JavaParserI - extensions ...

"
 COPYRIGHT (c) 1996-2011 by Claus Gittinger

 New code and modifications done at SWING Research Group [1]:

 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
                            SWING Research Group, Czech Technical University in Prague

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.

 [1] Code written at SWING Research Group contains a signature
     of one of the above copright owners. For exact set of such code,
     see the differences between this version and version stx:libjava
     as of 1.9.2010
"
"{ Package: 'stx:libjava' }"

Object subclass:#JavaVM
	instanceVariableNames:''
	classVariableNames:'UnhandledJavaExceptionSignal JavaExceptionSignal
		UnimplementedInstructionSignal UnimplementedNativeMethodSignal
		BadMessageSignal InternalErrorSignal CallHandlerSignal LockTable
		LockTableAccess StackTrace EagerResolvingEnabled
		OldspaceIncreased PerfCounters 
		 MonitorTrace MonitorTraceId ExceptionTrace
		  OpenFileTableLock 
		ExceptionDebug ExitDebug StandardThreadGroup
		AcquiredMonitorsPerProcess DUMMY_LONG_HIGHWORD
		DUMMY_DOUBLE_HIGHWORD FirstWindowCreationSemaphore SimulatedOS
		O_WGgraphics_originX O_WGgraphics_originY O_WGgraphics_pData
		O_FramePeer_pNativeWidget O_FramePeer_pData LastGraphics LastGC
		 
		  
		ExceptionDebugPatterns NullPointerExceptionDebug
		DivisionByZeroExceptionDebug IOExceptionDebug Reflection
		 JavaPrivilegedAccessQuery 
		SmalltalkClassLoader FinalizationEnabled FinalizationLobby
		ParkUnparkSemaphores ThreadInterrupts'
	poolDictionaries:'JavaConstants JavaVMData'
	category:'Languages-Java-Support'
!

Object subclass:#Performance
	instanceVariableNames:'vm'
	classVariableNames:''
	poolDictionaries:''
	privateIn:JavaVM
!

Object subclass:#Reflection
	instanceVariableNames:'vm constantPoolMapping javaClasses javaArrayClasses
		javaMethodsPerMethod returnNilIfMissing realMethods'
	classVariableNames:''
	poolDictionaries:''
	privateIn:JavaVM
!

!JavaVM class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1996-2011 by Claus Gittinger

 New code and modifications done at SWING Research Group [1]:

 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
                            SWING Research Group, Czech Technical University in Prague

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.

 [1] Code written at SWING Research Group contains a signature
     of one of the above copright owners. For exact set of such code,
     see the differences between this version and version stx:libjava
     as of 1.9.2010

"
!

documentation
"Runtime support and environment for Java.
You shouldn't communicate with JavaVM directly,
use Java class instead. JavaVM is layer between
the native interpret and the rest of the system.
JavaVM implements native java virtual machine
methods called by interpret, hides java primitive
types handling, and gives the ST world ways to
control class loading and reflection"
!

nativeMethods
"
    all native methods:

        JavaMethod allSubInstances select:[:m |
            m isNative
        ]

    implemented methods:

        JavaMethod allSubInstances select:[:m |
            |sel|

            m isNative ifTrue:[
                sel := ('_' , m javaClass lastName , '_' , m name , ':') asSymbol.
                JavaVM class implements:sel.
            ] ifFalse:[
                false
            ]
        ]

    unimplemented methods:

        JavaMethod allSubInstances select:[:m |
            |sel|

            m isNative ifTrue:[
                sel := ('_' , m javaClass lastName , '_' , m name , ':') asSymbol.
                (JavaVM class implements:sel) not
            ] ifFalse:[
                false
            ]
        ]


    list of all native methods as in jdk1.1.3:

      X - implemented
      * - implemented to be validated
      x - implemented with limited functionality
      o - implemented as dummy (no functionality)

    X (Math::double sin (double))
    X (Math::double cos (double))
    X (Math::double tan (double))
    X (Math::double asin (double))
    X (Math::double acos (double))
    X (Math::double atan (double))
    X (Math::double exp (double))
    X (Math::double log (double))
    X (Math::double sqrt (double))
      (Math::double IEEEremainder (double double))
    X (Math::double ceil (double))
    X (Math::double floor (double))
      (Math::double rint (double))
      (Math::double atan2 (double double))
    X (Math::double pow (double double))

    X (Class::java.lang.Class forName (java.lang.String))
    X (Class::java.lang.Object newInstance ())
    * (Class::boolean isInstance (java.lang.Object))
    X (Class::boolean isAssignableFrom (java.lang.Class))
    X (Class::boolean isInterface ())
      (Class::boolean isArray ())
    X (Class::boolean isPrimitive ())
    X (Class::java.lang.String getName ())
    X (Class::java.lang.ClassLoader getClassLoader ())
    X (Class::java.lang.Class getSuperclass ())
      (Class::java.lang.Class[] getInterfaces ())
      (Class::java.lang.Class getComponentType ())
      (Class::int getModifiers ())
      (Class::java.lang.Object[] getSigners ())
      (Class::void setSigners (java.lang.Object[]))
    X (Class::java.lang.Class getPrimitiveClass (java.lang.String))
      (Class::java.lang.reflect.Field getField0 (java.lang.String int))
      (Class::java.lang.reflect.Field[] getFields0 (int))
    X (Class::java.lang.reflect.Method getMethod0 (java.lang.String java.lang.Class[] int))
    X (Class::java.lang.reflect.Method[] getMethods0 (int))
      (Class::java.lang.reflect.Constructor[] getConstructors0 (int))
      (Class::java.lang.reflect.Constructor getConstructor0 (java.lang.Class[] int))

    X (InetAddressImpl::java.lang.String getLocalHostName ())
    X (InetAddressImpl::void makeAnyLocalAddress (java.net.InetAddress))
    X (InetAddressImpl::byte[][] lookupAllHostAddr (java.lang.String))
      (InetAddressImpl::java.lang.String getHostByAddr (int))
    X (InetAddressImpl::int getInetFamily ())

    X (ResourceBundle::java.lang.Class[] getClassContext ())

    X (System::void setIn0 (java.io.InputStream))
    X (System::void setOut0 (java.io.PrintStream))
    X (System::void setErr0 (java.io.PrintStream))
    X (System::long currentTimeMillis ())
    X (System::void arraycopy (java.lang.Object int java.lang.Object int int))
    X (System::int identityHashCode (java.lang.Object))
    X (System::java.util.Properties initProperties (java.util.Properties))

    X (Thread::java.lang.Thread currentThread ())
    X (Thread::void yield ())
    X (Thread::void sleep (long))
    X (Thread::void start ())
    X (Thread::boolean isInterrupted (boolean))
    X (Thread::boolean isAlive ())
      (Thread::int countStackFrames ())
    X (Thread::void setPriority0 (int))
    X (Thread::void stop0 (java.lang.Object))
    X (Thread::void suspend0 ())
    X (Thread::void resume0 ())
    * (Thread::void interrupt0 ())

      (String::java.lang.String intern ())

    X (Float::int floatToIntBits (float))
    X (Float::float intBitsToFloat (int))

      (ObjectStreamClass::int getClassAccess (java.lang.Class))
      (ObjectStreamClass::java.lang.String[] getMethodSignatures (java.lang.Class))
      (ObjectStreamClass::int getMethodAccess (java.lang.Class java.lang.String))
      (ObjectStreamClass::java.lang.String[] getFieldSignatures (java.lang.Class))
      (ObjectStreamClass::int getFieldAccess (java.lang.Class java.lang.String))
      (ObjectStreamClass::java.io.ObjectStreamField[] getFields0 (java.lang.Class))
      (ObjectStreamClass::long getSerialVersionUID (java.lang.Class))
      (ObjectStreamClass::boolean hasWriteObject (java.lang.Class))
      (ObjectInputStream::java.lang.Class loadClass0 (java.lang.Class java.lang.String))
      (ObjectInputStream::void inputClassFields (java.lang.Object java.lang.Class int[]))
      (ObjectInputStream::java.lang.Object allocateNewObject (java.lang.Class java.lang.Class))
      (ObjectInputStream::java.lang.Object allocateNewArray (java.lang.Class int))
      (ObjectInputStream::boolean invokeObjectReader (java.lang.Object java.lang.Class))

      (SecurityManager::java.lang.Class[] getClassContext ())
    X (SecurityManager::java.lang.ClassLoader currentClassLoader ())
      (SecurityManager::int classDepth (java.lang.String))
    X (SecurityManager::int classLoaderDepth ())
      (SecurityManager::java.lang.Class currentLoadedClass0 ())

    X (ClassLoader::void init ())
    X (ClassLoader::java.lang.Class defineClass0 (java.lang.String byte[] int int))
    X (ClassLoader::void resolveClass0 (java.lang.Class))
    X (ClassLoader::java.lang.Class findSystemClass0 (java.lang.String))
    X (ClassLoader::java.io.InputStream getSystemResourceAsStream0 (java.lang.String))
      (ClassLoader::java.lang.String getSystemResourceAsName0 (java.lang.String))

    X (FileDescriptor::boolean valid ())
      (FileDescriptor::void sync ())
    X (FileDescriptor::java.io.FileDescriptor initSystemFD (java.io.FileDescriptor int))

    X (Object::java.lang.Class getClass ())
    X (Object::int hashCode ())
    X (Object::java.lang.Object clone ())
    X (Object::void notify ())
    X (Object::void notifyAll ())
    X (Object::void wait (long))

    X (FileOutputStream::void open (java.lang.String))
    X (FileOutputStream::void openAppend (java.lang.String))
    X (FileOutputStream::void write (int))
    X (FileOutputStream::void writeBytes (byte[] int int))
    X (FileOutputStream::void close ())
    X (FileInputStream::void open (java.lang.String))
    X (FileInputStream::int read ())
    X (FileInputStream::int readBytes (byte[] int int))
      (FileInputStream::long skip (long))
    X (FileInputStream::int available ())
    X (FileInputStream::void close ())

      (VM::int getState ())
      (VM::boolean threadsSuspended ())
      (VM::void unsuspendThreads ())
      (VM::void unsuspendSomeThreads ())

    X (File::boolean exists0 ())
    X (File::boolean canWrite0 ())
    X (File::boolean canRead0 ())
    X (File::boolean isFile0 ())
    X (File::boolean isDirectory0 ())
    X (File::long lastModified0 ())
    X (File::long length0 ())
    X (File::boolean mkdir0 ())
    X (File::boolean renameTo0 (java.io.File))
    X (File::boolean delete0 ())
      (File::boolean rmdir0 ())
    X (File::java.lang.String[] list0 ())
      (File::java.lang.String canonPath (java.lang.String))
    X (File::boolean isAbsolute ())

      (ObjectOutputStream::void outputClassFields (java.lang.Object java.lang.Class int[]))
      (ObjectOutputStream::boolean invokeObjectWriter (java.lang.Object java.lang.Class))

    X (Throwable::void printStackTrace0 (java.lang.Object))
    X (Throwable::java.lang.Throwable fillInStackTrace ())

    X (Double::long doubleToLongBits (double))
    X (Double::double longBitsToDouble (long))
    X (Double::double valueOf0 (java.lang.String))

    X (Runtime::void exitInternal (int))
    o (Runtime::void runFinalizersOnExit0 (boolean))
    o (Runtime::java.lang.Process execInternal (java.lang.String[] java.lang.String[]))
    X (Runtime::long freeMemory ())
    X (Runtime::long totalMemory ())
    X (Runtime::void gc ())
      (Runtime::void runFinalization ())
      (Runtime::void traceInstructions (boolean))
      (Runtime::void traceMethodCalls (boolean))
    X (Runtime::java.lang.String initializeLinkerInternal ())
    X (Runtime::java.lang.String buildLibName (java.lang.String java.lang.String))
    X (Runtime::int loadFileInternal (java.lang.String))

      (WDrawingSurfaceInfo::int lock ())
      (WDrawingSurfaceInfo::void unlock ())
      (WDrawingSurfaceInfo::int getHWnd ())
      (WDrawingSurfaceInfo::int getHBitmap ())
      (WDrawingSurfaceInfo::int getPBits ())
      (WDrawingSurfaceInfo::int getHDC ())
      (WDrawingSurfaceInfo::int getDepth ())
      (WDrawingSurfaceInfo::int getHPalette ())

    X (WDefaultFontCharset::boolean canConvert (char))

      (ColorModel::void deletepData ())
    X (WToolkit::void init (java.lang.Thread))
    X (WToolkit::void eventLoop ())
      (WToolkit::java.awt.image.ColorModel makeColorModel ())
    X (WToolkit::int getScreenResolution ())
    X (WToolkit::int getScreenWidth ())
    X (WToolkit::int getScreenHeight ())
      (WToolkit::void sync ())
    * (WToolkit::void beep ())
    X (WToolkit::void loadSystemColors (int[]))

      (WPrintJob::void end ())

    X (WDialogPeer::void create (sun.awt.windows.WComponentPeer))
    X (WDialogPeer::void _show ())
    X (WDialogPeer::void _hide ())

    X (WWindowPeer::void toFront ())
    X (WWindowPeer::void toBack ())
    X (WWindowPeer::void _setTitle (java.lang.String))
    X (WWindowPeer::void _setResizable (boolean))
    X (WWindowPeer::void create (sun.awt.windows.WComponentPeer))
    o (WWindowPeer::void updateInsets (java.awt.Insets))
      (WWindowPeer::java.awt.Component getContainerElement (java.awt.Container int))

    X (WCanvasPeer::void create (sun.awt.windows.WComponentPeer))

    X (WTextAreaPeer::void create (sun.awt.windows.WComponentPeer))
    X (WTextAreaPeer::void insertText (java.lang.String int))
      (WTextAreaPeer::void replaceText (java.lang.String int int))

    X (WTextComponentPeer::java.lang.String getText ())
    X (WTextComponentPeer::void setText (java.lang.String))
    X (WTextComponentPeer::int getSelectionStart ())
    X (WTextComponentPeer::int getSelectionEnd ())
    X (WTextComponentPeer::void select (int int))
    X (WTextComponentPeer::void enableEditing (boolean))

    X (WComponentPeer::void show ())
    X (WComponentPeer::void hide ())
    X (WComponentPeer::void enable ())
    X (WComponentPeer::void disable ())
    X (WComponentPeer::java.awt.Point getLocationOnScreen ())
    X (WComponentPeer::void reshape (int int int int))
    o (WComponentPeer::void handleEvent (java.awt.AWTEvent))
    o (WComponentPeer::void _dispose ())
    X (WComponentPeer::void _setForeground (int))
    X (WComponentPeer::void _setBackground (int))
    o (WComponentPeer::void setFont (java.awt.Font))
    o (WComponentPeer::void requestFocus ())
    o (WComponentPeer::void setCursor (java.awt.Cursor))
    o (WComponentPeer::void start ())
      (WComponentPeer::void _beginValidate ())
      (WComponentPeer::void endValidate ())
    o (WComponentPeer::void setZOrderPosition (sun.awt.windows.WComponentPeer))

    X (WFramePeer::void setMenuBar0 (sun.awt.windows.WMenuBarPeer))
    X (WFramePeer::void create (sun.awt.windows.WComponentPeer))
    X (WFramePeer::void _setIconImage (sun.awt.image.ImageRepresentation))

    o (WFontMetrics::boolean needsConversion (java.awt.Font sun.awt.FontDescriptor))
    o (WFontMetrics::int getMFCharSegmentWidth (java.awt.Font sun.awt.FontDescriptor boolean char[] int int byte[] int))
      (WFontMetrics::int bytesWidth (byte[] int int))
      (WFontMetrics::void init ())

    o (WChoicePeer::void select (int))
    o (WChoicePeer::void remove (int))
    o (WChoicePeer::void addItem (java.lang.String int))
    X (WChoicePeer::void reshape (int int int int))
    X (WChoicePeer::void create (sun.awt.windows.WComponentPeer))

    X (WLabelPeer::void setText (java.lang.String))
    o (WLabelPeer::void setAlignment (int))
    X (WLabelPeer::void create (sun.awt.windows.WComponentPeer))

    X (WMenuItemPeer::void _setLabel (java.lang.String))
    X (WMenuItemPeer::void create (sun.awt.windows.WMenuPeer))
    X (WMenuItemPeer::void enable (boolean))
    o (WMenuItemPeer::void _dispose ())
      (WMenuPeer::void addSeparator ())
      (WMenuPeer::void delItem (int))
    X (WMenuPeer::void createMenu (sun.awt.windows.WMenuBarPeer))
      (WMenuPeer::void createSubMenu (sun.awt.windows.WMenuPeer))

      (WPopupMenuPeer::void createMenu (sun.awt.windows.WComponentPeer))
      (WPopupMenuPeer::void _show (java.awt.Event))
      (WMenuBarPeer::void addMenu (java.awt.Menu))
      (WMenuBarPeer::void delMenu (int))
    X (WMenuBarPeer::void create (sun.awt.windows.WFramePeer))

      (WCheckboxMenuItemPeer::void setState (boolean))

    X (WFileDialogPeer::void show ())

    X (WCheckboxPeer::void setState (boolean))
    X (WCheckboxPeer::void setCheckboxGroup (java.awt.CheckboxGroup))
      (WCheckboxPeer::void setLabel (java.lang.String))
    X (WCheckboxPeer::void create (sun.awt.windows.WComponentPeer))

    X (WClipboard::void init ())
      (WClipboard::void setClipboardText (java.awt.datatransfer.StringSelection))
      (WClipboard::java.lang.String getClipboardText ())

    X (WListPeer::void addItem (java.lang.String int))
    X (WListPeer::void delItems (int int))
    X (WListPeer::void select (int))
      (WListPeer::void deselect (int))
      (WListPeer::void makeVisible (int))
    X (WListPeer::void setMultipleSelections (boolean))
    X (WListPeer::void create (sun.awt.windows.WComponentPeer))
    X (WListPeer::boolean isSelected (int))

    x (WScrollbarPeer::void _setValues (int int int int))
    x (WScrollbarPeer::void setLineIncrement (int))
    x (WScrollbarPeer::void setPageIncrement (int))
    x (WScrollbarPeer::void create (sun.awt.windows.WComponentPeer))

    x (ImageRepresentation::void offscreenInit (java.awt.Color))
    x (ImageRepresentation::boolean setBytePixels (int int int int java.awt.image.ColorModel byte[] int int))
    x (ImageRepresentation::boolean setIntPixels (int int int int java.awt.image.ColorModel int[] int int))
    x (ImageRepresentation::boolean finish (boolean))
    X (ImageRepresentation::void imageDraw (java.awt.Graphics int int java.awt.Color))
    x (ImageRepresentation::void imageStretch (java.awt.Graphics int int int int int int int int java.awt.Color))
    x (ImageRepresentation::void disposeImage ())

    X (WTextFieldPeer::void create (sun.awt.windows.WComponentPeer))
    X (WTextFieldPeer::void setEchoCharacter (char))

    X (WScrollPanePeer::void create (sun.awt.windows.WComponentPeer))
    o (WScrollPanePeer::int getOffset (int))
      (WScrollPanePeer::void setInsets ())
      (WScrollPanePeer::void setScrollPosition (int int))
    x (WScrollPanePeer::int _getHScrollbarHeight ())
    x (WScrollPanePeer::int _getVScrollbarWidth ())
    o (WScrollPanePeer::void setSpans (int int int int))
      (WScrollPanePeer::java.awt.Component getScrollChild ())

      (WEmbeddedFramePeer::void create (sun.awt.windows.WComponentPeer))
    X (WButtonPeer::void setLabel (java.lang.String))
    X (WButtonPeer::void create (sun.awt.windows.WComponentPeer))

    x (WColor::java.awt.Color getDefaultColor (int))

    x (GifImageDecoder::boolean parseImage (int int int int boolean int byte[] byte[] java.awt.image.IndexColorModel))

    x (WGraphics::void createFromComponent (sun.awt.windows.WComponentPeer))
    x (WGraphics::void createFromGraphics (sun.awt.windows.WGraphics))
      (WGraphics::void createFromPrintJob (sun.awt.windows.WPrintJob))
      (WGraphics::void createFromHDC (int))
    x (WGraphics::void imageCreate (sun.awt.image.ImageRepresentation))
    x (WGraphics::void pSetFont (java.awt.Font))
    X (WGraphics::void pSetForeground (int))
      (WGraphics::void _dispose ())
    x (WGraphics::void dispose ())
    x (WGraphics::void setPaintMode ())
    x (WGraphics::void setXORMode (java.awt.Color))
    o (WGraphics::java.awt.Rectangle getClipBounds ())
    o (WGraphics::void changeClip (int int int int boolean))
      (WGraphics::void removeClip ())
    X (WGraphics::void clearRect (int int int int))
    X (WGraphics::void fillRect (int int int int))
    X (WGraphics::void drawRect (int int int int))
      (WGraphics::void drawSFChars (char[] int int int int))
    x (WGraphics::int drawMFCharsSegment (java.awt.Font sun.awt.FontDescriptor char[] int int int int))
      (WGraphics::int drawMFCharsConvertedSegment (java.awt.Font sun.awt.FontDescriptor byte[] int int int))
      (WGraphics::void drawBytes (byte[] int int int int))
    X (WGraphics::void drawLine (int int int int))
    X (WGraphics::void copyArea (int int int int int int))
    o (WGraphics::void drawRoundRect (int int int int int int))
    o (WGraphics::void fillRoundRect (int int int int int int))
    X (WGraphics::void drawPolygon (int[] int[] int))
      (WGraphics::void drawPolyline (int[] int[] int))
    X (WGraphics::void fillPolygon (int[] int[] int))
    x (WGraphics::void drawOval (int int int int))
    x (WGraphics::void fillOval (int int int int))
    x (WGraphics::void drawArc (int int int int int int))
    x (WGraphics::void fillArc (int int int int int int))
      (WGraphics::void print (sun.awt.windows.WComponentPeer))
      (WGraphics::void close (sun.awt.windows.WPrintJob))
      (JPEGImageDecoder::void readImage (java.io.InputStream byte[]))
    o (OffScreenImageSource::void sendPixels ())


    additional native methods added by microsoft (sigh):

    X (java.lang.String::boolean equals (java.lang.String))
    X (java.lang.String::int length (java.lang.String))
    o (java.lang.Runtime::void setInputStreamLocalised (java.io.DataInputStream))
    o (java.lang.Runtime::void setOutputStreamLocalised (java.io.DataOutputStream))

      (java.lang.String::int compareTo (java.lang.String))
      (java.lang.String::boolean equalsIgnoreCase (java.lang.String))
      (java.lang.String::int indexOf (java.lang.String int))
      (java.lang.String::boolean startsWith (java.lang.String int))
      (java.lang.String::boolean regionMatches (int java.lang.String int int))
      (java.lang.String::boolean regionMatches (boolean int java.lang.String int int))
      (java.lang.String::int lastIndexOf (java.lang.String int))
      (java.lang.ClassLoader::void resolveClass (java.lang.Class))

      (java.lang.ClassLoader::java.lang.Class createArrayClass (java.lang.String java.lang.Class))
      (java.io.PrintStream::boolean isOutputStreamLocalised (java.io.DataOutputStream))
      (java.lang.Runtime::boolean isOutputStreamLocalised (java.io.DataOutputStream))
      (java.lang.Runtime::boolean isInputStreamLocalised (java.io.DataInputStream))
      (java.lang.ThreadGroup::void initMainThreadGroup0 (java.lang.ThreadGroup))
      (java.lang.System::void validateSecurityManager (java.lang.SecurityManager))
      (java.lang.Class::java.lang.reflect.Method getMethod2 (int java.lang.String java.lang.String))
      (java.io.ObjectOutputStream::void invokeDefaultWriteObject (java.lang.Object java.lang.Class))
      (java.io.ObjectOutputStream::void invokeWriteObject (java.lang.Object java.lang.Class))
      (java.io.ObjectInputStream::void invokeDefaultReadObject (java.lang.Object java.lang.Class))
      (java.io.ObjectInputStream::void invokeReadObject (java.lang.Object java.lang.Class))
      (java.util.TimeZone::java.util.TimeZone getWin32TimeZone ())
      (java.net.InetAddress::java.lang.Object[] lookupHostByName (java.lang.String))
      (java.net.InetAddress::java.lang.Object[] lookupHostByAddr (int))
      (java.io.ObjectStreamClass::void doMismatchedRead (java.io.ObjectInputStream java.lang.Object))
      (java.io.ObjectStreamClass::long getClassDefinedUID (java.lang.Class))
      (java.io.ObjectStreamClass::boolean findObjectMethod0 (java.lang.Class int))
      (java.lang.reflect.Method::java.lang.String getDescriptor ())
      (java.lang.reflect.Array::void setShort (java.lang.Object int unsigned short))
      (java.lang.reflect.Array::char getChar (java.lang.Object int))
      (java.lang.reflect.Array::void setChar (java.lang.Object int char))
      (java.lang.reflect.Array::void setDouble (java.lang.Object int double))
      (java.lang.reflect.Array::java.lang.Object get (java.lang.Object int))
      (java.lang.reflect.Array::void set (java.lang.Object int java.lang.Object))
      (java.lang.reflect.Array::int getInt (java.lang.Object int))
      (java.lang.reflect.Array::void setInt (java.lang.Object int int))
      (java.lang.reflect.Array::java.lang.Object multiNewArray (java.lang.Class int[]))
      (java.lang.reflect.Array::boolean getBoolean (java.lang.Object int))
      (java.lang.reflect.Array::byte getByte (java.lang.Object int))
      (java.lang.reflect.Array::float getFloat (java.lang.Object int))
      (java.lang.reflect.Array::void setBoolean (java.lang.Object int boolean))
      (java.lang.reflect.Array::long getLong (java.lang.Object int))
      (java.lang.reflect.Array::void setByte (java.lang.Object int byte))
      (java.lang.reflect.Array::void setLong (java.lang.Object int long))
      (java.lang.reflect.Array::void setFloat (java.lang.Object int float))
      (java.lang.reflect.Array::java.lang.Object newArray (java.lang.Class int))
      (java.lang.reflect.Array::int getLength (java.lang.Object))
      (java.lang.reflect.Array::unsigned short getShort (java.lang.Object int))
      (java.lang.reflect.Array::double getDouble (java.lang.Object int))
      (java.lang.reflect.Field::void setShort (java.lang.Object unsigned short))
      (java.lang.reflect.Field::char getChar (java.lang.Object))
      (java.lang.reflect.Field::void setChar (java.lang.Object char))
      (java.lang.reflect.Field::void setDouble (java.lang.Object double))
      (java.lang.reflect.Field::java.lang.Object get (java.lang.Object))
      (java.lang.reflect.Field::void set (java.lang.Object java.lang.Object))
      (java.lang.reflect.Field::int getInt (java.lang.Object))
      (java.lang.reflect.Field::void setInt (java.lang.Object int))
      (java.lang.reflect.Field::boolean getBoolean (java.lang.Object))
      (java.lang.reflect.Field::byte getByte (java.lang.Object))
      (java.lang.reflect.Field::float getFloat (java.lang.Object))
      (java.lang.reflect.Field::long getLong (java.lang.Object))
      (java.lang.reflect.Field::void setBoolean (java.lang.Object boolean))
      (java.lang.reflect.Field::void setByte (java.lang.Object byte))
      (java.lang.reflect.Field::void setLong (java.lang.Object long))
      (java.lang.reflect.Field::void setFloat (java.lang.Object float))
      (java.lang.reflect.Field::int getModifiers ())
      (java.lang.reflect.Field::unsigned short getShort (java.lang.Object))
      (java.lang.reflect.Field::double getDouble (java.lang.Object))
      (java.lang.reflect.Constructor::java.lang.Object newInstance (java.lang.Object[]))
      (java.lang.reflect.Constructor::int getModifiers ())
      (java.util.zip.Inflater::void setDictionary0 (byte[] int int))
      (java.util.zip.Inflater::int getTotalIn0 ())
      (java.util.zip.Inflater::void reset0 ())
      (java.util.zip.Inflater::void end0 ())
      (java.util.zip.Inflater::int inflate0 (byte[] int int))
      (java.util.zip.Inflater::int getTotalOut0 ())
      (java.util.zip.Inflater::int getAdler0 ())
      (java.util.zip.CRC32::void update1 (int))
      (java.util.zip.CRC32::void update (byte[] int int))

      (com.ms.security.PolicyEngine::boolean isSystemClass (java.lang.String))
      (com.ms.security.PolicyEngine::void denyPermission (com.ms.security.PermissionID))
      (com.ms.security.PolicyEngine::void revertPermission (com.ms.security.PermissionID))
      (com.ms.security.PolicyEngine::void initPolicyEngine ())
      (com.ms.security.PolicyEngine::java.lang.Class _getClassOfCaller (java.lang.Class[]))
      (com.ms.security.PolicyEngine::void internalCheckClass (java.lang.Class com.ms.security.PermissionID java.lang.Object))
      (com.ms.security.PolicyEngine::com.ms.security.PermissionDataSet getPermissionsOfClass (java.lang.Class))
      (com.ms.security.PolicyEngine::void assertPermission (com.ms.security.PermissionID))
      (com.ms.security.PolicyEngine::void deepCheck (com.ms.security.PermissionID java.lang.Object))
      (com.ms.security.PolicyEngine::void shallowCheck (com.ms.security.PermissionID java.lang.Object java.lang.Class[] int))
      (com.ms.security.PolicyEngine::java.security.Principal getPrincipalOfClass (java.lang.Class))
      (com.ms.security.permissions.ThreadPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.ThreadPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.RegistryPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.RegistryPermission::byte[] pEncodeAsn ())
      (com.ms.security.management.ZonePermissions::byte[] pEncodeAsn ())
      (com.ms.security.management.ZonePermissions::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.UIPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.UIPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.NetIOPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.NetIOPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.ReflectionPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.ReflectionPermission::boolean pDecodeAsn (byte[]))
      (com.ms.vm.WeakReference::void storeRef (int java.lang.Object))
      (com.ms.vm.WeakReference::int allocRef (java.lang.Object))
      (com.ms.vm.WeakReference::void freeRef (int))
      (com.ms.vm.WeakReference::java.lang.Object fetchRef (int))
      (com.ms.dll.DllLib::void CoTaskMemFree (int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int float[] int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int double[] int int))
      (com.ms.dll.DllLib::int numParamBytes0 (java.lang.reflect.Method))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int java.lang.Object int int))
      (com.ms.dll.DllLib::void write2 (java.lang.Object int unsigned short))
      (com.ms.dll.DllLib::void write2 (int int unsigned short))
      (com.ms.dll.DllLib::void write2 (java.lang.Object int char))
      (com.ms.dll.DllLib::void write2 (int int char))
      (com.ms.dll.DllLib::int GlobalAlloc (int int))
      (com.ms.dll.DllLib::void resize (java.lang.Object int))
      (com.ms.dll.DllLib::long read8 (java.lang.Object int))
      (com.ms.dll.DllLib::long read8 (int int))
      (com.ms.dll.DllLib::int lstrcpy (java.lang.StringBuffer int))
      (com.ms.dll.DllLib::int lstrlenA (int))
      (com.ms.dll.DllLib::int read4 (java.lang.Object int))
      (com.ms.dll.DllLib::int CoTaskMemAlloc (int))
      (com.ms.dll.DllLib::void write8 (java.lang.Object int long))
      (com.ms.dll.DllLib::int sizeOf0 (java.lang.Class))
      (com.ms.dll.DllLib::int getSystemDefaultCharSize ())
      (com.ms.dll.DllLib::void write8 (int int long))
      (com.ms.dll.DllLib::int read4 (int int))
      (com.ms.dll.DllLib::byte read1 (java.lang.Object int))
      (com.ms.dll.DllLib::byte read1 (int int))
      (com.ms.dll.DllLib::int lstrlen (int))
      (com.ms.dll.DllLib::void CopyMemoryAnsi (int java.lang.String int))
      (com.ms.dll.DllLib::void CopyMemoryAnsi (java.lang.StringBuffer int int))
      (com.ms.dll.DllLib::boolean isStruct (java.lang.reflect.Field))
      (com.ms.dll.DllLib::boolean GlobalFree (int))
      (com.ms.dll.DllLib::void internalAttemptCopyPtrToStruct (int java.lang.Object int int))
      (com.ms.dll.DllLib::int getLastError ())
      (com.ms.dll.DllLib::void write4 (java.lang.Object int int))
      (com.ms.dll.DllLib::void write4 (int int int))
      (com.ms.dll.DllLib::unsigned short read2 (java.lang.Object int))
      (com.ms.dll.DllLib::unsigned short read2 (int int))
      (com.ms.dll.DllLib::void release (java.lang.Object))
      (com.ms.dll.DllLib::void write1 (java.lang.Object int byte))
      (com.ms.dll.DllLib::void write1 (int int byte))
      (com.ms.dll.DllLib::boolean isStructCls (java.lang.Class))
      (com.ms.dll.DllLib::void prelink (java.lang.reflect.Method))
      (com.ms.dll.DllLib::void CopyMemoryUni (int java.lang.String int))
      (com.ms.dll.DllLib::void CopyMemoryUni (java.lang.StringBuffer int int))
      (com.ms.dll.DllLib::void internalAttemptCopyStructToPtr (java.lang.Object int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (int int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (byte[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (char[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (unsigned short[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (int[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (long[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (float[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (double[] int int int))
      (com.ms.dll.DllLib::void CopyWithSrcOffset (java.lang.Object int int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int int int int))
      (com.ms.dll.DllLib::int lstrlenW (int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int byte[] int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int char[] int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int unsigned short[] int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int int[] int int))
      (com.ms.dll.DllLib::void CopyWithDstOffset (int long[] int int))
      (com.ms.dll.DllLib::int internalGetStructAddr (java.lang.Object))
      (com.ms.dll.DllLib::int offsetOf (java.lang.reflect.Field))
      (com.ms.dll.DllLib::int lstrcpy (int java.lang.String))
      (com.ms.dll.DllLib::int sizeOf (java.lang.Object))
      (com.ms.lang.RegKey::com.ms.lang.RegKeyEnumValue pRegEnumValue (int))
      (com.ms.lang.RegKey::java.lang.String pRegQueryStringValue (java.lang.String))
      (com.ms.lang.RegKey::byte[] pRegQueryBinaryValue (java.lang.String))
      (com.ms.lang.RegKey::int pRegQueryIntValue (java.lang.String))
      (com.ms.lang.RegKey::void pRegSetStringValue (java.lang.String java.lang.String))
      (com.ms.lang.RegKey::void pRegSetIntValue (java.lang.String int))
      (com.ms.lang.RegKey::void pRegSetBinaryValue (java.lang.String byte[]))
      (com.ms.lang.RegKey::void pRegDeleteValue (java.lang.String))
      (com.ms.lang.RegKey::void pRegFlushKey ())
      (com.ms.lang.RegKey::void pRegDeleteKey (java.lang.String))
      (com.ms.lang.RegKey::void pRegOpenBaseKey (int))
      (com.ms.lang.RegKey::void pRegOpenKey (com.ms.lang.RegKey java.lang.String int))
      (com.ms.lang.RegKey::int pRegQueryInfoKey (com.ms.lang.RegQueryInfo))
      (com.ms.lang.RegKey::void pRegUnLoadKey (java.lang.String))
      (com.ms.lang.RegKey::void pRegCreateKey (com.ms.lang.RegKey java.lang.String))
      (com.ms.lang.RegKey::void pRegRestoreKey (java.lang.String boolean))
      (com.ms.lang.RegKey::void pRegLoadKey (java.lang.String java.lang.String))
      (com.ms.lang.RegKey::void pRegCloseKey ())
      (com.ms.lang.RegKey::java.lang.String pRegEnumKey (int))
      (com.ms.lang.RegKey::void pRegReplaceKey (java.lang.String java.lang.String java.lang.String))
      (com.ms.awt.peer.NativeServices::int pGetKeyboardLayouts (int[] int))
      (com.ms.awt.peer.NativeServices::void jpegReadByte (com.ms.awt.peer.IjpegDecoderCallback byte[] int com.ms.awt.peer.jpegInfoHeader byte[] int))
      (com.ms.awt.peer.NativeServices::int getColourDataDepth ())
      (com.ms.awt.peer.NativeServices::java.lang.String pGetFontEnumeratedFamily (int))
      (com.ms.awt.peer.NativeServices::int pNewFontEnumeration ())
      (com.ms.awt.peer.NativeServices::int getScreenClipRgn (int))
      (com.ms.awt.peer.NativeServices::int pSetKeyboardLayout (int int))
      (com.ms.awt.peer.NativeServices::void ClipboardInit (com.ms.awt.peer.IToolkit))
      (com.ms.awt.peer.NativeServices::void getDeviceCaps (int int[] int))
      (com.ms.awt.peer.NativeServices::void getAfcMetrics (int[]))
      (com.ms.awt.peer.NativeServices::void setUserLocale (int int))
      (com.ms.awt.peer.NativeServices::void getDCDI (com.ms.awt.peer.DirectColourDataInfo))
      (com.ms.awt.peer.NativeServices::int pGetNumKeyboardLayouts ())
      (com.ms.awt.peer.NativeServices::void getIndexedColours (byte[] byte[] byte[]))
      (com.ms.awt.peer.NativeServices::int getNativeFont (java.lang.String int int int))
      (com.ms.awt.peer.NativeServices::int pGetKeyboardLayout ())
      (com.ms.awt.peer.NativeServices::int getSystemLCID ())
      (com.ms.awt.peer.NativeServices::void caretSetPos (int int int))
      (com.ms.awt.peer.NativeServices::java.lang.String getLogFontFromIUnknown (com.ms.com.IUnknown com.ms.awt.peer.LogFontX))
      (com.ms.awt.peer.NativeServices::java.lang.String ClipboardGetText ())
      (com.ms.awt.peer.NativeServices::int systemMetric (int))
      (com.ms.awt.peer.NativeServices::void jpegInit (com.ms.awt.peer.IjpegDecoderCallback byte[] int com.ms.awt.peer.jpegInfoHeader))
      (com.ms.awt.peer.NativeServices::void caretHide (int))
      (com.ms.awt.peer.NativeServices::int chooseColor (int int))
      (com.ms.awt.peer.NativeServices::java.lang.String pGetKeyboardLayoutName (int))
      (com.ms.awt.peer.NativeServices::int matchFontAndLanguage (int int))
      (com.ms.awt.peer.NativeServices::java.lang.String chooseFont (com.ms.awt.peer.LogFontX java.lang.String int))
      (com.ms.awt.peer.NativeServices::java.lang.String getSystemFont (int com.ms.awt.peer.LogFontX))
      (com.ms.awt.peer.NativeServices::com.ms.com.IUnknown getIUnknownFromLogFont (java.lang.String com.ms.awt.peer.LogFontX))
      (com.ms.awt.peer.NativeServices::void caretDispose (int))
      (com.ms.awt.peer.NativeServices::void caretShow (int))
      (com.ms.awt.peer.NativeServices::void deleteObject (int))
      (com.ms.awt.peer.NativeServices::void setDebugOutput (com.ms.awt.peer.COMPrintCallback))
      (com.ms.awt.peer.NativeServices::void jpegReadInt (com.ms.awt.peer.IjpegDecoderCallback byte[] int com.ms.awt.peer.jpegInfoHeader int[] int))
      (com.ms.awt.peer.NativeServices::int getSystemColourValue (int))
      (com.ms.awt.peer.NativeServices::void caretCreate (int int int))
      (com.ms.awt.peer.NativeServices::void ClipboardSetText (java.lang.String))
      (com.ms.awt.peer.NativeServices::void println (java.lang.String))
      (com.ms.security.SecurityClassLoader::boolean getSecureState ())
      (com.ms.security.SecurityClassLoader::void setSecureState (java.lang.String java.lang.String))
      (com.ms.security.SecurityClassLoader::java.lang.Class internalDefineClass (java.lang.String byte[] int int))
      (com.ms.security.SecurityClassLoader::void markClass (java.lang.Class com.ms.security.PermissionSet java.security.Principal))
      (com.ms.security.SecurityClassLoader::java.util.Hashtable getHashTable ())
      (com.ms.security.auditing.SecurityAuditor::boolean isThreadAuditingEnabled ())
      (com.ms.security.auditing.SecurityAuditor::void disableThreadAuditing ())
      (com.ms.security.auditing.SecurityAuditor::void enableThreadAuditing ())
      (com.ms.security.auditing.SecurityAuditor::void initSecurityAuditor ())
      (com.ms.security.PermissionDataSet::byte[] pEncodeAsn ())
      (com.ms.security.PermissionDataSet::boolean pDecodeAsn (byte[]))
      (com.ms.lang.SystemX::int pAnsiToUnicode (byte[] char[] int int int))
      (com.ms.lang.SystemX::int pQueryUnicodeToAnsi (char[] int int int))
      (com.ms.lang.SystemX::void gc ())
      (com.ms.lang.SystemX::boolean arrayCompare (java.lang.Object[] int java.lang.Object[] int int))
      (com.ms.lang.SystemX::int pUnicodeToAnsi (char[] byte[] int int int))
      (com.ms.lang.SystemX::boolean isLocalCharDBCSLeadByte (byte))
      (com.ms.lang.SystemX::int pQueryAnsiToUnicode (byte[] int int int))
      (com.ms.lang.SystemX::boolean isBaseDBCS ())
      (com.ms.lang.SystemX::java.lang.reflect.Method getMethod2 (java.lang.Class int java.lang.String java.lang.String))
      (com.ms.packagemanager.JavaPackage::byte[] nativeGetSigner (java.lang.Object))
      (com.ms.packagemanager.JavaPackage::byte[] nativeGetCapabilities (java.lang.Object))
      (com.ms.com._Guid::void IIDFromString (java.lang.String com.ms.com._Guid))
      (com.ms.com._Guid::java.lang.String StringFromIID (com.ms.com._Guid))
      (com.ms.security.auditing.PrintStreamAuditor::int GetModuleHandle (java.lang.String))
      (com.ms.security.auditing.PrintStreamAuditor::int FormatMessage (int int int int java.lang.StringBuffer int int[]))
      (com.ms.security.permissions.CustomPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.CustomPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.X509Signer::boolean pLoad (byte[]))
      (com.ms.packagemanager.PackageManager::java.lang.Class nativeFindClassInNamespace (java.lang.String java.lang.String java.lang.ClassLoader))
      (com.ms.packagemanager.PackageManager::java.lang.Object nativeGetPackage (java.lang.String java.lang.String))
      (com.ms.packagemanager.PackageManager::java.lang.String[] nativeGetBeansList ())
      (com.ms.packagemanager.PackageManager::com.ms.com.IStream nativeGetFileIStream (java.lang.String java.lang.String))
      (com.ms.packagemanager.PackageManager::java.lang.Class nativeFindClass (java.lang.String java.lang.String java.lang.ClassLoader))
      (com.ms.security.permissions.UserFileIOPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.UserFileIOPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.PropertyPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.PropertyPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.ClientStoragePermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.ClientStoragePermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.ExecutionPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.ExecutionPermission::boolean pDecodeAsn (byte[]))
      (com.ms.util.EventLog::boolean DeregisterEventSource (int))
      (com.ms.util.EventLog::void reportEvent0 (unsigned short unsigned short int java.lang.String[] byte[]))
      (com.ms.util.EventLog::int RegisterEventSource (java.lang.String java.lang.String))
      (com.ms.applet.BrowserAppletFrame::void signalViewChange (int))
      (com.ms.applet.BrowserAppletFrame::java.lang.Object newInstance (int java.lang.Class boolean com.ms.security.PermissionSet))
      (com.ms.applet.BrowserAppletFrame::void showSystemStatus (int int boolean java.lang.String))
      (com.ms.applet.BrowserAppletFrame::com.ms.security.management.SecurityPolicy getSecurityPolicy0 (int java.lang.String))
      (com.ms.applet.BrowserAppletFrame::void setDownloadState (int boolean))
      (com.ms.applet.BrowserAppletFrame::int GetSystemDefaultLCID ())
      (com.ms.applet.BrowserAppletFrame::void requestResize (int int int))
      (com.ms.applet.BrowserAppletFrame::void signalObjectLoadDone (int boolean))
      (com.ms.applet.BrowserAppletFrame::com.ms.applet.BrowserAppletFrame findOfflineContext ())
      (com.ms.applet.BrowserAppletFrame::void showStatus0 (int java.lang.String))
      (com.ms.applet.BrowserAppletFrame::boolean checkGlobalOfflineMode0 ())
      (com.ms.applet.BrowserAppletFrame::void showDocument0 (int java.lang.String java.lang.String))
      (com.ms.security.permissions.SystemStreamsPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.SystemStreamsPermission::boolean pDecodeAsn (byte[]))
      (com.ms.security.permissions.FileIOPermission::byte[] pEncodeAsn ())
      (com.ms.security.permissions.FileIOPermission::boolean pDecodeAsn (byte[]))
      (com.ms.com.ComLib::int newGCHandle (java.lang.Object))
      (com.ms.com.ComLib::java.lang.Object derefGCHandle (int))
      (com.ms.com.ComLib::void dprinthelper (char[]))
      (com.ms.com.ComLib::void release (java.lang.Object))
      (com.ms.com.ComLib::int jcdwClassSizeOf (java.lang.Class))
      (com.ms.com.ComLib::int jcdwOffsetOf (java.lang.Object java.lang.String))
      (com.ms.com.ComLib::int jcdwClassOffsetOf (java.lang.Class java.lang.String))
      (com.ms.com.ComLib::boolean isJavaOwned (java.lang.Object))
      (com.ms.com.ComLib::void brk (java.lang.Object))
      (com.ms.com.ComLib::void setDataWrapperSize (java.lang.Object int))
      (com.ms.com.ComLib::void brk (int))
      (com.ms.com.ComLib::void setJCDWHomeThread (java.lang.Object java.lang.Object))
      (com.ms.com.ComLib::void propagateOwnership (java.lang.Object int))
      (com.ms.com.ComLib::void threadStartMTA (java.lang.Thread))
      (com.ms.com.ComLib::void IENVNextMarshalerJ2C (int))
      (com.ms.com.ComLib::boolean supportsInterface (java.lang.Object com.ms.com._Guid))
      (com.ms.com.ComLib::java.lang.Object ptrToStruct (java.lang.Class int))
      (com.ms.com.ComLib::int jcdwSizeOf (java.lang.Object))
      (com.ms.com.ComLib::void declareMessagePumpThread ())
      (com.ms.com.ComLib::void IENVNextMarshalerC2J (int))
      (com.ms.com.ComLib::void freeGCHandle (int))
      (com.ms.com.ComLib::boolean isEqualUnknown (java.lang.Object java.lang.Object))
      (com.ms.com.Dispatch::boolean NIsArray (java.lang.Object))
      (com.ms.com.Dispatch::java.lang.String NInvokeReal (java.lang.Object com.ms.com._Guid java.lang.String int int int int com.ms.com.Variant[] com.ms.com.Variant[] int[]))
      (com.ms.com.Dispatch::void NGetIDsOfNamesReal (java.lang.Object com.ms.com._Guid int java.lang.String[] int[]))
      (com.ms.com.ComException::int FormatMessage (int int int int java.lang.StringBuffer int int[]))
      (com.ms.com.Variant::int toInt ())
      (com.ms.com.Variant::double toDate ())
      (com.ms.com.Variant::boolean toBoolean ())
      (com.ms.com.Variant::double toDouble ())
      (com.ms.com.Variant::long toCurrency ())
      (com.ms.com.Variant::void putVariantArray (com.ms.com.Variant[]))
      (com.ms.com.Variant::com.ms.com.Variant[] getVariantArray ())
      (com.ms.com.Variant::void putByteArray (java.lang.Object))
      (com.ms.com.Variant::void putShortRef (unsigned short))
      (com.ms.com.Variant::void putIntRef (int))
      (com.ms.com.Variant::void putDoubleRef (double))
      (com.ms.com.Variant::void putDateRef (double))
      (com.ms.com.Variant::void putStringRef (java.lang.String))
      (com.ms.com.Variant::unsigned short getShortRef ())
      (com.ms.com.Variant::int getIntRef ())
      (com.ms.com.Variant::double getDoubleRef ())
      (com.ms.com.Variant::double getDateRef ())
      (com.ms.com.Variant::java.lang.String getStringRef ())
      (com.ms.com.Variant::java.lang.String internalToString ())
      (com.ms.com.Variant::void initSafeArrayByRef (com.ms.com.SafeArray int))
      (com.ms.com.Variant::java.lang.Object toCharArray ())
      (com.ms.com.Variant::java.lang.Object toDispatch ())
      (com.ms.com.Variant::byte toByte ())
      (com.ms.com.Variant::java.lang.Object getDispatch ())
      (com.ms.com.Variant::void putDispatch (java.lang.Object))
      (com.ms.com.Variant::boolean getBoolean ())
      (com.ms.com.Variant::int toError ())
      (com.ms.com.Variant::java.lang.Object toObject ())
      (com.ms.com.Variant::void initSafeArrayByVal (com.ms.com.SafeArray int))
      (com.ms.com.Variant::java.lang.Object getObject ())
      (com.ms.com.Variant::void putObject (java.lang.Object))
      (com.ms.com.Variant::com.ms.com.SafeArray toSafeArrayHelper (java.lang.Class))
      (com.ms.com.Variant::void putFloatRef (float))
      (com.ms.com.Variant::void putCurrencyRef (long))
      (com.ms.com.Variant::void putErrorRef (int))
      (com.ms.com.Variant::void putBooleanRef (boolean))
      (com.ms.com.Variant::void putObjectRef (java.lang.Object))
      (com.ms.com.Variant::void putByteRef (byte))
      (com.ms.com.Variant::java.lang.String getString ())
      (com.ms.com.Variant::void putString (java.lang.String))
      (com.ms.com.Variant::float getFloatRef ())
      (com.ms.com.Variant::long getCurrencyRef ())
      (com.ms.com.Variant::int getErrorRef ())
      (com.ms.com.Variant::boolean getBooleanRef ())
      (com.ms.com.Variant::java.lang.Object getObjectRef ())
      (com.ms.com.Variant::byte getByteRef ())
      (com.ms.com.Variant::float toFloat ())
      (com.ms.com.Variant::void putCharArray (java.lang.Object))
      (com.ms.com.Variant::void putDispatchRef (java.lang.Object))
      (com.ms.com.Variant::java.lang.Object getDispatchRef ())
      (com.ms.com.Variant::void putVariantArrayRef (com.ms.com.Variant[]))
      (com.ms.com.Variant::com.ms.com.Variant[] getVariantArrayRef ())
      (com.ms.com.Variant::void changeType (unsigned short))
      (com.ms.com.Variant::void ncloneIndirect (com.ms.com.Variant))
      (com.ms.com.Variant::void nFinalize (boolean))
      (com.ms.com.Variant::void nclone (com.ms.com.Variant))
      (com.ms.com.Variant::unsigned short toShort ())
      (com.ms.com.Variant::void putSafeArrayRefHelper (int))
      (com.ms.com.Variant::com.ms.com.Variant[] toVariantArray ())
      (com.ms.com.Variant::java.lang.Object toByteArray ())
      (com.ms.com.Variant::void TrueVariantClear ())
      (com.ms.awt.WToolkit::boolean MessageBeep (int))
      (com.ms.applet.AppletPanel::boolean StartCodeDownload (int java.lang.String java.lang.String java.lang.String))
      (com.ms.applet.AppletPanel::void securedCall0 (int java.lang.Object))
      (com.ms.applet.AppletPanel::com.ms.security.PermissionSet getDefaultPermissionsFromLoader (com.ms.vm.loader.URLClassLoader))
      (com.ms.dll.Win32Exception::int FormatMessage (int int int int java.lang.StringBuffer int int[]))
      (com.ms.awt.WGuiCallback::boolean SetEvent (int))
      (com.ms.awt.WGuiCallback::int CreateSemaphore (int int int int))
      (com.ms.awt.WGuiCallback::int ReleaseSemaphore (int int int))
      (com.ms.awt.WGuiCallback::void userYield (boolean))
      (com.ms.awt.WGuiCallback::int MsgWaitForMultipleObjects (int int[] boolean int int))
      (com.ms.awt.WGuiCallback::int CreateEvent (int boolean boolean int))
      (com.ms.activeX.ActiveXToolkit::int GetSysColor (int))
      (com.ms.awt.peer.NativeGraphics::void setPageDimension (int int))
      (com.ms.awt.peer.NativeGraphics::void setBkColour (int int))
      (com.ms.awt.peer.NativeGraphics::void getClipBounds (com.ms.awt.peer.NativeRect int int))
      (com.ms.awt.peer.NativeGraphics::void pGetCharOutline (int byte[]))
      (com.ms.awt.peer.NativeGraphics::void drawLine (int int int int))
      (com.ms.awt.peer.NativeGraphics::void setXORMode (int int int int))
      (com.ms.awt.peer.NativeGraphics::int drawString (java.lang.String int int int int int int int int[] int[]))
      (com.ms.awt.peer.NativeGraphics::int getCoClass ())
      (com.ms.awt.peer.NativeGraphics::void drawArc (int int int int int int int))
      (com.ms.awt.peer.NativeGraphics::void getInitialPageDimension (com.ms.awt.peer.NativeRect))
      (com.ms.awt.peer.NativeGraphics::void setVisRgn (int))
      (com.ms.awt.peer.NativeGraphics::void pSetForeground (int int))
      (com.ms.awt.peer.NativeGraphics::int pGetDC ())
      (com.ms.awt.peer.NativeGraphics::void drawPixels (int[] int int int))
      (com.ms.awt.peer.NativeGraphics::void drawPolygon (int[] int[] int int int int))
      (com.ms.awt.peer.NativeGraphics::void createFromImage (com.ms.awt.peer.INativeImage))
      (com.ms.awt.peer.NativeGraphics::void endPage ())
      (com.ms.awt.peer.NativeGraphics::int pGetCharOutlineSize (int))
      (com.ms.awt.peer.NativeGraphics::void pDrawBezier (int int int[] int))
      (com.ms.awt.peer.NativeGraphics::int drawBytes (byte[] int int int int int))
      (com.ms.awt.peer.NativeGraphics::void changeClip (int int int int boolean))
      (com.ms.awt.peer.NativeGraphics::int drawChars (char[] int int int int int int int int int int[] int[]))
      (com.ms.awt.peer.NativeGraphics::void drawT2Curve (float float float float float float int int))
      (com.ms.awt.peer.NativeGraphics::void createFromPrintJob (java.lang.String com.ms.awt.peer.SPJData))
      (com.ms.awt.peer.NativeGraphics::void endPrintJob ())
      (com.ms.awt.peer.NativeGraphics::void pSetOrigin (int int))
      (com.ms.awt.peer.NativeGraphics::void createFromHDC (int))
      (com.ms.awt.peer.NativeGraphics::void drawOval (int int int int int))
      (com.ms.awt.peer.NativeGraphics::int pSetFont (java.lang.String int int int))
      (com.ms.awt.peer.NativeGraphics::void setPaintMode (int int))
      (com.ms.awt.peer.NativeGraphics::void startPage ())
      (com.ms.awt.peer.NativeGraphics::void clearClip ())
      (com.ms.awt.peer.NativeGraphics::void createFromCopy (com.ms.awt.peer.INativeGraphics))
      (com.ms.awt.peer.NativeGraphics::void scanLines (int int[] int int int int))
      (com.ms.awt.peer.NativeGraphics::void drawRoundRect (int int int int int int int))
      (com.ms.awt.peer.NativeGraphics::void dispose ())
      (com.ms.awt.peer.NativeGraphics::void clearRect (int int int int int))
      (com.ms.awt.peer.NativeGraphics::void copyArea (int int int int int int))
      (com.ms.awt.peer.NativeGraphics::void createFromWindow (int))
      (com.ms.awt.peer.NativeGraphics::void drawPolyline (int[] int[] int int int))
      (com.ms.awt.peer.NativeGraphics::void drawRect (int int int int int))
      (com.ms.awt.peer.CToolkit::void callbackEventLoop (com.ms.awt.peer.IToolkitCallback))
      (com.ms.awt.peer.CToolkit::int getToolkitHwnd ())
      (com.ms.awt.peer.CToolkit::int createCompHwnd (int int))
      (com.ms.awt.peer.CNativeSystemIME::void setCompositionFont (int int))
      (com.ms.awt.peer.CNativeSystemIME::void setCompositionPos (int int int))
      (com.ms.awt.peer.CNativeSystemIME::void setOpenStatus (int int))
      (com.ms.awt.peer.CNativeSystemIME::int getOpenStatus (int))
      (com.ms.awt.peer.CNativeSystemIME::java.lang.String getCompositionString (int))
      (com.ms.awt.peer.CNativeSystemIME::java.lang.String getCompositionResultString (int))
      (com.ms.net.wininet.WininetStreamHandlerFactory::int initNative (java.lang.String))
      (com.ms.com.SafeArray::void rawGetVariantAs (int com.ms.com.Variant))
      (com.ms.com.SafeArray::void NSafeArrayInit (int))
      (com.ms.com.SafeArray::float rawGetDouble (int))
      (com.ms.com.SafeArray::void NRawBoolCopyToJavaArray (int int boolean[] int))
      (com.ms.com.SafeArray::void validateArray (int))
      (com.ms.com.SafeArray::void NSafeArrayCreateFromString (java.lang.String))
      (com.ms.com.SafeArray::void rawSetString (int java.lang.String))
      (com.ms.com.SafeArray::int getInt (int))
      (com.ms.com.SafeArray::void setInt (int int))
      (com.ms.com.SafeArray::boolean getBoolean (int))
      (com.ms.com.SafeArray::void setBoolean (int boolean))
      (com.ms.com.SafeArray::int computeOffset (int))
      (com.ms.com.SafeArray::void NSafeArrayNullInit ())
      (com.ms.com.SafeArray::void rawSetVariant (int com.ms.com.Variant))
      (com.ms.com.SafeArray::float rawGetFloat (int))
      (com.ms.com.SafeArray::float getFloat (int))
      (com.ms.com.SafeArray::void setFloat (int float))
      (com.ms.com.SafeArray::int computeOffset2 (int int))
      (com.ms.com.SafeArray::void rawSetDouble (int double))
      (com.ms.com.SafeArray::java.lang.String asString ())
      (com.ms.com.SafeArray::void NRawCopyToJavaArray (int int java.lang.Object int))
      (com.ms.com.SafeArray::void NSafeArrayCreate (int int int[] int[]))
      (com.ms.com.SafeArray::void NRawBoolCopyFromJavaArray (boolean[] int int int))
      (com.ms.com.SafeArray::void NSafeArrayDestroy (boolean boolean))
      (com.ms.com.SafeArray::int NSafeArrayCopy ())
      (com.ms.com.SafeArray::int rawGetInt (int))
      (com.ms.com.SafeArray::boolean rawGetBoolean (int))
      (com.ms.com.SafeArray::void rawSetFloat (int float))
      (com.ms.com.SafeArray::java.lang.String rawGetString (int))
      (com.ms.com.SafeArray::int NTotalNumElems ())
      (com.ms.com.SafeArray::double getDouble (int))
      (com.ms.com.SafeArray::void setDouble (int double))
      (com.ms.com.SafeArray::void Nreinit (com.ms.com.SafeArray))
      (com.ms.com.SafeArray::int getPhysicalSafeArray ())
      (com.ms.com.SafeArray::int NgetdwordAt (int))
      (com.ms.com.SafeArray::void NRawCopyFromJavaArray (java.lang.Object int int int))
      (com.ms.com.SafeArray::void rawSetBoolean (int boolean))
      (com.ms.com.SafeArray::void rawSetInt (int int))
      (com.ms.awt.peer.CNativeComponent::void invalidate (int int int int))
      (com.ms.awt.peer.CNativeComponent::void hideModal ())
      (com.ms.awt.peer.CNativeComponent::void hide ())
      (com.ms.awt.peer.CNativeComponent::void setOnTop (int))
      (com.ms.awt.peer.CNativeComponent::void registerDragDrop ())
      (com.ms.awt.peer.CNativeComponent::void endValidate ())
      (com.ms.awt.peer.CNativeComponent::void enable ())
      (com.ms.awt.peer.CNativeComponent::void disable ())
      (com.ms.awt.peer.CNativeComponent::void setTitle (java.lang.String))
      (com.ms.awt.peer.CNativeComponent::void getBounds (com.ms.awt.peer.NativeRect))
      (com.ms.awt.peer.CNativeComponent::int gethwnd ())
      (com.ms.awt.peer.CNativeComponent::void showModal ())
      (com.ms.awt.peer.CNativeComponent::void setCursor (int))
      (com.ms.awt.peer.CNativeComponent::void reshape (int int int int))
      (com.ms.awt.peer.CNativeComponent::void requestFocus ())
      (com.ms.awt.peer.CNativeComponent::void callDefWindowProc (int int int int))
      (com.ms.awt.peer.CNativeComponent::void registerCustomDropTarget (com.ms.com.IUnknown))
      (com.ms.awt.peer.CNativeComponent::void setNoActivate (boolean))
      (com.ms.awt.peer.CNativeComponent::void getPlaceOnScreen (com.ms.awt.peer.NativeRect))
      (com.ms.awt.peer.CNativeComponent::void beginValidate ())
      (com.ms.awt.peer.CNativeComponent::void clippedReshape (int int int int int))
      (com.ms.awt.peer.CNativeComponent::void setResizable (boolean))
      (com.ms.awt.peer.CNativeComponent::void setIcon (int))
      (com.ms.awt.peer.CNativeComponent::void toBack ())
      (com.ms.awt.peer.CNativeComponent::void setFrameHost (com.ms.awt.peer.IBrowserAppletFrameCallback))
      (com.ms.awt.peer.CNativeComponent::void toFront ())
      (com.ms.awt.peer.CNativeComponent::void show ())
      (com.ms.awt.peer.CNativeComponent::void updateInsets (com.ms.awt.peer.NativeInsets))
      (com.ms.awt.peer.CNativeComponent::void dispose ())
      (com.ms.awt.peer.CNativeComponent::void initFromJavaWindow (int com.ms.awt.peer.IComponentCallback com.ms.awt.peer.INativeComponent com.ms.awt.peer.IToolkit int))
      (com.ms.awt.peer.CNativeComponent::void init (int com.ms.awt.peer.IComponentCallback com.ms.awt.peer.INativeComponent com.ms.awt.peer.IToolkit))
      (com.ms.awt.peer.CNativeComponent::void beginDrag (com.ms.awt.peer.INativeDragCallback))
      (com.ms.fx.RegionConverter::int computeNativeRegion (int[]))
      (com.ms.fx.RegionConverter::int[] computeJavaRegion (int))
      (com.ms.net.wininet.URLUtils::java.lang.String canonicalizeURL (java.lang.String int))
      (com.ms.net.wininet.URLUtils::java.lang.String combineURL (java.lang.String java.lang.String int))
      (com.ms.awt.peer.NativeFontMetrics::int bytesWidth (byte[] int int))
      (com.ms.awt.peer.NativeFontMetrics::int stringWidth (java.lang.String int int[]))
      (com.ms.awt.peer.NativeFontMetrics::int charsWidth (char[] int int int int[]))
      (com.ms.awt.peer.NativeFontMetrics::java.lang.String init (com.ms.awt.peer.INativeGraphics int[] java.lang.String int int int))
      (com.ms.io.console.Console::int MessageBox (int java.lang.String java.lang.String int))
      (com.ms.awt.peer.NativeFileDialog::void show (com.ms.awt.peer.IFileDialogCallback java.lang.String java.lang.String java.lang.String int com.ms.awt.peer.INativeComponent int int))
      (com.ms.security.management.SecurityZone::byte[] pLoadCustomPermissions (int int java.lang.String))
      (com.ms.awt.peer.NativeImage::int setBytePixelsDirected (int int int int com.ms.awt.peer.DirectColourModelData byte[] int int com.ms.awt.peer.INativeImageBufferDone))
      (com.ms.awt.peer.NativeImage::void create (int int int int))
      (com.ms.awt.peer.NativeImage::int setIntPixelsIndexed (int int int int int[] int int[] int int com.ms.awt.peer.INativeImageBufferDone))
      (com.ms.awt.peer.NativeImage::int getCoClass ())
      (com.ms.awt.peer.NativeImage::int getIcon (int int int))
      (com.ms.awt.peer.NativeImage::int setBytePixelsIndexed (int int int int int[] int byte[] int int com.ms.awt.peer.INativeImageBufferDone))
      (com.ms.awt.peer.NativeImage::void sendPixels (com.ms.awt.peer.SPData))
      (com.ms.awt.peer.NativeImage::void fillPixels (com.ms.awt.peer.SPData byte[]))
      (com.ms.awt.peer.NativeImage::void dispose ())
      (com.ms.awt.peer.NativeImage::void init (int int int int int))
      (com.ms.awt.peer.NativeImage::int setIntPixelsDirected (int int int int com.ms.awt.peer.DirectColourModelData int[] int int com.ms.awt.peer.INativeImageBufferDone))
      (com.ms.awt.peer.NativeImage::void imageDrawStretched (com.ms.awt.peer.INativeGraphics int int int int int int int int int int))
      (com.ms.awt.peer.NativeImage::int finish (int))
      (com.ms.awt.peer.NativeImage::void imageDraw (int int int int int))
      (com.ms.awt.peer.NativeResource::java.lang.String loadString (int))
      (com.ms.awt.peer.NativeResource::int openDialogFromID (int))
      (com.ms.awt.peer.NativeResource::boolean attach (java.lang.String))
      (com.ms.awt.peer.NativeResource::void loadBytes (int int java.lang.String byte[] int))
      (com.ms.awt.peer.NativeResource::int getSize (int int java.lang.String))
      (com.ms.awt.peer.NativeResource::void detach ())
      (com.ms.awt.peer.NativeResource::int openDialogFromName (java.lang.String))
      (com.ms.net.wininet.WininetURLConnection::com.ms.applet.BrowserAppletFrame findOfflineContext ())
      (com.ms.com.DispatchProxy::void finalize ())
      (com.ms.com.DispatchProxy::void init (com.ms.com._Guid java.lang.reflect.Method[] int[]))
      (com.ms.net.wininet.WininetInputStream::void close ())
      (com.ms.net.wininet.WininetInputStream::int read (byte[] int int))
      (com.ms.net.wininet.WininetInputStream::int available ())
      (com.ms.net.wininet.WininetInputStream::long skip (long))
      (com.ms.net.wininet.WininetInputStream::void connect (java.lang.String boolean boolean java.lang.SecurityManager))
      (com.ms.vm.loader.CabSignatureInfo::com.ms.vm.loader.CabSignatureInfo extractFromFile0 (java.lang.String com.ms.security.management.SecurityPolicy))
      (com.ms.net.wininet.http.HttpInputStream::byte[] getResponseHeaders ())
      (com.ms.net.wininet.http.HttpInputStream::void close0 ())
      (com.ms.net.wininet.http.HttpInputStream::void connect (java.lang.String int java.lang.String boolean boolean boolean boolean byte[] byte[] java.lang.SecurityManager))
      (com.ms.vm.loader.CabCracker::int GetTempFileName (java.lang.StringBuffer java.lang.String int java.lang.StringBuffer))
      (com.ms.vm.loader.CabCracker::void getBytes0 (int int byte[]))
      (com.ms.vm.loader.CabCracker::void cleanup ())
      (com.ms.vm.loader.CabCracker::int GetTempPath (int java.lang.StringBuffer))
      (com.ms.vm.loader.CabCracker::void load0 ())


"
!

performance1
    "
     JAVA::BenchMark new loopmark
     JAVA::BenchMark new logicmark
     JAVA::BenchMark new sievemark
     JAVA::BenchMark new methodmark
     JAVA::BenchMark new stringmark
     JAVA::BenchMark new newstringmark
     JAVA::BenchMark new neweststringmark


    "
"
                    caffmark  loopmark  logicmark  sievemark  methodmark  stringmark  float  image  graphic dialog newstringmark  neweststringmark
 linux:
   P6/233 No JIT                 84         87        90          40          22                                       17              10
                      103       133        142       137          28          73       109    167     18    140

   P6/233 JIT                   479       2459       393         649          28                                       21              12
   P6/233 JIT         473      1805       3046       439         986          28                                       21              12
                      533      1808       3382       613        1003          25       105    143      1
                      668      3330       3644       740
                      793      4116       3731      1243        1365         120       103     79      2
                      914      4480       4061                  2290          68       106    158     19     34
                      941      4607       4149      1238        2434          75       101    152     18     32
                                                                             591              164
                     1087                           1836                     800       110                   35
                     1102      4592       4270      1844        2381         841       109    169     21     35
                     1177      4608       4309      1810        2432         895       532    182     20     35


 w95
   P5/200 JIT          90        95         90        95         686          18        60     54      7
                      428      1657       2385       684         957          21        61     62      9
                      541      2886       2589       823         976          18        62     55      7
                      583      3062       2635       842         861         223        65     57      8
                      616      3075       2438      1081        1324         218        64     54      8
                      718      3138       2755      1085        1200         816        63     48      9      7

                    caffmark  loopmark  logicmark  sievemark  methodmark  stringmark  float  image  graphic dialog newstringmark  neweststringmark
"
!

performance2
    "
     symantec benchmarks


    "
"
		BubbleSort    BidirBubbleSort  QuickSort  Sieve   Hanoi   Dhry   Fib   Array   Tree   Total

   ST/X+J Linux
   233Mhz P6
   No JIT          352767         354597         69585    43048  101638  28961 108839  48815

   ST/X+J Linux
   233Mhz P6
   JIT             128724         116810         20259    39733   83160  27613  52093  33166  43996  545554
		   124744         101428         17239    10052    8264  14004  38821  23252  33709  374660
   +IINC           120324                                  7265
   +IADD op2       100173          90737         18128     6996    7423  17093  48559  44209  57056  390374
   +ISUB op2                       90460         17547             5921                       57056  390461
   +ICMPEQ/NE       99785          90147                           5792                43482  56486  388255
   +ICMP            87398          78214         15784     7574    5628  12812  38481  24654  32252  302797
   +IFICMPLE        84198          74928         13814     5650          11674         23241         293118
   +IFICMPxx        76867          69738         12208                          37505  21973  32104  273569
   +IFICMPEQ/NE                                                    5580  11202         21723
   const IFICMPxx                                11856             5463  11032  37372                272726
   +lea for add/sub
   +BALOAD                                       11700     4600    5015   9431
   +BASTORE                                                3279
   +CALOAD/CASTORE                                                        8907
   regSave change   66119          60365          9997             4917  15386  37851  38202  50027  286497
		    64858          58360          9476             4889  15001  37211  36288  48313  278478
		    63146          55949          9302                   14899
		    62970          56085          9352     3226    4837   8779  37573  22815  33899  241297
   -O               43662          40292          7181     2530    4696   8170  34555  22116  32337  195539

   +IALOAD          39162          36347
   +IASTORE         32461          30663          4299             3667                19556  30563  166868

   -IALOAD/IASTORE
										34167  19347
										       19232  29726
										       18821
   +AALOAD/BALOAD
		    41490          39527          6776     3315    4077   8443  33895  19152  28018  184693
		    41291          37034          6593                          32682
   +ATHROW                                                                6449                       180079
   +IASTORE         38848          35601          6219             3796   6122         17869  30085  175106
   IINC delayed code
   +ANEWARRAY                                              3263
   +LADD/LSUB const 38719          35256                                  6062  27071                172859

							   2837                 22835
   +ISTORE into arg
									  3080
   quick L2I for ints                                                     2774  21184
   +*ASTORE / *ALOAD
    again                                                  1621    3654   1525
   +CHECKCAST                                                      3574                       25810

------------------------------------------------------------------------------------------------------------
		BubbleSort    BidirBubbleSort  QuickSort  Sieve   Hanoi   Dhry   Fib   Array   Tree   Total
   ST/X+J Win95
   200Mhz P5
   JIT              78490          77060         15220     4840    6370   9180  73160  36080         351700
				   76900         13560             5500   9010         35200         348600
										66080         69920  370750
   +IADD non consts 76620          73210         13180     3790                 63550         58880  356900
											      51740
		    77390          72450         12520     3900    6040   8950  62450  34330  57780  335810
		    77220          71950                           5270   8840                       338650
		    72390          70690                                                      48010  327370
		    74910          66740         11420                    8620  61730  33340  47350  313940
   +xALOAD/JMP_ZERO
		    71740                                  2800
		    71460          65250         11540     2750                 62180  33840  50750  311660
   +LCMP                                                                        59100
   better abs(I)
   +xALOAD/IF_ICMPx 66130          61520         12080     3300    5280   8190  56510  33830  50310  297150
   elim dummy static                                               5210                       48270
   methods                                                                                    44160
		   119020         112440         19330     3070    4560   2640  56960  37730  52790  408540
------------------------------------------------------------------------------------------------------------
		BubbleSort    BidirBubbleSort  QuickSort  Sieve   Hanoi   Dhry   Fib   Array   Tree   Total


   Sun JDK         274625         244461         52676    50653   65183  26668  78133  28572  61608  882583
   (90Mhz P5)

   Microsoft J++     9684           8452          2874     1733    3535   3665   3836   4746  25717   64242
   (90Mhz P5)

   Symantec Cafe    14541          12198          3686     1922    4527   3325   3425  12969  26829   83422
   JIT 1.02
   (90Mhz P5)

   Symantec Cafe     8292           6970          2714     1613    3345   3235   2013   4516  13180   45878
   JIT 1.2
   (90Mhz P5)
"

"
   |b|

   b := JAVA::BubbleSortAlgorithm new.
   b perform:#'setData(JJ)V' with:10000 with:0 with:0 with:0.
   Time millisecondsToRun:[
       b performTest.
   ]
"
"
   |b|

   b := JAVA::QSortAlgorithm new.
   b perform:#'setData(JJ)V' with:500000 with:0 with:0 with:0.
   Time millisecondsToRun:[
       b performTest.
   ]
"
"
   |t|

   t := JAVA::Tree new.
   t perform:#'setData(JJ)V' with:1000000 with:0 with:0 with:0.
   Time millisecondsToRun:[
       t performTest.
   ]
"
"
   |t|

   t := JAVA::Array new.
   t perform:#'setData(JJ)V' with:1000000 with:0 with:0 with:0.
   Time millisecondsToRun:[
       t performTest.
   ]
"

! !

!JavaVM class methodsFor:'initialization'!

boot

    Java initialize.
    self initializeVM.

    "Created: / 21-02-2012 / 18:09:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

compile:source selector:smalltalkSelector asJavaMethod:javaSelector fakedSource:fakedSource in:aClass
    "install additional java protocol in smalltalk classes, req'd for java programs"

    |cloneCode|

    (aClass implements:javaSelector) ifFalse:[
        Class packageQuerySignal answer:'__temporary__'
        do:[
            aClass
                compile:source
                classified:'java support'
                logged:false.
        ].

        cloneCode := aClass compiledMethodAt:smalltalkSelector.
        cloneCode source:fakedSource.

        Class withoutUpdatingChangesDo:[
            aClass removeSelector:smalltalkSelector.
            aClass addSelector:javaSelector withMethod:cloneCode.
        ]
    ].

    "Created: / 5.11.1998 / 19:30:22 / cg"
    "Modified: / 5.11.1998 / 19:37:57 / cg"
!

deinitialize
    StandardThreadGroup := nil.

    KnownWindows notNil ifTrue: [
        KnownWindows do: [:v | v isTopView ifTrue: [ v destroy ] ]
    ].
    JavaWindowGroup := nil.
    KnownWindows := nil.
    OpenFileTable := nil.
    JavaMethods := nil.
    SystemClassLoader := nil.

    "
     JavaVM deinitialize"

    "Created: / 03-01-1998 / 21:28:14 / cg"
    "Modified: / 03-12-1998 / 20:33:21 / cg"
    "Modified: / 28-01-2011 / 14:11:35 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 16-11-2011 / 09:46:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

deinitializeAdditionalJavaProtocol
    "deinstall additional java protocol in smalltalk classes, req'd for java programs"

    #(
        #'clone()Ljava/lang/Object;'
        #'equals(Ljava/lang/Object;)Z'
        #'toString()Ljava/lang/String;'
        #'getClass()Ljava/lang/Class;'
     ) do:[:sel |
        (Object implements:sel) ifTrue:[
            Class withoutUpdatingChangesDo:[
                Object removeSelector:sel.
            ]
        ].
    ].

    "
     self deinitializeAdditionalJavaProtocol
    "

    "Created: / 4.2.1998 / 21:37:10 / cg"
    "Modified: / 5.12.1998 / 15:27:39 / cg"
!

flushClasses

    ClassRegistry notNil ifTrue:[
        ClassRegistry flush
    ].

    "Created: / 30-10-2011 / 16:09:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initialize
    DUMMY_LONG_HIGHWORD := 1.
    DUMMY_DOUBLE_HIGHWORD := 2.
    StandardThreadGroup := nil.
    NoAudio := true.

    "/ NoAudio := false.

    JavaConsoleStream := "Transcript"Stdout.
    FullExceptionTrace := StackTrace := false.
    WindowOPTrace := DrawOPTrace := EventTrace := ThreadTrace := false.
    MonitorTrace := ExceptionTrace := FileOpenTrace := FileIOTrace := false.
    ExceptionDebug := ExitDebug := false.
    ExceptionDebugPatterns := Set new.
    WindowCreationTrace := false.
    FileOpenConfirmation := false.
    SocketConnectConfirmation := false.
    WindowOPTrace := false.
    MonitorTrace := false.
    ThreadTrace := false.
    UnhandledJavaExceptionSignal := (Signal new) mayProceed: true.
    UnhandledJavaExceptionSignal nameClass: self
        message: #unhandledJavaExceptionSignal.
    UnhandledJavaExceptionSignal notifierString: 'unhandled java exception'.
    JavaExceptionSignal := (Signal new) mayProceed: false.
    JavaExceptionSignal nameClass: self message: #javaExceptionSignal.
    JavaExceptionSignal notifierString: 'java exception'.
    UnimplementedInstructionSignal := (Signal new) mayProceed: false.
    UnimplementedInstructionSignal nameClass: self
        message: #unimplementedInstructionSignal.
    UnimplementedInstructionSignal notifierString: 'unimplemented instruction'.
    UnimplementedNativeMethodSignal := (Signal new) mayProceed: false.
    UnimplementedNativeMethodSignal nameClass: self
        message: #unimplementedNativeMethodSignal.
    UnimplementedNativeMethodSignal
        notifierString: 'unimplemented native method'.
    BadMessageSignal := (Signal new) mayProceed: false.
    BadMessageSignal nameClass: self message: #badMessageSignal.
    BadMessageSignal notifierString: 'invalid message to JAVA object'.
    InternalErrorSignal := (Signal new) mayProceed: false.
    InternalErrorSignal nameClass: self message: #internalErrorSignal.
    InternalErrorSignal notifierString: 'internal error'.
    CallHandlerSignal := (Signal new) mayProceed: false.
    CallHandlerSignal nameClass: self message: #callHandlerSignal.
    CallHandlerSignal notifierString: 'internal signal'.
    StdinReplacementFileQuerySignal := QuerySignal new.
    StdinReplacementFileQuerySignal nameClass: self
        message: #stdinReplacementFileQuerySignal.
    StdinReplacementFileQuerySignal notifierString: 'asking for stdin stream'.
    JavaPrivilegedAccessQuery := QuerySignal new.
    JavaPrivilegedAccessQuery defaultAnswer: false.
    AssertionsEnabled := true.
    ClassRegistry := JavaClassRegistry new.
    FinalizationEnabled := true.
    EagerResolvingEnabled := false.

    ObjectMemory addDependent: self.


    "
     JavaVM initialize"

    "Created: / 02-01-1998 / 18:02:34 / cg"
    "Modified: / 02-12-1998 / 23:02:22 / cg"
    "Modified: / 09-10-2011 / 20:29:10 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 08-12-2011 / 21:06:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 17-08-2012 / 11:16:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeAdditionalJavaProtocol
    "install additional java protocol in smalltalk classes, req'd for java programs"

    "/ since we use smalltalk Arrays for JavaArray, some
    "/ additional (java-) protocol is required.
    "/ This is also useful, when Smalltalk objects are passed to
    "/ java ...
    "/ We should implement all of the java.lang.Object protocol in
    "/ Object, to be on the bright side of life; more of this later ...

    self
        compile:'__clone
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ self shallowCopy'
        selector:#'__clone'
        asJavaMethod:#'clone()Ljava/lang/Object;'
        fakedSource:'#''clone()Ljava/lang/Object;''
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ self shallowCopy'
        in:Object.

    "/ ------------------------------------------------------------

    self
        compile:'__equals:arg
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ (arg = self) ifTrue:[1] ifFalse:[0]'
        selector:#'__equals:'
        asJavaMethod:#'equals(Ljava/lang/Object;)Z'
        fakedSource:'#''equals(Ljava/lang/Object;)Z''
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ (arg = self) ifTrue:[1] ifFalse:[0]'
        in:Object.

    "/ ------------------------------------------------------------

    self
        compile:'__toString
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ Java as_String:(self displayString)'
        selector:#'__toString'
        asJavaMethod:#'toString()Ljava/lang/String;'
        fakedSource:'#''toString()Ljava/lang/String;''
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ Java as_String:(self displayString)'
        in:Object.

    "/ ------------------------------------------------------------

    self
        compile:'__getClass
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ JavaVM javaClassObjectForClass:self class'
        selector:#'__getClass'
        asJavaMethod:#'getClass()Ljava/lang/Class;'
        fakedSource:'#''getClass()Ljava/lang/Class;''
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ JavaVM javaClassObjectForClass:self class'
        in:Object.

    "/ ------------------------------------------------------------

    self
        compile:'__hashCode
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ self identityHash'
        selector:#'__hashCode'
        asJavaMethod:#'hashCode()I'
        fakedSource:'#''hashCode()I''
    "this is smalltalk code with a java selector ...
     (This source cannot be accepted in the browser,
      since it has a funny selector.)
     Has been added by JavaVM>>initializeAdditionalJavaProtocol"

    ^ self identityHash'
        in:Object.


    "
     self initializeAdditionalJavaProtocol
    "

    "Modified: / 28-01-1997 / 19:38:58 / stefan"
    "Modified: / 22-01-1998 / 21:23:40 / av"
    "Created: / 04-02-1998 / 21:35:46 / cg"
    "Modified: / 30-12-1998 / 21:07:55 / cg"
    "Modified: / 25-10-2010 / 16:26:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeBaseClasses
    "load req'd base classes"

    #( 'java.lang.Object'
     'java.lang.Class'
     'java.lang.String'
     'java.lang.System' )
            do: [
                :cName |
                (self classForName: cName) isNil ifTrue: [
                    self
                        warn: ('JavaVM: could not find required class: ' , cName asText allBold
                                , '\\Please check the Java settings (javaHome)') withCRs.
                    AbortSignal raise.
                    ^ self
                ]
            ].

    "
     self initializeBaseClasses"
    "Created: / 3.1.1998 / 21:13:28 / cg"
    "Modified: / 23.12.1999 / 19:27:42 / cg"
!

initializeClassReader
    "/Nothing to do"

    JavaClassReader initialize.

    "Created: / 06-09-2012 / 11:18:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeJavaResources
    self initializeMonitorTable.
    self initializePrimitiveClasses.
    self initializeOpenFileTable.

    "
     JavaVM releaseAllMonitors"

    "Created: / 02-01-1998 / 18:04:05 / cg"
    "Modified: / 07-01-1998 / 22:58:10 / cg"
    "Created: / 16-11-2011 / 14:23:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 17-08-2012 / 11:30:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeMonitorTable
    LockTable := WeakIdentityDictionary new:32000.
    LockTableAccess := Semaphore "RecursionLock" forMutualExclusion.
    LockTableAccess name: 'JavaVM lock table access mutex'.
    Logger
        log: 'Initializing EnteredMonitorsPerProcess'
        severity: #debug
        facility: #JVM.
    EnteredMonitorsPerProcess := IdentityDictionary new.
    Logger
        log: 'Initializing AcquiredMonitorsPerProcess'
        severity: #debug
        facility: #JVM.
    AcquiredMonitorsPerProcess := IdentityDictionary new.

    "
     JavaVM initializeMonitorTable"

    "Created: / 17-08-2012 / 11:30:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeOpenFileTable
    OpenFileTable := OrderedCollection
                        with:Stdin
                        with:("JavaConsoleStream ?" Stdout)
                        with:("JavaConsoleStream ?" Stderr).
    OpenFileTableLock := RecursionLock new.

    "
     JavaVM initializeOpenFileTable
    "

    "Modified: / 06-08-1997 / 00:40:19 / cg"
    "Created: / 02-01-1998 / 18:04:32 / cg"
    "Modified: / 30-07-2012 / 18:12:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializePrimitiveClasses


    "/    #(
    "/        (#byte    'B' 1)
    "/        (#short   'S' 2)
    "/        (#int     'I' 4)
    "/        (#long    'J' 8)
    "/        (#boolean 'Z' 1)
    "/        (#char    'C' 2)
    "/        (#float   'F' 4)
    "/        (#double  'D' 8)
    "/        (#void    'V' 0)
    "/    ) triplesDo:[:nm :sig :len |
    "/        |jClass classInst|
    "/
    "/        "/
    "/        "/ create a javaClass for it.
    "/        "/
    "/        jClass := Java at:'java.lang.Class'.
    "/        jClass notNil ifTrue:[
    "/            classInst := jClass new.
    "/            JavaClasses at:nm put:classInst.
    "/            JavaClasses at:classInst put:nm.
    "/        ]
    "/    ].
    "
     self initializePrimitiveClasses"

    "Modified: / 22-10-1998 / 01:56:02 / cg"
    "Modified: / 20-12-2010 / 23:39:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 14:57:38 / Marcel Hlopko <hlopik@gmail.com>"
!

initializeReflection

    Reflection := JavaVM::Reflection for: self.

    "Created: / 21-12-2010 / 19:48:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeSimulatedLibs
    "return a collection of native libs which are considered
     being already loaded. (used with jdk < 1.2)"

    LibPath := #(
                        '__builtIn__'
                        '/usr/local/lib'
                        '/usr/local/lib/java'
                ).

    SimulatedLibs := #(
                        '__builtIn__/net'
                        '__builtIn__/awt'
                        '__builtIn__/tawt'
                        '__builtIn__/winawt'
                        '__builtIn__/jpeg'
                        '__builtIn__/mmedia'
                        '__builtIn__/zip'
                        '__builtIn__/math'
                        '__builtIn__/sysresource'

                        "/ KAVA ...
                        '__builtIn__/agent'

                        "/ MS-java ...
                        '__builtIn__/msawt'
                        '__builtIn__/javart'

                        "/ 1.1.8
                        '__builtIn__/jpeg_sun'
                      ).

    "
     self initializeSimulatedLibs
    "

    "Created: / 4.1.1998 / 19:05:03 / cg"
    "Modified: / 17.11.1998 / 23:53:02 / cg"
!

initializeSimulatedNativeLibs
    "return a collection of native libs which are considered
     being already loaded (used with jdk >= 1.2)"

    OperatingSystem isUNIXlike ifTrue: [
        SimulatedNativeLibs := #( 'libawt.so' 'libnet.so' 'libcmm.so' 'libzip.so' 'libnio.so'
                                  'libmanagement.so'        "/ Management Beans - req'd by Tomcat
                                  'libjpeg.so' 'liblcms.so' "/ Some UI stuff - req'd by Tomcat !!?!!
                                  'libfontmanager.so'       "/ req'd by java.text.Bidi
                                    ).
        ^ self.
    ].
    OperatingSystem isMSWINDOWSlike ifTrue: [
        SimulatedNativeLibs := #( 'awt.dll' 'net.dll' 'cmm.dll' 'zip.dll' 'nio.so'
                                  'management.dll'          "/ Management Beans - req'd by Tomcat
                                  'fontmanager.dll'          "/ req'd by java.text.Bidi
                                ).
        ^ self.
    ].
    SimulatedNativeLibs := #().

    "
     self initializeSimulatedNativeLibs"

    "Modified: / 27-01-1998 / 18:43:10 / cg"
    "Modified: / 03-11-2011 / 19:00:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 21-12-2011 / 23:03:35 / jv"
    "Modified: / 12-05-2012 / 12:52:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeSimulatedNativeMemory

    SimulatedNativeMemory := JavaNativeMemory new.

    "Created: / 07-12-2010 / 21:07:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 07-12-2010 / 23:45:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeSystemClassLoader

    | java_lang_ClassLoader stx_libjava_ClassLoader |

    java_lang_ClassLoader := JavaVM classForName: 'java.lang.ClassLoader'.
    (SystemClassLoader := java_lang_ClassLoader instVarNamed:#scl) isNil ifTrue:[
        SystemClassLoader := java_lang_ClassLoader perform: #'getSystemClassLoader()Ljava/lang/ClassLoader;'
    ].

    stx_libjava_ClassLoader := JavaVM classForName: 'stx.libjava.ClassLoader'.
    (SmalltalkClassLoader := stx_libjava_ClassLoader instVarNamed:#scl) isNil ifTrue:[
        SmalltalkClassLoader := stx_libjava_ClassLoader perform: #'getSmalltalkClassLoader()Ljava/lang/ClassLoader;'
    ].

    "Created: / 30-10-2011 / 12:04:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeSystemPropertiesInto: props
    | cpu  cpu2  os |
    "/ use JAVA compatible cpu-name
    cpu := OperatingSystem getCPUType.
    cpu2 := cpu.
    cpu = 'i386' ifTrue: [ cpu := 'ix86' ].
    (OperatingSystem getSystemInfo at: #machine) = 'x86_64' ifTrue: [
        cpu2 := 'amd64'
    ].
    SimulatedOS notNil ifTrue: [ os := SimulatedOS ] ifFalse: [
        os := OperatingSystem getOSType.
        os := os asUppercaseFirst.
    ].
    props addPairsFrom: {
                'java.runtime.name'.
                'OpenJDK Runtime Environment'.
                'sun.boot.library.path'.
                OperatingSystem isMSWINDOWSlike ifTrue: [
                    (Java release jreHome / 'bin') asString
                ] ifFalse: [ (Java release jreHome / 'lib' / cpu2) asString ].
                'java.vm.version'.
                Smalltalk versionString.
                'java.vm.vendor'.
                'eXept Software AG & SWING Research Group'.
                'java.vendor.url'.
                'http://www.exept.de & http://swing.fit.cvut.cz'.
                'path.separator'.
                OperatingSystem pathSeparator asString.
                'java.vm.name'.
                'Smalltalk/X'.
                'file.encoding.pkg'.
                'sun.io'.
                'sun.java.launcher'.
                'SUN_STANDARD'.
                'user.country'.
                'US'.
                'sun.os.patch.level'.
                'unknown'.
                'java.vm.specification.name'.
                'Java Virtual Machine Specification'.
                'user.dir'.
                Filename currentDirectory pathName.
                'java.awt.graphicsenv'.
                'sun.awt.X11GraphicsEnvironment'.
                'java.endorsed.dirs'.
                (Java release jreHome / 'lib' / 'endorsed') asString.
                'os.arch'.
                cpu.
                'java.io.tmpdir'.
                Filename tempDirectory pathName.
                'line.separator'.
                Character cr asString.
                'java.vm.specification.vendor'.
                'Sun Microsystems Inc.'.
                'os.name'.
                os.
                'sun.jnu.encoding'.
                'UTF-8'.
                'java.library.path'.
                self defaultJavaLibraryPath.
                'java.specification.name'.
                'Java Platform API Specification'.
                'java.class.version'.
                '50.0'.
                'sun.management.compiler'.
                'Smalltalk/X jinterpreter'.
                'os.version'.
                OperatingSystem isMSWINDOWSlike ifTrue: [
                    OperatingSystem getSystemInfo at: #release
                ] ifFalse: [ OperatingSystem getSystemInfo at: #version ].
                'user.home'.
                Filename homeDirectory pathName.
                'user.timezone'.
                ''.
                'java.awt.printerjob'.
                'sun.print.PSPrinterJob'.
                'file.encoding'.
                'UTF-8'.
                'java.specification.version'.
                '1.6'.
                'java.class.path'.
                self defaultCLASSPATH.
                'user.name'.
                OperatingSystem getLoginName.
                'java.vm.specification.version'.
                '1.0'.
                 "'sun.java.command'            . 'SystemProperties' ."
                'java.home'.
                Java release jreHome pathName.
                'sun.arch.data.model'.
                '32'.
                'user.language'.
                Smalltalk language.
                'java.specification.vendor'.
                'Sun Microsystems Inc.'.
                'java.vm.info'.
                'Smalltalk/X 6.2.1'.
                'java.version'.
                '1.6'.
                'java.ext.dirs'.
                self defaultExtDirs.
                'sun.boot.class.path'.
                self defaultSunBootLibraryPath.
                'java.vendor'.
                'Sun Microsystems Inc.'.
                'file.separator'.
                Filename separatorString.
                'java.vendor.url.bug'.
                'https://swing.fit.cvut.cz/projects/stx-libjava/newticket'.
                'sun.io.unicode.encoding'.
                'UnicodeLittle'.
                'sun.cpu.endian'.
                'little'.
                'sun.desktop'.
                'gnome'.
                'sun.cpu.isalist'.
                ''
            }.

    "/ props at:'user.dir'           put:(Filename currentDirectory pathName).
    "/props at:'awt.toolkit'        put:(self defaultWindowingToolKit).

    props at: 'user.country' put: 'US'.
    props at: 'hotjava.home' put: (self defaultHotJavaHome).

    "/ new with jdk 1.1.8
    "/ undocumented ?
    "/ suppress copyright view in appletViewer ...

    props at: 'appletviewer.version' put: '1.1'.

    "/ new with jdk 1.2

    props at: 'java.awt.graphicsenv' put: 'sun.awt.X11GraphicsEnvironment'.
    props at: 'java.awt.fonts' put: '/usr/lib/X11/fonts'.

    "/ jws
    "/props at:'jws.home'             put:(self defaultJWSHome).
    "/ new with jws 2.0 ...
    "/props at:'jws.startcmd'         put:'jws.showwin.mainide'.
"/    props at: 'sun.misc.URLClassPath.debug' put: 'true'.

    "/ Java tests, sigh..."

    props at: 'libjava.tests.dir' put: ((Smalltalk getPackageDirectoryForPackage: self package) / 'tests') pathName.

    ^ props

    "
     self initializeSystemPropertiesInto:(Dictionary new)"

    "Created: / 03-01-1998 / 14:26:39 / cg"
    "Modified: / 27-01-2000 / 02:20:18 / cg"
    "Modified (format): / 03-11-2011 / 12:40:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 21-12-2011 / 23:05:11 / jv"
    "Modified: / 13-09-2012 / 20:33:56 / m"
    "Modified: / 09-01-2013 / 17:11:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeVM

    OperatingSystem initResources.

    "Java requires a huge stack. Change default to 16 MB.
     Observations:
     - Groovy 'rnd = new java.security.SecureRandom()' requires > 4MB
     - ant run on Groovy 1.8.7 source requires > 8MB
    "
    "/Process defaultMaximumStackSize: ((1024 * 1024 * 16) max: Process defaultMaximumStackSize).

    "Java Classes are huge and there is a (unfixed) bug in 2-phase oldspace
     compress, so try to avoid it by pre-allocating more oldspace."
    OldspaceIncreased ~~ true ifTrue:[
        ObjectMemory moreOldSpace: 64"MB"*(1024*1024).
        OldspaceIncreased := true.
    ].

    ClassRegistry := JavaClassRegistry for: self.
    ClassLoaderQuerySignal := Query new.
    JavaObject autoload.
    JavaContext autoload.
    MonitorTrace isNil ifTrue: [ self initialize ].
    MonitorTraceId := 0.
    self initializeAdditionalJavaProtocol.
    self initializeJavaResources.
    JavaConsoleStream := Transcript.
    Java initAllStaticFields.
    Java markAllClassesUninitialized.
    ZipCache := OrderedCollection new.
    ZipEntryCache := OrderedCollection new.
    ZipInflaters := OrderedCollection new.
    FinalizationLobby := JavaFinalizationRegistry new.

    "/ force re-resolving;
    "/ otherwise, class-inits would not be called
    "/ by resolver ... (sigh)

    JavaNativeMethod flushAllCachedNativeMethods.
    JavaMethod
        allSubInstancesDo: [
            :m |
            m checked: false.
            m code: nil.
        ].
    ObjectMemory flushCaches.

    "/ sigh - must flush inline caches.

    JavaClass startRememberingOrderOfClassInits.
    self initializeSimulatedLibs.

    "/ < jdk 1.2

    self initializeSimulatedNativeLibs.

    "/ >= jdk 1.2

    self initializeSimulatedNativeMemory.

    "/>  jdk 6

    ThreadInterrupts := Dictionary new.

    self initializeClassReader.
    self initializeOpenFileTable.
    self initializeReflection.
    self initializeBaseClasses.
    self initializePrimitiveClasses.
    Java initSystemClass.
    Java initializeCurrentThread.
    self initializeSystemClassLoader.
    ObjectMemory addDependent: self.
    StartupTime := OperatingSystem getOSTime.
    FinalizationLobby startFinalizationProcessAt: 5.
    PerfCounters := Performance for: self.


    JavaNativeMethod allInstancesDo:[:e|e nCallsReset ].

    "
     JavaVM initialize.
     JavaVM initializeVM."

    "Created: / 03-01-1998 / 21:29:09 / cg"
    "Modified: / 14-12-1999 / 18:58:56 / cg"
    "Modified: / 15-10-2010 / 15:27:45 / Jan Kurs <kurs.jan@post.cz>"
    "Modified: / 24-02-2012 / 13:59:29 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 24-02-2012 / 14:37:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 16-01-2013 / 13:18:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeVMIfNoEventThreadRunning
    |uClass updater p|

    uClass := JAVA::sun::awt::ScreenUpdater.
    uClass notNil ifTrue:[
        updater := uClass instVarNamed:'updater'.
        updater notNil ifTrue:[
            p := self stProcessForJavaThread:updater
        ].
        (updater isNil or:[p isNil or:[p isDead]]) isNil ifTrue:[
            self initializeVM.
            ^ self.
        ]
    ].

    (JavaEventThread isNil or:[JavaEventThread isDead]) ifTrue:[
        self initializeVM
    ].

    "
     JavaVM initializeVMIfNoEventThreadRunning
    "

    "Created: / 15.1.1998 / 17:32:27 / cg"
    "Modified: / 24.12.1999 / 02:18:25 / cg"
!

reboot

    Java flushAllJavaResources.
    self boot

    "Created: / 21-02-2012 / 18:10:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

reinitializeSockets
    "Reopens all server-sockets (i.e., listening sockets bound to a port).
     Called upon restarting from image"

    OpenFileTable notNil ifTrue:[
        OpenFileTable do:[:each|each isSocket ifTrue:[each reOpenIfPossible]]
    ].

    "Created: / 17-08-2012 / 15:33:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

reinitializeVM
    |classesToInit|

    self releaseAllJavaResources.

    JavaConsoleStream := Transcript.

    Java initAllStaticFields.
    Java markAllClassesUninitialized.

    self initializeOpenFileTable.

    classesToInit := JavaClass orderOfClassInits.
    JavaClass startRememberingOrderOfClassInits.

    self initializePrimitiveClasses.
"/    Java initSystemClass.

    classesToInit do:[:jClass |
        jClass classInit
    ].
    Java initSystemClass.

    "Created: / 12-11-1998 / 15:37:52 / cg"
    "Modified: / 17-11-1998 / 16:10:11 / cg"
    "Modified: / 14-09-2011 / 22:06:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

reinitializeVMIfNoEventThreadRunning
    (JavaEventThread isNil or:[JavaEventThread isDead]) ifTrue:[
        ^ self reinitializeVM
    ].
    (JavaEventQueueThread isNil or:[JavaEventQueueThread isDead]) ifTrue:[
        ^ self reinitializeVM
    ].

    "
     JavaVM reinitializeVMIfNoEventThreadRunning
    "

    "Created: / 24.11.1998 / 15:45:49 / cg"
    "Modified: / 24.12.1999 / 02:36:41 / cg"
!

releaseAllJavaResources
    self deinitialize.
    FirstWindowCreationSemaphore := Semaphore new.
    JavaScreenUpdaterThread := JavaEventQueueThread := nil.
    LoadedLibs := nil.
    LoadedNativeLibs := nil.
    ImageStretchCache := nil.
    LastGraphics := LastGC := nil.
    SimulatedNativeMemory := nil.
    self initializePrimitiveClasses.
    self terminateAllThreads.
    "/self releaseAllMonitors.
    self releaseAllWindows.
    self releaseAllStreams.

    "
     JavaVM releaseAllJavaResources"

    "Created: / 07-01-1998 / 22:49:42 / cg"
    "Modified: / 24-12-1999 / 02:33:11 / cg"
    "Modified: / 17-12-2010 / 17:51:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-11-2011 / 20:27:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

releaseAllMonitors
    LockTable := WeakIdentityDictionary new.
    LockTableAccess := Semaphore "RecursionLock" forMutualExclusion.
    LockTableAccess name: 'JavaVM lock table access mutex'.
    EnteredMonitorsPerProcess notNil ifTrue: [
        EnteredMonitorsPerProcess
            keysAndValuesDo: [:p :value | value size > 0 ifTrue: [ self breakPoint: #mh ] ]
    ].
    self releaseLeftOverMonitors.
    Logger
        log: 'Clearing EnteredMonitorsPerProcess'
        severity: #debug
        facility: #JVM.
    EnteredMonitorsPerProcess := IdentityDictionary new.
    Logger
    log: 'Clearing AcquiredMonitorsPerProcess'
    severity: #debug
    facility: #JVM.
        EnteredMonitorsPerProcess := IdentityDictionary new.

    "
     JavaVM releaseAllMonitors"

    "Created: / 02-01-1998 / 18:04:05 / cg"
    "Modified: / 07-01-1998 / 22:58:10 / cg"
    "Modified: / 17-11-2011 / 17:00:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 13-04-2012 / 00:34:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

releaseAllStreams
    OpenFileTable notNil ifTrue:[
	OpenFileTable do:[:aStream |
	    aStream notNil ifTrue:[
		aStream ~~ Stdin ifTrue:[
		    aStream ~~ Stdout ifTrue:[
			aStream ~~ Stderr ifTrue:[
			    aStream ~~ JavaConsoleStream ifTrue:[
				aStream isExternalStream ifTrue:[
				    aStream shutDown
				]
			    ]
			]
		    ]
		]
	    ]
	]
    ].
    self initializeOpenFileTable.

    "
     JavaVM releaseAllStreams
    "

    "Created: / 7.1.1998 / 22:57:04 / cg"
    "Modified: / 4.2.1998 / 19:53:11 / cg"
!

releaseAllWindows
    KnownWindows notNil ifTrue:[
	KnownWindows do:[:aView |
	    aView destroy
	].
	KnownWindows := nil.
    ]

    "
     self releaseAllWindows
    "

    "Created: / 7.1.1998 / 22:58:32 / cg"
!

releaseLeftOverMonitors
    "release monitors held by dead processes"

    | deadProcesses |
    deadProcesses := IdentitySet new.
    EnteredMonitorsPerProcess notNil ifTrue: [
        EnteredMonitorsPerProcess keysAndValuesDo: [
            :p :monitors |
            p isDead ifTrue: [

                monitors do: [
                    :mon |
                    Logger
                        log: 'release leftover monitor ...'
                        severity: #info
                        facility: 'JVM'.
                    mon release
                ].
                deadProcesses add: p.
            ]
        ].
        ].
    deadProcesses do: [:p | EnteredMonitorsPerProcess removeKey: p ].

    "
     JavaVM releaseLeftOverMonitors"

    "Created: / 08-01-1998 / 17:29:26 / cg"
    "Modified: / 14-09-2011 / 22:06:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 29-11-2011 / 14:26:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

releasehSmalltalkClassLoader
    SmalltalkClassLoader := nil.

    "Created: / 09-01-2013 / 15:58:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

releasehSystemClassLoader
    SystemClassLoader := nil.

    "Created: / 30-07-2012 / 17:13:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

systemProperties
    |props|

    props := Dictionary new.
    self initializeSystemPropertiesInto:props.
    ^ props

    "Created: / 3.1.1998 / 14:25:58 / cg"
    "Modified: / 3.1.1998 / 14:32:38 / cg"
!

update:what with:aParameter from:changedObject

    "
    #earlyRestart is send first, nothing has been setup yet.
    (should be used to flush all device dependent entries)
    "
    what == #earlyRestart ifTrue:[
        self initializeMonitorTable.

        ^self.
    ].

    "#returnFromSnapshot is sent last (should be used to restart processes, reOpen
    Streams which cannot be automatically be reopened (i.e. Sockets, Pipes) and so on.
    (Notice that positionable fileStreams are already reopened and repositioned)
    "
    what == #returnFromSnapshot ifTrue:[
        self reinitializeSockets.

        ^self
    ].
    "
     JavaVM initializeVM
    "

    ObjectMemory dependents

    "Created: / 09-01-1998 / 10:30:13 / cg"
    "Modified: / 06-11-1998 / 00:40:53 / cg"
    "Modified: / 17-08-2012 / 15:35:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'Signal constants'!

badMessageSignal
    ^ BadMessageSignal

    "Created: / 2.1.1998 / 18:06:52 / cg"
!

callHandlerSignal
    ^ CallHandlerSignal

    "Created: / 2.1.1998 / 18:07:16 / cg"
!

classLoaderQuerySignal

    <resource: #obsolete>

    self breakPoint: #jv.

    ^JavaClassReader classLoaderQuerySignal

    "Modified: / 28-10-2011 / 22:11:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

internalErrorSignal
    ^ InternalErrorSignal

    "Created: / 2.1.1998 / 18:07:05 / cg"
!

javaExceptionSignal
    "^ JavaExceptionSignal"
    ^JavaError

    "Created: / 02-01-1998 / 18:05:58 / cg"
    "Modified: / 01-03-2011 / 21:50:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

privilegedAccessQuery
    ^ JavaPrivilegedAccessQuery.

    "Created: / 09-10-2011 / 20:24:49 / Marcel Hlopko <hlopik@gmail.com>"
!

stdinReplacementFileQuerySignal
    ^ StdinReplacementFileQuerySignal

    "Created: / 2.1.1998 / 18:06:52 / cg"
!

unhandledJavaExceptionSignal
    ^ UnhandledJavaExceptionSignal

    "Created: / 2.1.1998 / 18:05:19 / cg"
!

unimplementedInstructionSignal
    ^ UnimplementedInstructionSignal

    "Created: / 2.1.1998 / 18:06:15 / cg"
!

unimplementedNativeMethodSignal
    ^ UnimplementedNativeMethodSignal

    "Created: / 02-01-1998 / 18:06:40 / cg"
    "Modified: / 15-01-2013 / 22:30:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'accessing'!

addClass:aJavaClass definedBy:aJavaClassLoader

    self assert: aJavaClass classLoader == aJavaClassLoader.
    ^ ClassRegistry registerClass:aJavaClass

    "Modified: / 23-10-2011 / 11:58:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

addSelector:newSelector withMethod:newMethod
    super addSelector:newSelector withMethod:newMethod.

    "/JavaNativeMethod may not be loaded..."

    (Smalltalk at:#JavaNativeMethod)
        ifNotNil:[JavaNativeMethod flushAllCachedNativeMethods].

    "Created: / 24-12-1999 / 03:12:05 / cg"
    "Modified: / 02-02-2011 / 04:38:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-02-2011 / 23:38:08 / Marcel Hlopko <hlopik@gmail.com>"
!

assertionsEnabled: aBoolean

    AssertionsEnabled := aBoolean

    "
        JavaVM assertionsEnabled: true.
        JavaVM assertionsEnabled: false.
    "

    "Created: / 24-11-2010 / 09:02:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

classRegistry
    ^ ClassRegistry.

    "Created: / 21-10-2011 / 11:12:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

extClassLoader
    ^ self systemClassLoader instVarNamed:#'parent'.

    "Created: / 30-10-2011 / 12:08:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 02-11-2011 / 13:20:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

finalizationEnabled

    ^FinalizationEnabled

    "Created: / 14-11-2011 / 21:14:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

finalizationLobby

    ^FinalizationLobby

    "Created: / 14-11-2011 / 12:29:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaEventQueueThread
     ^ JavaEventQueueThread

    "Created: / 24.12.1999 / 02:34:35 / cg"
!

javaEventThread
     ^ JavaEventThread

    "Created: / 8.1.1999 / 17:05:02 / cg"
!

javaScreenUpdaterThread
     ^ JavaScreenUpdaterThread

    "Created: / 8.1.1999 / 17:06:52 / cg"
!

performance
    "Return an object keeping Java performance counters"
    ^ PerfCounters

    "Modified: / 14-08-2012 / 00:39:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

reflection
    ^ Reflection.

    "Created: / 28-01-2011 / 15:09:19 / Marcel Hlopko <hlopik@gmail.com>"
!

registry
    ^ ClassRegistry.

    "Modified (format): / 21-10-2011 / 11:12:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

smalltalkClassLoader

    ^SmalltalkClassLoader

    "Created: / 22-08-2012 / 13:00:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

systemClassLoader

    ^SystemClassLoader

    "Created: / 30-10-2011 / 12:08:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

useSmalltalkInterpreter

    JavaMethod makeMetaMethod

    "Created: / 23-02-2011 / 12:59:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

useVMInterpreter

    JavaMethod makeJavaMethod

    "Created: / 23-02-2011 / 12:59:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'cache management'!

flushCachesFor: aClass
    "Flush all caches for given class, including JIT-compiled code.
     Called for allow for dynamic recompilation when a reference
     is resolved"

    aClass methodDictionary do:[:mthd|
        (mthd isJavaMethod and:[mthd isResolved not]) ifTrue:[
            "Stdout nextPutAll:'Flushing code for ' , mthd printString; cr."
            mthd code: nil.
            mthd checked: false.
        ].
    ].
    ObjectMemory flushCachesFor: aClass.

    "Created: / 17-10-2012 / 20:22:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'class access'!

arrayClassFor: javaClass ifAbsentPut: block
    ^self reflection arrayClassFor: javaClass ifAbsentPut: block

    "Created: / 05-07-2012 / 23:20:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

at: aString

    ^ ClassRegistry classNamed: aString asInternalJavaClassName.

    "Modified (comment): / 21-10-2011 / 12:14:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 23-10-2011 / 12:25:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

at: aString put: aJavaClass
    self breakPoint: #mh.
    self breakPoint: #jv.
    "dont use me anymore"
    ^ ClassRegistry registerClass: aJavaClass

    "Modified (comment): / 21-10-2011 / 12:14:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 23-10-2011 / 11:58:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

classForName: className
    "load class from registry - load using classLoader from query or JavaClassReader if absent"


    ^ self classForName: className asSlashedJavaClassName
        definedBy: (JavaClassReader classLoaderQuerySignal query) "? SystemClassLoader".

    "Modified: / 30-10-2011 / 17:46:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 16:33:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

classForName: className definedBy: classLoader
    "load class from registry - load using given classLoader if not nil"

    | result |
    result := self
                classForName: className asSlashedJavaClassName
                definedBy: classLoader
                ifAbsentPut: [
                    | class  classLoaderEnsured |
                    self assert: (className includes: $.) not.
                    self booted ifFalse: [
                        "class loaders allowed after vm boot, until then, only primordial"
                        class := self usePrimordialCLToLoadClassNamed: className.
                        self assert: (class notNil)
                            description: 'Couldnt load class ' , className , ' while booting Java VM'.
                        class.
                    ] ifTrue: [
                        self assert: (self booted)
                            description: 'Java VM is not booted and we are not using primordial class loader to load: '
                                    , className.
                        (Java release bootClassPathIncludesClassNamed: className) ifTrue: [
                            "we will use primordial class loader for classes in rt.jar etc"
                            class := self usePrimordialCLToLoadClassNamed: className.
                            self assert: (class notNil)
                                description: 'Class ' , className
                                        , ' is supposed to be in boot classpath, but we couldnt load it'.
                            class.
                        ] ifFalse: [
                            (Java release extDirsIncludesClassNamed: className) ifTrue: [
                                class := self useExtCLToLoadClassNamed: className.
                                self assert: (class notNil)
                                    description: 'Class ' , className
                                            , ' is supposed to be in java.ext,dirs, but we couldnt load it'.
                                class.
                            ] ifFalse: [
                                "at this point, nil classLoader means use system class loader,
                                 in other words, at this point, we shouldnt use primordial cl at all"
                                classLoader isNil ifTrue: [
                                    self assert: (self systemClassLoader notNil)
                                        description: 'We needed system class loader, but its not loaded yet'.
                                    classLoaderEnsured := self systemClassLoader
                                ] ifFalse: [ classLoaderEnsured := classLoader ].
                                class := self useUserDefinedCL: classLoaderEnsured
                                            toLoadClassNamed: className.
                                class isNil ifTrue: [
                                    Logger
                                        log: 'Even ' , classLoader printString , ' was not able to load class '
                                                , className
                                        severity: #warn
                                        facility: 'JVM'.
                                    nil
                                ] ifFalse: [ class ].
                            ]
                        ]
                    ]
                ].
    result isNil ifTrue: [
        Logger
            log: 'Class ' , className , ' couldnt be loaded'
            severity: #warn
            facility: 'JVM'
    ] ifFalse: [ result := self makeArrayOf: result asDescribedBy: className. ].
    ^ result.

    "Created: / 21-10-2011 / 12:01:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 30-10-2011 / 13:54:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 16:49:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

classForName: className definedBy: classLoader ifAbsentPut: aBlock
    "load class from registry - if absent evaluate given block to get loaded class"

    | result |
    className asJavaComponentClassName isJavaPrimitiveTypeDescriptor ifTrue: [
        ^ (JavaDescriptor fromString: className) javaClass.
    ].
    result := ClassRegistry
                classForName: className asSlashedJavaClassName
                loader: classLoader
                ifAbsentPut: aBlock.
    result notNil ifTrue: [
        result := self makeArrayOf: result asDescribedBy: className.
    ].
    ^ result.

    "Created: / 21-10-2011 / 12:13:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 30-10-2011 / 22:04:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 02-11-2011 / 16:09:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

classNamed: className
    "Return class with given name loaded by current classloader or nil if class is not yet loaded"

    ^ self classNamed: className definedBy: JavaClassReader classLoaderQuerySignal query.

    "Modified: / 21-10-2011 / 12:09:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (comment): / 21-10-2011 / 13:34:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 28-10-2011 / 22:12:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

classNamed: className definedBy: classLoader
    "Return class with given name loaded by given classloader or nil if class is not yet loaded"

    | result |
    className asJavaComponentClassName isJavaPrimitiveTypeDescriptor ifTrue: [
        ^ (JavaDescriptor fromString: className) javaClass.
    ].
    result := ClassRegistry
                classForName: className asSlashedJavaClassName
                loader: classLoader
                ifAbsent: [ ^ nil ].
    ^ self makeArrayOf: result asDescribedBy: className.

    "Created: / 21-10-2011 / 11:58:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 23-10-2011 / 12:01:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-11-2011 / 15:36:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

loadClassesIn: directory
"load all classes (.class files, strictly speaking) found in given directory.
The argument is string containing the name of the directory.

Returns a set of loaded classes."

^ self loadClassesIn: directory matching: '*'.

    "Modified: / 11-06-2011 / 13:35:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 21-10-2011 / 12:40:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

loadClassesIn: directory matching: pattern
    "load all classes (.class files, strictly speaking) found in given directory.
     The arguments are a string containing the name of the directory
     and a class name pattern. Only classes matching the pattern are loaded.
     class names are matched using String>>matches:.
     ALL CLASSES ARE INSTALLED!!
     Returns a set of loaded classes."

    | dir  dirString  className  loadedClasses |
    dir := directory asFilename asAbsoluteFilename.
    loadedClasses := Set new.
    Java addToClassPath: dir pathName.
    JavaClassReader classLoaderQuerySignal answer: SystemClassLoader do:[

    dir
        recursiveDirectoryContentsAsFilenamesDo: [
            :filename |
            (filename isRegularFile and: [ filename suffix = #class ]) ifTrue: [
                dirString := dir pathName.
                className := filename withoutSuffix pathName.
                className := className subString: dirString size + 2 to: className size.
                className := className copyReplaceAll: (Filename separator) with: $..
                (className matches: pattern) ifTrue: [
                    (self classNamed: className) isNil ifTrue:[
                        loadedClasses add: (self classForName:className).
                    ].
                ]
            ]
        ].
    ].
    ^ loadedClasses.

    "Modified: / 21-10-2011 / 12:52:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 30-10-2011 / 14:02:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'class loading'!

useExtCLToLoadClassNamed: className
    | ecl  class |
    ecl := self extClassLoader.
    self assert: (ecl notNil)
        description: 'we want to use ExtClassLoader, but its not loaded yet'.
    class := ecl
                perform: #'loadClassInternal(Ljava/lang/String;)Ljava/lang/Class;'
                with: (Java as_String: (className asDottedJavaClassName)).
    self assert: (class notNil)
        description: 'we tried to load class ' , className
                , ' using ExtClassLoader and we failed:)'.
                class := JavaVM classForJavaClassObject: class.
                class classLoader: ecl.
    ^ class.

    "Created: / 02-11-2011 / 13:48:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

usePrimordialCLToLoadClassNamed: className
    | class |
    JavaClassReader classLoaderQuerySignal answer: nil
        do: [
            class := JavaClassReader readClass: className.
        ].
    ^ class

    "Modified: / 02-11-2011 / 17:28:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

useUserDefinedCL: classLoader toLoadClassNamed: className
    | classObject  class |
    classObject := classLoader
                perform: #'loadClassInternal(Ljava/lang/String;)Ljava/lang/Class;'
                with: (Java as_String: (className asDottedJavaClassName)).
    class := self classForJavaClassObject: classObject.
    class javaMirror getClassLoader isNil ifTrue: [self breakPoint:#mh].
    ^ class.

    "Created: / 02-11-2011 / 16:20:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 22-08-2012 / 12:57:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'debugging support'!

disableMonitorTrace
    MonitorTrace := false.

    "Created: / 22-11-2011 / 10:29:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

enableMonitorTrace
    MonitorTrace := true.

    "Created: / 22-11-2011 / 10:29:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 07-04-2012 / 08:47:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

exceptionDebug
    ^ ExceptionDebug

    "Created: / 27.1.1999 / 20:14:51 / cg"
!

exceptionDebug:aBoolean
    ExceptionDebug := aBoolean

    "Created: / 27.1.1999 / 20:15:00 / cg"
!

exceptionDebugPatterns

    ^ ExceptionDebugPatterns
    "
    ExceptionDebug must be set in order to ExceptionDebugPatterns work

    ExceptionDebug := true.
    ExceptionDebug := false.
    ExceptionDebugPatterns removeAll.
    ExceptionDebugPatterns add: 'java/lang/SecurityException*'.
    ExceptionDebugPatterns add: 'java/net/ConnectException*'.
    ExceptionDebugPatterns add: 'java/lang/IllegalArgumentException'.
    ExceptionDebugPatterns add: 'java/lang/IllegalAccessException'.
    ExceptionDebugPatterns add: 'java/lang/ClassNotFoundException'.
    ExceptionDebugPatterns add: 'java/io/IOException'.
    ExceptionDebugPatterns add: 'java/io/FileNotFoundException'.
    ExceptionDebugPatterns add: 'java/io/EOFException'.
    ExceptionDebugPatterns add: 'java/lang/NoSuchMethodException'.
    ExceptionDebugPatterns add: 'java/lang/ArrayIndexOutOfBoundsException'.
    ExceptionDebugPatterns add: 'java/lang/IllegalMonitorStateException'.
    ExceptionDebugPatterns add: 'org/xml/sax/SAXParseException'.
    ExceptionDebugPatterns add: 'org/apache/xerces/xni/parser/XMLParseException'.
    ExceptionDebugPatterns add: 'java/lang/InstantiationException'.
    ExceptionDebugPatterns add: 'java/lang/RuntimeException'.
    ExceptionDebugPatterns add: 'java/lang/ClassCastException'.


    ExceptionDebug := true.
    "

    "Created: / 25-02-2011 / 08:08:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'debugging-dumping'!

dumpOpenExternalStream: stream on: output
    output nextPutAll: stream class printString.
    output space.
    OpenFileTable notNil ifTrue:[
        | idx |
        idx := OpenFileTable identityIndexOf: stream.
        idx ~~ 0 ifTrue:[
            output nextPutAll:'JavaVM:OpenFileTable['; nextPutAll: idx printString; nextPut:$]; space.
        ]
    ].
    ZipCache notNil ifTrue:[
        | idx |
        idx := ZipCache identityIndexOf: stream.
        idx ~~ 0 ifTrue:[
            output nextPutAll:'JavaVM:ZipCache['; nextPutAll: idx printString; nextPut:$]; space.
        ]
    ].
    stream isFileStream ifTrue:[
        output nextPutAll: stream pathName ? '?'
    ]

    "Created: / 23-07-2012 / 16:40:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

dumpOpenExternalStreams
    ^self dumpOpenExternalStreamsOn: Stdout.

    "Created: / 23-07-2012 / 16:32:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

dumpOpenExternalStreamsOn: aStream

    | nOpenStreams |

    nOpenStreams := 0.
    ExternalStream allSubInstancesDo:[:each|
        each isOpen ifTrue:[
            nOpenStreams := nOpenStreams + 1.
            self dumpOpenExternalStream: each on: aStream.
            aStream cr.
        ]
    ].
    aStream nextPutLine:
        ('SUMMARY: open=%1, java.io=%2, java.util.zip=%3'
            bindWith: nOpenStreams
                with: ((OpenFileTable ? #()) inject:0 into:[:a :s|a + (s notNil ifTrue:[1] ifFalse:[0])])
                with: ((ZipCache ? #())      inject:0 into:[:a :s|a + (s notNil ifTrue:[1] ifFalse:[0])])
        )

    "
        JavaVM dumpOpenExternalStreamsOn: Stdout
    "

    "Created: / 23-07-2012 / 16:34:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'defaults'!

audioEnabled
    ^ NoAudio not

    "Created: / 18.7.1998 / 22:31:36 / cg"
!

audioEnabled:aBoolean
    NoAudio := aBoolean not

    "Created: / 18.7.1998 / 22:31:20 / cg"
!

defaultCLASSPATH
    |s|

    s := '' writeStream.
    Java effectiveClassPath
        do:[:p | s nextPutAll:p asString ]
        separatedBy: [s nextPut: OperatingSystem pathSeparator].

    ^ s contents

    "
     self defaultCLASSPATH
    "

    "Created: / 03-01-1998 / 14:27:21 / cg"
    "Modified: / 16-01-2013 / 13:15:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

defaultExtDirs

    ^String streamContents:[:s|
        Java javaExtDirs do:[:dir|
            s nextPutAll: dir pathName.
        ] separatedBy:[
            s nextPut: OperatingSystem pathSeparator.
        ]
    ]

    "
    JavaVM defaultExtDirs
    "

    "Created: / 31-08-2011 / 20:03:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

defaultHotJavaHome
    ^ '/usr/local/java/hotjava'.

    "Modified: / 5.8.1997 / 04:13:36 / cg"
    "Created: / 3.1.1998 / 14:27:34 / cg"
!

defaultJAVAHome
    ^ Java javaHome

    "Modified: / 6.8.1997 / 00:54:44 / cg"
    "Created: / 3.1.1998 / 14:27:01 / cg"
!

defaultJWSHome
    '/phys/idefix/home2/java/JWS2_0/Java-WorkShop2.0/JWS' asFilename exists ifTrue:[
	^ '/phys/idefix/home2/java/JWS2_0/Java-WorkShop2.0/JWS'
    ].

    ^ '/usr/local/java/JWS'.

    "Created: / 3.1.1998 / 14:27:42 / cg"
    "Modified: / 3.12.1998 / 14:54:08 / cg"
!

defaultJavaLibraryPath

    | dirs |
    dirs := OrderedCollection new
            add: Java release javaHome asFilename / 'lib';
            add: Java release javaHome asFilename / 'lib' / 'amd64';
            add: Java release javaHome asFilename / 'lib' / 'i386';
            add: Java release javaHome asFilename / 'jre' / 'lib' ;
            add: Java release javaHome asFilename / 'jre' / 'lib' / 'amd64'  ;
            add: Java release javaHome asFilename / 'jre' / 'lib' / 'i386' ;
            add: Java release javaHome asFilename / 'jre' / 'bin' ;
            yourself.
    OperatingSystem isMSWINDOWSlike ifTrue:[
        dirs
            add: Java release javaHome asFilename / 'bin'.
    ].

    ^String streamContents:
        [:path|
        (dirs select:[:d|d exists])
            do:[:d|path nextPutAll:d pathName]
            separatedBy:[path nextPut: OperatingSystem pathSeparator]]

    "
        JavaVM defaultJavaLibraryPath
    "

    "Created: / 10-12-2010 / 14:09:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-04-2011 / 18:21:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

defaultSunBootLibraryPath

    |s|

    s := '' writeStream.
    Java release classPath
        do:[:p | s nextPutAll:p asString]
        separatedBy: [s nextPut: OperatingSystem pathSeparator].

    ^ s contents

    "
        JavaVM defaultSunBootLibraryPath
    "

    "Created: / 10-12-2010 / 14:37:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

defaultWindowingToolKit
    "/ prefer the windows toolkit ...

    (self classForName: 'sun.awt.windows.WToolkit') notNil ifTrue: [
        ^ 'sun.awt.windows.WToolkit'.
    ].
    (Java classForName: 'sun.awt.motif.MToolkit') notNil ifTrue: [
        self halt: 'MotifToolKit: this is untested code'.
        ^ 'sun.awt.motif.MToolkit'.
    ].
    self halt: 'TinyToolKit: this is untested code'.
    ^ 'sun.awt.tiny.TinyToolkit'.

    "/    ^ 'sun.awt.win32.MToolkit'.
    "/    ^ 'sun.awt.motif.MToolkit'.
    "
     self defaultWindowingToolKit"
    "Created: / 3.1.1998 / 14:27:49 / cg"
    "Modified: / 27.1.1998 / 21:52:52 / cg"
!

fileAccessTrace
    ^ FileAccessTrace

    "Created: / 27.1.1999 / 18:55:40 / cg"
!

fileAccessTrace:aBoolean
    FileAccessTrace := aBoolean

    "Created: / 19.10.1998 / 16:01:44 / cg"
    "Modified: / 27.1.1999 / 18:55:52 / cg"
!

fileOpenConfirmation
    ^ FileOpenConfirmation

    "Created: / 19.10.1998 / 16:01:44 / cg"
!

fileOpenConfirmation:aBoolean
    FileOpenConfirmation := aBoolean

    "Created: / 19.10.1998 / 16:01:56 / cg"
!

javaConsole:aStream
    JavaConsoleStream := aStream

    "
     JavaVM javaConsole:Transcript
    "

    "Modified: / 6.8.1997 / 00:34:13 / cg"
    "Created: / 3.1.1998 / 14:27:58 / cg"
!

javaConsoleStream
    ^ JavaConsoleStream

    "Created: / 3.1.1998 / 14:32:16 / cg"
!

nullPointerExceptionDebug
    ^ NullPointerExceptionDebug

    "Created: / 27.1.1999 / 20:14:51 / cg"
!

nullPointerExceptionDebug:aBoolean
    NullPointerExceptionDebug := aBoolean

    "Created: / 27.1.1999 / 20:15:00 / cg"
!

socketConnectConfirmation
    ^ SocketConnectConfirmation

    "Created: / 19.10.1998 / 16:02:15 / cg"
!

socketConnectConfirmation:aBoolean
    SocketConnectConfirmation := aBoolean

    "Created: / 19.10.1998 / 16:02:06 / cg"
! !

!JavaVM class methodsFor:'eager resolving'!

disableEagerResolving
    EagerResolvingEnabled := false.

    "Created: / 08-12-2011 / 21:06:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

eagerResolvingEnabled
    ^ EagerResolvingEnabled.

    "Created: / 08-12-2011 / 21:05:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

enableEagerResolving
     EagerResolvingEnabled := true.

    "Created: / 08-12-2011 / 21:06:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaVM class methodsFor:'fileIO'!

addOpenFile:aStream
    "Given a stream, adds it into the open file table. Returns a
     (fake) file descriptor number"
    | fd |

    OpenFileTableLock critical:[
        fd := OpenFileTable indexOf: nil.
        fd ~~ 0 ifTrue:[
            OpenFileTable at: fd put: aStream.
            fd := fd - 1.
        ] ifFalse:[
            OpenFileTable add:aStream.
            fd := OpenFileTable size - 1.
        ].
    ].
    ^fd

    "Created: / 02-01-1998 / 18:32:59 / cg"
    "Modified (comment): / 18-07-2012 / 23:00:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

getOpenFileAt:idx
    ^ OpenFileTable at:idx+1 ifAbsent:nil.

    "Created: / 2.1.1998 / 18:28:01 / cg"
    "Modified: / 2.1.1998 / 18:33:06 / cg"
!

setOpenFile:aStream at:idx
    OpenFileTable size < (idx+1) ifTrue:[
        OpenFileTable grow:idx+1.
    ].
    OpenFileTable at:idx+1 put:aStream.

"/    Do not shrink OpenFileTable now, make debugging easier
"/    aStream isNil ifTrue:[
"/        [ OpenFileTable last isNil ] whileTrue:[
"/            OpenFileTable removeLast.
"/        ]
"/    ].

    "Modified: / 02-01-1998 / 18:33:21 / cg"
    "Modified: / 14-11-2011 / 19:53:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'helpers'!

canCast: s to: t
    "Helper for _CHECKCAST:_:"

    | sc  tc |

    "Not specified in JVM spec, sigh"
    s isJavaPrimitiveType ifTrue: [
        "FIXME"
        ^ s == t or:[(s isSubclassOf: t) or:[t isSubclassOf: s]]
    ].
     "
     Java VM Spec, 3rd edition, p 280:

     The following rules are used to determine whether an objectref that is not
     null can be cast to the resolved type: if S is the class of the object
     referred to by objectref and T is the resolved class, array, or interface type,
     checkcast determines whether objectref can be cast to type T as follows:

     - If S is an ordinary (nonarray) class, then:
     - If T is a class type, then S must be the same class as T, or a subclass
     of T.
     - If T is an interface type, then S must implement interface T.
    "
    (s isJavaArrayClass not and: [ s isInterface not ]) ifTrue: [
        ^ (s includesBehavior: t).
    ].
     "
     - If S is an interface type, then:
     - If T is a class type, then T must be Object.
     - If T is an interface type, then T must be the same interface as S or a
     superinterface of S.
    "
    s isInterface ifTrue: [
        ^ t isInterface not
            ifTrue: [ t == (self classForName: 'java.lang.Object') ]
            ifFalse: [ s includesBehavior: t ]
    ].
     "
     - If S is a class representing the array type SC[], that is, an array of com-
     ponents of type SC , then:
    "
    self assert: s isJavaArrayClass description: 'S should be array type'.
    sc := s javaComponentClass.
     "
     - If T is a class type, then T must be Object.
    "
    t isJavaClassType ifTrue: [ ^ t == (self classForName: 'java.lang.Object') ].
     "
     - If T is an array type TC[], that is, an array of components of type TC ,
     then one of the following must be true:
     - TC and SC are the same primitive type.
     - TC and SC are reference types, and type SC can be cast to TC by
     recursive application of these rules.
    "
    t isJavaArrayClass ifTrue: [
        tc := t javaComponentClass.
        ^ tc isJavaPrimitiveType
            ifTrue: [ tc == sc ]
            ifFalse: [ self canCast: sc to: tc ]
    ].
     "
     - If T is an interface type, T must be one of the interfaces implemented
     by arrays (JLS3 4.10.3).
    "
    ((t name == #'java/lang/Cloneable')
        or: [ t name == #'java/lang/Serializable' ]) ifTrue: [ ^ true ].
    ^ false

    "Modified: / 09-01-1999 / 00:45:21 / cg"
    "Created: / 11-02-2011 / 08:21:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-10-2011 / 13:50:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 24-02-2012 / 16:34:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

invoke: jmethod receiver: obj arguments: args context: context "of the native method" constructor: isConstructor

    "Common helper for invoking methods and ctors. Performs
     (type) checks and unboxing. Return (possibly boxed) return value."

    | method parameterTypes bargs bargss retval retcls bi executionEx |

    method := self reflection methodForJavaConstructorObject: jmethod.
    parameterTypes := jmethod instVarNamed: #parameterTypes.

    (obj isNil and:[method isStatic not]) ifTrue:[
        self throwNullPointerException.
        ^nil.
    ].

    "Possibly box/unbox arguments"
    args notEmptyOrNil ifTrue:[
        bargs := Array new: (bargss := method numArgs).
        bi := 1.
        1 to: args size do:[:i|
            | cls |
            bi > bargss ifTrue:[
"/                self breakPoint: #jv.
                self throwIllegalArgumentException: 'passed more arguments than expected'.
            ].

            cls := self classForJavaClassObject: (parameterTypes at: i).
            cls isJavaPrimitiveType ifTrue:[
                bargs at: bi put: (cls javaUnbox: (args at:i) onError:[
"/                    self breakPoint: #jv.
                    self throwIllegalArgumentException:'illegal unbox'. ^nil
                ]).
                (cls == LargeInteger or:[cls == Float]) ifTrue:[bi := bi + 1].
            ] ifFalse:[
                ((args at:i) isNil or:[(self canCast: (args at:i) class to: cls)]) ifFalse:[
                    self breakPoint: #jv.
                    self throwIllegalArgumentException:'incomplatible argument types'. ^nil.
                ].
                bargs at: bi put: (args at:i).
            ].
            bi := bi + 1.
       ].
        bi <= bargss ifTrue:[
"/             self breakPoint: #jv.
             self throwExceptionClassName: 'java.lang.reflect.InvocationTargetException'
                              withMessage: 'not enough arguments'
        ].
    ] ifFalse:[
        bargs := #()
    ].

    "Check number of arguments"
    method numArgs ~= bargs size ifTrue:[
        self throwIllegalArgumentException:'Invalid number of arguments'.
        ^nil.
    ].

    "Lookup the method here - hack, because of those stupid package private methods"
    method isStatic not ifTrue:[
        method := JavaLookup instance
                    lookupMethodForSelector: method selector
                                 directedTo: obj class
                                        for: obj
                              withArguments: bargs
                                       from: context
                                        ilc: nil.
        method isNil ifTrue:[
            self throwIllegalArgumentException:'Message not understood - invalid class for ''this'''.
            ^nil.
        ].
    ].

    "Fire the method"
    [
        method isStatic ifTrue:[
            retval := method valueWithReceiver: method javaClass arguments: bargs.
        ] ifFalse:[
            retval := method valueWithReceiver: obj arguments: bargs.
        ].
    ] on: (self classForName:'java.lang.Throwable') do:[:ex |
        executionEx := ex.
    ].
    executionEx notNil ifTrue:[
        self throwInvocationTargetException: 'An exception occured during invocation' target: executionEx.
        ^nil.
    ].

    isConstructor ifFalse:[
        retcls := jmethod instVarNamed: #returnType.
        retcls notNil ifTrue:[
            retcls := self classForJavaClassObject: retcls.
            retcls ~~ UndefinedObject ifTrue:[
                retval := retcls javaBox: retval.
            ]
        ].
    ].
    ^retval.

    "Created: / 05-07-2012 / 23:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaStringObjectForString:string
    self breakPoint:#mh info:'refactor my sender to use reflection directly'.
    ^ self reflection javaStringObjectForString:string interned:false

    "Created: / 22-11-2010 / 16:31:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 00:47:49 / Marcel Hlopko <hlopik@gmail.com>"
!

javaStringObjectForString:string interned:intern

    ^self reflection javaStringObjectForString:string interned:intern.

    "Created: / 22-11-2010 / 16:28:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 22-11-2010 / 17:57:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:04:21 / Marcel Hlopko <hlopik@gmail.com>"
!

javaThreadForSTProcess: stProcess
    | result |
    result := Java threadForStProcess: stProcess ifAbsent: nil.
    result == 0 ifTrue: [ self breakPoint: #mh. ^ nil].
    ^ result.

    "Modified: / 26-08-1997 / 19:56:31 / cg"
    "Created: / 03-01-1998 / 01:53:41 / cg"
    "Modified: / 09-12-2011 / 13:12:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

makeArrayOf: loadedJavaClass asDescribedBy: className
    | arrayClass  dimensions |

    arrayClass := loadedJavaClass.
    dimensions := className occurrencesOf: $[.
        arrayClass isJavaArrayClass ifTrue: [
        "is already array (primitive arrays case, like ByteArray etc)"
        dimensions := dimensions - 1.
    ].
    dimensions timesRepeat: [ arrayClass := arrayClass javaArrayClass. ].
        ^ arrayClass.

    "Created: / 21-10-2011 / 12:18:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 23-10-2011 / 22:30:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

newThread: name
    | thread  threadClass  i |
    threadClass := JavaVM classForName: 'java.lang.Thread'.
    thread := threadClass basicNew.
    thread instVarNamed: '_lockWord_' put: 0.
    thread instVarNamed: 'name' put: name. "/NOT a Java string, name instvar is char[]!!!!!!"
    thread instVarNamed: 'priority'
        put: (threadClass instVarNamed: 'NORM_PRIORITY').
    thread instVarNamed: 'single_step' put: 0.
    thread instVarNamed: 'daemon' put: 0.
    thread instVarNamed: 'stillborn' put: 0.
    thread instVarNamed: 'threadStatus' put: 0.
    thread instVarNamed: 'target' put: nil.
    thread instVarNamed: 'blockerLock' put:
        ((JavaVM classForName: 'java.lang.Object') basicNew
            instVarAt: 1 put: 0;
            yourself).

    "/
    "/ that on was only temporarily present in JDK1.1.3 (sigh)
    "/

    (i := thread class instVarOffsetOf: 'initial_stack_memory') notNil ifTrue: [
        thread instVarAt: i put: 0.
    ].
    thread instVarNamed: 'group' put: (self standardThreadGroup).
    threadClass classLoader isNil ifTrue: [
        thread instVarNamed: 'contextClassLoader' put: self systemClassLoader
    ] ifFalse: [
        thread instVarNamed: 'contextClassLoader' put: threadClass classLoader
    ].
    ^ thread

    "Created: / 03-01-1998 / 01:47:30 / cg"
    "Modified: / 27-01-1998 / 00:54:33 / cg"
    "Modified: / 01-12-2011 / 17:43:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 19-09-2012 / 16:06:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

stProcessForJavaThread: jThread
    | result |
    result := Java threadsAt: jThread ifAbsent: nil.
    result == 0 ifTrue: [ self breakPoint: #mh. ^ nil ].
    ^ result.

    "Created: / 02-01-1998 / 21:48:27 / cg"
    "Modified: / 03-01-1998 / 01:53:55 / cg"
    "Modified: / 09-12-2011 / 13:12:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

standardThreadGroup
    | standardGroup  threadClass |

    StandardThreadGroup isNil ifTrue: [
        threadClass := JavaVM classForName: 'java.lang.Thread'.
        standardGroup := (self classForName: 'java.lang.ThreadGroup') new.
        standardGroup instVarNamed: 'parent' put: nil.
        standardGroup instVarNamed: 'name' put: (Java as_String: 'main').
        standardGroup instVarNamed: 'maxPriority'
            put: (threadClass instVarNamed: 'MAX_PRIORITY').
        standardGroup instVarNamed: 'destroyed' put: 0.
        standardGroup instVarNamed: 'daemon' put: nil.
        (standardGroup class instVarOffsetOf: 'vmAllowSuspension') notNil ifTrue: [
            standardGroup instVarNamed: 'vmAllowSuspension' put: 0.
        ].
        standardGroup instVarNamed: 'nthreads' put: 0.
        standardGroup instVarNamed: 'ngroups' put: 0.
        standardGroup instVarNamed: 'groups' put: nil.
        StandardThreadGroup := standardGroup.
    ].
    ^ StandardThreadGroup

    "Created: / 03-01-1998 / 01:41:54 / cg"
    "Modified: / 17-11-1998 / 22:55:30 / cg"
    "Modified: / 25-04-2011 / 20:27:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'helpers - awt'!

commonReshapeComponent:nativeContext
    |view x y width height ext menu|

    view := self viewForWPeer:nativeContext.

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    width := nativeContext argAt:3.
    height := nativeContext argAt:4.
    ext := width@height.

"/    'pReshape ' print. view print.
"/    ' ' print. x print. '/' print. y print.
"/    ' extent: ' print. ext printNL.
    view isPopUpView ifTrue:[
	view origin:x@y extent:ext.
    ] ifFalse:[
	(view isTopView
	or:[view isMemberOf:JavaEmbeddedFrameView]) ifTrue:[
	    "/
	    "/ dont allow setting the origin
	    "/
	    menu := self topViewsMenu:view.
	    menu notNil ifTrue:[
		"/ must add the menus height
		height := height + menu height.
		ext := width@height.
	    ].

	    "/ to prevent a view from not being visible/closable
	    "/ in case Java goes mad ..

	    (width < 30
	    or:[height < 10]) ifTrue:[
		"/ self halt.
		width := 30.
		height := 20.
		ext := width@height.
	    ].

	    view extent:ext.
	    (view isKindOf:ModalBox) ifTrue:[
		view preferredExtent:ext
	    ].

	    "/ adjust non-resizable views min/max

	    view isTopView ifTrue:[
		view minExtent notNil ifTrue:[
		    view minExtent:ext.
		    view maxExtent:ext
		].
	    ]
	] ifFalse:[
	    (view superView notNil
	    and:[view superView isTopView]) ifTrue:[
		menu := self topViewsMenu:view superView.
		menu notNil ifTrue:[
		    "/ must add menus height to yPos
		    y := y + menu height.
		]
	    ] ifFalse:[
		"/ post a configuration event
		EventTrace == true ifTrue:[
		    'JAVA: configure: need event' printCR.
		]
	    ].
	    (x isNil or:[y isNil]) ifTrue:[
		Transcript showCR:'bad args to reshape'.
	    ] ifFalse:[
		view origin:x@y extent:ext.
	    ]
	].
    ].

    view isJavaView ifTrue:[
	view invalidate.
    ].

    ^ nil

    "Created: / 4.1.1998 / 18:00:52 / cg"
    "Modified: / 5.12.1998 / 13:34:20 / cg"
!

createdWindowsView:aView for:aJavaPeer
    "this is only sent with the sun.awt.windows toolkit"

    aJavaPeer instVarNamed:'pData' put:aView.

    JavaWindowGroup isNil ifTrue:[
	JavaWindowGroup := WindowGroup new.
	JavaWindowGroup isForModalSubview:true.
    ].
    aView windowGroup:JavaWindowGroup.
    JavaWindowGroup addView:aView.

    KnownWindows isNil ifTrue:[
	KnownWindows := IdentityDictionary new.
    ].
    KnownWindows at:aJavaPeer put:aView.

    FirstWindowCreationSemaphore signalIf.

"/'*** ' print. aJavaPeer print. ' -> ' print. aView printCR.
"/(aView isKindOf:ModalBox) ifTrue:[
"/    self halt.
"/].

    "Created: / 4.1.1998 / 17:57:16 / cg"
    "Modified: / 28.1.1998 / 22:40:19 / cg"
!

gcForWGraphics:nativeContext
    |jGraphics gc orgX orgY trans tX tY|

    jGraphics := nativeContext receiver.
    O_WGgraphics_pData isNil ifTrue:[
	O_WGgraphics_pData := (jGraphics class instVarOffsetOf:'pData').
    ].
    O_WGgraphics_originX isNil ifTrue:[
	O_WGgraphics_originX := (jGraphics class instVarOffsetOf:'originX').
    ].
    O_WGgraphics_originY isNil ifTrue:[
	O_WGgraphics_originY := (jGraphics class instVarOffsetOf:'originY').
    ].
    gc := jGraphics instVarAt:O_WGgraphics_pData.

    trans := gc translation.
    tX := trans x.
    tY := trans y.
"/    tX := gc translationX.
"/    tY := gc translationY.

    orgX := jGraphics instVarAt:O_WGgraphics_originX.
    orgY := jGraphics instVarAt:O_WGgraphics_originY.
    ((orgX ~~ tX) or:[orgY ~~ tY]) ifTrue:[
	gc translation:orgX@orgY
    ].
    ^ gc

    "Created: / 8.1.1998 / 00:16:38 / cg"
    "Modified: / 23.12.1998 / 20:27:35 / cg"
!

jPeerForView:aView
    ^ KnownWindows keyAtValue:aView ifAbsent:nil

    "Created: / 15.1.1998 / 13:48:01 / cg"
    "Modified: / 15.1.1998 / 13:48:43 / cg"
!

pReshape:nativeContext
    |jFramePeer view x y width height menu|

    jFramePeer := nativeContext receiver.
    view := jFramePeer instVarNamed:'pData'.

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    width := nativeContext argAt:3.
    height := nativeContext argAt:4.

"/    'pReshape ' print. view print.
"/    ' ' print. x print. '/' print. y print.
"/    ' extent: ' print. width print. '/' print. height printNL.

    view isPopUpView ifTrue:[
	self halt.
    ].

    (view isTopView
    or:[view isMemberOf:JavaEmbeddedFrameView]) ifTrue:[
	"/
	"/ dont allow setting the origin
	"/
	menu := self topViewsMenu:view.
	menu notNil ifTrue:[
	    "/ must add the menus height
	    height := height + menu height
	].
	view extent:width@height.
    ] ifFalse:[
	(view superView notNil
	and:[view superView isTopView]) ifTrue:[
	    menu := self topViewsMenu:view superView.
	    menu notNil ifTrue:[
		"/ must add menus height to yPos
		y := y + menu height.
	    ]
	].
	view origin:x@y extent:width@height.
    ].

    ^ nil

    "Created: / 7.1.1998 / 21:47:11 / cg"
    "Modified: / 5.12.1998 / 13:47:52 / cg"
!

replacementFontFor:name style:styleNr size:size
    |font family style|

    style := 'roman'.
    styleNr = 0 ifTrue:[
        style := 'roman'
    ].

    font := Font family:name style:style size:size.
    font notNil ifTrue:[^ font].

    name = 'Dialog' ifTrue:[
        family := 'helvetica'
    ] ifFalse:[
        family := 'courier'
    ].

    ^ Font family:name style:style size:size.
!

topViewsMenu:view
    |idx|

    view isTopView ifTrue:[
	view subViews size > 0 ifTrue:[
	    (idx := view subViews findFirst:[:v | v isMemberOf:MenuPanel]) ~~ 0 ifTrue:[
		"/ must add the menus height
		^ view subViews at:idx
	    ]
	].
    ].
    ^ nil

    "Modified: / 4.8.1997 / 01:23:06 / cg"
    "Created: / 4.1.1998 / 18:01:42 / cg"
!

viewForWPeer:nativeContext
    |jPeer|

    jPeer := nativeContext receiver.

    "/ sigh; pData was renamed to pNativeWidget in jdk1.2 ...
    O_FramePeer_pNativeWidget isNil ifTrue:[
	O_FramePeer_pNativeWidget := (jPeer class instVarOffsetOf:'pNativeWidget').
	O_FramePeer_pNativeWidget isNil ifTrue:[
	    O_FramePeer_pNativeWidget := 0.
	    O_FramePeer_pData isNil ifTrue:[
		O_FramePeer_pData := (jPeer class instVarOffsetOf:'pData').
	    ].
	]
    ].
    O_FramePeer_pNativeWidget > 0 ifTrue:[
	"/ ok, we are < 1.2
	^ jPeer instVarAt:O_FramePeer_pNativeWidget.
    ].
    ^ jPeer instVarAt:O_FramePeer_pData.

    "Modified: / 19.11.1998 / 01:43:20 / cg"
! !

!JavaVM class methodsFor:'helpers - exceptions'!

throwAbstractMethodError
    ^ self throwExceptionClassName: 'java.lang.AbstractMethodError'
        withMessage: 'resolving a method ref failed'.

    "Created: / 11-04-2011 / 20:32:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwArrayIndexOutOfBoundsException: badIndex
    | exClass  ex |

    exClass := self classForName: 'java.lang.ArrayIndexOutOfBoundsException'.
    ex := exClass newWith_int: badIndex.
    ^ self throwException: ex

    "Created: / 14.1.1998 / 21:36:05 / cg"
    "Modified: / 20.11.1998 / 13:27:14 / cg"
!

throwArrayIndexOutOfBoundsException: theArray _: badIndex
    | exClass  ex |

    exClass := self classForName: 'java.lang.ArrayIndexOutOfBoundsException'.
    ex := exClass newWith_int: badIndex.
    ^ self throwException: ex

    "Modified: / 20.11.1998 / 13:27:14 / cg"
    "Created: / 8.1.1999 / 15:03:59 / cg"
!

throwArrayStoreException:badArray
    ^ self
        throwExceptionClassName:'java.lang.ArrayStoreException'
         withMessage:('bad array store: ' , badArray class printString)

    "Modified: / 23-06-2011 / 09:19:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwClassCastException


    ^ self throwExceptionClassName: 'java.lang.ClassCastException'
        withMessage: 'cast failed'

    "Modified: / 07-01-1998 / 15:25:35 / cg"
    "Created: / 08-01-1999 / 18:55:31 / cg"
    "Modified (format): / 23-10-2011 / 22:33:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwClassFormatError
    ^ self throwClassFormatError: 'Invalid class format'

    "Created: / 04-01-1998 / 22:26:09 / cg"
    "Modified: / 10-11-1998 / 13:20:31 / cg"
    "Created: / 08-08-2011 / 17:57:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwClassFormatError: message
    ^ self
        throwExceptionClassName:'java.lang.ClassFormatError'
        withMessage: message

    "Created: / 04-01-1998 / 22:26:09 / cg"
    "Modified: / 10-11-1998 / 13:20:31 / cg"
    "Created: / 27-10-2011 / 16:20:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwClassNotFoundException
    ^ self
	throwExceptionClassName:'java.lang.ClassNotFoundException'
	withMessage:'no such class'

    "Created: / 4.1.1998 / 22:25:26 / cg"
    "Modified: / 7.1.1998 / 15:25:35 / cg"
!

throwClassNotFoundException: className
    ^ self throwExceptionClassName: 'java.lang.ClassNotFoundException'
        withMessage: 'no such class: ' , className

    "Created: / 4.1.1998 / 22:26:09 / cg"
    "Modified: / 10.11.1998 / 13:20:31 / cg"
!

throwDataFormatException: message
    ^ self
        throwExceptionClassName:'java.util.zip.DataFormatException'
        withMessage: message

    "Created: / 16-08-2012 / 17:55:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwDivisionByZeroException
    DivisionByZeroExceptionDebug == true ifTrue:[
	self halt:'division by zero'.
    ].
    ^ self
	throwExceptionClassName:'java.lang.ArithmeticException'
	withMessage:'division by zero'

    "Created: / 8.1.1999 / 14:28:15 / cg"
!

throwException: aJavaException
    <resource: #skipInDebuggersWalkBack>
    | con  jMsg  msg  exClass  srchCon  handlerContext  handlerPC  method  pc  hPC handler |
    ExceptionTrace ifTrue: [
        | tmpMessage |
        tmpMessage := aJavaException instVarNamed: 'detailMessage'.
        tmpMessage isNil ifTrue: [ tmpMessage := '' ] ifFalse: [
            tmpMessage := Java as_ST_String: tmpMessage
        ].
        Logger
            log: 'JAVA: exception: ' , aJavaException class fullName , ' ('
                    , tmpMessage , ')'
            severity: #debug
            facility: 'JVM'
    ].
    ExceptionDebug ifTrue: [
        "/        self internalError:('JAVA: exception: ' , aJavaException class fullName).
        (ExceptionDebugPatterns isNilOrEmptyCollection
            or: [
                ExceptionDebugPatterns
                    anySatisfy: [:pattern | pattern match: aJavaException class fullName ]
            ])
                ifTrue: [
                    self halt: ('JAVA: exceptionDebug: ' , aJavaException class fullName)
                ]
    ].

    "/
    "/ search stack for a javaContext which handles that exception
    "/


    srchCon := thisContext sender.
    [ handlerContext isNil and: [ srchCon notNil ] ] whileTrue: [
        (srchCon isJavaContext) ifTrue: [
            method := srchCon method.
            pc := srchCon pc.
            (hPC := method handlerFor: aJavaException at: pc) notNil ifTrue: [
                handlerPC := hPC.
                handlerContext := srchCon
            ].
        ] ifFalse:[
            srchCon isHandleContext ifTrue:[
                handler := srchCon receiver
                    handlerForSignal: aJavaException class context: srchCon originator:thisContext sender.
                handler notNil ifTrue:[
                    "We have found a Smalltalk handler for Java exception here"
                    handlerContext := srchCon.
                ]
            ].
        ].
        srchCon := srchCon sender.
    ].
    handlerContext isNil ifTrue: [
        "/
        "/ no JavaHandler ... let smalltalk handle it
        "/
        exClass := aJavaException class.
        exClass == (self classNamed: 'java/lang/ThreadDeath') ifTrue: [
            "/mh 1.12.11 uncaught threadDeaths are not delegated out.. Thread.stop javadoc
            ^ self
        ].
        msg := 'Java ' , exClass name.
        jMsg := aJavaException instVarNamed: 'detailMessage'.
        jMsg notNil ifTrue: [ msg := msg , ': ' , (Java as_ST_String: jMsg). ].

        "/ for our convenience: skip ST contexts
        "/ (i.e. the handler or debugger will see the javaContext first )

        con := thisContext sender.
        [ con isNil or: [ con isJavaContext ] ] whileFalse: [ con := con sender ].
        con isNil ifTrue: [ con := thisContext sender ].
        JavaUnhandledExceptionError
            raiseWith: aJavaException
            errorString: msg
            in: con.
    ] ifFalse: [
        handlerContext isJavaContext ifTrue:[
            "/
            "/ found a Java exception handler
            "/
            handlerContext setPC: handlerPC.
            handlerContext exceptionArg: aJavaException pc: handlerPC.
            handlerContext markForException.
            handlerContext unwindAndRestartForJavaException.
            self halt: 'should not be reached'.
        ] ifFalse:[
            | val |
            "/
            "/ found a Smalltalk exception handler
            "/
            "/ First, call evaluate the handler (see GenericException>>doCallHandler:
            val := handler valueWithOptionalArgument: aJavaException.
            "handler fall through - is just like a #return:(aHandlerBlock value)"

            "Java exceptions cannot be proceed (by design)  but they might be
            rejected (rethrown) - this is not supported yet - we need
            to somehow indicate that (kind of reject token object returned
            from handler?)"
            thisContext evaluateUnwindActionsUpTo:handlerContext.
            handlerContext return: val.
        ].
    ].
    Processor activeProcess == JavaScreenUpdaterThread ifTrue: [ self halt ].
    Processor activeProcess == JavaEventQueueThread ifTrue: [ self halt ].
    Processor activeProcess terminate.

    "
     ExceptionTrace := true"

    "Created: / 07-01-1998 / 15:28:22 / cg"
    "Modified: / 24-12-1999 / 02:33:25 / cg"
    "Modified: / 01-12-2011 / 18:32:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 18-03-2012 / 21:47:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwExceptionClassName: aJavaExceptionClassName withMessage: someMessage
    | exClass  ex |

    exClass := self classForName: aJavaExceptionClassName asSlashedJavaClassName definedBy: nil.
    ex := exClass newWith_String: someMessage.
    ^ self throwException: ex

    "Created: / 07-01-1998 / 15:25:09 / cg"
    "Modified: / 14-01-1998 / 23:38:30 / cg"
    "Modified: / 30-10-2011 / 17:44:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 16:54:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwExceptionClassName: aJavaExceptionClassName withMessage: someMessage cause: cause
    | exClass  ex |

    exClass := self classForName: aJavaExceptionClassName asSlashedJavaClassName definedBy: nil.
    ex := exClass newWith_String: someMessage.
    ex instVarNamed: #cause put: cause.
    ^ self throwException: ex

    "Created: / 05-07-2012 / 09:01:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwExceptionForFinallyIn: context
    "Evaluates a single finally block by fake-throwing
     FinallyToken - only evaluates a finally handler in
     given method, senders are not searched"

    |method pc handlerPC token returnContext |

    self assert: context isJavaContext.

    method := context method.
    pc := context pc.

    token := JavaContext::FinallyToken new.
    returnContext := thisContext sender sender sender.
    returnContext selector == #return: ifTrue:[
        token
            context: context;
            selector: #return:;
            exception: returnContext receiver;
            value: (returnContext argAt:1).
    ] ifFalse:[
        returnContext selector == #return ifTrue:[
            token
                context: context;
                selector: #return;
                exception: returnContext receiver;
                value: nil.
        ] ifFalse:[
            self error:'Unhandled case, inform libjava developers (JV in particular)' .
        ].
    ].


    handlerPC := method handlerFor: nil at: pc.
    handlerPC isNil ifTrue:[ ^ self ].

    context setPC: handlerPC.
    context exceptionArg: token pc: handlerPC.
    context markForException.
    context restart.

    self halt: 'should not be reached'.

    "Created: / 03-04-2012 / 16:56:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwExceptionInInitializerError:className
    ^ self
        throwExceptionClassName:'java.lang.ExceptionInInitializerError'
        withMessage:'error when initializing class: ' , className

    "Created: / 24-11-2010 / 09:23:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwFileNotFoundException: message
    ^ self
        throwExceptionClassName:'java.io.FileNotFoundException'
        withMessage: message

    "Created: / 04-01-1998 / 22:26:09 / cg"
    "Modified: / 10-11-1998 / 13:20:31 / cg"
    "Created: / 10-08-2011 / 14:19:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwIOExceptionWithMessage:message
    IOExceptionDebug == true ifTrue:[
	self halt:'IO Exception'.
    ].
    ^ self
	throwExceptionClassName:'java.io.IOException'
	withMessage:message

    "Created: / 7.1.1998 / 10:34:24 / cg"
    "Modified: / 7.1.1998 / 15:26:25 / cg"
!

throwIllegalAccessError
    ^ self throwExceptionClassName: 'java.lang.IllegalAccessError'
        withMessage: 'illegal access'

    "Created: / 13-04-2011 / 23:07:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwIllegalAccessException
    ^ self
	throwExceptionClassName:'java.lang.IllegalAccessException'
	withMessage:'illegal access'

    "Modified: / 7.1.1998 / 15:25:35 / cg"
    "Created: / 14.1.1998 / 23:13:44 / cg"
!

throwIllegalArgumentException: message
    ^ self
        throwExceptionClassName:'java.lang.IllegalArgumentException'
        withMessage: 'illegal argument: ', message

    "Modified: / 07-01-1998 / 15:25:35 / cg"
    "Created: / 14-01-1998 / 23:13:44 / cg"
    "Created: / 07-09-2011 / 14:18:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwIllegalMonitorStateException: message
    self throwExceptionClassName: 'java.lang.IllegalMonitorStateException'
            withMessage: message.

    "Created: / 29-11-2011 / 14:21:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwIncompatibleClassChangeError
        ^ self throwExceptionClassName: 'java.lang.IncompatibleClassChangeError'
                withMessage: 'illegal change'.

    "Created: / 11-04-2011 / 20:03:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwInstantiationException
    ^ self
	throwExceptionClassName:'java.lang.InstantiationException'
	withMessage:'cannot instantiate'

    "Modified: / 7.1.1998 / 15:25:35 / cg"
    "Created: / 14.1.1998 / 23:15:01 / cg"
!

throwInstantiationExceptionFor:aJavaClass
    ^ self
        throwExceptionClassName:'java.lang.InstantiationException'
        withMessage:('cannot instantiate: ' , aJavaClass javaName)

    "Modified: / 7.1.1998 / 15:25:35 / cg"
    "Created: / 14.1.1998 / 23:17:02 / cg"
!

throwInterruptedException: message
    ^ self throwExceptionClassName: 'java.lang.InterruptedException'
        withMessage:message

    "Created: / 30-11-2011 / 12:23:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwInvocationTargetException: message target: target
    | exClass  ex |

    exClass := self classForName: #'java/lang/reflect/InvocationTargetException' definedBy: nil.
    ex := exClass newWith_String: message.
    ex instVarNamed: #target put: target.
    ^ self throwException: ex

    "Created: / 05-07-2012 / 17:48:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwLinkageError: message
    ^ self
        throwExceptionClassName:'java.lang.LinkageError'
        withMessage: message

    "Modified: / 10-11-1998 / 13:20:31 / cg"
    "Created: / 26-11-2010 / 11:26:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwNegativeArraySizeException: size
    ^ self
        throwExceptionClassName: 'java.lang.NegativeArraySizeException'
        withMessage: 'negative array size: ' , size printString

    "Created: / 13-05-2012 / 14:46:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwNoSuchFieldException
  ^ self throwExceptionClassName: 'java.lang.NoSuchFieldError'
        withMessage: 'looking up a field failed'.

    "Created: / 13-04-2011 / 12:16:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwNoSuchMethodError
      ^ self throwExceptionClassName: 'java.lang.NoSuchMethodError'
              withMessage: 'looking up a method failed'.

    "Created: / 11-04-2011 / 20:33:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwNullPointerException
    NullPointerExceptionDebug == true ifTrue:[
        self halt:'Null Pointer exception'.
    ].

    ^ self
        throwExceptionClassName:'java.lang.NullPointerException'
        withMessage:'null pointer'

    "Created: / 09-01-1998 / 02:26:08 / cg"
    "Modified: / 28-01-1998 / 02:30:09 / cg"
    "Modified: / 13-08-2011 / 01:10:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwNullPointerException:message
    NullPointerExceptionDebug == true ifTrue: [
        self halt: 'Null Pointer exception'.
    ].
    ^ self throwExceptionClassName: 'java.lang.NullPointerException'
        withMessage: message

    "Created: / 09-01-1998 / 02:26:08 / cg"
    "Modified: / 28-01-1998 / 02:30:09 / cg"
    "Modified: / 13-08-2011 / 01:10:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 09-12-2011 / 11:13:40 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwNumberFormatException
    ^ self
	throwExceptionClassName:'java.lang.NumberFormatException'
	withMessage:'bad number format'

    "Modified: / 7.1.1998 / 15:25:35 / cg"
    "Created: / 11.1.1998 / 16:08:22 / cg"
!

throwOutOfMemoryError
    ^ self
        throwExceptionClassName:'java.lang.OutOfMemoryError'
        withMessage:'Oops, out of memory!!'

    "Created: / 04-01-1998 / 22:26:09 / cg"
    "Modified: / 10-11-1998 / 13:20:31 / cg"
    "Created: / 30-08-2011 / 09:23:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwSecurityException
    JavaClassReader classLoaderQuerySignal
        answer:  nil
        do: [
            ^ self throwExceptionClassName: 'java.lang.SecurityException'
                withMessage: 'trying to load class from java.lang using different class loader?'
        ].

    "Created: / 01-11-2011 / 15:55:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwSecurityExceptionWith: message
    JavaClassReader classLoaderQuerySignal answer: nil
        do: [
            ^ self throwExceptionClassName: 'java.lang.SecurityException'
                withMessage: 'trying to load class from java.lang: ' , message.
        ].

    "Created: / 01-11-2011 / 16:28:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

throwSocketException: message
    JavaClassReader classLoaderQuerySignal answer: nil
        do: [
            ^ self throwExceptionClassName: 'java.net.SocketException'
                withMessage: message
        ].

    "Created: / 01-11-2011 / 16:28:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Created: / 03-11-2011 / 23:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwZipException
    ^ self throwZipException:'error in opening zip file'.

    "Created: / 27-03-2011 / 16:25:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 20-07-2012 / 19:15:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

throwZipException: message
    ^ self throwExceptionClassName: 'java.util.zip.ZipException'
           withMessage: 'error in opening zip file'.

    "Created: / 20-07-2012 / 19:15:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'helpers - io'!

anyStream_close:nativeContext
    |jStream fileNo file|

    jStream := nativeContext receiver.

    file := self validateFile:jStream.
    file == Stdin ifTrue:[
        file := StdinReplacementFileQuerySignal raiseRequest.
        file isNil ifTrue:[
            file := Stdin
        ]
    ].

    "/ should always be bytes

    (file ~~ Stdin
    and:[file ~~ Stdout
    and:[file ~~ Stderr
    and:[file ~~ Transcript]]]) ifTrue:[
        file close.
    ] ifFalse:[
        self breakPoint: #jv.
    ].
    self setOpenFile:nil at:fileNo.

    fileNo := jStream instVarNamed:'fd'.
    fileNo isInteger ifFalse:[
        "/ JDK 1.1.3
        fileNo instVarNamed:'fd' put:0.
    ] ifTrue:[
        "/ JDK 1.0
        jStream instVarNamed:'fd' put:0
    ].

    "Created: / 04-02-1998 / 15:22:03 / cg"
    "Modified: / 14-10-1998 / 15:10:07 / cg"
    "Modified: / 28-07-2012 / 02:45:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

anyStream_readBytes:nativeContext
    |bytes offset count stream nRead|

    bytes := nativeContext argAt:1.
    offset := nativeContext argAt:2.
    count := nativeContext argAt:3.

    stream := self validateFile:(nativeContext receiver).

    "/ should always be bytes
    bytes class isBytes ifFalse:[
        self halt.
    ].
    stream == Stdin ifTrue:[
        stream := StdinReplacementFileQuerySignal raiseRequest.
        stream isNil ifTrue:[
            ^ -1 "/ 0  EOF
        ]
    ].

    FileIOTrace ifTrue:[
        ('JAVA: read ' , count printString , ' bytes from ' , stream pathName) infoPrintCR.
    ].

    stream isPositionable ifFalse:[
        "/ mhmh - some kind of socket or pipe

        stream readWait.
    ].

    count == 0 ifTrue:[^0].

    Stream readErrorSignal handle:[:ex |
        nRead := -1
    ] do:[
        nRead := stream nextAvailableBytes:count into:bytes startingAt:offset+1.
    ].
    nRead == 0 ifTrue:[
        stream atEnd ifTrue:[
            FileIOTrace ifTrue:[
                ('JAVA: at EOF ' , nRead printString) infoPrintCR.
            ].
            ^ -1
        ].
    ].
    count ~~ nRead ifTrue:[
        FileIOTrace ifTrue:[
            ('JAVA: only got ' , nRead printString) infoPrintCR.
        ]
    ].
    ^ nRead

    "Created: / 04-02-1998 / 15:20:00 / cg"
    "Modified: / 10-11-1998 / 19:56:47 / cg"
    "Modified: / 10-08-2011 / 21:35:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

anyStream_writeBytes:nativeContext
    |bytes offset count stream|

    bytes := nativeContext argAt:1.
    offset := nativeContext argAt:2.
    count := nativeContext argAt:3.

    stream := self validateFile:(nativeContext receiver).

    FileIOTrace ifTrue:[
        stream isFileStream ifTrue:[
            Logger log: ('write ' , count printString , ' bytes to ' , stream pathName) severity: #info facility: 'JVM'.
        ] ifFalse:[
            stream ~~ Stdout ifTrue:[
                stream ~~ Stderr ifTrue:[
                    Logger log: ('write ' , count printString , ' bytes to ' , stream displayString) severity: #info facility: 'JVM'.
                ]
            ]
        ]
    ].

    "/ should always be bytes
    Stream writeErrorSignal handle:[:ex |
        ex return
    ] do:[
        Socket brokenConnectionSignal handle:[:ex |
            ex return
        ] do:[
            stream isBinary ifTrue:[
                stream nextPutBytes:count from:bytes startingAt:offset+1
            ] ifFalse:[
                stream nextPutAll: (bytes asString copyFrom: offset + 1 to: offset + count).
            ]

        ].
        stream == Transcript ifTrue:[
            Transcript endEntry
        ]
    ].

    "Created: / 04-02-1998 / 15:23:58 / cg"
    "Modified: / 16-02-1999 / 11:32:45 / cg"
    "Modified: / 14-09-2011 / 22:05:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

checkWritePermissionOfDirectory:dir message:msg
    |answer|

    (PermittedDirectories notNil
    and:[PermittedDirectories includes:dir]) ifFalse:[
	FileOpenConfirmation ifTrue:[
	    answer := Dialog
		    confirmWithCancel:msg withCRs
			       labels:#('no' 'grant')
			       values:#(false true)
			      default:2.
	    answer == false ifTrue:[
		^ false
	    ].

	    (self confirm:('JAVA Security check\\Always permit writes in this directory (''' , dir pathName , ''') ?') withCRs)
	    ifTrue:[
		PermittedDirectories isNil ifTrue:[
		    PermittedDirectories := Set new
		].
		PermittedDirectories add:dir.
	    ]
	]
    ].
    ^ true

    "Created: / 3.12.1998 / 15:07:56 / cg"
    "Modified: / 3.12.1998 / 15:16:55 / cg"
!

commonClose:nativeContext

    | fdobj fd stream |
    fdobj := (nativeContext receiver instVarNamed: #fd).
    fd    := fdobj instVarNamed: #fd.
    fd == -1 ifTrue:[
        "Never opened or already closed"
        ^self.
    ].
    stream := self getOpenFileAt:fd.
    stream notNil ifTrue:[
        stream isView ifTrue:[
            "Some applications close stdout/stderr (such as Apache Tomcat).
             We don't want that, so ignore a close in that case"
            stream ~~ Transcript ifTrue:[
                self breakPoint: #jv.
            ].
        ] ifFalse:[
            (stream ~~ Stdout and:[stream ~~ Stderr and:[stream ~~ Stdin]]) ifTrue:[
                stream close.
            ]
        ]
    ] ifFalse:[
        self breakPoint: #jv.
    ].
    self setOpenFile: nil at: fd.
    fdobj instVarNamed:#fd put: -1.

    "Created: / 10-08-2011 / 14:02:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

commonOpen:nativeContext forAppend:forAppend
    |fs fd fn nm dir stream fileNo readonly|

    fs := nativeContext receiver.
    fd := fs instVarNamed:'fd'.
    (fd instVarNamed:'fd') ~~ -1 ifTrue:[
        "/self halt:'file already open'.
        self internalError:'file already open'.
        ^ self.
    ].

    nm := nativeContext argAt:1.
    nm := Java as_ST_String:nm.

    FileOpenTrace ifTrue:[
        ('JAVA: opening ' , nm) infoPrintCR.
    ].

    fn := nm utf8Decoded asFilename.
    dir := fn directory pathName.

    readonly := false.
"/    (PermittedDirectories notNil
"/    and:[PermittedDirectories includes:dir]) ifFalse:[
"/        FileOpenConfirmation ifTrue:[
"/            answer := Dialog
"/                    confirmWithCancel:('JAVA Security check\\Opening ''' , name , ''' for read/write.\Grant permission ?') withCRs
"/                               labels:#('no' 'grant' 'readonly')
"/                               values:#(false true #readonly)
"/                              default:3.
"/            answer == false ifTrue:[
"/                self throwIOExceptionWithMessage:('no permission to open ' , name , ' for writing').
"/                ^ self
"/            ].
"/            readonly := (answer == #readonly).
"/
"/            readonly ifFalse:[
"/                (self confirm:('JAVA Security check\\Always permit writes in this directory (''' , dir , ''') ?') withCRs)
"/                ifTrue:[
"/                    PermittedDirectories isNil ifTrue:[
"/                        PermittedDirectories := Set new
"/                    ].
"/                    PermittedDirectories add:dir.
"/                ]
"/            ]
"/        ]
"/    ].

    readonly ifTrue:[
        (fn exists and:[fn isReadable not]) ifTrue:[
            ^self throwFileNotFoundException: 'File is not readable'
        ].
        stream := fn readStream.
    ] ifFalse:[
"/        fn exists ifFalse:[
"/            ^self throwFileNotFoundException: 'File does not exist'
"/        ].
        fn isDirectory ifTrue:[
             ^self throwFileNotFoundException: 'File is directory'
        ].
        (fn exists and:[fn isWritable not]) ifTrue:[
            ^self throwFileNotFoundException: 'File does not writable'
        ].
        forAppend ifTrue:[
            stream := self commonOpenStreamUsing:[fn appendingWriteStream].
        ] ifFalse:[
            stream := self commonOpenStreamUsing:[fn writeStream].
        ]
    ].
    stream isNil ifTrue:[
        self throwIOExceptionWithMessage:('cannot open ' , nm , ' for writing').
    ].
    stream binary.

    fileNo := self addOpenFile:stream.

    FileOpenTrace ifTrue:[
        ('JAVA: opened ' , nm , ' as FD ' , fileNo printString , ' for writing') infoPrintCR.
    ].

    fd instVarNamed:'fd' put:fileNo.

    "Kludge for finalization..."
    fs finalizationLobby registerChange: fs

    "Created: / 07-04-1998 / 19:14:09 / cg"
    "Modified: / 04-01-1999 / 14:34:42 / cg"
    "Modified: / 12-12-2012 / 23:43:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

commonOpenStreamUsing: aBlock
    "Helper for opening a stream. Catches 'too many files' open error
     and tries to GC to cleanup if necessary"

    | stream retry |

    retry := false.
    [ stream := aBlock value ] on:OpenError do:[:ex|
        (ex errorCode) == (OperatingSystem errorNumberFor:#EMFILE) ifTrue:[
            "Worst case, try to cleanup"
            Logger log: 'maximum number of open files reached, forcing finalization...' severity: #warn facility: #JVM.
            [
                FinalizationLobby finalizeNow.
                Delay waitForSeconds: 5. "/Give Java finalization thread a chance to clean up
                ObjectMemory garbageCollect.
                retry := true.
                PerfCounters printOpenExternalStreamsOn: Stderr.
            ] on: Error do:[:ex|
                Logger log: 'failed to force finalization: ', ex description severity: #error facility: #JVM
            ].
        ] ifFalse:[
            ex pass.
        ].
    ].
    retry ifTrue:[
        stream := aBlock value.
        Logger log: 'good, forced finalization solved the problem' severity: #info facility: #JVM
    ].
    ^stream

    "Created: / 23-07-2012 / 19:33:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 14-08-2012 / 02:25:06 / jv"
!

fileStreamForReading:name
    |fn stream tryAlongClassPath|

    FileOpenTrace ifTrue:[
        ('JAVA: opening for read:' , name) infoPrintCR.
    ].
    fn := name asFilename.
    fn exists  ifFalse:[
        ^self throwFileNotFoundException: 'File does not exists'
    ].
    fn isDirectory ifTrue:[
        ^self throwFileNotFoundException: 'File is directory'
    ].
    fn isReadable  ifFalse:[
        ^self throwFileNotFoundException: 'File is not readable'
    ].

    stream := self commonOpenStreamUsing:[fn readStream].
    stream notNil ifTrue:[^ stream].

    fn isAbsolute ifFalse:[
        "/ if not absolute, try along classPath
        "/ This allows classes to open local files (JEdit)
        "/ even if they have NOT been loaded by a Java classLoader.
        "/ Only do this for image files
        "/ (and maybe some other config files in the future),
        "/ to avoid security holes.
        tryAlongClassPath := true.
"/        tryAlongClassPath := false.
"/        (fn hasSuffix:'gif') ifTrue:[
"/            tryAlongClassPath := true.
"/        ].
"/        (fn hasSuffix:'jpg') ifTrue:[
"/            tryAlongClassPath := true.
"/        ].

        tryAlongClassPath ifTrue:[
            Java effectiveClassPath do:[:dirName |
                |fn|

                (fn := dirName asFilename construct:name) exists ifTrue:[
                    fn isReadable ifFalse:[
                        self throwFileNotFoundException: 'File is not readable'.
                        ^nil
                    ].
                    stream := fn readStream.
                    stream notNil ifTrue:[^ stream].
                ]
            ]
        ]
    ].
    ^ nil.

    "Modified: / 27-01-1999 / 18:54:46 / cg"
    "Modified: / 23-07-2012 / 19:37:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fixFilename:path
    OperatingSystem isMSDOSlike ifTrue:[
	(#($/ $\) includes:(path at:1)) ifTrue:[
	    (path at:3) == $: ifTrue:[
		^ path copyFrom:2
	    ]
	]
    ].
    ^ path

    "Created: / 20.10.1998 / 20:58:45 / cg"
    "Modified: / 20.10.1998 / 21:06:49 / cg"
!

validateFile:javaStream
    |fileNo file|

    fileNo := self validateFileNo:javaStream.
    file := self getOpenFileAt:fileNo.

    file isNil ifTrue:[
        self throwIOExceptionWithMessage:('stream with file descriptor %1 closed or was never open' bindWith: fileNo).
        ^ nil
    ].

    ^ file

    "Created: / 04-01-1998 / 16:50:38 / cg"
    "Modified: / 28-07-2012 / 02:44:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

validateFileDescriptor: jFileDescriptor
    "Validates given instance of java.io.FileDescriptor.
     If it is valid, return underlying Smalltalk stream,
     otherwise, throws java.io.IOException"

    | fileNo stream |

    fileNo := jFileDescriptor instVarNamed:'fd'.
    ((fileNo == -1) and:[OperatingSystem isMSWINDOWSlike]) ifTrue:[
        fileNo := jFileDescriptor instVarNamed:'handle'.
    ].
    fileNo isInteger ifFalse:[
        self throwIOExceptionWithMessage:'Invalid fd in java.io.FileDescriptor'.
        ^ nil
    ].
    fileNo == -1 ifTrue:[
        self throwIOExceptionWithMessage:'java.io.FileDescriptor not open'.
        ^ nil
    ].
    stream := self getOpenFileAt:fileNo.
    stream isNil ifTrue:[
        self throwIOExceptionWithMessage:'Stale descriptor in java.io.FileDescriptor (VM stream does not exists)'.
        ^nil
    ].
    ^ stream.

    "Created: / 06-07-2012 / 23:02:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

validateFileNo:javaStream
    |fileNo descriptor|

    "/ JDK 1.1.3 has fileDescriptor wrapped
    "/ JDK 1.0 has it directly as integer

    fileNo := javaStream instVarNamed:'fd'.
    fileNo isInteger ifFalse:[
        descriptor := fileNo.
        descriptor notNil ifTrue:[
            fileNo := descriptor instVarNamed:'fd'.
            ((fileNo == -1) and:[OperatingSystem isMSWINDOWSlike]) ifTrue:[
                fileNo := descriptor instVarNamed:'handle'.
            ].
            fileNo isInteger ifFalse:[
                self throwIOExceptionWithMessage:('invalid fd value in FileDescriptor (%1 [%2])' bindWith: fileNo with: fileNo class).
                ^self
            ].
            ^fileNo
        ]
    ].

    fileNo isInteger ifFalse:[
"/        self halt:'invalid fileNo in read'.
"/        self internalError:'invalid fileNo in read'.
        self throwIOExceptionWithMessage:('invalid fd value in stream object (%1 [%2])' bindWith: fileNo with: fileNo class).
        ^ nil
    ].

    ^ fileNo.

    "Created: / 04-01-1998 / 17:49:08 / cg"
    "Modified: / 13-01-1998 / 14:07:47 / cg"
    "Modified: / 18-08-2011 / 20:03:37 / jv"
    "Modified: / 28-07-2012 / 02:42:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'helpers - reflection'!

classForJavaClassObject:aJavaClassObject
    "given java.lang.class instance, return the real class for it."

    ^ self reflection classForJavaClassObject:aJavaClassObject

    "Created: / 23-01-1998 / 17:44:09 / cg"
    "Modified: / 03-02-2011 / 21:33:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:02:17 / Marcel Hlopko <hlopik@gmail.com>"
!

javaClassObjectForClass: aClass
    "given a real class, return the corresponding java.lang.class
     instance for it."

"/    | class |
"/
"/    "find reflection of StClass in the Java World"
"/    (JavaObjectDictionary new hasReflection: aClass name) ifTrue: [
"/        class := JavaObjectDictionary new reflectionOf: aClass name
"/    ] ifFalse: [ class := aClass. ].
    ^ self reflection javaClassObjectForClass: aClass.

    "Created: / 23-01-1998 / 17:43:38 / cg"
    "Modified: / 05-12-1998 / 15:29:32 / cg"
    "Modified: / 17-01-2011 / 19:24:22 / kursjan <kursjan@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 14:31:25 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 31-07-2012 / 00:49:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaConstructorObjectForMethod:method
    "given a real method, return the corresponding java.lang.reflect.Constructor
     instance for it."
    self breakPoint:#mh info:'refactor my sender to call reflection directly'.
    ^ self reflection javaConstructorObjectForMethod: method.

    "Modified: / 09-02-2011 / 00:58:09 / Marcel Hlopko <hlopik@gmail.com>"
!

javaFieldObjectForField: aJavaField in: aJavaLangClass
    "given a java field, return the corresponding java.lang.Field
     instance for it."
    "
        See OpenJDK7 source:
        jdk7/hotspot/src/share/vm/runtime/reflection.cpp,
        oop Reflection::new_field"

    | field  clazz  name  slot  type  modifiers |

    clazz := aJavaLangClass.
    name := self reflection javaStringObjectForString: aJavaField name
                interned: true.
    slot := aJavaField index.
    type := self javaClassObjectForClass: aJavaField typeClass.
    modifiers := aJavaField accessFlags.
    field := (self classForName: 'java.lang.reflect.Field') new.
    field
        instVarNamed: #clazz put: clazz;
        instVarNamed: #name put: name;
        instVarNamed: #slot put: slot;
        instVarNamed: #type put: type;
        instVarNamed: #modifiers put: modifiers;
        yourself.
    aJavaField annotations
        ifNotNil: [
            field instVarNamed: #annotations
                put: aJavaField annotations runtimeVisible rawAnnotations
        ].
    ^ field.

    "Modified: / 05-12-1998 / 15:29:32 / cg"
    "Created: / 22-11-2010 / 17:01:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:06:20 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 01-04-2011 / 12:11:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 25-04-2011 / 20:23:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaMethodObjectForMethod:method
    "given a real method, return the corresponding java.lang.reflect.Constructor
     instance for it."

    ^ self reflection javaMethodObjectForMethod:method.

    "Modified: / 28-02-2011 / 17:08:36 / Marcel Hlopko <hlopik@gmail.com>"
!

methodForJavaConstructorObject:constructor
    "given a java.lang.reflect.Constructor, return the corresponding method
     it."
    self breakPoint:#mh info: 'refactor my sender to call reflection directly'.
    ^ self reflection methodForJavaConstructorObject: constructor.

    "Modified: / 09-02-2011 / 00:59:43 / Marcel Hlopko <hlopik@gmail.com>"
!

methodForJavaMethodObject:aJavaMethodObject
    "
        Given an instance of java.lang.reflect.Method, answers
        real method associated with it."
   ^ self reflection methodForJavaMethodObject:aJavaMethodObject.

    "Modified: / 07-02-2011 / 09:50:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-02-2011 / 16:58:05 / Marcel Hlopko <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'monitors'!

getJavaMonitorFor:someObject
    | mon |

    "/    JV@2012-04-13: Removed the critical section - this method should be called
    "/                   only when interrupts are blocked
    "/    LockTableAccess
    "/        critical: [
    mon := LockTable at:someObject ifAbsent:nil.
    mon isNil ifTrue:[
        LockTable at:someObject put:(mon := JavaMonitor for:someObject)
    ].

"/        ].

    ^ mon

    "Created: / 02-01-1998 / 19:01:52 / cg"
    "Modified: / 30-11-2011 / 20:40:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 13-04-2012 / 00:44:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

monitorEnter:someObject in:aJavaContext
    | thisProcess  wasBlocked  lockWordOrJavaMonitor |

    self assert:(aJavaContext isNil or:[ aJavaContext isJavaContext ]).
    someObject isNil ifTrue:[
        self throwNullPointerException.
        self breakPoint:#mh.
        ^ self
    ].
    thisProcess := Processor activeProcess.
    MonitorTrace ifTrue:[
        Logger
            log:('MONENTER: entering monitor for %1 in %2'
                    bindWith:(self monitorFriendlyPrintStringOf:someObject)
                    with:thisProcess name)
            severity:#debug
            facility:#JVM.
    ].
    wasBlocked := OperatingSystem blockInterrupts.

    "/ Fetch the lockword. If it is thinlock, iflate it
    lockWordOrJavaMonitor := someObject getJavaLockWord.
    lockWordOrJavaMonitor class == SmallInteger ifTrue:[
        self inflateLockFor: someObject lockword: lockWordOrJavaMonitor
    ] ifFalse:[
        lockWordOrJavaMonitor class ~~ JavaMonitor ifTrue:[
            self internalError: 'lockWord does not contain SmallIntefer nor JavaMonitor!!'.
        ]
    ].

    "/ Now, we're sure that the lock is fat JavaMonitor, enter it
    self enterMonitor:someObject ofProcess:thisProcess.
"/    aJavaContext notNil ifTrue:[aJavaContext addMonitor:someObject].

    wasBlocked ifFalse:[ OperatingSystem unblockInterrupts ].

    MonitorTrace ifTrue:[
        Logger
            log:'MONENTER: monitor entered in ' , thisProcess name
            severity:#debug
            facility:#JVM.
    ].

    "Created: / 08-11-2011 / 15:15:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 11:49:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

monitorExit: someObject in: aJavaContext
    | thisProcess  wasBlocked|
"/    self assert: (aJavaContext isJavaContext).
    someObject isNil ifTrue: [
        self throwNullPointerException.
        self breakPoint: #mh.
        ^ self
    ].
    thisProcess := Processor activeProcess.
    MonitorTrace ifTrue: [
        Logger
            log: ('MONEXIT: leaving monitor for %1 in %2'
                    bindWith: (self monitorFriendlyPrintStringOf: someObject)
                    with: thisProcess name) , thisProcess name
            severity: #info
            facility: #JVM.
    ].

    wasBlocked := OperatingSystem blockInterrupts.
    self leaveMonitor: someObject ofProcess: thisProcess.
"/    aJavaContext notNil ifTrue:[aJavaContext removeMonitor: someObject].
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].

    MonitorTrace ifTrue: [
        Logger
            log: 'MONEXIT: monitor left in ' , thisProcess name
            severity: #info
            facility: #JVM.
    ].

    "Created: / 08-11-2011 / 15:17:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 11:49:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

notify: obj
    | mon  thisProcess  wasBlocked|

    wasBlocked := OperatingSystem blockInterrupts.
    thisProcess := Processor activeProcess.
    mon := obj getJavaMonitor.
    (mon isOwnedBy: thisProcess) ifFalse: [
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
        self
            throwIllegalMonitorStateException: 'monitor was not owned when called notify'.
        ^self.
    ].
    mon notify.
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].

    "Created: / 22-11-2011 / 13:26:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 26-08-2012 / 18:39:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

notifyAll: obj
    | mon  thisProcess  wasBlocked|

    wasBlocked := OperatingSystem blockInterrupts.
    thisProcess := Processor activeProcess.
    mon := obj getJavaMonitor.
    (mon isOwnedBy: thisProcess) ifFalse: [
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
        self
            throwIllegalMonitorStateException: 'monitor was not owned when called notify'.
        ^self

    ].
    mon notifyAll.
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].

    "Created: / 22-11-2011 / 13:26:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 26-08-2012 / 18:39:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

releaseMonitorsOfUnwindingContext: aJavaContext
    "Forcibly releases all monitors acquired by given context.
     Use by unwind handlers"

    | thisProcess  wasBlocked receiver lockWord |
    MonitorTrace ifTrue:[
        Logger
            log: ('UNWIND HANDLER: force-leaving ',aJavaContext acquiredMonitors size printString,'monitors acquired by: ' , aJavaContext printString )
            severity: #info
            facility: #JVM.
    ].
    thisProcess := Processor activeProcess.

    wasBlocked := OperatingSystem blockInterrupts.
    receiver := aJavaContext acquiredMonitors.
    receiver notNil ifTrue:[
        lockWord := receiver getJavaLockWord.
    ] ifFalse:[
        lockWord := 0.
    ].
%{
    if (lockWord != __MKINT(0)) {
      __monitorExit(receiver);
    }
%}.
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].

    MonitorTrace ifTrue:[
        Logger
            log: ('UNWIND HANDLER: leftover monitors left for ' , aJavaContext printString )
            severity: #info
            facility: #JVM.
    ].

    "Created: / 05-04-2012 / 11:35:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

sleepForTimeout: tmo state: state
    "wait"

    | thisProcess |

    thisProcess := Processor activeProcess.
    thisProcess isInterrupted ifTrue: [
        thisProcess clearInterrupted.
        self throwInterruptedException: 'process was interrupted before/during sleep !!?'
    ].
    thisProcess state: state.
    (Delay forMilliseconds: tmo) waitWithState: state.
    thisProcess isInterrupted ifTrue: [
        thisProcess clearInterrupted.
        self throwInterruptedException: 'process was interrupted before/during sleep !!?'
    ].

    "Created: / 30-12-1998 / 19:19:35 / cg"
    "Modified: / 08-01-1999 / 17:29:24 / cg"
    "Created: / 30-11-2011 / 11:04:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 26-08-2012 / 18:40:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

waitOn: obj forTimeout: tmo state: state
    "wait"

    | wasBlocked  thisProcess  mon |
    thisProcess := Processor activeProcess.
    thisProcess isInterrupted ifTrue: [
        thisProcess clearInterrupted.
        self
            throwInterruptedException: 'process was interrupted before/during wait !!?'
    ].
    wasBlocked := OperatingSystem blockInterrupts.
    mon := obj getJavaMonitor.
    (mon isOwnedBy: thisProcess) ifFalse: [
        wasBlocked ifFalse: [ OperatingSystem unblockInterrupts ].
        self throwIllegalMonitorStateException: 'monitor was not owned on wait by ' , thisProcess printString.
        ^self.
    ].
    state notNil ifTrue: [ thisProcess state: state ].
    wasBlocked ifFalse: [ OperatingSystem unblockInterrupts ].
    mon waitForMilliseconds: tmo.
    thisProcess isInterrupted ifTrue: [
        thisProcess clearInterrupted.
        self
            throwInterruptedException: 'process was interrupted before/during wait !!?'
    ].

    "Created: / 30-12-1998 / 19:19:35 / cg"
    "Modified: / 08-01-1999 / 17:29:24 / cg"
    "Created: / 22-11-2011 / 13:20:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 26-08-2012 / 18:40:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'monitors-internal'!

acquireMonitor: obj ofProcess: aProcess
    "Acquire* (stay in the queue and get it) monitor.
     *leave is the word used by jvm spec"

    | mon |
    mon := obj getJavaMonitor.
    self assert: mon notNil.
    MonitorTrace ifTrue: [
        Logger
            log: ('acquiring monitor %1 owned by thread: %2'
                    bindWith: (self monitorFriendlyPrintStringOf: obj)
                    with: aProcess name)
            severity: #debug
            facility: #JVM.
    ].
    mon acquire.
    self assert:(mon isOwnedBy: aProcess).
"/    self acquiredMonitorsOf: aProcess add: obj.
"/    self assert: ((self enteredMonitorsOfProcessAt: aProcess) includes: obj).
"/    self assert: ((self acquiredMonitorsOfProcessAt: aProcess) includes: obj).

    "Created: / 17-11-2011 / 19:01:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 23:24:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

acquireMonitorAndNotifyAll: handle
    | mon |
    mon := handle getJavaMonitor.
    mon enter.
    self notifyAll: handle.
    mon exit.

    "Created: / 29-11-2011 / 14:24:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 01:06:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

acquireMonitorsOfProcess: aProcess
    "will try to acquire all entered monitors of process"

    | enteredMonitors |
    (self hasEnteredMonitorsOfProcess: aProcess) ifTrue: [
        enteredMonitors := self copyEnteredMonitorsOfProcessAt: aProcess.
        self assert: enteredMonitors notNil.
        enteredMonitors do: [:each | self acquireMonitor: each ofProcess: aProcess. ].
    ].

    "Created: / 17-11-2011 / 17:16:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

acquiredMonitorsOf: aProcess add: anyObject

    ^ (self acquiredMonitorsOfProcess: aProcess) add: anyObject.

    "Modified: / 08-01-1999 / 14:02:15 / cg"
    "Created: / 17-11-2011 / 18:29:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

acquiredMonitorsOf: aProcess remove: anyObject
"/    self assert: ((self acquiredMonitorsOfProcess: aProcess) includes: anyObject).
    MonitorTrace ifTrue:[
        self assert: ((self acquiredMonitorsOfProcess: aProcess) last first == anyObject).
    ] ifFalse:[
        self assert: ((self acquiredMonitorsOfProcess: aProcess) last == anyObject).
    ].
    (self acquiredMonitorsOfProcess: aProcess) removeLast.

    "Modified: / 08-01-1999 / 14:02:15 / cg"
    "Created: / 17-11-2011 / 18:40:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 11-04-2012 / 23:37:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

acquiredMonitorsOfProcess: aProcess
    ^ AcquiredMonitorsPerProcess at: aProcess
        ifAbsent: [
            | monitors |
            monitors := OrderedCollection new.
            AcquiredMonitorsPerProcess at: aProcess put: monitors.
            monitors
        ]
            .

    "Created: / 17-11-2011 / 18:29:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

acquiredMonitorsOfProcessAt: aProcess


    ^ AcquiredMonitorsPerProcess at: aProcess ifAbsent: nil.

    "Created: / 08-01-1999 / 14:02:02 / cg"
    "Created: / 17-11-2011 / 17:03:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

copyAcquiredMonitorsOfProcessAt: aProcess
    "does not create empty collection like enteredMonitorsOfProcess"

    ^ (AcquiredMonitorsPerProcess at: aProcess ifAbsent: nil) copy.

    "Created: / 08-01-1999 / 14:02:02 / cg"
    "Created: / 17-11-2011 / 19:23:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

copyEnteredMonitorsOfProcessAt: aProcess
    "does not create empty collection like enteredMonitorsOfProcess"

    ^ (EnteredMonitorsPerProcess at: aProcess ifAbsent: nil) copy.

    "Created: / 08-01-1999 / 14:02:02 / cg"
    "Created: / 17-11-2011 / 19:22:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

countAcquiredMonitorsOfProcess: aProcess
    | acquiredMonitors |
    acquiredMonitors := self acquiredMonitorsOfProcessAt: aProcess.
    ^ acquiredMonitors isNil ifTrue: [ 0 ] ifFalse: [ acquiredMonitors size ].

    "Created: / 17-11-2011 / 18:23:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

countEnteredMonitorsOfProcess: aProcess
    | enteredMonitors |
    enteredMonitors := self enteredMonitorsOfProcessAt: aProcess.
    ^ enteredMonitors isNil ifTrue: [ 0 ] ifFalse: [ enteredMonitors size ].

    "Created: / 17-11-2011 / 17:14:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

enterMonitor: obj ofProcess: aProcess
    "registers itself as one of processes wanting monitor and then tries to acquire it."

    | mon objInLists |
    MonitorTrace ifTrue:[
        MonitorTraceId := MonitorTraceId + 1.
        objInLists := { obj . MonitorTraceId }
    ] ifFalse:[
        objInLists := obj
    ].
"/    self enteredMonitorsOf: aProcess add: objInLists.
    mon := obj  getJavaMonitor.
    self assert: mon notNil.
    MonitorTrace ifTrue: [

        Logger
            log: ('[trace id %3] Entering monitor %1 owned by thread: %2'
                    bindWith: (self monitorFriendlyPrintStringOf: obj)
                    with: aProcess id
                    with: MonitorTraceId)
            severity: #trace
            facility: #JVM
            originator: self
            "/attachment: thisContext fullPrintAllString
    ].
    mon enter.
    self assert: (mon isOwnedBy: aProcess).
"/    self acquiredMonitorsOf: aProcess add: objInLists.
"/    self assert: ((self enteredMonitorsOfProcessAt: aProcess) includes: objInLists).
"/    self assert: ((self acquiredMonitorsOfProcessAt: aProcess) includes: objInLists).

    "Created: / 17-11-2011 / 19:03:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 23:21:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

enteredMonitorsOf: aProcess add: anyObject

    ^ (self enteredMonitorsOfProcess: aProcess) addLast: anyObject.

    "Modified: / 08-01-1999 / 14:02:15 / cg"
    "Created: / 17-11-2011 / 16:25:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 13-04-2012 / 01:05:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

enteredMonitorsOf: aProcess remove: anyObject
"/    self assert: ((self enteredMonitorsOfProcess: aProcess) includes: anyObject).
"/    self assert: ((self enteredMonitorsOfProcess: aProcess) last == anyObject).
    MonitorTrace ifTrue:[
        self assert: ((self enteredMonitorsOfProcess: aProcess) last first == anyObject).
    ] ifFalse:[
        self assert: ((self enteredMonitorsOfProcess: aProcess) last == anyObject).
    ].


    (self enteredMonitorsOfProcess: aProcess) removeLast.

    "Modified: / 08-01-1999 / 14:02:15 / cg"
    "Created: / 17-11-2011 / 18:40:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 11-04-2012 / 23:37:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

enteredMonitorsOfProcess: aProcess
    ^ EnteredMonitorsPerProcess at: aProcess
        ifAbsent: [
            | monitors |
            monitors := OrderedCollection new.
            EnteredMonitorsPerProcess at: aProcess put: monitors.
            monitors
        ]
            .

    "Created: / 08-01-1999 / 14:02:02 / cg"
    "Modified: / 17-11-2011 / 19:22:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

enteredMonitorsOfProcessAt: aProcess
    "does not create empty collection like enteredMonitorsOfProcess"

    ^ EnteredMonitorsPerProcess at: aProcess ifAbsent: nil.

    "Created: / 08-01-1999 / 14:02:02 / cg"
    "Created: / 16-11-2011 / 15:37:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

exitOwnedMonitorsOfProcess
   |thisProcess monitors|
   thisProcess := Processor activeProcess.
   monitors := self acquiredMonitorsOfProcess: thisProcess.
   monitors do: [:each | self assert: (each isOwnedBy:thisProcess).
    each exit.
    ]

    "Created: / 05-12-2011 / 21:15:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

has: aProcess enteredMonitorFor: anyObject
    ^ (self enteredMonitorsOfProcess: aProcess) includes: anyObject.

    "Created: / 17-11-2011 / 16:28:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

hasAcquiredMonitorsOfProcess: aProcess
   | acquiredMonitors |
   acquiredMonitors := self acquiredMonitorsOfProcessAt: aProcess.
   ^ acquiredMonitors isNil
   ifTrue: [ false ]
           ifFalse: [ acquiredMonitors size > 0 ].

    "Created: / 17-11-2011 / 17:07:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

hasEnteredMonitorsOfProcess: aProcess
   | enteredMonitors |
   enteredMonitors := self enteredMonitorsOfProcessAt: aProcess.
   ^ enteredMonitors isNil ifTrue: [ false ] ifFalse: [ enteredMonitors size > 0].

    "Created: / 17-11-2011 / 17:09:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

inflateLockFor: obj lockword: lw
     | threadId count mon |
%{
    threadId = __MKINT(__LOCKWORD_TID_GET(lw));
    count =    __MKINT(__LOCKWORD_CNT_GET(lw));
%}.
    ^ JavaMonitor for: obj thread: threadId nestedLockCount: count.

    "Modified (format): / 27-08-2012 / 15:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

leaveMonitor: obj ofProcess: aProcess
    "Leave* (release and never come back, exit) monitor owned by given project.
     *leave is the word used by jvm spec"

    | mon |
    mon := obj getJavaMonitor.
    self assert: mon notNil.
    "/self assert: (mon isOwnedBy: aProcess).
    MonitorTrace ifTrue: [
        Logger
        log: ('[trace id %3] leaving monitor %1 owned by thread: %2 '
                bindWith: (self monitorFriendlyPrintStringOf: obj)
                with: aProcess name
                with: (self enteredMonitorsOfProcess: aProcess) last second)
        severity: #trace
        facility: #JVM
        originator: self
        "/attachment: thisContext fullPrintAllString

    ].
    mon exit.
"/    self acquiredMonitorsOf: aProcess remove: obj.
"/    self enteredMonitorsOf: aProcess remove: obj.

    "Created: / 17-11-2011 / 18:46:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 23:22:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

leaveMonitorsOfProcess: aProcess
    "Leave* (release and never come back, exit) all monitors owned by given project.
     Called when cleaning up after process death or when handling smalltalk (non-java) exceptions
     (such an exception in native method)
     *leave is the word used by jvm spec"

    | monitors |
    monitors := EnteredMonitorsPerProcess at: aProcess ifAbsent: nil.
    monitors notNil ifTrue: [
        monitors do: [:obj |

            | mon |
            mon := obj getJavaMonitor.
            mon notNil ifTrue: [
                (mon isOwnedBy: aProcess) ifTrue: [
                    Logger
                        log: ('leaving monitor owned by dying thread: ' , aProcess name)
                        severity: #info
                        facility: #JVM.
                    self breakPoint: #jv.
                    mon exit
                ].
            ].
        ].
        EnteredMonitorsPerProcess removeKey: aProcess.
    ].

    "Created: / 17-11-2011 / 16:51:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 27-08-2012 / 11:37:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

monitorExit: someObject in: aJavaContext ifOwnedBy: aProcess
    | monitor |
    monitor := someObject getJavaMonitor.
    (monitor isOwnedBy: aProcess) ifTrue: [
        self monitorExit: someObject in: aJavaContext
    ] ifFalse: [
        MonitorTrace ifTrue: [
            Logger
                log: ('%1 trying to exit monitor for %2, but it does not own it. Ignoring'
                        bindWith: aProcess name
                        with: (self monitorFriendlyPrintStringOf: someObject))
                severity: #debug
                facility: #JVM
        ]
    ].

    "Created: / 17-11-2011 / 21:17:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 26-08-2012 / 20:00:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

monitorFriendlyPrintStringOf: someObject
    | objString |
    someObject isJavaClass ifTrue: [ objString := someObject name ] ifFalse: [
        objString := someObject class name , '@'
                    , someObject identityHash printString.
    ].
    ^ objString
!

releaseMonitor: obj ofProcess: aProcess
    "Release* (let go and wait for it again) monitor owned by given project.
     *word used by jvm spec"

    | mon |
    mon := obj getJavaMonitor.
    self assert: mon notNil.
    self assert: (mon isOwnedBy: aProcess).
    MonitorTrace ifTrue: [
        Logger
            log: ('releasing monitor %1 owned by thread: %2'
                    bindWith: (self monitorFriendlyPrintStringOf: obj)
                    with: aProcess name)
            severity: #debug
            facility: #JVM.
    ].
    mon release.
    self acquiredMonitorsOf: aProcess remove: obj.
"/    self assert: ((self enteredMonitorsOfProcessAt: aProcess) includes: obj).

    "Created: / 17-11-2011 / 18:51:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 23:24:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

releaseMonitorsOfProcess

    self releaseMonitorsOfProcess: Processor activeProcess

    "Created: / 04-11-2011 / 22:15:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

releaseMonitorsOfProcess: aProcess
    "Releases* all monitors owned by given project.
     Monitor can be acquired again, (aProcess going into WAIT)
     *word used by jvm spec"

    | monitors |
    monitors := self copyAcquiredMonitorsOfProcessAt: aProcess.
    monitors notNil ifTrue: [
        monitors do: [:obj | self releaseMonitor: obj ofProcess: aProcess. ].
    ].

    "Created: / 04-11-2011 / 22:15:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-11-2011 / 21:29:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (comment): / 05-12-2011 / 21:13:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

unwindHandlerForJavaContext: aJavaContext
    "given a context which has been marked for unwind,
     retrieve the handler block. This method is called when ST
     exception raises and stack is unwinding. JavaClass instance
     has an opportunity to clean up monitors"

    ^ [
        | thisProcess |
        aJavaContext shouldExecuteFinallyOnUnwind ifTrue:[
            self throwExceptionForFinallyIn: aJavaContext
        ].
        self releaseMonitorsOfUnwindingContext: aJavaContext.
    ].

    "Created: / 08-11-2011 / 12:30:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 17-11-2011 / 21:33:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 10-04-2012 / 11:08:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'monitors-obsolete'!

waitFor: sema state: pState timeOut: tmo
    "wait"

    | wasBlocked  thisProcess  releasedCount  acquiredCount |
    thisProcess := Processor activeProcess.
    wasBlocked := OperatingSystem blockInterrupts.
    releasedCount := self countAcquiredMonitorsOfProcess: thisProcess.
    (self hasAcquiredMonitorsOfProcess: thisProcess) ifTrue: [
        MonitorTrace ifTrue: [
            Logger
                log: thisProcess name , ' going into WAIT - releasing '
                        , (self countAcquiredMonitorsOfProcess: thisProcess) printString
                            , ' monitors'
                severity: #debug
                facility: #JVM.
        ].
        self releaseMonitorsOfProcess: thisProcess.
    ].
    wasBlocked ifFalse: [ OperatingSystem unblockInterrupts ].
    pState notNil ifTrue: [ thisProcess state: pState ].
    sema isNil ifTrue: [ Delay waitForMilliseconds: tmo ] ifFalse: [
        (tmo isNil or: [ tmo = 0 ]) ifTrue: [ sema wait. ] ifFalse: [
            sema waitWithTimeout: tmo / 1000.
        ].
    ].

    "/ re-enter monitors.

    (self hasEnteredMonitorsOfProcess: thisProcess) ifTrue: [
        wasBlocked := OperatingSystem blockInterrupts.
        Logger
            log: thisProcess name , ' has been notified - trying to acquire '
                    , (self countEnteredMonitorsOfProcess: thisProcess) printString
                        , ' monitors'
            severity: #debug
            facility: #JVM.
        self acquireMonitorsOfProcess: thisProcess.
        acquiredCount := self countAcquiredMonitorsOfProcess: thisProcess.
        self assert: acquiredCount = releasedCount.
        wasBlocked ifFalse: [ OperatingSystem unblockInterrupts ].
    ].

    "Created: / 30-12-1998 / 19:19:35 / cg"
    "Modified: / 08-01-1999 / 17:29:24 / cg"
    "Modified: / 20-11-2011 / 12:36:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaVM class methodsFor:'native - com.sun.management'!

_com_sun_management_UnixOperatingSystem_initialize: nativeContext

    <javanative: 'com/sun/management/UnixOperatingSystem' name: 'initialize()V'>

Logger log: 'mh did not set page_size here, which he should :)' severity:#info facility:#JVM.
^self.

    "Modified: / 03-11-2011 / 18:59:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.awt'!

_java_awt_AWTEvent_initIDs: nativeContext

    <javanative: 'java/awt/AWTEvent' name: 'initIDs'>

    "Intentionally left blank"

    "Modified: / 12-08-2011 / 19:08:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_awt_Button_initIDs: nativeContext

    <javanative: 'java/awt/Button' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:34 / mh <hlopik@gmail.com>"
!

_java_awt_Color_initIDs: nativeContext

    <javanative: 'java/awt/Color' name: 'initIDs()V'>

        "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:19:23 / cg"
!

_java_awt_Component_initIDs: nativeContext

    <javanative: 'java/awt/Component' name: 'initIDs'>

        "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 19:53:29 / cg"
!

_java_awt_Container_initIDs: nativeContext

    <javanative: 'java/awt/Container' name: 'initIDs'>

    "Intentionally left blank"

    "Modified: / 12-08-2011 / 19:09:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_awt_Cursor_initIDs: nativeContext

    <javanative: 'java/awt/Cursor' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:49 / mh <hlopik@gmail.com>"
!

_java_awt_Dialog_initIDs: nativeContext

    <javanative: 'java/awt/Dialog' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:09 / mh <hlopik@gmail.com>"
!

_java_awt_Dimension_initIDs: nativeContext

    <javanative: 'java/awt/Dimension' name: 'initIDs'>

    "Intentionally left blank"

    "Modified: / 12-08-2011 / 19:08:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_awt_Event_initIDs: nativeContext

    <javanative: 'java/awt/Event' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:11 / mh <hlopik@gmail.com>"
!

_java_awt_FontMetrics_initIDs: nativeContext

    <javanative: 'java/awt/FontMetrics' name: 'initIDs()V'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_awt_Frame_initIDs: nativeContext

    <javanative: 'java/awt/Frame' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:52 / mh <hlopik@gmail.com>"
!

_java_awt_Insets_initIDs: nativeContext

    <javanative: 'java/awt/Insets' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:54 / mh <hlopik@gmail.com>"
!

_java_awt_KeyboardFocusManager_initIDs: nativeContext

    <javanative: 'java/awt/KeyboardFocusManager' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:55:04 / mh <hlopik@gmail.com>"
!

_java_awt_MenuComponent_initIDs: nativeContext

    <javanative: 'java/awt/MenuComponent' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:22 / mh <hlopik@gmail.com>"
!

_java_awt_MenuItem_initIDs: nativeContext

    <javanative: 'java/awt/MenuItem' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:40 / mh <hlopik@gmail.com>"
!

_java_awt_Rectangle_initIDs: nativeContext

    <javanative: 'java/awt/Rectangle' name: 'initIDs()V'>

    "Intentionally left blank"

    "Modified: / 27-10-2011 / 15:07:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_awt_Toolkit_initIDs: nativeContext

    <javanative: 'java/awt/Toolkit' name: 'initIDs'>

        "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 19:53:50 / cg"
!

_java_awt_Window_initIDs: nativeContext

    <javanative: 'java/awt/Window' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:47 / mh <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'native - java.awt.event'!

_java_awt_event_InputEvent_initIDs: nativeContext

    <javanative: 'java/awt/event/InputEvent' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:27 / mh <hlopik@gmail.com>"
!

_java_awt_event_KeyEvent_initIDs: nativeContext

    <javanative: 'java/awt/event/KeyEvent' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:33 / mh <hlopik@gmail.com>"
!

_java_awt_event_MouseEvent_initIDs: nativeContext

    <javanative: 'java/awt/event/MouseEvent' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:53:40 / mh <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'native - java.io'!

_java_io_FileDescriptor_initIDs: nativeContext

    <javanative: 'java/io/FileDescriptor' name: 'initIDs'>

        "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 18:16:29 / cg"
!

_java_io_FileDescriptor_set: nativeContext

    <javanative: 'java/io/FileDescriptor' name: 'set(I)J'>

    "SunJDK Speciofic method, we don't need handles, so return
     FD instead"

    ^nativeContext argAt:1

    "Modified: / 18-08-2011 / 19:54:36 / jv"
!

_java_io_FileDescriptor_sync: nativeContext

    <javanative: 'java/io/FileDescriptor' name: 'sync'>
    "
    /**
    * Force all system buffers to synchronize with the underlying
    * device.  This method returns after all modified data and
    * attributes of this FileDescriptor have been written to the
    * relevant device(s).  In particular, if this FileDescriptor
    * refers to a physical storage medium, such as a file in a file
    * system, sync will not return until all in-memory modified copies
    * of buffers associated with this FileDescriptor have been
    * written to the physical medium.
    *
    * sync is meant to be used by code that requires physical
    * storage (such as a file) to be in a known state  For
    * example, a class that provided a simple transaction facility
    * might use sync to ensure that all changes to a file caused
    * by a given transaction were recorded on a storage medium.
    *
    * sync only affects buffers downstream of this FileDescriptor.  If
    * any in-memory buffering is being done by the application (for
    * example, by a BufferedOutputStream object), those buffers must
    * be flushed into the FileDescriptor (for example, by invoking
    * OutputStream.flush) before that data will be affected by sync.
    *
    * @exception SyncFailedException
    *        Thrown when the buffers cannot be flushed,
    *        or because the system cannot guarantee that all the
    *        buffers have been synchronized with physical media.
    * @since     JDK1.1
    */
    public native void sync() throws SyncFailedException;
    "

    OpenFileTable do:[:stream|
        stream notNil ifTrue:[stream flush].
    ].

    "Created: / 12-11-1998 / 19:26:25 / cg"
    "Modified (format): / 10-08-2011 / 19:04:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_available: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'available'>

        |file|

    file := self validateFile:(nativeContext receiver).
    file == Stdin ifTrue:[
        file := StdinReplacementFileQuerySignal raiseRequest.
        file isNil ifTrue:[
            ^ 1
        ]
    ].
    file isFileStream ifTrue:[
        ^ file size - file position + 1
    ].
    file atEnd ifTrue:[
        ^ 0.
    ].
    self halt.
    ^ 1

    "Modified: / 14-01-1998 / 15:12:52 / cg"
    "Modified: / 28-07-2012 / 02:45:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_close0: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'close0'>

    ^self commonClose: nativeContext

    "Modified: / 10-08-2011 / 14:03:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_initIDs: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'initIDs'>

        "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 18:15:51 / cg"
!

_java_io_FileInputStream_open: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'open'>

    |fs fd name stream fileNo|

    fs := nativeContext receiver.
    fd := fs instVarNamed:'fd'.
    (fileNo := fd instVarNamed:'fd') ~~ 0 ifTrue:[
        fileNo ~~ -1 ifTrue:[
            self halt:'file already open'.
            self internalError:'file already open'.
            ^ self.
        ]
    ].

    name := nativeContext argAt:1.
    name := Java as_ST_String:name.

    name := self fixFilename:name.

    FileOpenTrace ifTrue:[
        ('JAVA: opening ' , name) infoPrintCR.
    ].

    stream := self fileStreamForReading:name.
    stream isNil ifTrue:[
        ^ self.
    ].
    stream buffered:false.

"/    FileOpenConfirmation ifTrue:[
"/        (self confirm:('JAVA Security check\\Opening ''' , name , ''' for reading.\Grant permission ?') withCRs)
"/        ifFalse:[
"/            self throwIOExceptionWithMessage:('no permission to open ' , name , ' for reading').
"/            ^ self
"/        ]
"/    ].

    fileNo := self addOpenFile:stream.

    FileOpenTrace ifTrue:[
        ('JAVA: opened ' , name , ' as FD ' , fileNo printString) infoPrintCR.
    ].

    fd instVarNamed:'fd' put:fileNo.
    "Kludge for finalization..."

    "Created: / 04-01-1998 / 16:47:12 / cg"
    "Modified: / 28-01-1999 / 17:24:07 / cg"
    "Modified: / 24-07-2012 / 02:17:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_read: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'read()I'>

        |file byte|

    file := self validateFile:(nativeContext receiver).

    file == Stdin ifTrue:[
        file := StdinReplacementFileQuerySignal raiseRequest.
        file isNil ifTrue:[
            ^ -1
        ]
    ].

    FileIOTrace ifTrue:[
        ('JAVA: read 1 byte from ' , file pathName) infoPrintCR.
    ].

    byte := file nextByte.
    byte isNil ifTrue:[
        ^ -1
    ].
    "Java bytes are signed"
    byte > 127 ifTrue:[
        byte := 
            byte"/ - 255.
    ].
    ^ byte

    "Created: / 05-01-1998 / 02:17:08 / cg"
    "Modified (format): / 12-12-2012 / 23:53:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_readBytes: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'readBytes'>

    ^ self anyStream_readBytes:nativeContext

    "Modified: / 04-02-1998 / 15:23:08 / cg"
    "Modified (format): / 10-08-2011 / 21:32:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileInputStream_skip: nativeContext

    <javanative: 'java/io/FileInputStream' name: 'skip(J)J'>

        "/ long skip (long)
    |file nSkip nSkipped|

    file := self validateFile:(nativeContext receiver).
    nSkip := nativeContext argAt:1.

    file == Stdin ifTrue:[
	file := StdinReplacementFileQuerySignal raiseRequest.
	file isNil ifTrue:[
	    ^ -1
	]
    ].

    FileIOTrace ifTrue:[
	(('JAVA: skip %1 byte(s) from ' bindWith:nSkip printString) , file pathName) infoPrintCR.
    ].

    file skip:nSkip.
    ^ nSkip

    "Modified: / 27.1.1999 / 20:36:11 / cg"
!

_java_io_FileOutputStream_close0: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'close0'>

    ^self commonClose: nativeContext

    "Modified: / 10-08-2011 / 14:03:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileOutputStream_initIDs: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'initIDs'>

        "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 18:16:40 / cg"
!

_java_io_FileOutputStream_open: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'open'>

    ^ self commonOpen:nativeContext forAppend:false

    "Modified: / 07-04-1998 / 19:14:31 / cg"
    "Modified (format): / 10-08-2011 / 14:25:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileOutputStream_openAppend: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'openAppend'>

    ^ self commonOpen:nativeContext forAppend:true

    "Modified: / 07-04-1998 / 19:13:42 / cg"
    "Modified (format): / 10-08-2011 / 23:48:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileOutputStream_write: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'write'>
    "
     /**
     * Writes the specified byte to this file output stream. Implements
     * the <code>write</code> method of <code>OutputStream</code>.
     *
     * @param      b   the byte to be written.
     * @exception  IOException  if an I/O error occurs.
     */
     public native void write(int b) throws IOException;
    "

    | fdobj fd stream b |
    b := nativeContext argAt:1.
    "/Java byte is signed, make it integer in 0-255"
    b < 0 ifTrue:[b := b + 256].
    fdobj := (nativeContext receiver instVarNamed: #fd).
    fd    := fdobj instVarNamed: #fd.
    stream := self getOpenFileAt:fd.
    [
        stream nextPut: b
    ] on: Error do:[:ex|
        self throwIOExceptionWithMessage: ex description
    ]

    "Modified: / 15-12-2012 / 16:31:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_FileOutputStream_writeBytes: nativeContext

    <javanative: 'java/io/FileOutputStream' name: 'writeBytes'>

        ^ self anyStream_writeBytes:nativeContext

    "Modified: / 4.2.1998 / 15:24:20 / cg"
!

_java_io_FileSystem_getFileSystem: aJavaContext
    <javanative: 'java/io/FileSystem' name: 'getFileSystem'>
    OperatingSystem isUNIXlike ifTrue: [
        ^ (self classForName: 'java.io.UnixFileSystem') new
    ].
    OperatingSystem isMSWINDOWSlike ifTrue: [
        ^ (Java classForName: 'java.io.WinNTFileSystem') new
    ].
    self error: 'Unknown/Unsupported platform'

    "Created: / 09-12-2010 / 17:58:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-04-2011 / 18:09:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_ObjectInputStream_latestUserDefinedLoader: nativeContext

    <javanative: 'java/io/ObjectInputStream' name: 'latestUserDefinedLoader'>

    "
    /**
    * Returns the first non-null class loader (not counting class loaders of
    * generated reflection implementation classes) up the execution stack, or
    * null if only code from the null class loader is on the stack.  This
    * method is also called via reflection by the following RMI-IIOP class:
    *
    *     com.sun.corba.se.internal.util.JDKClassLoader
    *
    * This method should not be removed or its signature changed without
    * corresponding modifications to the above class.
    */
    // REMIND: change name to something more accurate?
    private static native ClassLoader latestUserDefinedLoader();
    "

    | ctx cl |
    ctx := nativeContext.
    [ ctx notNil ] whileTrue:[
        ctx receiver isJavaObject ifTrue:[
            (cl := ctx receiver class classLoader) notNil ifTrue:[
                "/self breakPoint: #jv info: 'Should not count class loaders of generated reflection implementation classes'.
                "/Please check"
                ^cl.
            ]
        ].
        ctx := ctx sender.
    ].
    ^nil

    "Modified: / 30-08-2011 / 16:00:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_ObjectStreamClass_hasStaticInitializer: nativeContext

    <javanative: 'java/io/ObjectStreamClass' name: 'hasStaticInitializer'>

    | cls |
    cls := self reflection classForJavaClassObject: (nativeContext argAt:1).
    ^(cls includesSelector: #'<clinit>()V') ifTrue:[1] ifFalse:[0]

    "Modified: / 10-08-2011 / 01:13:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_ObjectStreamClass_initNative: aJavaContext

    <javanative: 'java/io/ObjectStreamClass' name: 'initNative'>


    "
    /**
     * Initializes native code.
     */
    "
    "Nothing to do"

    "Created: / 20-12-2010 / 17:43:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_close0: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'close0()V'>

    ^ self commonClose:nativeContext

    "Modified: / 06-07-2012 / 00:09:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_getFilePointer: nativeContext
    "
    /**
     * Returns the current offset in this file.
     *
     * @return     the offset from the beginning of the file, in bytes,
     *             at which the next read or write occurs.
     * @exception  IOException  if an I/O error occurs.
     */
    "
    <javanative: 'java/io/RandomAccessFile' name: 'getFilePointer()J'>

    | file |

    file := self validateFile:(nativeContext receiver).

    FileIOTrace ifTrue:[
        ('JAVA: getFilePointer on ' , file pathName) infoPrintCR.
    ].
    ^file position0Based

    "Modified: / 06-07-2012 / 12:40:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_initIDs: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'initIDs'>

    "Nothing to do"

    "Modified: / 10-08-2011 / 21:49:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_length: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'length()J'>

        |file sz|

    file := self validateFile:(nativeContext receiver).

    FileIOTrace ifTrue:[
	('JAVA: length of ' , file pathName) infoPrintCR.
    ].

    sz := file size.
    ^ sz.

    "Created: / 4.2.1998 / 13:27:58 / cg"
!

_java_io_RandomAccessFile_open: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'open'>

    |fs fd nm mode filename dir stream fileNo answer readonly|


    fs := nativeContext receiver.
    fd := fs instVarNamed:'fd'.
    (fd instVarNamed:'fd') ~~ -1 ifTrue:[
        self halt:'file already open'.
        self internalError:'file already open'.
        ^ self.
    ].

    nm := nativeContext argAt:1.
    nm := Java as_ST_String:nm.
    nm := self fixFilename:nm.
    mode := nativeContext argAt:2.

    "
    private static final int O_RDONLY = 1;
    private static final int O_RDWR =   2;
    private static final int O_SYNC =   4;
    private static final int O_DSYNC =  8;
    "
    readonly := (mode bitAnd:1) == 1.

    FileOpenTrace ifTrue:[
        ('JAVA: opening ' , nm) infoPrintCR.
    ].

    dir := (filename := nm utf8Encoded asFilename) directory pathName.

    (PermittedDirectories notNil
    and:[PermittedDirectories includes:dir]) ifFalse:[
        FileOpenConfirmation ifTrue:[
            answer := Dialog
                    confirmWithCancel:('JAVA Security check\\Opening ''' , nm , ''' for read/write.\Grant permission ?') withCRs
                               labels:#('no' 'grant' 'readonly')
                               values:#(false true #readonly)
                              default:3.
            answer == false ifTrue:[
                self throwIOExceptionWithMessage:('no permission to open ' , nm , ' for writing').
                ^ self
            ].
            readonly := (answer == #readonly).

            readonly ifFalse:[
                (self confirm:('JAVA Security check\\Always permit writes in this directory (''' , dir , ''') ?') withCRs)
                ifTrue:[
                    PermittedDirectories isNil ifTrue:[
                        PermittedDirectories := Set new
                    ].
                    PermittedDirectories add:dir.
                ]
            ]
        ]
    ].

    (filename exists not and:[readonly]) ifTrue:[
        self throwIOExceptionWithMessage:'File ', nm , ' does not exist'
    ].

    readonly ifTrue:[
        stream := self commonOpenStreamUsing:[filename readStream].
    ] ifFalse:[
        stream := self commonOpenStreamUsing:[filename readWriteStream].
        stream isNil ifTrue:[
            self throwIOExceptionWithMessage:('cannot open ' , nm , ' for writing').
        ].
    ].


    fileNo := self addOpenFile:stream.

    FileOpenTrace ifTrue:[
        ('JAVA: opened ' , nm , ' as FD ' , fileNo printString , ' for writing') infoPrintCR.
    ].

    fd instVarNamed:'fd' put:fileNo.
    "Kludge for finalization..."
    fs finalizationLobby registerChange: fs

    "Created: / 04-02-1998 / 00:14:48 / cg"
    "Modified: / 12-11-1998 / 21:29:46 / cg"
    "Modified: / 23-07-2012 / 19:37:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_read: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'read()I'>

        |file byte|

    file := self validateFile:(nativeContext receiver).

    FileIOTrace ifTrue:[
	('JAVA: read 1 byte from ' , file pathName) infoPrintCR.
    ].

    byte := file nextByte.
    byte isNil ifTrue:[
	^ -1
    ].
    ^ byte

    "Modified: / 5.1.1998 / 02:17:25 / cg"
    "Created: / 27.1.1999 / 19:01:15 / cg"
!

_java_io_RandomAccessFile_readBytes: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'readBytes([BII)I'>

    ^ self anyStream_readBytes:nativeContext

    "Modified: / 04-02-1998 / 15:23:27 / cg"
    "Modified (format): / 06-07-2012 / 00:08:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_seek: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'seek(J)V'>

        |file pos|

    file := self validateFile:(nativeContext receiver).

    FileIOTrace ifTrue:[
        ('JAVA: seek on ' , file pathName) infoPrintCR.
    ].

    pos := nativeContext argAt:1.
    file position0Based:pos

    "Created: / 04-02-1998 / 13:25:38 / cg"
    "Modified (comment): / 06-07-2012 / 12:39:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_RandomAccessFile_writeBytes: nativeContext

    <javanative: 'java/io/RandomAccessFile' name: 'writeBytes([BII)V'>

        ^ self anyStream_writeBytes:nativeContext

    "Modified: / 4.2.1998 / 15:24:20 / cg"
    "Created: / 4.2.1998 / 15:24:35 / cg"
!

_java_io_UnixFileSystem_canonicalize0: aJavaContext

    <javanative: 'java/io/UnixFileSystem' name: 'canonicalize0'>

    |  path |

    path := Java as_ST_String: (aJavaContext argAt: 1).
    ^(Java as_String: path utf8Encoded asFilename asAbsoluteFilename pathName utf8Decoded)

    "Created: / 10-12-2010 / 14:40:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_checkAccess: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'checkAccess'>

    "
     public static final int ACCESS_READ    = 0x04;
     public static final int ACCESS_WRITE   = 0x02;
     public static final int ACCESS_EXECUTE = 0x01;
    "

    | fileobj file access result |
    fileobj := nativeContext argAt:1.
    file := (Java as_ST_String:(fileobj instVarNamed:#path)) asFilename.
    access := nativeContext argAt:2.
    [
        access == 16r01 ifTrue:[result := file isExecutable].
        access == 16r02 ifTrue:[result := file isWritable].
        access == 16r04 ifTrue:[result := file isReadable].
    ] on: Error do:[
        result := false.
    ].
    ^result ifTrue:[1] ifFalse:[0].

    "Modified: / 09-08-2011 / 17:09:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_createDirectory: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'createDirectory'>

    | fileobj file |
    fileobj := (nativeContext argAt:1).
    file := Java as_ST_String: (fileobj instVarNamed:#path).
    file := file asFilename.
    file exists ifFalse:[
        [
            file recursiveMakeDirectory.
            ^1.
        ] on: Error do:[:ex|
            self throwIOExceptionWithMessage:ex description.
        ].
    ].
    ^0

    "Modified: / 05-12-2011 / 23:04:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_createFileExclusively: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'createFileExclusively'>

    | file |
    file := Java as_ST_String: (nativeContext argAt:1).
    file := file asFilename.
    file exists ifFalse:[
        [
            file createAsEmptyFile
        ] on: Error do:[:ex|
            self throwIOExceptionWithMessage:ex description.
        ].
        ^1
    ].
    ^0

    "Modified: / 10-08-2011 / 13:42:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_delete0: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'delete0'>
    "
      /**
      * Delete the file or directory denoted by the given abstract pathname,
      * returning <code>true</code> if and only if the operation succeeds.
      */
      public abstract boolean delete(File f);
    "
    | file |

    file := (Java as_ST_String: ((nativeContext argAt:1) instVarNamed: #path)) asFilename.
    file exists ifFalse:[^0].
    ^[
        file remove.
        true
    ] on: Error do:[
        false
    ]

    "Modified: / 09-08-2011 / 17:09:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_getBooleanAttributes0: aJavaContext
    <javanative: 'java/io/UnixFileSystem' name: 'getBooleanAttributes0'>
    | file  path  retval  fileSystemClass |
    retval := 0.
    file := (aJavaContext argAt: 1).
    path := Java as_ST_String: ((aJavaContext argAt: 1) perform: #'getAbsolutePath()Ljava/lang/String;').
    fileSystemClass := (self classForName: 'java.io.FileSystem').
    path asFilename exists ifTrue: [
        retval := retval bitOr: (fileSystemClass instVarNamed: #'BA_EXISTS')
    ] ifFalse: [ ^ 0. ].
    path asFilename isDirectory ifTrue: [
        retval := retval bitOr: (fileSystemClass instVarNamed: #'BA_DIRECTORY')
    ].
    path asFilename isRegularFile ifTrue: [
        retval := retval bitOr: (fileSystemClass instVarNamed: #'BA_REGULAR')
    ].
    path asFilename isHidden ifTrue: [
        retval := retval bitOr: (fileSystemClass instVarNamed: #'BA_HIDDEN')
    ].
    ^ retval

    "Modified: / 10-12-2010 / 14:43:31 / Jan Kurs <kurs.jan@post.cz>"
    "Created: / 10-12-2010 / 14:46:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 11-12-2010 / 19:44:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 03-11-2011 / 11:03:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_io_UnixFileSystem_getLastModifiedTime: aJavaContext

    <javanative: 'java/io/UnixFileSystem' name: 'getLastModifiedTime'>

    | file  filename  |

    file := aJavaContext argAt: 1.
    filename := (Java as_ST_String: (file instVarNamed: #path)) utf8Encoded asFilename.
    ^filename exists ifTrue:[
        filename modificationTime asMilliseconds
    ] ifFalse:[
        0
    ].

    "Modified: / 10-12-2010 / 14:43:31 / Jan Kurs <kurs.jan@post.cz>"
    "Created: / 27-03-2011 / 15:32:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 06-07-2012 / 08:57:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_getLength: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'getLength'>

    | file |

    file := (Java as_ST_String: ((nativeContext argAt:1) instVarNamed: #path)) asFilename.
    file exists ifFalse:[^0].
    ^file fileSize

    "Modified: / 09-08-2011 / 15:38:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_initIDs: aJavaContext

    <javanative: 'java/io/UnixFileSystem' name: 'initIDs'>


    self breakPoint: #libjava

    "Created: / 10-12-2010 / 14:47:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-12-2010 / 20:58:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_list: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: #'list(Ljava/io/File;)[Ljava/lang/String;'>
    "
    /**
    * Returns an array of strings naming the files and directories in the
    * directory denoted by this abstract pathname.
    *
    * <p> If this abstract pathname does not denote a directory, then this
    * method returns {@code null}.  Otherwise an array of strings is
    * returned, one for each file or directory in the directory.  Names
    * denoting the directory itself and the directory's parent directory are
    * not included in the result.  Each string is a file name rather than a
    * complete path.
    *
    * <p> There is no guarantee that the name strings in the resulting array
    * will appear in any specific order; they are not, in particular,
    * guaranteed to appear in alphabetical order.
    *
    * @return  An array of strings naming the files and directories in the
    *          directory denoted by this abstract pathname.  The array will be
    *          empty if the directory is empty.  Returns {@code null} if
    *          this abstract pathname does not denote a directory, or if an
    *          I/O error occurs.
    */
   "
    | fileobj file names jnames |
    fileobj := (nativeContext argAt:1).
    file := Java as_ST_String: (fileobj instVarNamed:#path).
    file := file asFilename.
    file exists ifFalse:[^nil].
    file isDirectory ifFalse:[^nil].

    names := file directoryContents.
    jnames := (Java at:'java.lang.String') javaArrayClass new: names size.
    1 to: names size do:[:i|
        jnames at: i put: (Java as_String:(names at: i))
    ].
    ^jnames

    "Modified: / 23-07-2012 / 21:57:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_rename0: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'rename0(Ljava/io/File;Ljava/io/File;)Z'>

    | file1 file2 |

    file1 := (Java as_ST_String: ((nativeContext argAt:1) instVarNamed: #path)) asFilename.
    file2 := (Java as_ST_String: ((nativeContext argAt:2) instVarNamed: #path)) asFilename.
    file1 exists ifFalse:[^0].
    ^[
        file1 moveTo: file2.
        true
    ] on: Error do:[
        false
    ]

    "Modified: / 09-12-2011 / 20:01:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_setLastModifiedTime: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'setLastModifiedTime(Ljava/io/File;J)Z'>

    | f mtime file |
    f := nativeContext argAt: 1.
    mtime := nativeContext argAt: 2.
    file := (Java as_ST_String: (f instVarNamed: #path)) asFilename.

    self breakPoint: #jv. "There is no interface for that in St/X"

    "Modified: / 05-12-2011 / 23:42:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_setPermission: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'setPermission'>
    "
    /**
     * Set on or off the access permission (to owner only or to all) to the file
     * or directory denoted by the given abstract pathname, based on the parameters
     * enable, access and oweronly.
     */
    public abstract boolean setPermission(File f, int access, boolean enable, boolean owneronly);
    "
    | f access enable owneronly file perms |
    f := nativeContext argAt: 1.
    access := nativeContext argAt: 2.
    enable := (nativeContext argAt: 3) == 1.
    owneronly := (nativeContext argAt: 4) == 1.
    file := (Java as_ST_String: (f instVarNamed: #path)) asFilename.
    "
    public static final int ACCESS_READ    = 0x04;
    public static final int ACCESS_WRITE   = 0x02;
    public static final int ACCESS_EXECUTE = 0x01;
    "

    access == 16r04 ifTrue:[
        perms := owneronly ifFalse:[#(readUser readGroup readOthers)] ifTrue:[#(readUser)].
    ].
    access == 16r02 ifTrue:[
        perms := owneronly ifFalse:[#(writeUser writeGroup writeOthers)] ifTrue:[#(writeUser)].
    ].
    access == 16r01 ifTrue:[
        perms := owneronly ifFalse:[#(executeUser executeGroup executeOthers)] ifTrue:[#(executeUser)].
    ].
    [
        enable ifTrue:[
            file addAccessRights: perms
        ] ifFalse:[
            file removeAccessRights: perms
        ].
        ^ 1.
    ] on: Error do:[
        ^ 0
    ].
    ^0

    "Modified: / 09-08-2011 / 17:18:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_UnixFileSystem_setReadOnly: nativeContext

    <javanative: 'java/io/UnixFileSystem' name: 'setReadOnly'>

    | fileobj file |
    fileobj := (nativeContext argAt:1).
    file := Java as_ST_String: (fileobj instVarNamed:#path).
    file := file asFilename.
    file exists ifFalse:[^0].
    [
        file  removeAccessRights: #(writeUser writeGroup writeOthers).
        ^1
    ] on: Error do:[
        ^0
    ].
    ^0

    "Modified: / 10-08-2011 / 13:40:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_Win32FileSystem_initIDs: nativeContext

    <javanative: 'java/io/Win32FileSystem' name: 'initIDs()V'>

    "Intentionally left blank"
!

_java_io_WinNTFileSystem_canonicalize0: aJavaContext

    <javanative: 'java/io/WinNTFileSystem' name: 'canonicalize0(Ljava/lang/String;)Ljava/lang/String;'>


    |  path |

    path := Java as_ST_String: (aJavaContext argAt: 1).
    ^(Java as_String: path asFilename asAbsoluteFilename pathName)

    "Created: / 01-04-2011 / 23:00:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_WinNTFileSystem_canonicalizeWithPrefix0: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'canonicalizeWithPrefix0(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;'>

    |  path |

    path := Java as_ST_String: (nativeContext argAt: 2).
    ^(Java as_String: path utf8Encoded asFilename asAbsoluteFilename pathName utf8Decoded)

    "Modified: / 01-09-2011 / 21:50:47 / jv"
!

_java_io_WinNTFileSystem_checkAccess: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'checkAccess(Ljava/io/File;I)Z'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_io_WinNTFileSystem_createDirectory: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'createDirectory(Ljava/io/File;)Z'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_io_WinNTFileSystem_createFileExclusively: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'createFileExclusively(Ljava/lang/String;)Z'>

    ^ self _java_io_UnixFileSystem_createFileExclusively: nativeContext

    "Modified: / 18-08-2011 / 17:26:11 / jv"
!

_java_io_WinNTFileSystem_delete0: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'delete0(Ljava/io/File;)Z'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_io_WinNTFileSystem_getBooleanAttributes: aJavaContext

    <javanative: 'java/io/WinNTFileSystem' name: 'getBooleanAttributes(Ljava/io/File;)I'>

    ^ self _java_io_UnixFileSystem_getBooleanAttributes0:aJavaContext

    "Created: / 01-04-2011 / 18:10:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_io_WinNTFileSystem_getLastModifiedTime: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'getLastModifiedTime(Ljava/io/File;)J'>

    ^ self _java_io_UnixFileSystem_getLastModifiedTime: nativeContext

    "Modified: / 18-08-2011 / 14:12:07 / jv"
!

_java_io_WinNTFileSystem_getLength: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'getLength(Ljava/io/File;)J'>

    ^ self _java_io_UnixFileSystem_getLength: nativeContext

    "Modified: / 18-08-2011 / 14:15:36 / jv"
!

_java_io_WinNTFileSystem_list: nativeContext

    <javanative: 'java/io/WinNTFileSystem' name: 'list(Ljava/io/File;)[Ljava/lang/String;'>

    ^ self _java_io_UnixFileSystem_list: nativeContext

    "Modified: / 01-09-2011 / 21:46:37 / jv"
! !

!JavaVM class methodsFor:'native - java.lang'!

_java_lang_ClassLoader_NativeLibrary_load: nativeContext
    <javanative: 'java/lang/ClassLoader$NativeLibrary' name: 'load'>
    "/ introduced with jdk1.2 ... (sigh)

    | nativeLoader  jLibName  libName  libHandle  index |

    nativeLoader := nativeContext receiver.
    jLibName := nativeContext argAt: 1.
    libName := (Java as_ST_String: jLibName) asFilename baseName.
    (index := SimulatedNativeLibs indexOf: libName) ~~ 0 ifTrue: [
        "/        ('JAVA: builtIn nativeLibLoad simulated: ' , libName) printNL.
        nativeLoader instVarNamed: 'handle' put: index.
        ^ self
        "/ void
    ].
    (LoadedNativeLibs notNil and: [ LoadedNativeLibs includesKey: libName ]) ifTrue: [
        "/        ('JAVA: native library already loaded: ' , libName) printNL.
        nativeLoader instVarNamed: 'handle' put: (LoadedNativeLibs at: libName).
        ^ self
        "/ void
    ].
    (self confirm: 'permission to load native library: ' , libName , ' ?') ifFalse: [
        ^ self
    ].
    self halt.
    libName asFilename exists ifFalse: [
        ('JAVA: no file to load nativeLib: ' , libName) printNL.
        ^ self
        "/ void
    ].
    libHandle := ObjectFileLoader loadLibrary: libName.
    libHandle isNil ifTrue: [
        ('JAVA: failed to load nativeLib: ' , libName) printNL.
        ^ self
        "/ void
    ].
    LoadedNativeLibs isNil ifTrue: [ LoadedNativeLibs := Dictionary new. ].
    LoadedNativeLibs at: libName put: libHandle.
    nativeLoader instVarNamed: 'handle' put: (LoadedNativeLibs at: libName).
    ^ self
    "/ void

    "Modified: / 06-02-1998 / 03:12:17 / cg"
    "Created: / 10-12-2010 / 15:11:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 03-11-2011 / 18:25:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_ClassLoader_defineClass1: nativeContext
    <javanative: 'java/lang/ClassLoader' name: 'defineClass1'>
    "
     private native Class defineClass1(String name, byte[] b, int off, int len,
                                      ProtectionDomain pd, String source);"

    | className  b  off  len  pd  source  bs  cls |
    className := Java as_ST_String: (nativeContext argAt: 1).
    "if name starts with java.* or package is signed by something else and we are not signed, throw security exception"
    "ClassLoadersTest>>testEyeOpeningClassLoaderLoadObject"
    "18.11. mh revised - they really test it against java., totally ignoring boot class path.. That surpsised me"
    (className startsWith: 'java.') ifTrue: [
        self throwSecurityExceptionWith: 'className=' , className
    ].
    cls := nil.
    b := nativeContext argAt: 2.
    b ifNil: [self throwNullPointerException].
    off := nativeContext argAt: 3.
    len := nativeContext argAt: 4.
    pd := nativeContext argAt: 5.
    source := Java as_ST_String: (nativeContext argAt: 6).
    bs := (off = 0 and: [ len = b size ])
        ifTrue: [ b readStream ]
        ifFalse: [ bs := (b copyFrom: off + 1 to: off + len) readStream ].
    [
        JavaClassReader classLoaderQuerySignal answer: nativeContext receiver
            do: [ cls := JavaClassReader readStream: bs. ]
    ] on: JavaClassReader invalidClassFormatSignal
            do: [
        :ex |
        self throwClassFormatError: ex description.
        ^ nil.
    ].
    self assert: cls classLoader == nativeContext receiver.
     "FIXME: What to do with source?"
    self registry registerClass: cls.
    "JavaClassReader classLoaderQuerySignal answer: nativeContext receiver
        do: [ cls resolveAll. ]."
    ^ self reflection javaClassObjectForClass: cls.

    "Modified: / 08-12-2011 / 20:56:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 20-02-2012 / 23:14:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-09-2012 / 22:21:22 / m"
!

_java_lang_ClassLoader_defineClass1_OLD: nativeContext
    <javanative: 'java/lang/ClassLoader' name: 'defineClass1'>
    "
     private native Class defineClass1(String name, byte[] b, int off, int len,
                                      ProtectionDomain pd, String source);"

    | className  b  off  len  pd  source  bs  cls |
    className := Java as_ST_String: (nativeContext argAt: 1).
     "if name starts with java.* or package is signed by something else and we are not signed, throw security exception" "ClassLoadersTest>>testEyeOpeningClassLoaderLoadObject" "18.11. mh revised - they really test it against java., totally ignoring boot class path.. That surpsised me"
    (className startsWith: 'java.') ifTrue: [
        self throwSecurityExceptionWith: 'className=' , className
    ].
    cls := ClassRegistry
                classForName: className asSlashedJavaClassName
                loader: nativeContext receiver
                ifAbsentPut: [
                    b := nativeContext argAt: 2.
                    off := nativeContext argAt: 3.
                    len := nativeContext argAt: 4.
                    pd := nativeContext argAt: 5.
                    source := Java as_ST_String: (nativeContext argAt: 6).
                    (off = 0 and: [ len = b size ]) ifTrue: [ bs := b readStream ] ifFalse: [
                        bs := (b copyFrom: off + 1 to: off + len) readStream
                    ].
                    [
                        JavaClassReader classLoaderQuerySignal answer: nativeContext receiver
                            do: [ cls := JavaClassReader readStream: bs. ]
                    ] on: JavaClassReader invalidClassFormatSignal
                            do: [
                        :ex |
                        self throwClassFormatError: ex description.
                        ^ nil.
                    ].
                    self assert: cls classLoader == nativeContext receiver.
                     "FIXME: What to do with source?"
                    cls.
                ].
    "JavaClassReader classLoaderQuerySignal answer: nativeContext receiver
        do: [ cls resolveAll. ]."
    ^ self reflection javaClassObjectForClass: cls.

    "Modified: / 30-10-2011 / 21:46:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-12-2011 / 20:56:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Created: / 20-02-2012 / 23:10:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ClassLoader_findBootstrapClass: nativeContext
    <javanative: 'java/lang/ClassLoader' name: 'findBootstrapClass'>
    "Return class loaded by bootstrap (primordial) classloader or null.
     See OpenJDK, file src/jdk7/hostspot/src/share/vm/prims/jvm.cpp"

    | nm  class |
    nm := Java as_ST_String: (nativeContext argAt: 1).
    class := ClassRegistry
                classForName: nm asSlashedJavaClassName
                loader: nil
                ifAbsentPut: [ class := JavaVM usePrimordialCLToLoadClassNamed: nm. ].

    ^ class notNil
        ifTrue: [ self reflection javaClassObjectForClass: class ]
        ifFalse: [ self throwClassNotFoundException: nm ].

    "Modified: / 30-10-2011 / 21:45:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 20:13:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_ClassLoader_findLoadedClass0: nativeContext

    <javanative: 'java/lang/ClassLoader' name: 'findLoadedClass0'>

    "
    Return java class object for class with given name
    loaded by the receiver or null if not found.
    See OpenJDK:
        src/jdk7/hostspot/src/share/vm/classfile/systemDictionary.cpp
        src/jdk7/hostspot/src/share/vm/prims/jvm.cpp

    "
    | nm class |
    nm := Java as_ST_String: (nativeContext argAt:1).
    class := ClassRegistry classNamed: nm asSlashedJavaClassName loader: nativeContext receiver.

    ^class notNil ifTrue: [
        self reflection javaClassObjectForClass:class
    ] ifFalse:[
        nil
    ]

    "Modified: / 30-10-2011 / 21:48:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ClassLoader_getCaller: nativeContext

    <javanative: 'java/lang/ClassLoader' name: ''>
    "
    // index 0: java.lang.ClassLoader.class
    // index 1: the immediate caller of index 0.
    // index 2: the immediate caller of index 1.
    private static native Class<? extends ClassLoader> getCaller(int index);
    "

    | ctx receiver |

    ctx := nativeContext.

    (nativeContext argAt:1) timesRepeat:[
        ctx := ctx sender.
    ].
    receiver := ctx receiver.
    receiver isJavaClass ifTrue:[
        receiver := Reflection javaClassObjectForClass: receiver.
    ].
    ^receiver

    "Modified: / 03-09-2012 / 18:50:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ClassLoader_registerNatives: aJavaContext

    <javanative: 'java/lang/ClassLoader' name: 'registerNatives'>


    "Nothing to do"

    "Created: / 09-11-2010 / 20:55:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ClassLoader_resolveClass0: nativeContext
    <javanative: 'java/lang/ClassLoader' name: 'resolveClass0'>
    "resolve a new class as previously created by defineClass0"
    "or to be more precise - link class"

    | jClassLoader  jCls  cls |
    jClassLoader := nativeContext receiver.
    jCls := nativeContext argAt: 1.
    jCls isNil ifTrue: [
        self throwNullPointerException.
        ^ nil
    ].
    cls := self reflection classForJavaClassObject: jCls.
    self assert: cls notNil.
    JavaClassReader classLoaderQuerySignal answer: jClassLoader
     do: [ "cls resolveAll." ].
    ^ cls.

    "
        Links the specified class.  This (misleadingly named) method may be
        * used by a class loader to link a class.  If the class <tt>c</tt> has
        * already been linked, then this method simply returns. Otherwise, the
        * class is linked as described in the Execution chapter of the <a
        * href=http://java.sun.com/docs/books/jls/>Java Language
        * Specification</a>.
        * </p>
        *
        * @param  c
        *         The class to link
        *
        * @throws  NullPointerException
         *          If <tt>c</tt> is <tt>null</tt>."

    "Created: / 07-01-1998 / 13:12:27 / cg"
    "Modified: / 20-10-1998 / 19:01:57 / cg"
    "Modified: / 28-01-2011 / 15:28:18 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 08-12-2011 / 20:52:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 12-12-2011 / 14:12:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ClassLoader_retrieveDirectives: nativeContext

    <javanative: 'java/lang/ClassLoader' name: 'retrieveDirectives()Ljava/lang/AssertionStatusDirectives;'>

    | directives |
    directives := (self classForName:'java.lang.AssertionStatusDirectives') new.
    directives instVarNamed:#classes
        put: ((self classForName:'java.lang.String') javaArrayClass new:0).
    directives instVarNamed:#classEnabled
        put: (Boolean javaArrayClass new:0).
    directives instVarNamed:#packages
        put: ((self classForName:'java.lang.String') javaArrayClass new:0).
    directives instVarNamed:#packageEnabled
        put: (Boolean javaArrayClass new:0).
    directives instVarNamed:#deflt
        put: ((AssertionsEnabled == true) ifTrue:[1] ifFalse:[0]).
    ^directives

    "Modified: / 06-07-2012 / 08:49:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_desiredAssertionStatus0: aJavaContext

    <javanative: 'java/lang/Class' name: 'desiredAssertionStatus0'>


    ^AssertionsEnabled == true

    "Created: / 24-11-2010 / 08:58:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_forName0:aJavaContext
    <javanative: 'java/lang/Class' name: 'forName0'>
    |nm initialize loader class descriptor|

    nm := Java as_ST_String:(aJavaContext argAt:1).
     "Using Class.forName() to get a primitive type is not allowed"
    (nm size == 1 and:[JavaDescriptor baseTypes includesKey:nm first]) ifTrue:[
        ^ self throwClassNotFoundException:nm.
    ].
    (JavaDescriptor baseTypesByTypeName includesKey:nm) ifTrue:[
        ^ self throwClassNotFoundException:nm.
    ].
    initialize := aJavaContext argAt:2.
    loader := aJavaContext argAt:3.
    JavaClassReader classLoaderQuerySignal answer:loader do:[
        (nm first == $[) ifTrue:[
            |nms|

            nms := nm readStream.
            descriptor := JavaDescriptor readFrom:nms
                        onError:[^ self throwClassNotFoundException:nm].
            nms atEnd ifFalse:[
                ^ self throwClassNotFoundException:nm
            ].
            class := descriptor javaClass.
        ] ifFalse:[
            class := self classForName:nm
        ]
    ].
    class isNil ifTrue:[
        ^ self throwClassNotFoundException:nm
    ].
    ((initialize ~~ 0)
        and:[class isJavaArrayClass not and:[class isJavaPrimitiveType not]])
            ifTrue:[
                [class classInit] on:Error do:[self throwExceptionInInitializerError:nm]
            ].
    ^ JavaVM javaClassObjectForClass:class.

    "Created: / 24-11-2010 / 09:03:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 30-10-2011 / 23:30:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 19:12:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 03-12-2011 / 10:49:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getClassLoader0: aJavaContext

    <javanative: 'java/lang/Class' name: 'getClassLoader0'>

    "get a classes loader"

    |jClass cls |
    jClass := aJavaContext receiver.
    cls := self reflection classForJavaClassObject:jClass.
    ^cls javaMirror getClassLoader

    "Created: / 25-10-2010 / 22:49:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:18:54 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified (format): / 31-07-2012 / 18:33:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getComponentType: nativeContext

    <javanative: 'java/lang/Class' name: 'getComponentType'>

        |cls|

    cls := self reflection classForJavaClassObject:(nativeContext receiver).
    cls isJavaPrimitiveType ifTrue:[
        self breakPoint:#jv.
        ^ nil
    ].
    ^ self javaClassObjectForClass:cls javaComponentClass

    "Created: / 12-11-1998 / 18:54:46 / cg"
    "Modified: / 20-12-2010 / 22:56:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:18:59 / Marcel Hlopko <hlopik@gmail.com>"
!

_java_lang_Class_getConstantPool: aJavaContext

    <javanative: 'java/lang/Class' name: 'getConstantPool'>

        | class |

    class := self reflection classForJavaClassObject:aJavaContext receiver.
    class isJavaClass ifFalse:[
        ^nil
    ].

    ^ self reflection javaConstantPoolObjectFor:class constantPool.

    "Created: / 21-12-2010 / 20:00:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-02-2011 / 18:05:13 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 31-07-2012 / 00:47:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getDeclaredClasses0: nativeContext

    <javanative: 'java/lang/Class' name: 'getDeclaredClasses0'>

    | class innerPrefix inners |
    class := self reflection classForJavaClassObject: nativeContext receiver.
    innerPrefix := class name , '$'.
    inners := Set new.
    JAVA allClassesDo:[:cls|
        ((cls name startsWith: innerPrefix) and:[(cls name indexOf: $$ startingAt: innerPrefix size) == 0]) ifTrue:[
            inners add: (self reflection javaClassObjectForClass: cls)
        ].
    ].
    ^(Java at: 'java.lang.Class') javaArrayClass withAll: inners

    "Modified: / 31-07-2012 / 12:07:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getDeclaredConstructors0:aJavaContext
    <javanative: 'java/lang/Class' name: 'getDeclaredConstructors0'>

    | class publicOnly |

    class := self reflection classForJavaClassObject:(aJavaContext receiver).
    publicOnly := (aJavaContext argAt:1) == 1.
    ^class javaMirror getDeclaredConstructors: publicOnly.

    "Created: / 24-11-2010 / 09:25:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:24:03 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified (format): / 01-08-2012 / 11:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getDeclaredFields0:aJavaContext
    <javanative: 'java/lang/Class' name: 'getDeclaredFields0'>
    |javaClassObject class fields publicOnly|

    class := self reflection
                classForJavaClassObject:(javaClassObject := aJavaContext argAt:0).
    (class isJavaPrimitiveType or:[class isJavaArrayClass]) ifTrue:[
        ^(self classForName:'java.lang.reflect.Field') javaArrayClass new:0.
    ].

    publicOnly := (aJavaContext argAt:1) == 1.
    fields := class javaMirror getDeclaredFields: publicOnly.
    ^fields

    "Created: / 10-11-2010 / 16:22:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:19:06 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 22-08-2012 / 12:16:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getDeclaredMethods0:aJavaContext
    <javanative: 'java/lang/Class' name: 'getDeclaredMethods0'>

    | class publicOnly |

    class := self reflection classForJavaClassObject:(aJavaContext receiver).
    publicOnly := (aJavaContext argAt:1) == 1.
    ^class javaMirror getDeclaredMethods: publicOnly.

    "Created: / 21-12-2010 / 22:39:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:19:09 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 04-06-2011 / 17:07:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 01-08-2012 / 11:15:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getDeclaringClass: nativeContext
    <javanative: 'java/lang/Class' name: 'getDeclaringClass'>
    "
     /**
     * If the class or interface represented by this {@code Class} object
     * is a member of another class, returns the {@code Class} object
     * representing the class in which it was declared.  This method returns
     * null if this class or interface is not a member of any other class.  If
     * this {@code Class} object represents an array class, a primitive
     * type, or void,then this method returns null.
     *
     * @return the declaring class for this class
     * @since JDK1.1
     */"

    | cls  enclosingClsName  enclosingCls |

    cls := self reflection classForJavaClassObject: (nativeContext receiver).
    (cls isJavaPrimitiveType or: [ cls isJavaArrayClass ]) ifTrue: [ ^ nil ].
    (cls name includes: $$) ifFalse: [ ^ nil ].
    enclosingClsName := cls name copyTo: (cls name lastIndexOf: $$) - 1.
    enclosingCls := self classForName: enclosingClsName.
    enclosingCls isNil ifTrue: [ self error: 'Cannot fins declaring class' ].
    ^ self reflection javaClassObjectForClass: enclosingCls

    "Modified: / 13-08-2011 / 02:01:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getEnclosingMethod0: nativeContext

    <javanative: 'java/lang/Class' name: 'getEnclosingMethod0'>

    ^nil "/Not true"

    "Modified: / 14-08-2011 / 20:05:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getGenericSignature: nativeContext

    <javanative: 'java/lang/Class' name: 'getGenericSignature'>

    |cls sig |

    cls := self reflection classForJavaClassObject:(nativeContext receiver).
    sig := cls javaMirror getGenericSignature.
    ^sig notNil ifTrue:[
        Java as_String: sig
    ] ifFalse:[
        nil
    ]

    "Modified: / 22-08-2012 / 11:58:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getInterfaces:nativeContext
    <javanative: 'java/lang/Class' name: 'getInterfaces'>
    |jClass cls interfaces jInterfaces|

    jClass := nativeContext receiver.
    cls := self reflection classForJavaClassObject:jClass.
    interfaces := cls javaMirror getInterfaces.
    jInterfaces := (self classForName:'java.lang.Class') javaArrayClass new:interfaces size.
    interfaces
        withIndexDo:[:iface :idx | jInterfaces at:idx put:(self javaClassObjectForClass:iface) ].
    ^ jInterfaces

    "Modified: / 28-01-2011 / 15:19:11 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 22-08-2012 / 11:08:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getModifiers: aJavaContext
    <javanative: 'java/lang/Class' name: 'getModifiers'>
    | cls |

    cls := (self reflection classForJavaClassObject: aJavaContext receiver).
    ^cls javaMirror getModifiers

    "Created: / 12-11-1998 / 18:54:53 / cg"
    "Modified: / 28-01-2011 / 15:19:14 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 22-08-2012 / 11:04:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getName0: aJavaContext

    <javanative: 'java/lang/Class' name: 'getName0'>

        |class|

    class := aJavaContext receiver.
    class := self reflection classForJavaClassObject:aJavaContext receiver.
    ^ self reflection
        javaStringObjectForString:class javaMirror getName
        interned:true.

    "Created: / 22-11-2010 / 17:50:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:06:53 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 22-08-2012 / 10:47:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getPrimitiveClass: nativeContext

    <javanative: 'java/lang/Class' name: 'getPrimitiveClass'>

        "get a primitive class by name"

    |jClassName className|

    jClassName := nativeContext argAt:1.
    className := Java as_ST_String:jClassName.
    (JavaDescriptor baseTypesByTypeName keys includes: className)
        ifFalse:[self throwClassNotFoundException:className].
    ^self reflection javaClassObjectForClassNamed: className

    "Created: / 04-01-1998 / 00:46:03 / cg"
    "Modified: / 28-01-2011 / 15:30:45 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 03-02-2011 / 21:43:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getProtectionDomain0: nativeContext

    <javanative: 'java/lang/Class' name: 'getProtectionDomain0'>

    ^(self reflection classForJavaClassObject: nativeContext receiver) javaMirror getProtectionDomain

    "Modified: / 22-08-2012 / 12:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getRawAnnotations: aJavaContext

    <javanative: 'java/lang/Class' name: 'getRawAnnotations'>

    |class |

    class := self reflection classForJavaClassObject:aJavaContext receiver.
    class isJavaArrayClass ifTrue:[
        ^nil
    ].
    class isJavaPrimitiveType ifTrue:[
        ^nil
    ].
    class isJavaClass ifFalse:[
        ^nil.
    ].
    ^ class runtimeVisibleAnnotationsAsBytesOrNil

    "Created: / 21-12-2010 / 19:35:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:19:20 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 31-07-2012 / 00:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_getSuperclass: nativeContext
    <javanative: 'java/lang/Class' name: 'getSuperclass'>
    "return a classes superclass"

    | jClass  cls  superCls |

    jClass := nativeContext receiver.
    cls := self reflection classForJavaClassObject: jClass.

    cls isJavaPrimitiveType ifTrue: [ ^ nil ].
    cls isJavaArrayClass ifTrue: [
        ^ self javaClassObjectForClass: (Java at: 'java.lang.Object')
    ].
    cls == Object ifTrue: [
        ^ self javaClassObjectForClass: (Java at: 'java.lang.Object')
    ].
    cls isInterface ifTrue: [ ^ nil ].
    superCls := cls superclass.
    superCls == JavaObject ifTrue: [ ^ nil. ].
    superCls ==     Object ifTrue: [ ^ nil ]. "/for Java
    ^ self javaClassObjectForClass: superCls

    "Created: / 12-01-1998 / 12:38:36 / cg"
    "Modified: / 04-02-1998 / 14:51:22 / cg"
    "Modified: / 28-01-2011 / 14:12:47 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 31-07-2012 / 00:50:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_isArray: nativeContext

    <javanative: 'java/lang/Class' name: 'isArray'>

        ^ (self reflection classForJavaClassObject:nativeContext receiver) isJavaArrayClass
        ifTrue:[1]
        ifFalse:[0]

    "Created: / 12-11-1998 / 18:54:24 / cg"
    "Modified: / 20-12-2010 / 23:20:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:19:24 / Marcel Hlopko <hlopik@gmail.com>"
!

_java_lang_Class_isAssignableFrom: nativeContext

    <javanative: 'java/lang/Class' name: 'isAssignableFrom'>

        "
    /**
     * Determines if the class or interface represented by this
     * {@code Class} object is either the same as, or is a superclass or
     * superinterface of, the class or interface represented by the specified
     * {@code Class} parameter. It returns {@code true} if so;
     * otherwise it returns {@code false}. If this {@code Class}
     * object represents a primitive type, this method returns
     * {@code true} if the specified {@code Class} parameter is
     * exactly this {@code Class} object; otherwise it returns
     * {@code false}.
     *
     * <p> Specifically, this method tests whether the type represented by the
     * specified {@code Class} parameter can be converted to the type
     * represented by this {@code Class} object via an identity conversion
     * or via a widening reference conversion. See <em>The Java Language
     * Specification</em>, sections 5.1.1 and 5.1.4 , for details.
     *
     * @param cls the {@code Class} object to be checked
     * @return the {@code boolean} value indicating whether objects of the
     * type {@code cls} can be assigned to objects of this class
     * @exception NullPointerException if the specified Class parameter is
     *            null.
     * @since JDK1.1
     */
    "
    | clsObj me other |
    clsObj := nativeContext argAt: 1.
    clsObj ifNil:[^self throwNullPointerException].
    me := self reflection classForJavaClassObject: nativeContext receiver.
    other := self reflection classForJavaClassObject: clsObj.

    "/    Determines if the class or interface represented by this
    "/    @code Class} object is either the same as, or is a superclass or
    "/    superinterface of, the class or interface represented by the specified
    "/    {@code Class} parameter.

    ^(other includesBehavior: me)
        ifTrue:[1]
        ifFalse:[0]

    "Created: / 12-11-1998 / 18:54:16 / cg"
    "Modified: / 05-02-2011 / 23:38:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_isInstance: nativeContext

    <javanative: 'java/lang/Class' name: 'isInstance'>

        "
    /**
     * Determines if the specified {@code Object} is assignment-compatible
     * with the object represented by this {@code Class}.  This method is
     * the dynamic equivalent of the Java language {@code instanceof}
     * operator. The method returns {@code true} if the specified
     * {@code Object} argument is non-null and can be cast to the
     * reference type represented by this {@code Class} object without
     * raising a {@code ClassCastException.} It returns {@code false}
     * otherwise.
     *
     * <p> Specifically, if this {@code Class} object represents a
     * declared class, this method returns {@code true} if the specified
     * {@code Object} argument is an instance of the represented class (or
     * of any of its subclasses); it returns {@code false} otherwise. If
     * this {@code Class} object represents an array class, this method
     * returns {@code true} if the specified {@code Object} argument
     * can be converted to an object of the array class by an identity
     * conversion or by a widening reference conversion; it returns
     * {@code false} otherwise. If this {@code Class} object
     * represents an interface, this method returns {@code true} if the
     * class or any superclass of the specified {@code Object} argument
     * implements this interface; it returns {@code false} otherwise. If
     * this {@code Class} object represents a primitive type, this method
     * returns {@code false}.
     *
     * @param   obj the object to check
     * @return  true if {@code obj} is an instance of this class
     *
     * @since JDK1.1
     */
    public native boolean isInstance(Object obj);
    "

    |jClass cls obj|

    obj := nativeContext argAt:1.
    obj isNil ifTrue:[^ 0].
    jClass := nativeContext receiver.
    cls := self reflection classForJavaClassObject:jClass.
    ^self _INSTANCEOF:obj _:cls

    "Modified: / 09-02-1998 / 14:56:23 / cg"
    "Modified: / 28-01-2011 / 14:12:42 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 25-02-2011 / 18:37:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_isInterface: nativeContext

    <javanative: 'java/lang/Class' name: 'isInterface'>

        "return true, if this class is an interface"

    |jClass cls|

    jClass := nativeContext receiver.
    cls := self reflection classForJavaClassObject:jClass.
    cls isJavaClass ifFalse:[
        ^ 0
    ].
    cls isInterface ifTrue:[
        ^ 1 "TRUE"
    ].
    ^ 0 "FALSE"

    "Created: / 12-01-1998 / 12:37:02 / cg"
    "Modified: / 28-01-2011 / 14:12:35 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 03-02-2011 / 21:50:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_isPrimitive: nativeContext

    <javanative: 'java/lang/Class' name: 'isPrimitive'>

        "return true, if this class is builtin primitive class
     (i.e. byteArray, array, string etc."

    |jClass cls|

    jClass := nativeContext receiver.
    cls := self reflection classForJavaClassObject:jClass.
    ^cls isJavaPrimitiveType
        ifTrue:[1"true"]
        ifFalse:[0"false"].

    "Created: / 09-02-1998 / 14:46:07 / cg"
    "Modified: / 28-01-2011 / 14:12:30 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 04-02-2011 / 11:56:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_registerNatives: aJavaContext

    <javanative: 'java/lang/Class' name: 'registerNatives'>


     "Nothing to do, native method are bound lazily"

    "Created: / 20-10-2010 / 11:13:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Class_setProtectionDomain0: nativeContext

    <javanative: 'java/lang/Class' name: 'getProtectionDomain0'>

    (self reflection classForJavaClassObject: nativeContext receiver)
        protectionDomain: (nativeContext argAt:1)

    "Created: / 10-08-2011 / 15:20:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Compiler_disable: nativeContext

    <javanative: 'java/lang/Compiler' name: 'disable()V'>

    "Modified: / 09-02-2012 / 22:56:44 / mh <hlopik@gmail.com>"
!

_java_lang_Compiler_enable: nativeContext

    <javanative: 'java/lang/Compiler' name: 'enable()V'>

    "Modified: / 09-02-2012 / 22:57:15 / mh <hlopik@gmail.com>"
!

_java_lang_Compiler_registerNatives: nativeContext

    <javanative: 'java/lang/Compiler' name: 'registerNatives()V'>

    "Modified: / 09-02-2012 / 22:56:37 / mh <hlopik@gmail.com>"
!

_java_lang_Double_doubleToRawLongBits: aJavaContext

    <javanative: 'java/lang/Double' name: 'doubleToRawLongBits'>

        "
    /**
     * Returns a representation of the specified floating-point value
     * according to the IEEE 754 floating-point 'double
     * format' bit layout, preserving Not-a-Number (NaN) values.
     *
     * <p>Bit 63 (the bit that is selected by the mask
     * {@code 0x8000000000000000L}) represents the sign of the
     * floating-point number. Bits
     * 62-52 (the bits that are selected by the mask
     * {@code 0x7ff0000000000000L}) represent the exponent. Bits 51-0
     * (the bits that are selected by the mask
     * {@code 0x000fffffffffffffL}) represent the significand
     * (sometimes called the mantissa) of the floating-point number.
     *
     * <p>If the argument is positive infinity, the result is
     * {@code 0x7ff0000000000000L}.
     *
     * <p>If the argument is negative infinity, the result is
     * {@code 0xfff0000000000000L}.
     *
     * <p>If the argument is NaN, the result is the {@code long}
     * integer representing the actual NaN value.  Unlike the
     * {@code doubleToLongBits} method,
     * {@code doubleToRawLongBits} does not collapse all the bit
     * patterns encoding a NaN to a single 'canonical' NaN
     * value.
     *
     * <p>In all cases, the result is a {@code long} integer that,
     * when given to the {@link #longBitsToDouble(long)} method, will
     * produce a floating-point value the same as the argument to
     * {@code doubleToRawLongBits}.
     *
     * @param   value   a {@code double} precision floating-point number.
     * @return the bits that represent the floating-point number.
     * @since 1.3
     */
    "
      | f b |
    f := aJavaContext argAt:1.
    (f =  0.0) ifTrue:[^0].
    (f = -0.0) ifTrue:[^(1 bitShift: 63)].

    b := ByteArray streamContents:[:s|Float storeBinaryIEEEDouble:f on:s].
    ^ LargeInteger digitBytes: b MSB: UninterpretedBytes isBigEndian not.


"/    | f |
"/    f := aJavaContext argAt:1.
"/    f class == Float ifFalse:[ ^self throwIllegalArgumentException: 'Not a float'].
"/%{
"/    __int64__ *i = &(__floatVal(f));
"/    RETURN (__MKINT64( i ));
"/%}.
"/    self primitiveFailed.

    "Created: / 10-11-2010 / 14:48:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-12-2012 / 23:23:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Double_longBitsToDouble: nativeContext

    <javanative: 'java/lang/Double' name: 'longBitsToDouble'>

    |i aFloat|

    i := nativeContext argAt:1.

    aFloat := Float new.
    UninterpretedBytes isBigEndian ifTrue:[
        aFloat basicAt:1 put:((i bitShift:-56) bitAnd:16rFF).
        aFloat basicAt:2 put:((i bitShift:-48) bitAnd:16rFF).
        aFloat basicAt:3 put:((i bitShift:-40) bitAnd:16rFF).
        aFloat basicAt:4 put:((i bitShift:-32) bitAnd:16rFF).
        aFloat basicAt:5 put:((i bitShift:-24) bitAnd:16rFF).
        aFloat basicAt:6 put:((i bitShift:-16) bitAnd:16rFF).
        aFloat basicAt:7 put:((i bitShift:-8) bitAnd:16rFF).
        aFloat basicAt:8 put:(i bitAnd:16rFF).
    ] ifFalse:[
        aFloat basicAt:1 put:(i bitAnd:16rFF).
        aFloat basicAt:2 put:((i bitShift:-8) bitAnd:16rFF).
        aFloat basicAt:3 put:((i bitShift:-16) bitAnd:16rFF).
        aFloat basicAt:4 put:((i bitShift:-24) bitAnd:16rFF).
        aFloat basicAt:5 put:((i bitShift:-32) bitAnd:16rFF).
        aFloat basicAt:6 put:((i bitShift:-40) bitAnd:16rFF).
        aFloat basicAt:7 put:((i bitShift:-48) bitAnd:16rFF).
        aFloat basicAt:8 put:((i bitShift:-56) bitAnd:16rFF).
    ].

    ^ aFloat.


"/    | i f|
"/
"/    i := nativeContext argAt:1.
"/    f := Float new.
"/%{
"/    long long l;
"/    l = __longIntVal(i);
"/    double *d = &l;
"/    __floatVal(f) = *d;
"/%}.
"/    ^f

    "Modified: / 16-12-2012 / 23:24:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Float_floatToRawIntBits: aJavaContext

    <javanative: 'java/lang/Float' name: 'floatToRawIntBits'>

        "
    /**
     * Returns a representation of the specified floating-point value
     * according to the IEEE 754 floating-point 'single format' bit
     * layout, preserving Not-a-Number (NaN) values.
     *
     * <p>Bit 31 (the bit that is selected by the mask
     * {@code 0x80000000}) represents the sign of the floating-point
     * number.
     * Bits 30-23 (the bits that are selected by the mask
     * {@code 0x7f800000}) represent the exponent.
     * Bits 22-0 (the bits that are selected by the mask
     * {@code 0x007fffff}) represent the significand (sometimes called
     * the mantissa) of the floating-point number.
     *
     * <p>If the argument is positive infinity, the result is
     * {@code 0x7f800000}.
     *
     * <p>If the argument is negative infinity, the result is
     * {@code 0xff800000}.
     *
     * <p>If the argument is NaN, the result is the integer representing
     * the actual NaN value.  Unlike the {@code floatToIntBits}
     * method, {@code floatToRawIntBits} does not collapse all the
     * bit patterns encoding a NaN to a single 'canonical'
     * NaN value.
     *
     * <p>In all cases, the result is an integer that, when given to the
     * {@link #intBitsToFloat(int)} method, will produce a
     * floating-point value the same as the argument to
     * {@code floatToRawIntBits}.
     *
     * @param   value   a floating-point number.
     * @return the bits that represent the floating-point number.
     * @since 1.3
     */
    "
    | f b |
    f := aJavaContext argAt:1.
    f class == ShortFloat ifFalse:[ self throwIllegalArgumentException: 'Not a float'].
%{
        int *ival = &__shortFloatVal(f);
        RETURN (__MKINT(*ival));
%}.
    self primitiveFailed.

    "Created: / 09-11-2010 / 20:59:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-12-2012 / 11:16:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Float_intBitsToFloat: nativeContext

    <javanative: 'java/lang/Float' name: 'intBitsToFloat(I)F'>

    | i f|

    i := nativeContext argAt:1.
    f := ShortFloat new.
%{
    int ival = __intVal(i);
    float *fval = &ival;
    __shortFloatVal(f) = *fval;
%}.
    ^f

    "Modified: / 16-12-2012 / 10:39:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Object_clone: nativeContext

    <javanative: 'java/lang/Object' name: 'clone'>

        "clone an object"

    |o rslt|

    o := nativeContext receiver.
    rslt := o shallowCopy.
    ^ rslt

    "Created: / 4.1.1998 / 19:39:26 / cg"
!

_java_lang_Object_getClass: nativeContext
    <javanative: 'java/lang/Object' name: 'getClass'>
    "return an objects class"

    | o  cls  jClass |

    o := nativeContext receiver.
    cls := o class.
    jClass := self javaClassObjectForClass: cls.
    ^ jClass

    "Created: / 6.1.1998 / 18:28:27 / cg"
    "Modified: / 23.1.1998 / 17:48:22 / cg"
!

_java_lang_Object_hashCode: nativeContext

    <javanative: 'java/lang/Object' name: 'hashCode'>

        "identityHash"

    |o rslt|

    o := nativeContext receiver.
    rslt := o identityHash.
    ^ rslt

    "Created: / 4.1.1998 / 19:40:26 / cg"
!

_java_lang_Object_notify: nativeContext
    <javanative: 'java/lang/Object' name: 'notify'>
    "wakeup"

    self notify: (nativeContext receiver).

    "Created: / 06-01-1998 / 21:09:26 / cg"
    "Modified: / 22-11-2011 / 13:24:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Object_notifyAll: nativeContext
    <javanative: 'java/lang/Object' name: 'notifyAll'>
    self notifyAll: (nativeContext receiver).

    "Created: / 03-01-1998 / 03:06:56 / cg"
    "Modified: / 22-11-2011 / 13:27:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Object_registerNatives: aJavaContext

    <javanative: 'java/lang/Object' name: 'registerNatives'>


    "Nothing to do, native method are bound lazily"

    "Created: / 19-10-2010 / 12:42:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 20-10-2010 / 10:57:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Object_wait: nativeContext
    <javanative: 'java/lang/Object' name: 'wait'>
    | tmo  handle |
    handle := nativeContext receiver.
    tmo := nativeContext argAt: 1.
    tmo < 0 ifTrue:[
        self throwIllegalArgumentException: '1'
    ].
    self
        waitOn: handle forTimeout: tmo
        state: #javaWait.

    "Modified: / 30-12-1998 / 19:20:43 / cg"
    "Modified: / 22-11-2011 / 13:17:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 19-09-2012 / 16:19:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Package_getSystemPackage0: nativeContext

    <javanative: 'java/lang/Package' name: 'getSystemPackage0'>

    "Based on code on OpenJDK, it is ok to return nil here:"

    | syspkg syspkg_s |
    syspkg := nativeContext argAt: 1.
    syspkg isNil ifTrue:[ ^ nil ].
    syspkg_s := Java as_ST_String: syspkg.
    ^(ClassRegistry systemPackage: syspkg_s) notNil ifTrue:[
        syspkg
    ] ifFalse:[
        nil
    ].

    "Modified: / 16-08-2012 / 17:45:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ProcessEnvironment_environ: nativeContext

    <javanative: 'java/lang/ProcessEnvironment' name: 'environ'>

    | env jenv i|
    env := OperatingSystem getEnvironment.
    jenv :=  ByteArray javaArrayClass new: env size * 2.
    i := 1.
    env keysAndValuesDo:
        [:name :value|
        jenv
            at: i   put: name  asByteArray;
            at: i+1 put: value asByteArray.
        i := i + 2].
    ^jenv

    "Modified: / 25-06-2011 / 08:57:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_ProcessEnvironment_environmentBlock: nativeContext

    <javanative: 'java/lang/ProcessEnvironment' name: 'environmentBlock()Ljava/lang/String;'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_lang_Runtime_availableProcessors: nativeContext

    <javanative: 'java/lang/Runtime' name: 'availableProcessors()I'>
    "
    /**
     * Returns the number of processors available to the Java virtual machine.
     *
     * <p> This value may change during a particular invocation of the virtual
     * machine.  Applications that are sensitive to the number of available
     * processors should therefore occasionally poll this property and adjust
     * their resource usage appropriately. </p>
     *
     * @return  the maximum number of processors available to the virtual
     *          machine; never smaller than one
     * @since 1.4
     */
    "

    ^ 1 "/ Since Smalltalk/X is single-thread application

    "Modified: / 03-09-2012 / 18:53:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Runtime_freeMemory: nativeContext

    <javanative: 'java/lang/Runtime' name: 'freeMemory()J'>

        "free memory - Returns the number of free bytes"

    ^ ObjectMemory freeListSpace + ObjectMemory freeSpace

    "Created: / 12.1.1998 / 12:59:53 / cg"
!

_java_lang_Runtime_gc: nativeContext

    <javanative: 'java/lang/Runtime' name: 'gc'>

        "Runs the garbage collector.
     Ignored, since the ST-gc runs all the time."

    ^ self

    "Modified: / 12.1.1998 / 12:58:32 / cg"
!

_java_lang_Runtime_runFinalization0: nativeContext

    <javanative: 'java/lang/Runtime' name: 'runFinalization0'>

    Smalltalk garbageCollect

    "Modified: / 08-08-2011 / 17:48:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_SecurityManager_getClassContext: nativeContext

    <javanative: 'java/lang/SecurityManager' name: 'getClassContext'>
    "
    /**
     * Returns the current execution stack as an array of classes.
     * <p>
     * The length of the array is the number of methods on the execution
     * stack. The element at index <code>0</code> is the class of the
     * currently executing method, the element at index <code>1</code> is
     * the class of that method's caller, and so on.
     *
     * @return  the execution stack.
     */

    "

    | classes ctx jclasses |
    classes := OrderedCollection new.
    ctx := thisContext.
    [ ctx notNil ] whileTrue: [
        ctx isJavaContext ifTrue:[
            classes add: ctx method javaClass.
        ].
        ctx := ctx sender.
    ].

    jclasses := (self classForName:'java.lang.Class') javaArrayClass new: classes size.
    1 to: classes size do:[:i|
        jclasses at: i put: (self reflection javaClassObjectForClass: (classes at: i)).
    ].
    ^jclasses

    "Created: / 12-11-1998 / 18:56:06 / cg"
    "Modified: / 15-11-2011 / 00:27:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Shutdown_halt0: nativeContext

    <javanative: 'java/lang/Shutdown' name: 'halt0'>

    AbortOperationRequest raise

    "Modified: / 06-07-2012 / 13:13:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_cbrt: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'cbrt'>

    ^ JavaMathSupport cbrt: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:34:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_ceil: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'ceil(D)D'>

    ^ (nativeContext argAt:1) ceiling

    "Modified: / 21-08-2012 / 18:01:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_cos: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'cos'>

    ^ JavaMathSupport cos: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:34:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_cosh: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'cosh'>

    "
    /**
     * Returns the hyperbolic cosine of a {@code double} value.
     * The hyperbolic cosine of <i>x</i> is defined to be
     * (<i>e<sup>x</sup>&nbsp;+&nbsp;e<sup>-x</sup></i>)/2
     * where <i>e</i> is {@linkplain Math#E Euler's number}.
     *
     * <p>Special cases:
     * <ul>
     *
     * <li>If the argument is NaN, then the result is NaN.
     *
     * <li>If the argument is infinite, then the result is positive
     * infinity.
     *
     * <li>If the argument is zero, then the result is {@code 1.0}.
     *
     * </ul>
     *
     * @param   x The number whose hyperbolic cosine is to be returned.
     * @return  The hyperbolic cosine of {@code x}.
     * @since 1.5
     */
    public static native double cosh(double x);
    "

    ^JavaMathSupport cosh: (nativeContext argAt:1)

    "Modified: / 06-09-2011 / 19:25:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_expm1: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'expm1'>

    ^ JavaMathSupport expm1: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:34:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_floor: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'floor'>

   ^ JavaMathSupport floor: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:33:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_pow: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'pow(DD)D'>

    ^JavaMathSupport pow: (nativeContext argAt:1) to: (nativeContext argAt:3)

    "Modified: / 07-09-2011 / 17:33:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_sin: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'cos'>

    ^ JavaMathSupport sin: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:32:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_sinh: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'sinh'>

    "
    /**
     * Returns the hyperbolic sine of a {@code double} value.
     * The hyperbolic sine of <i>x</i> is defined to be
     * (<i>e<sup>x</sup>&nbsp;-&nbsp;e<sup>-x</sup></i>)/2
     * where <i>e</i> is {@linkplain Math#E Euler's number}.
     *
     * <p>Special cases:
     * <ul>
     *
     * <li>If the argument is NaN, then the result is NaN.
     *
     * <li>If the argument is infinite, then the result is an infinity
     * with the same sign as the argument.
     *
     * <li>If the argument is zero, then the result is a zero with the
     * same sign as the argument.
     *
     * </ul>
     *
     * @param   x The number whose hyperbolic sine is to be returned.
     * @return  The hyperbolic sine of {@code x}.
     * @since 1.5
     */
    public static native double sinh(double x);

    "

    ^ JavaMathSupport sinh: (nativeContext argAt:1)

    "Modified: / 06-09-2011 / 19:36:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 07-09-2011 / 17:31:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_sqrt: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'sqrt(D)D'>

    ^(nativeContext argAt:1) sqrt

    "Modified: / 17-07-2012 / 20:53:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_StrictMath_tan: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'tan(D)D'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_lang_StrictMath_tanh: nativeContext

    <javanative: 'java/lang/StrictMath' name: 'tanh'>
    "
    /**
     * Returns the hyperbolic tangent of a {@code double} value.
     * The hyperbolic tangent of <i>x</i> is defined to be
     * (<i>e<sup>x</sup>&nbsp;-&nbsp;e<sup>-x</sup></i>)/(<i>e<sup>x</sup>&nbsp;+&nbsp;e<sup>-x</sup></i>),
     * in other words, {@linkplain Math#sinh
     * sinh(<i>x</i>)}/{@linkplain Math#cosh cosh(<i>x</i>)}.  Note
     * that the absolute value of the exact tanh is always less than
     * 1.
     *
     * <p>Special cases:
     * <ul>
     *
     * <li>If the argument is NaN, then the result is NaN.
     *
     * <li>If the argument is zero, then the result is a zero with the
     * same sign as the argument.
     *
     * <li>If the argument is positive infinity, then the result is
     * {@code +1.0}.
     *
     * <li>If the argument is negative infinity, then the result is
     * {@code -1.0}.
     *
     * </ul>
     *
     * @param   x The number whose hyperbolic tangent is to be returned.
     * @return  The hyperbolic tangent of {@code x}.
     * @since 1.5
     */
    public static native double tanh(double x);
    "

    ^ JavaMathSupport tanh: (nativeContext argAt:1)

    "Modified: / 07-09-2011 / 17:32:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_String_intern: nativeContext

    <javanative: 'java/lang/String' name: 'intern'>

        |jString|

    jString := nativeContext receiver.
    ^ Java intern:jString
!

_java_lang_System_arraycopy: nativeContext

    <javanative: 'java/lang/System' name: 'arraycopy'>

    |srcArray srcIdx dstArray dstIdx srcArrayCC dstArrayCC count dstEndIdx|

    srcArray := nativeContext argAt:1.
    srcArray isNil ifTrue:[
        ^ self throwNullPointerException
    ].
    srcArray isJavaArray ifFalse:[
        ^ self throwArrayStoreException:srcArray
    ].
    srcIdx := nativeContext argAt:2.
    dstArray := nativeContext argAt:3.
    dstArray isNil ifTrue:[
        ^ self throwNullPointerException
    ].
    dstArray isJavaArray ifFalse:[
        ^ self throwArrayStoreException:dstArray
    ].

    srcArrayCC := srcArray class javaComponentClass.
    dstArrayCC := dstArray class javaComponentClass.

    srcArrayCC isJavaPrimitiveType == dstArrayCC isJavaPrimitiveType
        ifTrue:
            [srcArrayCC isJavaPrimitiveType
                ifTrue:
                    [srcArrayCC ~~ dstArrayCC ifTrue:
                        [^ self throwArrayStoreException:dstArray]].
            ]
        ifFalse:
            [^ self throwArrayStoreException:dstArray].

    dstIdx := nativeContext argAt:4.
    count := nativeContext argAt:5.

    count < 0 ifTrue:[
        ^ self throwArrayIndexOutOfBoundsException:(srcIdx + count - 1)
    ].

    ((srcIdx < 0) or:[srcIdx + count > srcArray size]) ifTrue:[
        srcArray size == 0 ifTrue:[
            srcArray isVariable ifFalse:[
                ^ self throwArrayStoreException:srcArray
            ]
        ].
        ^ self throwArrayIndexOutOfBoundsException:(srcIdx + count - 1)
    ].
    ((dstIdx < 0) or:[dstIdx + count > dstArray size]) ifTrue:[
        dstArray size == 0 ifTrue:[
            dstArray isVariable ifFalse:[
                ^ self throwArrayStoreException:dstArray
            ]
        ].
        ^ self throwArrayIndexOutOfBoundsException:(dstIdx + count - 1)
    ].

    dstEndIdx := dstIdx + count.
    dstIdx := dstIdx + 1.       "/ ST uses 1-based indexing
    srcIdx := srcIdx + 1.       "/ ST uses 1-based indexing



    (srcArray class isBytes and:[dstArray class isBytes]) ifTrue:[
        dstArray replaceBytesFrom:dstIdx to:dstEndIdx with:srcArray startingAt:srcIdx.
    ] ifFalse:[
        dstArrayCC isJavaPrimitiveType ifFalse:[
            "Copy from array iff src=dst to avoid overwriting a data when copying"
            srcArray == dstArray ifTrue:[srcArray := srcArray copy].
            1 to: count do:[:i|
                | obj |

                obj := srcArray at:srcIdx + i - 1.

                (obj notNil and:[(self canCast: obj class to: dstArrayCC) not]) ifTrue:[
                    ^ self throwArrayStoreException:dstArray
                ].
                dstArray at: dstIdx + i - 1 put: (srcArray at:srcIdx + i - 1)
            ]
        ] ifTrue:[
            dstArray replaceFrom:dstIdx to:dstEndIdx with:srcArray startingAt:srcIdx.
        ]
    ].
    ^ nil.

    "Modified: / 08-09-2011 / 15:25:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_System_currentTimeMillis: nativeContext

    <javanative: 'java/lang/System' name: 'currentTimeMillis'>

    "return the milliseconds since 1.jan.1970"

    "Should be OK, see Timestamp>>getMilliseconds & Timestamp>>getSeconds & Timestamp>>utcSecondsSince1970"
    ^ Timestamp now getMilliseconds

    "
     JavaVM _System_currentTimeMillis:nil
    "

    "Modified: / 23-12-1998 / 21:54:50 / cg"
    "Modified: / 19-07-2012 / 11:44:56 / jv"
!

_java_lang_System_identityHashCode: nativeContext

    <javanative: 'java/lang/System' name: 'identityHashCode'>

        |obj|

    obj := nativeContext argAt:1.
    ^ obj identityHash

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:54:00 / cg"
!

_java_lang_System_initProperties: nativeContext

    <javanative: 'java/lang/System' name: 'initProperties'>

        |props stProps|

    props := nativeContext argAt:1.
    stProps := self systemProperties.

    "/ recursively invoke myself on the Java HashTable.
    "/ calling 'put' to stuff in the values ...

    stProps keysAndValuesDo:[:key :value |
	|keyObj valueObj|

	keyObj := Java as_String:key.
	valueObj := Java as_String:value.

	props
	    perform:#'put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;'
	    with:keyObj
	    with:valueObj.
    ].
    ^ props

    "Created: / 3.1.1998 / 14:25:22 / cg"
    "Modified: / 4.1.1998 / 14:23:18 / cg"
!

_java_lang_System_mapLibraryName: aJavaContext

    <javanative: 'java/lang/System' name: 'mapLibraryName'>


    | name |
    name := Java as_ST_String: (aJavaContext argAt: 1).

    OperatingSystem isUNIXlike ifTrue:[
        ^Java as_String: ('lib' , name , '.so').
    ].

    OperatingSystem isMSWINDOWSlike ifTrue:[
        ^Java as_String: ( name , '.dll').
    ].

    self error:'Unknown/Unsupported platform'

    "Created: / 09-12-2010 / 18:16:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-04-2011 / 18:14:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_System_nanoTime: nativeContext

    <javanative: 'java/lang/System' name: 'nanoTime'>

    ^ OperatingSystem getMicrosecondTime * 1000

    "Modified: / 07-08-2011 / 21:47:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_System_registerNatives: aJavaContext

    <javanative: 'java/lang/System' name: 'registerNatives'>


    "Nothing to do, native method are bound lazily"

    "Created: / 20-10-2010 / 10:56:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_System_setErr0: nativeContext

    <javanative: 'java/lang/System' name: 'setErr0'>

        |stream|

    stream := nativeContext argAt:1.

    self setOpenFile:(self javaConsoleStream ? Stderr) at:2.

    nativeContext receiver instVarNamed:'err' put:stream.

    "Created: / 18.3.1997 / 15:02:05 / cg"
    "Modified: / 4.1.1998 / 16:21:15 / cg"
!

_java_lang_System_setIn0: nativeContext

    <javanative: 'java/lang/System' name: 'setIn0'>

        |stream|

    stream := nativeContext argAt:1.

    self setOpenFile:Stdin at:0.

    nativeContext receiver instVarNamed:'in' put:stream.

    "Created: / 4.1.1998 / 16:16:38 / cg"
    "Modified: / 4.1.1998 / 16:20:44 / cg"
!

_java_lang_System_setOut0: nativeContext

    <javanative: 'java/lang/System' name: 'setOut0'>

        |stream|

    stream := nativeContext argAt:1.

    self setOpenFile:(self javaConsoleStream ? Stdout) at:1.

    nativeContext receiver instVarNamed:'out' put:stream.

    "Created: / 4.1.1998 / 16:18:26 / cg"
    "Modified: / 4.1.1998 / 16:20:23 / cg"
!

_java_lang_Thread_currentThread: nativeContext
    <javanative: 'java/lang/Thread' name: 'currentThread'>
    | t  p |
    p := Processor activeProcess.
    t := self javaThreadForSTProcess: p.
    nativeContext sender receiver class name
        = 'java/util/concurrent/locks/ReentrantLock$NonfairSync'
            ifTrue: [
                | owner |
                owner := (nativeContext sender receiver
                            perform: #'getExclusiveOwnerThread()Ljava/lang/Thread;').
                (owner notNil and: [ owner ~= t ]) ifTrue: [ self breakPoint: #mh. ]
            ].
    t notNil ifTrue: [ ^ t ].
    t := self newThread: p name.
    t instVarNamed: 'tid' put: p id.
    Java addThread: t for: p.
    ^ t

    "Modified: / 04-12-2011 / 20:11:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-12-2011 / 12:52:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Thread_holdsLock: aJavaContext
    <javanative: 'java/lang/Thread' name: 'holdsLock'>
    | obj  mon  thisProcess |
    obj := aJavaContext argAt: 1.
    obj isNil ifTrue: [self throwNullPointerException:'null given to _java_lang_Thread_holdsLock'].
    mon := obj getJavaMonitor.
    thisProcess := Processor activeProcess.
    (mon isOwnedBy: thisProcess) ifTrue: [ ^ 1 ] ifFalse: [ ^ 0 ].

    "Created: / 30-04-2011 / 22:06:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-12-2011 / 11:13:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 11:36:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Thread_interrupt0: nativeContext
    <javanative: 'java/lang/Thread' name: 'interrupt0()V'>
    | jThread  stProcess |
    jThread := nativeContext receiver.
    stProcess := self stProcessForJavaThread: jThread.
    self assert: stProcess notNil.
    stProcess javaInterrupt.

    "Modified: / 02-01-1998 / 21:49:06 / cg"
    "Created: / 10-04-1998 / 15:21:43 / cg"
    "Modified: / 30-11-2011 / 13:36:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Thread_isAlive: nativeContext

    <javanative: 'java/lang/Thread' name: 'isAlive'>

        "is it alive ?"

    |jThread stProcess|

    jThread := nativeContext receiver.
    stProcess := JavaVM stProcessForJavaThread:jThread.
    stProcess isNil ifTrue:[
	ThreadTrace == true ifTrue:[
	    ('JAVA: no stProcess for javaThread: ' , jThread displayString) printNL.
	].
	^ 0 "FALSE"
    ].
    stProcess isDead ifTrue:[^ 0 "FALSE"].
    ^ 1 "TRUE"

    "Created: / 5.1.1998 / 02:03:51 / cg"
    "Modified: / 6.2.1998 / 02:15:01 / cg"
!

_java_lang_Thread_isInterrupted: nativeContext
    <javanative: 'java/lang/Thread' name: 'isInterrupted'>
    "ask if a thread is interrupted (clear interruptState if arg is true)"

    | jThread  stProcess  clearInterrupt  wasInterrupted |
    jThread := nativeContext receiver.
    stProcess := self stProcessForJavaThread: jThread.
    self assert: stProcess notNil.
    clearInterrupt := nativeContext argAt: 1.
    wasInterrupted := stProcess isInterrupted.
    clearInterrupt ~~ 0 ifTrue: [ stProcess clearInterrupted ].
    stProcess isDead ifTrue: [ ^ 0 ].
    wasInterrupted ifTrue: [ ^ 1 ] ifFalse: [ ^ 0 ].

    "Modified: / 02-01-1998 / 21:49:06 / cg"
    "Created: / 07-01-1998 / 18:50:26 / cg"
    "Modified: / 05-08-2011 / 22:21:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 30-11-2011 / 12:22:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Thread_registerNatives: aJavaContext

    <javanative: 'java/lang/Thread' name: 'registerNatives'>


    "Nothing to do, native method are bound lazily"

    "Created: / 20-10-2010 / 11:12:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Thread_resume0: nativeContext

    <javanative: 'java/lang/Thread' name: 'resume0()V'>

        "yield"

    |jThread stProcess|

    jThread := nativeContext receiver.
    stProcess := JavaVM stProcessForJavaThread:jThread.
    stProcess isNil ifTrue:[
	ThreadTrace == true ifTrue:[
	    ('JAVA: no stProcess for javaThread: ' , jThread displayString) printNL.
	].
	^ nil "void"
    ].
    stProcess resume

    "Created: / 8.1.1998 / 01:06:27 / cg"
    "Modified: / 6.2.1998 / 02:15:08 / cg"
!

_java_lang_Thread_setPriority0: nativeContext

    <javanative: 'java/lang/Thread' name: 'setPriority0'>

   |t p prio|

    t := nativeContext receiver.
    p := JavaVM stProcessForJavaThread:t.
    prio := nativeContext argAt:1.

    p isNil ifTrue:[
        ThreadTrace == true ifTrue:[
            'JAVA [info]: no process yet (in setPriority)' infoPrintCR.
        ].
        ^ nil
    ].

    "Modified: / 01-05-2011 / 13:25:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Thread_sleep: nativeContext
    <javanative: 'java/lang/Thread' name: 'sleep'>
    "sleep for some milliseconds "

    | millis |
    millis := nativeContext argAt: 1.
    millis < 0 ifTrue: [
        self throwIllegalArgumentException: ('negative timeout: %1 in Thread.sleep' bindWith: millis)
    ].
    Logger
        log: ('%1 going to sleep for %2'
                bindWith: Processor activeProcess printString
                with: millis)
        severity: #debug
        facility: #JVM.
    self sleepForTimeout: millis state: #sleep.

    "Modified: / 08-01-1999 / 16:42:52 / cg"
    "Modified: / 30-11-2011 / 13:58:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Thread_start0: nativeContext

    <javanative: 'java/lang/Thread' name: 'start0'>


    ^self threadStart: nativeContext

    "Modified: / 24-12-1999 / 03:14:33 / cg"
    "Created: / 22-11-2010 / 17:48:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 14-12-2010 / 21:31:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Thread_stop0: nativeContext

    <javanative: 'java/lang/Thread' name: 'stop0(Ljava/lang/Object;)V'>

        "terminate a thread"

    | jThread  stProcess  death |
    jThread := nativeContext receiver.
    stProcess := JavaVM stProcessForJavaThread: jThread.
    stProcess isNil ifTrue: [
        ThreadTrace == true ifTrue: [
            ('JAVA: no stProcess for javaThread: ' , jThread displayString) printNL.
        ].
        ^ nil "void"
    ].
    stProcess == JavaScreenUpdaterThread ifTrue: [ self halt ].
    stProcess == JavaEventQueueThread ifTrue: [ self halt ].
    death := nativeContext argAt: 1.
    stProcess
        interruptWith: [
            JavaVM javaExceptionSignal
                handle: [
                    :ex |
                    Processor activeProcess == JavaScreenUpdaterThread ifTrue: [ self halt ].
                    Processor activeProcess == JavaEventQueueThread ifTrue: [ self halt ].
                    Processor activeProcess terminate
                ]
                do: [
                    ThreadTrace == true ifTrue: [
                        ('JAVA: thread exit: ' , jThread displayString) infoPrintNL.
                    ].

                    jThread perform: #'exit()V'.

                    self throwException: death.
                ]
        ].

    "Created: / 08-01-1998 / 13:11:17 / cg"
    "Modified: / 24-12-1999 / 02:32:45 / cg"
    "Modified: / 01-12-2011 / 18:26:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_lang_Thread_yield: nativeContext

    <javanative: 'java/lang/Thread' name: 'yield()V'>

        "yield"

    |jThread stProcess|

    Processor yield.
"/    jThread := nativeContext receiver.
"/    stProcess := JavaVM stProcessForJavaThread:jThread.
"/    stProcess isNil ifTrue:[
"/        ThreadTrace == true ifTrue:[
"/            ('JAVA: no stProcess for javaThread: ' , jThread displayString) printNL.
"/        ].
"/        ^ nil "void"
"/    ].
"/    stProcess == Processor activeProcess ifTrue:[
"/        Processor yield.
"/    ] ifFalse:[
"/        self halt.
"/    ].

    "Created: / 5.1.1998 / 02:03:51 / cg"
    "Modified: / 23.12.1998 / 19:19:17 / cg"
!

_java_lang_Throwable_fillInStackTrace: nativeContext
    <javanative: 'java/lang/Throwable' name: 'fillInStackTrace'>
    | java_lang_Throwable  exceptionObject  list  con |

    java_lang_Throwable := Java classNamed: 'java/lang/Throwable'.
    exceptionObject := nativeContext receiver.

    "/
    "/ debugging only
    "/

    (java_lang_Throwable notNil and:[(exceptionObject isKindOf: java_lang_Throwable) not]) ifTrue: [
        self error:'Thrown object is not a java.lang.Throwable'.
    ].
    con := thisContext sender.

    "/
    "/ we are not interrested in all intermediate Exception frames ...
    "/

    FullExceptionTrace ifFalse: [
        "/ first, skip any JavaVM contexts
        [ con receiver == exceptionObject ] whileFalse: [ con := con sender ].

        "/ then, all exception-init contexts

        [ con receiver == exceptionObject ] whileTrue: [ con := con sender ].
    ].
    list := OrderedCollection new.
    [ con notNil ] whileTrue: [
        (con isJavaContext) ifTrue: [
            "/ add a copy, in case the context continues with some
            "/ cleanup ...
            list add: con shallowCopy
        ].
        con := con sender
    ].
    exceptionObject instVarNamed: 'backtrace' put: (list asArray).
    ^ nil.

    "Created: / 04-01-1998 / 14:27:40 / cg"
    "Modified: / 08-05-1998 / 21:29:53 / cg"
    "Modified: / 21-10-2011 / 13:41:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 28-10-2011 / 22:15:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Throwable_getStackTraceDepth: nativeContext

    <javanative: 'java/lang/Throwable' name: 'getStackTraceDepth'>


    ^(nativeContext receiver instVarNamed: #backtrace) size

    "Modified: / 01-05-2011 / 20:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_Throwable_getStackTraceElement: nativeContext

    <javanative: 'java/lang/Throwable' name: 'getStackTraceElement'>

    | throwable index ctx stackTraceElement |
    throwable := nativeContext receiver.
    index :=  nativeContext argAt: 1.
    ctx := (throwable instVarNamed:#backtrace) at: index + 1.

    stackTraceElement := (self classForName: 'java.lang.StackTraceElement') new.

    stackTraceElement
        instVarNamed: #declaringClass
        put: (Java as_String:(ctx method javaClass javaName));

        instVarNamed: #methodName
        put: (Java as_String:"(ctx method printStringForBrowserWithSelector:ctx method selector inClass: ctx method javaClass) asString"ctx method selector);

        instVarNamed: #lineNumber
        put: ctx lineNumber.

    ctx method javaClass sourceFile notNil ifTrue:[
        stackTraceElement
            instVarNamed: #fileName
            put: (Java as_String:(ctx method javaClass sourceFile))
    ].
    ^ stackTraceElement

    "Modified: / 02-12-2011 / 23:36:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_UNIXProcess_forkAndExec: nativeContext

    <javanative: 'java/lang/UNIXProcess' name: 'forkAndExec'>

    "^ UnimplementedNativeMethodSignal raise"
!

_java_lang_UNIXProcess_initIDs: nativeContext

    <javanative: 'java/lang/UNIXProcess' name: 'initIDs'>

    "Nothing to do"

    "Modified: / 25-06-2011 / 10:05:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_UNIXProcess_waitForProcessExit: nativeContext

    <javanative: 'java/lang/UNIXProcess' name: 'waitForProcessExit(I)I'>

    "^ UnimplementedNativeMethodSignal raise"

! !

!JavaVM class methodsFor:'native - java.lang.ref'!

_java_lang_ref_Finalizer_invokeFinalizeMethod: nativeContext

    <javanative: 'java/lang/ref/Finalizer' name: 'invokeFinalizeMethod(Ljava/lang/Object;)V'>

    | o |

    o := nativeContext argAt:1.

    Logger log: 'Finalizing ' , o printString  severity: #debug facility: 'JVM' .
    o perform:#'finalize()V'

    "Modified: / 24-07-2012 / 11:11:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.lang.reflect'!

_java_lang_reflect_Array_getLength: nativeContext

    <javanative: 'java/lang/reflect/Array' name: 'getLength(Ljava/lang/Object;)I'>

    ^(nativeContext argAt: 1) size

    "Modified: / 17-08-2011 / 09:02:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_reflect_Array_multiNewArray: nativeContext

    <javanative: 'java/lang/reflect/Array' name: 'multiNewArray(Ljava/lang/Class;[I)Ljava/lang/Object;'>

    |componentClass sizes cls array |

    (nativeContext argAt:1) isNil ifTrue:[
        self throwNullPointerException.
        ^nil.
    ].
    (nativeContext argAt:2) isNil ifTrue:[
        self throwNullPointerException.
        ^nil.
    ].

    componentClass := self reflection
                classForJavaClassObject:(nativeContext argAt:1).
    componentClass == UndefinedObject ifTrue:[
        self throwIllegalArgumentException:'invalid class: void'.
        ^nil
    ].
    sizes := nativeContext argAt:2.
    sizes class == SignedIntegerArray ifFalse:[
        self throwIllegalArgumentException:('sizes arguments not instance of int[] (is: %1)' bindWith: sizes class).
        ^nil
    ].
    sizes size == 0 ifTrue:[
        self throwIllegalArgumentException:('sizes argument has no elements').
        ^nil
    ].
    array := nil.
    cls := componentClass.
    sizes do:[:size|
        | newArray |
        size > SmallInteger maxVal ifTrue:[
            "This is just for Mauve tests"
            self throwExceptionClassName:'java.lang.OutOfMemoryError'
                             withMessage:'array size too big'.
            ^nil.
        ].
        size <  0 ifTrue:[
            self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                             withMessage:'negative array size not allowed'.
            ^nil
        ].
        cls := cls javaArrayClass.
        newArray := cls new: size.
        1 to: size do:[:i|
            newArray at:i put: array copy.
        ].
        array := newArray.
    ].
    ^array.

    "Modified: / 22-11-2011 / 10:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_reflect_Array_newArray:aJavaContext
    <javanative: 'java/lang/reflect/Array' name: 'newArray'>
    |componentClass size|

    (aJavaContext argAt:1) isNil ifTrue:[
        self throwNullPointerException.
        ^nil.
    ].
    componentClass := self reflection
                classForJavaClassObject:(aJavaContext argAt:1).
    componentClass == UndefinedObject ifTrue:[
        self throwIllegalArgumentException:'invalid class: void'.
        ^nil
    ].
    size := aJavaContext argAt:2.
    size < 0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    ^ componentClass javaArrayClass new:size

    "Created: / 17-12-2010 / 14:49:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:18:50 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 04-06-2011 / 17:06:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 22-11-2011 / 09:13:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_reflect_Array_set: nativeContext

    <javanative: 'java/lang/reflect/Array' name: 'set'>

    | array index value |
    array :=  nativeContext at:1.
    index := (nativeContext at:2) + 1.
    value :=  nativeContext at:3.

    array isJavaArray ifFalse:[
        self throwIllegalArgumentException:'passed object is not an array'.
        ^nil.
    ].
    index < 1 ifTrue:[
        self throwIllegalArgumentException:'index is negative'.
        ^nil.
    ].
    index > array size ifTrue:[
        self throwArrayIndexOutOfBoundsException: index.
        ^nil.
    ].
    value isNil ifTrue:[
        array at: index put: nil.
        ^nil
    ].
    (self canCast: value class to: array class javaComponentClass) ifFalse:[
        self throwIllegalArgumentException:'type-incompatible value'.
        ^nil.
    ].
    array at: index put: value.

    "Modified: / 22-11-2011 / 11:06:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_lang_reflect_Proxy_defineClass0: nativeContext

    <javanative: 'java/lang/reflect/Proxy' name: 'defineClass0'>

        "
    private static native Class defineClass0(ClassLoader loader, String name,
                                             byte[] b, int off, int len);
    "
    | loader name b off len  bs cls |
    loader := nativeContext argAt: 1.
    name := nativeContext argAt: 2.
    b := nativeContext argAt: 3.
    off := nativeContext argAt: 4.
    len := nativeContext argAt: 5.

    bs := (off = 0 and: [len = b size])
            ifTrue:[b readStream]
            ifFalse:[(b copyFrom: off + 1 to: off + len) readStream].

    cls := JavaClassReader readStream: bs.
    cls classLoader: loader.
    self classRegistry registerClass: cls.

    ^self reflection javaClassObjectForClass: cls.

    "Created: / 06-02-2011 / 16:55:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.net'!

_java_net_DatagramPacket_init: nativeContext

    <javanative: 'java/net/DatagramPacket' name: 'init'>

    "Nothing to do"

    "Modified: / 13-09-2011 / 22:33:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_Inet4AddressImpl_getHostByAddr: nativeContext

    <javanative: 'java/net/Inet4AddressImpl' name: 'getHostByAddr([B)Ljava/lang/String;'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_net_Inet4AddressImpl_getLocalHostName: nativeContext

    <javanative: 'java/net/Inet4AddressImpl' name: 'getLocalHostName()Ljava/lang/String;'>

    ^Java as_String: OperatingSystem getHostName

    "Modified: / 13-09-2011 / 22:36:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_Inet4AddressImpl_lookupAllHostAddr: nativeContext

    <javanative: 'java/net/Inet4AddressImpl' name: 'lookupAllHostAddr(Ljava/lang/String;)[Ljava/net/InetAddress;'>

    | hostname sockaddr inet4Address |
    hostname := Java as_ST_String: (nativeContext argAt:1).
    [
        sockaddr := IPSocketAddress hostName: hostname.
    ] on: HostNameLookupError do: [:ex|
        self throwExceptionClassName: 'java.net.UnknownHostException' withMessage: (ex description , '(' , hostname , ')').
        ^nil.
    ].
    "Bad, here we have an access to just one inet address,
     that's fine for now, however"

    inet4Address := (self classForName:'java.net.Inet4Address') newCleared.
    inet4Address
        instVarNamed: #family put: 1; "/IPv4
        instVarNamed: #address put: (sockaddr address doubleWordAt: 1 MSB: true);
        instVarNamed: #hostName put: (nativeContext argAt:1);
        instVarNamed: #canonicalHostName put: (nativeContext argAt:1).

    ^(self classForName:'java.net.InetAddress') javaArrayClass with: inet4Address.

    "Modified: / 08-11-2011 / 10:10:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_Inet4Address_init: nativeContext

    <javanative: 'java/net/Inet4Address' name: 'init()V'>

    "Nothing to do"

    "Modified: / 13-09-2011 / 22:31:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_Inet6Address_init: nativeContext

    <javanative: 'java/net/Inet6Address' name: 'init()V'>

    "Nothing to do"

    "Modified: / 13-09-2011 / 22:32:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_InetAddressImplFactory_isIPv6Supported: nativeContext

    <javanative: 'java/net/InetAddressImplFactory' name: 'isIPv6Supported'>

    ^ 0 "IPv6 is not supported!!"

    "Modified: / 13-09-2011 / 19:43:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_InetAddress_init: nativeContext

    <javanative: 'java/net/InetAddress' name: 'init'>

    "Nothing to do"

    "Created: / 27-01-1998 / 18:16:40 / cg"
    "Modified (comment): / 13-09-2011 / 22:32:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_NetworkInterface_getAll: nativeContext

    <javanative: 'java/net/NetworkInterface' name: 'getAll()[Ljava/net/NetworkInterface;'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_net_NetworkInterface_getByName0: nativeContext

    <javanative: 'java/net/NetworkInterface' name: 'getByName0(Ljava/lang/String;)Ljava/net/NetworkInterface;'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_net_NetworkInterface_init: nativeContext

    <javanative: 'java/net/NetworkInterface' name: 'init'>

    "Nothing to do"

    "Modified: / 13-09-2011 / 22:33:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainDatagramSocketImpl_bind0: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'bind0(ILjava/net/InetAddress;)V'>

    | port addr sock fd |

    port := nativeContext argAt: 1.
    addr := nativeContext argAt: 2.
    addr isNil ifTrue:[
        self throwSocketException: 'Passed InetAddress object is null'.
        ^nil.
    ].
    fd := nativeContext receiver instVarNamed: #fd.
    fd isNil ifTrue:[
        self throwSocketException: 'Socket closed'.
        ^nil.
    ].
    sock := self validateFile: nativeContext receiver.

    addr := addr perform: #'getAddress()[B'.
    addr = #[0 0 0 0] ifTrue:[
        addr := nil
    ] ifFalse:[
        self throwSocketException: 'Only all-interface bind is supported by underlaing socket implementation, sorry'.
        ^nil
    ].
    [
        sock bindTo: port address: addr reuseAddress: true.
        nativeContext receiver instVarNamed: #localPort put: sock port.
    ] on: Error do:[:ex|
        self throwSocketException: 'bind0() failed: ', ex description
    ]

    "Modified: / 07-11-2011 / 21:45:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainDatagramSocketImpl_datagramSocketClose: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'datagramSocketClose()V'>

        |jsock sock|

    jsock := nativeContext receiver.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    'JAVA: datagram close socket' infoPrintCR
	].
	sock close.
    ].

    "Modified: / 21.8.1997 / 17:09:40 / cg"
    "Created: / 25.1.1998 / 20:04:24 / cg"
!

_java_net_PlainDatagramSocketImpl_datagramSocketCreate: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'datagramSocketCreate()V'>

        |jsock fd sock fileNo|

    jsock := nativeContext receiver.

    fd := jsock instVarNamed:'fd'.
    (fd instVarNamed:'fd') ~~ -1 ifTrue:[
        self halt:'file already open'.
        self internalError:'file already open'.
        self throwIOExceptionWithMessage:'file already open in socketCreate'.
        ^ self.
    ].

    FileOpenTrace ifTrue:[
        ('JAVA: create datagram socket') infoPrintCR.
    ].

    sock := self commonOpenStreamUsing:[Socket newUDP].
    sock isNil ifTrue:[
        self throwIOExceptionWithMessage:'socketCreate failed'.
    ].

    fileNo := self addOpenFile:sock.
    fd instVarNamed:'fd' put:fileNo.
    "Kludge for finalization..."
    jsock finalizationLobby registerChange: jsock

    "Created: / 25-01-1998 / 19:59:25 / cg"
    "Modified: / 30-12-1998 / 20:10:38 / cg"
    "Modified: / 23-07-2012 / 19:37:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainDatagramSocketImpl_init: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'init'>

    "Nothing to do"

    "Modified: / 13-09-2011 / 22:36:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainDatagramSocketImpl_receive0: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'receive0(Ljava/net/DatagramPacket;)V'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_net_PlainDatagramSocketImpl_send: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'send(Ljava/net/DatagramPacket;)V'>

        |jsock jdatagramPacket sock ok|

    jsock := nativeContext receiver.
    jdatagramPacket := nativeContext argAt:1.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket send') infoPrintCR
	].
	^ -1.
    ].
    ^ -1

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_java_net_PlainDatagramSocketImpl_socketSetOption: nativeContext

    <javanative: 'java/net/PlainDatagramSocketImpl' name: 'socketSetOption(ILjava/lang/Object;)V'>

        "/ native void socketSetOption (int arg1, java.lang.Object arg2)

    |jsock opt optVal sock ok err jSocketOptions|

    jsock := nativeContext receiver.
    opt := nativeContext argAt:1.
    optVal := nativeContext argAt:2.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket setOption ' , opt printString) infoPrintCR
	].

	jSocketOptions := Java at:'java.net.SocketOptions'.
	(opt == (jSocketOptions instVarNamed:'TCP_NODELAY')) ifTrue:[
	] ifFalse:[
	    (opt == (jSocketOptions instVarNamed:'SO_BINDADDR')) ifTrue:[
	    ] ifFalse:[
		(opt == (jSocketOptions instVarNamed:'SO_REUSEADDR')) ifTrue:[
		] ifFalse:[
		    (opt == (jSocketOptions instVarNamed:'IP_MULTICAST_IF')) ifTrue:[
		    ] ifFalse:[
			(opt == (jSocketOptions instVarNamed:'SO_LINGER')) ifTrue:[
			] ifFalse:[
			    (opt == (jSocketOptions instVarNamed:'SO_TIMEOUT')) ifTrue:[
			    ] ifFalse:[
				self throwIOExceptionWithMessage:'bad arg to setOption'.
			    ]
			]
		    ]
		]
	    ]
	].
	self throwIOExceptionWithMessage:'unimplemented: setOption'.
self halt.
	^ nil.  "/ void
    ].

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_java_net_PlainSocketImpl_initProto: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'initProto'>

    "Nothing to do"

    "Created: / 12-01-1998 / 12:56:52 / cg"
    "Modified (comment): / 13-09-2011 / 22:36:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketAccept: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketAccept(Ljava/net/SocketImpl;)V'>

    |jsock fd newJSock sock newSock fileNo|

    jsock := nativeContext receiver.

    sock := self validateFile:jsock.
    sock isNil ifTrue:[
        self throwIOExceptionWithMessage:'nil socket in accept'.
        ^ self.
    ].

    newJSock := nativeContext argAt:1.
    fd := newJSock instVarNamed:'fd'.
    (fd instVarNamed:'fd') ~~ -1 ifTrue:[
        self halt:'file already open'.
        self internalError:'file already open'.
        self throwIOExceptionWithMessage:'socket already open in socketAccept'.
        ^ self.
    ].
    FileIOTrace ifTrue:[
        'JAVA: socket accept' infoPrintCR
    ].
    [
        newSock := self commonOpenStreamUsing:[sock accept].
    ] on: Error do:[:ex|
        self throwSocketException:'accept failed: ' , ex description.
        ^nil.
    ].
    newSock isNil ifTrue:[
        self throwSocketException:'accept failed'.
        ^nil.
    ].
    fileNo := self addOpenFile:newSock.
    fd instVarNamed:'fd' put:fileNo.
    newJSock instVarNamed:'localport' put: newSock port.
    newJSock instVarNamed:'port' put: newSock getPeer port.

    "Kludge for finalization..."
    newJSock finalizationLobby registerChange: newJSock.

    "Created: / 04-02-1998 / 15:26:49 / cg"
    "Modified: / 30-12-1998 / 20:10:01 / cg"
    "Modified: / 23-07-2012 / 19:37:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketAvailable: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketAvailable()I'>

        |jSock sock n|

    jSock := nativeContext receiver.

    sock := self validateFile:jSock.
    sock isNil ifTrue:[
	self throwIOExceptionWithMessage:'socketAvailable on closed socket'.
	^ self.
    ].

    n := sock numAvailable.
    ^ n

    "Created: / 4.2.1998 / 16:58:49 / cg"
    "Modified: / 30.12.1998 / 20:10:08 / cg"
!

_java_net_PlainSocketImpl_socketBind: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketBind(Ljava/net/InetAddress;I)V'>

    |jsock jaddr port sock hostName ok err|

    jsock := nativeContext receiver.
    jaddr := nativeContext argAt:1.
    port := nativeContext argAt:2.

    hostName := jaddr instVarNamed:'hostName'.
    hostName isNil ifTrue:[
        self halt.
    ] ifFalse:[
        hostName := Java as_ST_String:hostName
    ].

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
        FileIOTrace ifTrue:[
            ('JAVA: socket bind to ' , hostName printString, ' port ' , port printString) infoPrintCR
        ].

        [
            ok := sock bindTo:port address:nil "hostName".
        ] on: Error do: [:ex|
            self
                throwExceptionClassName: 'java.net.BindException'
                withMessage:'bind failed: ' , ex description.
        ].
        ok ifFalse:[
            err := OperatingSystem lastErrorString.
            self
                throwExceptionClassName: 'java.net.BindException'
                withMessage:'bind failed: ' , err.
        ].
       jsock instVarNamed: #localport put: sock port.
       jsock instVarNamed: #address put: jaddr.
    ].

    "Created: / 04-02-1998 / 15:06:20 / cg"
    "Modified: / 30-12-1998 / 20:10:16 / cg"
    "Modified: / 19-11-2011 / 00:43:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketClose0: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketClose0(Z)V'>

    ^self commonClose: nativeContext

    "Modified: / 07-11-2011 / 23:21:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketConnect: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketConnect(Ljava/net/InetAddress;II)V'>

    |jsock jaddr port sock addr hostName ok|

    jsock := nativeContext receiver.
    jaddr := nativeContext argAt:1.
    port := nativeContext argAt:2.

    hostName := jaddr instVarNamed:'hostName'.
    hostName notNil ifTrue:[
        hostName := Java as_ST_String:hostName
    ] ifFalse:[
        addr := jaddr instVarNamed:'address'.
        addr notNil ifTrue:[
            hostName := ByteArray new:4.
            hostName at:4 put:(addr bitAnd:16rFF).
            addr := addr bitShift:-8.
            hostName at:3 put:(addr bitAnd:16rFF).
            addr := addr bitShift:-8.
            hostName at:2 put:(addr bitAnd:16rFF).
            addr := addr bitShift:-8.
            hostName at:1 put:(addr bitAnd:16rFF).
        ].
    ].
    hostName isNil ifTrue:[
        self halt.
    ].

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
        FileIOTrace ifTrue:[
            Logger log: ('socket connect to ' , hostName printString , ' port ' , port printString) severity: #trace facility: #JVM.
        ].
        SocketConnectConfirmation ifTrue:[
            (PermittedHostConnects isNil
            or:[(PermittedHostConnects includes:hostName) not]) ifTrue:[
                (self confirm:'connect to host: ' , hostName printString , ' - ok ?')
                ifFalse:[
                    self throwIOExceptionWithMessage:'connect permission denied'.
                ].

                (self confirm:('JAVA Security check\\Always permit connects to this host (''' , hostName printString , ''') ?') withCRs)
                ifTrue:[
                    PermittedHostConnects isNil ifTrue:[
                        PermittedHostConnects := Set new
                    ].
                    PermittedHostConnects add:hostName.
                ]
            ]
        ].

        [
            ok := sock connectTo:hostName port:port.
            ok ifFalse:[
                self throwExceptionClassName:'java.net.ConnectException' withMessage:'connect failed'.
            ].
            jsock instVarNamed: #localport put: sock port.
            jsock instVarNamed: #address put: jaddr.
        ] on: Error do:[:ex|
            self throwExceptionClassName:'java.net.ConnectException' withMessage:'connect failed: ', ex description
        ].

    ].

    "Created: / 25-01-1998 / 20:02:27 / cg"
    "Modified: / 30-12-1998 / 20:10:28 / cg"
    "Modified: / 13-11-2011 / 23:16:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketCreate: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketCreate(Z)V'>

    |jsock isStream fd sock fileNo|

    jsock := nativeContext receiver.
    isStream := (nativeContext argAt:1) == 1.

    fd := jsock instVarNamed:'fd'.
    fd isNil ifTrue:[
        self throwSocketException: 'null fd object'.
    ].
    (fd instVarNamed:'fd') ~~ -1 ifTrue:[
        self halt:'file already open'.
        self internalError:'file already open'.
        self throwSocketException:'socket already open in socketCreate'.
        ^ self.
    ].

    FileOpenTrace ifTrue:[
        ('JAVA: create socket') infoPrintCR.
    ].

    isStream ifTrue:[
        sock := self commonOpenStreamUsing:[JavaSocket newTCP].
    ] ifFalse:[
        sock := self commonOpenStreamUsing:[JavaSocket newUDP].
    ].
    sock isNil ifTrue:[
        self throwIOExceptionWithMessage:'socketCreate failed'.
    ].

    (jsock instVarNamed: #serverSocket) notNil ifTrue:[
        "/If this is a server socket then enable SO_REUSEADDR
        [
            Object primitiveFailureSignal
        ] on: Object primitiveFailureSignal do:[:ex|
            self throwIOExceptionWithMessage:'cannot set SO_REUSEADDR: ' , ex description.
            ^nil.
        ]
    ].



    fileNo := self addOpenFile:sock.
    fd instVarNamed:'fd' put:fileNo.
    "Kludge for finalization..."
    jsock finalizationLobby registerChange: jsock

    "Created: / 25-01-1998 / 19:59:25 / cg"
    "Modified: / 30-12-1998 / 20:10:38 / cg"
    "Modified: / 23-07-2012 / 19:38:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketGetOption: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketGetOption(ILjava/lang/Object;)I'>

    | opt arg sock ret |
    opt := nativeContext argAt: 1.
    arg := nativeContext argAt: 2.

    sock := self validateFile: nativeContext receiver.

"/  TCP_NODELAY = 1;
    opt = 1 ifTrue:[
        ret := sock getSocketOption: #TCP_NODELAY.
        ^ret ifTrue:[1] ifFalse:[-1].
    ].
"/  SO_BINDADDR = 15;
    opt = 15 ifTrue:[
        self breakPoint: #jv.
        ^-1 "/Unsupported
    ].

"/  SO_REUSEADDR = 4;
    opt = 4 ifTrue:[
        ret := sock getSocketOption: #SO_REUSEADDR.
        ^ret ifTrue:[1] ifFalse:[-1].
    ].
"/  IP_TOS = 3;
    opt = 3 ifTrue:[
        self breakPoint: #jv.
        ^-1 "/Unsupported
    ].
"/  SO_LINGER = 128;
    opt = 128 ifTrue:[
        ret := sock getSocketOption:#SO_LINGER.
        ^ret
    ].
"/  SO_TIMEOUT = 4102;
    opt = 4102 ifTrue:[
        self breakPoint: #jv.
        ^-1 "/Unsupported                   .
    ].
"/  SO_SNDBUF = 4097;
    opt = 4097 ifTrue:[
        ret := sock getSocketOption: #SO_SNDBUF.
        ^ret
    ].

"/  SO_RCVBUF = 4098;
    opt = 4098 ifTrue:[
        ret := sock getSocketOption: #SO_RCVBUF.
        ^ret
    ].

"/  SO_KEEPALIVE = 8;
    opt = 8 ifTrue:[
        ret := sock getSocketOption: #SO_KEEPALIVE.
        ^ret ifTrue:[1] ifFalse:[-1].
    ].

"/  SO_OOBINLINE = 4099;
    opt = 4099 ifTrue:[
        ret := sock getSocketOption: #SO_OOBINLINE.
        ^ret ifTrue:[1] ifFalse:[-1].
    ]

    "Modified: / 13-11-2011 / 23:06:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketListen: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketListen(I)V'>

        |jSock time sock ok|

    jSock := nativeContext receiver.
    time := nativeContext argAt:1.

    sock := self validateFile:jSock.
    sock notNil ifTrue:[
        FileIOTrace ifTrue:[
            ('JAVA: socket listen with timeout ' , time printString) infoPrintCR.
        ].
        ok := sock listenFor:5.
        ok ifFalse:[
            self throwIOExceptionWithMessage:'listen failed'.
            ^ self.
        ].
        time ~~ 0 ifTrue:[
            sock readWaitWithTimeoutMs:time
        ]
    ].

    "Created: / 04-02-1998 / 15:17:48 / cg"
    "Modified: / 30-12-1998 / 20:10:46 / cg"
    "Modified: / 17-08-2012 / 15:27:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_PlainSocketImpl_socketSetOption: nativeContext

    <javanative: 'java/net/PlainSocketImpl' name: 'socketSetOption(IZLjava/lang/Object;)V'>

    | opt on val sock o arg1 arg2 |
    opt := nativeContext argAt: 1.
    on  := nativeContext argAt: 2.
    val := nativeContext argAt: 3.

    sock := self validateFile: nativeContext receiver.

"/  TCP_NODELAY = 1;
    opt = 1 ifTrue:[
        o := #TCP_NODELAY.
        arg1 := (on == 1)
    ].
"/  SO_BINDADDR = 15;
    opt = 15 ifTrue:[
        ^self "/Unsupported
    ].

"/  SO_REUSEADDR = 4;
    opt = 4 ifTrue:[
        o := #SO_REUSEADDR.
        arg1 := (on == 1)
    ].
"/  IP_TOS = 3;
    opt = 3 ifTrue:[
        ^self "/Unssuported
    ].
"/  SO_LINGER = 128;
    opt = 128 ifTrue:[
        o := #SO_LINGER.
        arg1 := (on == 1).
        arg2 := val instVarNamed: #value.
    ].
"/  SO_TIMEOUT = 4102;
    opt = 4102 ifTrue:[
        ^self "/Unssuported
                   .
    ].
"/  SO_SNDBUF = 4097;
    opt = 4097 ifTrue:[
        o := #SO_SNDBUF.
        arg1 := val instVarNamed: #value.
    ].

"/  SO_RCVBUF = 4098;
    opt = 4098 ifTrue:[
        o := #SO_RCVBUF.
        arg1 := val instVarNamed: #value.
    ].

"/  SO_KEEPALIVE = 8;
    opt = 8 ifTrue:[
        o := #SO_KEEPALIVE.
        arg1 := (on == 1)
    ].

"/  SO_OOBINLINE = 4099;
    opt = 4099 ifTrue:[
        o := #SO_OOBINLINE.
        arg1 := (on == 1)
    ].

    [
        sock setSocketOption: o argument: arg1 argument: arg2.
    ] on: Error do:[:ex|
        self throwSocketException: 'Error setting socket option: ', ex description.
    ].

    "Modified: / 13-11-2011 / 23:05:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_SocketInputStream_init: nativeContext

    <javanative: 'java/net/SocketInputStream' name: 'init()V'>

    "Nothing to do"

    "Modified: / 09-11-2011 / 22:27:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_SocketInputStream_socketRead0: nativeContext

    <javanative: 'java/net/SocketInputStream' name: 'socketRead0(Ljava/io/FileDescriptor;[BIII)I'>

    | fdObj data off len timeout sock nread |
    fdObj   := nativeContext argAt:1.
    data    := nativeContext argAt:2.
    off     := nativeContext argAt:3.
    len     := nativeContext argAt:4.
    timeout := nativeContext argAt:5.

    fdObj isNil ifTrue:[
        self throwSocketException: 'Socket closed (null fdObj passed to socketRead0)'.
        ^ -1.
    ].

    sock := self validateFile: fdObj.

    timeout ~~ 0 ifTrue:[
        [
            (sock readWaitWithTimeout: timeout) ifTrue:[
                self throwExceptionClassName:'java.net.SocketTimeoutException' withMessage: 'Read timed out'.
                ^ -1.
            ].
        ] on: Error do:[:ex|
            self throwSocketException: 'Error when reading: ', ex description.
        ]
    ].

    [
        nread := sock nextAvailableBytes: len into: data startingAt: off + 1
    ] on: Error do:[:ex|
        self throwSocketException: 'Error when reading: ', ex description.
    ].

    ^nread

    "Modified: / 04-12-2011 / 20:24:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_SocketOutputStream_init: nativeContext

    <javanative: 'java/net/SocketOutputStream' name: 'init()V'>

    "Nothing to do"

    "Modified: / 09-11-2011 / 23:44:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_net_SocketOutputStream_socketWrite0: nativeContext

    <javanative: 'java/net/SocketOutputStream' name: 'socketWrite0(Ljava/io/FileDescriptor;[BII)V'>

    | fdObj data off len  sock |
    fdObj   := nativeContext argAt:1.
    data    := nativeContext argAt:2.
    off     := nativeContext argAt:3.
    len     := nativeContext argAt:4.


    fdObj isNil ifTrue:[
        self throwSocketException: 'Socket closed (null fdObj passed to socketRead0)'.
        ^ -1.
    ].

    sock := self validateFile: fdObj.

    [
        sock nextPutBytes: len from: data startingAt: off + 1.
    ] on: Error do:[:ex|
        self throwIOExceptionWithMessage: 'Error when writing: ', ex description.
    ].

    "Modified: / 13-11-2011 / 23:53:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.nio'!

_java_nio_Bits_copyFromByteArray: nativeContext
    "
    static native void copyFromByteArray(Object src, long srcPos, long dstAddr,
                                         long length);
    "


    <javanative: 'java/nio/Bits' name: 'copyFromByteArray(Ljava/lang/Object;JJJ)V'>

    | src srcPos dstAddr length |
    src := nativeContext argAt: 1.
    srcPos := nativeContext argAt: 2.
    dstAddr := nativeContext argAt: 4.
    length := nativeContext argAt: 6.
    SimulatedNativeMemory  bcopy: dstAddr length: length from: src offset: srcPos.

    "Modified: / 11-07-2012 / 10:37:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_nio_Bits_copyToByteArray: nativeContext
    "
    static native void copyToByteArray(long srcAddr, Object dst, long dstPos,
                                       long length);
    "

    <javanative: 'java/nio/Bits' name: 'copyToByteArray(JLjava/lang/Object;JJ)V'>

    | srcAddr dst dstPos length |

    srcAddr := nativeContext argAt: 1.
    dst := nativeContext argAt: 3.
    dstPos := nativeContext argAt: 4.
    length := nativeContext argAt: 6.
    SimulatedNativeMemory bcopy: srcAddr length: length into: dst offset: dstPos.

    "Modified: / 11-07-2012 / 10:34:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.security'!

_java_security_AccessController_doPrivileged: aJavaContext
    <javanative: 'java/security/AccessController' name: 'doPrivileged'>
    "we don't care about permissions, we will just allow this. Now it's guaranteed that called code will not perform access permission checks"

    | retval |
    JavaVM privilegedAccessQuery answer: true
        do: [
            retval := (aJavaContext argAt: 1) perform: #'run()Ljava/lang/Object;'.
        ].
    ^ retval

    "Created: / 20-10-2010 / 12:31:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-10-2011 / 23:56:31 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 18-10-2011 / 23:28:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-09-2012 / 23:22:59 / m"
!

_java_security_AccessController_getStackAccessControlContext: nativeContext
    <javanative: 'java/security/AccessController' name: 'getStackAccessControlContext'>
    "/ introduced with jdk1.2
    "/ supposed to do more here ...

    ^nil.

    "Created: / 27-01-1998 / 18:22:15 / cg"
    "Modified: / 09-10-2011 / 23:40:46 / Marcel Hlopko <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'native - java.sql'!

_java_sql_DriverManager_getCallerClassLoader: nativeContext

    <javanative: 'java/sql/DriverManager' name: 'getCallerClassLoader()Ljava/lang/ClassLoader;'>

    ^nativeContext
        sender sender
        receiver class theNonMetaclass
        classLoader

    "Modified: / 05-12-2011 / 11:34:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.text'!

_java_text_Bidi_nativeBidiChars: nativeContext

    <javanative: 'java/text/Bidi' name: 'nativeBidiChars(Ljava/text/Bidi;[CI[BIII)V'>

    ^ JavaVM unimplementedNativeMethodSignal raise
! !

!JavaVM class methodsFor:'native - java.util'!

_java_util_ResourceBundle_getClassContext: nativeContext

    <javanative: 'java/util/ResourceBundle' name: 'getClassContext'>

    "returns an array filled with the contextChain receivers classes.
     What an ugly, messy interface."

    |chain con cls jClass|

    chain := OrderedCollection new.
    con := thisContext sender.
    [
        con notNil
            and:[con receiver isMethod not or:[con receiver isJavaMethod not]]
    ] whileTrue:[con := con sender.].
    con := con sender sender sender.
    [con notNil] whileTrue:[
        (true) "con isJavaContext" ifTrue:[
            cls := con receiver class.
            cls isMeta ifTrue:[
                "/ t'was a static method
                cls := cls soleInstance
            ].
            cls isJavaClass ifTrue:[
                jClass := self reflection javaClassObjectForClass:cls.
                chain add:jClass.
            ]
        ].
        con := con sender.
    ].
    ^(self classForName:'java.lang.Class') javaArrayClass withAll: chain

    "Created: / 05-01-1998 / 02:47:00 / cg"
    "Modified: / 24-12-1998 / 00:34:57 / cg"
    "Modified: / 28-01-2011 / 15:31:28 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 09-01-2013 / 18:11:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_TimeZone_getSystemGMTOffsetID: nativeContext

    <javanative: 'java/util/TimeZone' name: 'getSystemGMTOffsetID()Ljava/lang/String;'>

    ^ Java as_String: 'GMT'

    "Modified: / 09-01-2013 / 16:18:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_TimeZone_getSystemTimeZoneID: nativeContext

    <javanative: 'java/util/TimeZone' name: 'getSystemTimeZoneID'>

    "JV@2011-06-25: TODO: finish, returning nil here means GMT"

    ^ nil

    "Modified: / 25-06-2011 / 08:26:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.util.concurrent.atomic'!

_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8: nativeContext

    <javanative: 'java/util/concurrent/atomic/AtomicLong' name: 'VMSupportsCS8'>

    "Should be safe - say we don't support lockless updates"

    ^ 0

    "Modified: / 07-08-2011 / 20:53:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.util.jar'!

_java_util_jar_JarFile_getMetaInfEntryNames: nativeContext

    <javanative: 'java/util/jar/JarFile' name: 'getMetaInfEntryNames'>
    "
    private native String[] getMetaInfEntryNames();
    "
    | zipArchive entries jentries |

    zipArchive := ZipCache at: (nativeContext receiver instVarNamed: #jzfile).
    entries := (zipArchive entries select:[:entry|entry size > 9 and:[entry startsWith: 'META-INF/']]) asArray.
    jentries := Java java_lang_String javaArrayClass new: entries size.
    1 to: entries size do:[:i|
        jentries at: i put: (Java as_String: (entries at: i))
    ].
    ^jentries

    "Modified: / 10-12-2012 / 05:42:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - java.util.zip'!

_java_util_zip_Adler32_updateBytes: nativeContext

    <javanative: 'java/util/zip/Adler32' name: 'updateBytes'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_util_zip_CRC32_update: nativeContext

    <javanative: 'java/util/zip/CRC32' name: 'update(II)I'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_java_util_zip_CRC32_updateBytes: nativeContext

    <javanative: 'java/util/zip/CRC32' name: 'updateBytes(I[BII)I'>

    | crc b off len |
    crc := nativeContext argAt: 1.
    b   := nativeContext argAt: 2.
    off := nativeContext argAt: 3.
    len := nativeContext argAt: 4.

    ^ZipStream crc32BytesIn:b from:off + 1  to: off + len crc:crc

    "Modified: / 05-12-2011 / 00:41:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_deflateBytes: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'deflateBytes(J[BII)I'>

    "
    private native int deflateBytes(long addr, byte[] b, int off, int len);
    "

    | addr b off len deflater ret |
    addr := nativeContext argAt: 1."long takes 2 slots"
    b := nativeContext argAt: 3.
    off := nativeContext argAt: 4.
    len := nativeContext argAt: 5.

    deflater := ZipInflaters at: addr.

    ret := deflater deflate: b offset: off length: len flush: 0 deflater: nativeContext receiver.

    ^ret.

    "Modified: / 25-10-2012 / 20:19:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_end: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'end(J)V'>

    | addr deflater |
    addr := nativeContext argAt: 1.
    deflater := ZipInflaters at: addr.
    ZipInflaters at: addr put: nil.
    deflater end.

    "Modified: / 25-10-2012 / 20:24:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_getBytesRead: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'getBytesRead(J)J'>

    | addr deflater |
    addr := nativeContext argAt: 1.
    deflater := ZipInflaters at: addr.
    ^deflater bytesRead.

    "Modified: / 25-10-2012 / 20:19:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_getBytesWritten: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'getBytesWritten(J)J'>

    | addr deflater |
    addr := nativeContext argAt: 1.
    deflater := ZipInflaters at: addr.
    ^deflater bytesWritten.

    "Modified: / 25-10-2012 / 20:19:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_init: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'init(IIZ)J'>

    | level strategy nowrap deflater |
    level := nativeContext argAt: 1.
    strategy := nativeContext argAt: 2.
    nowrap := nativeContext argAt:3.
    deflater := JavaZipSupport deflaterFor: self.
    deflater init: strategy level: level nowrap: nowrap.
    1 to: ZipInflaters size do:[:i|
        (ZipInflaters at: i) isNil ifTrue:[
            ZipInflaters at: i put: deflater.
            ^i
        ].
    ].
    ZipInflaters add: deflater.
    ^ZipInflaters size.
    "/^deflater

    "Modified: / 25-10-2012 / 20:25:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_initIDs: nativeContext
    <javanative: 'java/util/zip/Deflater' name: 'initIDs'>

    "Nothing to do here"

    "Modified: / 08-12-2011 / 21:11:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 10-05-2012 / 17:03:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Deflater_reset: nativeContext

    <javanative: 'java/util/zip/Deflater' name: 'reset(J)V'>

    | addr deflater |
    addr := nativeContext argAt: 1.
    deflater := ZipInflaters at: addr.
    deflater reset.

    "Modified: / 25-10-2012 / 20:19:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_end: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'end(J)V'>

     "
    private native static void reset(long addr);
    "
    | addr inflater |
    addr := nativeContext argAt: 1.
    inflater := ZipInflaters at: addr.
    ZipInflaters at: addr put: nil.
    inflater end.

    "Modified: / 25-10-2012 / 20:24:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_getBytesRead: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'getBytesRead(J)J'>

    | addr inflater |
    addr := nativeContext argAt: 1.
    inflater := ZipInflaters at: addr.
    ^inflater bytesRead.

    "Modified: / 25-10-2012 / 20:20:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_getBytesWritten: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'getBytesWritten'>

    | addr inflater |
    addr := nativeContext argAt: 1.
    inflater := ZipInflaters at: addr.
    ^inflater bytesWritten.

    "Modified: / 25-10-2012 / 20:20:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_inflateBytes: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'inflateBytes'>
    "
    private native int inflateBytes(long addr, byte[] b, int off, int len)
    "

    | addr b off len inflater ret |
    addr := nativeContext argAt: 1."long takes 2 slots"
    b := nativeContext argAt: 3.
    off := nativeContext argAt: 4.
    len := nativeContext argAt: 5.

    inflater := ZipInflaters at: addr.

    ret := inflater inflate: b offset: off length: len inflater: nativeContext receiver.

    ^ret.

    "Created: / 30-04-2011 / 23:02:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 25-10-2012 / 20:20:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_init: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'init'>


    | nowrap inflater |
    nowrap := nativeContext argAt:1.
    inflater := JavaZipSupport inflaterFor: self.
    inflater init: nowrap.
    1 to: ZipInflaters size do:[:i|
        (ZipInflaters at: i) isNil ifTrue:[
            ZipInflaters at: i put: inflater.
            ^i
        ].
    ].
    ZipInflaters add: inflater.
    ^ ZipInflaters size.

    "Created: / 01-02-1998 / 20:14:01 / cg"
    "Modified: / 25-10-2012 / 20:25:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_initIDs: aJavaContext

    <javanative: 'java/util/zip/Inflater' name: 'initIDs'>


    "Nothing to do, used only to register natives"

    "Created: / 30-04-2011 / 21:55:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_Inflater_reset: nativeContext

    <javanative: 'java/util/zip/Inflater' name: 'reset'>
    "
    private native static void reset(long addr);
    "
    | addr inflater |
    addr := nativeContext argAt: 1.
    inflater := ZipInflaters at: addr.
    inflater reset.

    "Created: / 01-02-1998 / 20:14:13 / cg"
    "Modified: / 25-10-2012 / 20:20:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipEntry_initFields: aJavaContext

    <javanative: 'java/util/zip/ZipEntry' name: 'initFields'>

        | entry jzentry zmember |

    entry := aJavaContext receiver.
    jzentry := aJavaContext argAt: 1.
    zmember := ZipEntryCache at: jzentry.

    entry
        instVarNamed: #name     put: (Java as_String: zmember fileName);
        instVarNamed: #time     put: -1"zmember lastModFileTime";
        instVarNamed: #crc      put: zmember crc32;
        instVarNamed: #size     put: zmember uncompressedSize;
        instVarNamed: #csize    put: zmember compressedSize;
        instVarNamed: #method   put: zmember compressionMethod;
        instVarNamed: #extra    put: zmember extraField;
        instVarNamed: #comment  put: (zmember fileComment ifNotNil:[Java as_String: zmember fileComment]).

    "Created: / 01-04-2011 / 13:04:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 05-12-2011 / 23:42:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipEntry_initIDs: aJavaContext

    <javanative: 'java/util/zip/ZipEntry' name: 'initIDs'>

        "hopefully nothing to do"

    "Created: / 01-04-2011 / 13:02:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_java_util_zip_ZipFile_close: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'close(J)V'>

    | jzfile zar |
    jzfile := nativeContext argAt: 1.
    zar := ZipCache at: jzfile.
    zar close.
    ZipCache at: jzfile put: nil.

    "Modified: / 03-11-2011 / 22:22:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_freeEntry: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'freeEntry'>

    | zipArchiveIndex  zipEntryIndex |


    zipArchiveIndex := nativeContext at: 1.
    zipEntryIndex := nativeContext at: 3.
    zipEntryIndex = 0 ifFalse: [ ZipEntryCache at: zipEntryIndex put: nil ].

    "Modified: / 01-05-2011 / 13:33:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getCSize: aJavaContext

    <javanative: 'java/util/zip/ZipFile' name: 'getCSize'>


    | jzentry zmember |
    jzentry := aJavaContext argAt: 1.
    zmember := ZipEntryCache at: jzentry.

    ^zmember compressedSize

    "Created: / 30-04-2011 / 21:50:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getEntry: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'getEntry'>

    | zipArchive  filename  member |

    zipArchive := ZipCache at: (nativeContext argAt: 1).
    filename := Java as_ST_String: (nativeContext argAt: 3).
    member := (zipArchive findMemberAllowForMissingTrailingSlash: filename).
    member isNil ifTrue: [
        ^ 0
    ] ifFalse: [
        ^ ZipEntryCache indexOf: member ifAbsent:[
            ZipEntryCache add: member.
            ZipEntryCache size.
        ]
    ]

    "Created: / 27-03-2011 / 16:59:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 01-04-2011 / 16:03:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 18-08-2011 / 19:44:56 / jv"
    "Modified: / 20-07-2012 / 19:27:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getMethod: aJavaContext

    <javanative: 'java/util/zip/ZipFile' name: 'getMethod'>


    | jzentry zmember |
    jzentry := aJavaContext argAt: 1.
    zmember := ZipEntryCache at: jzentry.

    ^zmember compressionMethod

    "Created: / 30-04-2011 / 21:53:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getNextEntry: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'getNextEntry(JI)J'>

    | zipArchive  index i |

    zipArchive := ZipCache at: (nativeContext at: 1).
    index := nativeContext at: 3.
    i := 0.
    zipArchive zipMembersDo:[:member |
        index == i ifTrue:[
            ^ ZipEntryCache indexOf: member ifAbsent:[
                ZipEntryCache add: member.
                ZipEntryCache size.
            ]
        ].
        i := i + 1.
    ].
    ^0

    "Modified: / 05-12-2011 / 11:19:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getSize: aJavaContext

    <javanative: 'java/util/zip/ZipFile' name: 'getSize'>


    | jzentry zmember |
    jzentry := aJavaContext argAt: 1.
    zmember := ZipEntryCache at: jzentry.

    ^zmember uncompressedSize

    "Created: / 30-04-2011 / 21:53:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_getTotal: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'getTotal'>

    | zar|
    zar := ZipCache at: (nativeContext argAt: 1).
    ^ zar entries size.

    "Modified: / 23-07-2012 / 23:35:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_initIDs: aJavaContext

    <javanative: 'java/util/zip/ZipFile' name: 'initIDs'>


    "Nothing to do"

    "Created: / 23-03-2011 / 19:37:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_open: nativeContext

    <javanative: 'java/util/zip/ZipFile' name: 'open'>

    | path  mode  lastModTime  result |

    path := Java as_ST_String: (nativeContext at: 1).
    "/(path endsWith:'.jar') ifFalse:[self breakPoint: #jv].
    mode := nativeContext at: 2.
    lastModTime := nativeContext at: 3.
    result := path asFilename.
    result ifNil: [ JavaVM throwZipException ].
    ^[
        | i zar |
        zar := ZipArchive readingFrom: result readStream.
        i := ZipCache indexOf: nil.
        i ~~ 0 ifTrue:[
            ZipCache at: i put: zar.
            i
        ] ifFalse:[
            ZipCache add: zar.
            ZipCache size.
        ].
    ] on: Error do:[:ex|
        self throwZipException: 'Cannot open zip file: ', ex description
    ]

    "Modified: / 01-04-2011 / 15:35:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 20-07-2012 / 21:48:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_java_util_zip_ZipFile_read: aJavaContext

    <javanative: 'java/util/zip/ZipFile' name: 'read'>


    | jzfile jzentry pos b off len zar zmember bytesToRead |
    jzfile := aJavaContext argAt: 1.
    jzentry := aJavaContext argAt: 3. "first arg is long!!!!!!"
    pos := aJavaContext argAt: 5. "jzentry arg is long!!!!!!"
    b := aJavaContext argAt: 7.
    off := aJavaContext argAt: 8.
    len := aJavaContext argAt: 9.

    zar := ZipCache at: jzfile.
    zmember := ZipEntryCache at: jzentry.

    bytesToRead := len min: (zmember compressedSize - pos).

    ^zar nextBytes: bytesToRead of: zmember startingAt: pos into: b startingAt: off + 1.

    "Created: / 30-04-2011 / 22:15:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 01-05-2011 / 16:22:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - old-style'!

_AccessController_beginPrivileged:nativeContext
    "/ introduced with jdk1.2

    "Created: / 27.1.1998 / 18:18:11 / cg"
!

_AccessController_endPrivileged:nativeContext
    "/ introduced with jdk1.2

    "Created: / 27.1.1998 / 18:18:32 / cg"
!

_AudioDevice_audioClose:nativeContext
    |device fd stream|

    device := nativeContext receiver.
    device notNil ifTrue:[
	fd := device instVarNamed:'dev'.
	(fd notNil and:[fd > 0]) ifTrue:[
	    stream := self getOpenFileAt:fd.
	    stream notNil ifTrue:[
		stream close.
		device instVarNamed:'dev' put:0.
	    ]
	]
    ]

    "Created: / 10.1.1998 / 15:45:16 / cg"
    "Modified: / 13.1.1998 / 18:08:20 / cg"
!

_AudioDevice_audioOpen:nativeContext
    |f stream fileNo|

    NoAudio ifTrue:[
        Transcript showCR:'JAVA: audio disabled'.
        ^ -1
    ].

    Stream streamErrorSignal handle:[:ex |
        Stream streamErrorSignal handle:[:ex |
            stream := nil.
            ex return.
        ] do:[
            stream := SoundStream writing.
        ].
    ] do:[
        stream := SoundStream writing.
        stream notNil ifTrue:[
            stream setSampleRate:8000.
        ]
    ].
    stream isNil ifTrue:[
"/        ^ -1.

        f := '/dev/audio' asFilename.
        f exists ifFalse:[
            Transcript showCR:'JAVA: neither SoundStream nor /dev/audio available'.
            ^ -1
        ].
        stream := self commonOpenStreamUsing: [f readWriteStream].
        stream isNil ifTrue:[
            Transcript showCR:'JAVA: /dev/audio exists, but cannot be opened'.
            ^ -1
        ].
        fileNo := self addOpenFile:stream.
    ].

    fileNo := self addOpenFile:stream.

    FileOpenTrace ifTrue:[
        ('JAVA: opened audioDevice as FD ' , fileNo printString) infoPrintCR.
    ].

    ^ fileNo

    "Created: / 10-01-1998 / 15:45:30 / cg"
    "Modified: / 14-10-1998 / 15:20:52 / cg"
    "Modified: / 23-07-2012 / 19:36:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_AudioDevice_audioWrite:nativeContext
    |device fd stream bytes count|

    device := nativeContext receiver.
    device notNil ifTrue:[
	fd := device instVarNamed:'dev'.
	(fd notNil and:[fd > 0]) ifTrue:[
	    stream := self getOpenFileAt:fd.
	    stream notNil ifTrue:[
		bytes := nativeContext argAt:1.
		count := nativeContext argAt:2.
		stream nextPutBytes:count from:bytes startingAt:1
	    ]
	]
    ]

    "Created: / 10.1.1998 / 15:45:16 / cg"
    "Modified: / 13.1.1998 / 18:07:20 / cg"
!

_BigInteger_plumbInit:nativeContext
    JavaVM unimplementedNativeMethodSignal raiseRequest

    "Modified: / 12.11.1998 / 19:23:00 / cg"
!

_ColorModel_deletepData:nativeContext
    "/ void deletepData ()
    JavaVM unimplementedNativeMethodSignal raiseRequest

    "Created: / 12.11.1998 / 19:22:05 / cg"
!

_ColorModel_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:19:23 / cg"
!

_Constructor_getModifiers:nativeContext
    "/ int getModifiers ()

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 02:54:38 / cg"
!

_Constructor_newInstance:nativeContext
    "/ java.lang.Object newInstance (java.lang.Object[])

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
!

_Field_get:nativeContext
    "/ java.lang.Object get (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:04:18 / cg"
!

_Field_getBoolean:nativeContext
    "/ boolean getBoolean (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:05:16 / cg"
!

_Field_getByte:nativeContext
    "/ byte getByte (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:05:30 / cg"
!

_Field_getChar:nativeContext
    "/ char getChar (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:03:37 / cg"
!

_Field_getDouble:nativeContext
    "/ double getDouble (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:07:49 / cg"
!

_Field_getFloat:nativeContext
    "/ float getFloat (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:05:41 / cg"
!

_Field_getInt:nativeContext
    "/ int getInt (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:04:47 / cg"
!

_Field_getLong:nativeContext
    "/ long getLong (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:05:54 / cg"
!

_Field_getModifiers:nativeContext
    "/ int getModifiers ()

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:07:03 / cg"
!

_Field_getShort:nativeContext
    "/ unsigned short getShort (java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:07:35 / cg"
!

_Field_set:nativeContext
    "/ void set (java.lang.Object java.lang.Object)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:04:33 / cg"
!

_Field_setBoolean:nativeContext
    "/ void setBoolean (java.lang.Object boolean)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:06:06 / cg"
!

_Field_setByte:nativeContext
    "/ void setByte (java.lang.Object byte)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:06:20 / cg"
!

_Field_setChar:nativeContext
    "/ void setChar (java.lang.Object char)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:03:48 / cg"
!

_Field_setDouble:nativeContext
    "/ void setDouble (java.lang.Object double)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:04:02 / cg"
!

_Field_setFloat:nativeContext
    "/ void setFloat (java.lang.Object float)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:06:48 / cg"
!

_Field_setInt:nativeContext
    "/ void setInt (java.lang.Object int)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:05:04 / cg"
!

_Field_setLong:nativeContext
    "/ void setLong (java.lang.Object long)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:06:37 / cg"
!

_Field_setShort:nativeContext
    "/ void setShort (java.lang.Object unsigned short)

JavaVM unimplementedNativeMethodSignal raiseRequest.

    "Modified: / 27.1.2000 / 02:53:55 / cg"
    "Created: / 27.1.2000 / 03:03:23 / cg"
!

_FileDescriptor_initSystemFD:nativeContext
    |descriptor fileNo myStream|

    descriptor := nativeContext argAt:1.
    fileNo := nativeContext argAt:2.

    fileNo == 0 ifTrue:[
        myStream := Stdin
    ] ifFalse:[
        fileNo == 1 ifTrue:[
           myStream := JavaConsoleStream ? Stdout
        ] ifFalse:[
            fileNo == 2 ifTrue:[
                myStream := JavaConsoleStream ? Stderr
            ] ifFalse:[
                self halt:'invalid fileNo given'.
                self internalError:'invalid fileNo given'.
            ]
        ]
    ].

    self setOpenFile:myStream at:fileNo.

    descriptor instVarNamed:'fd' put:fileNo.
    ^ descriptor

    "Modified: / 27-01-1998 / 18:15:28 / cg"
    "Modified (format): / 28-07-2012 / 02:46:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_FileDescriptor_valid:nativeContext
    "/ boolean valid ()
    |descriptor fileNo stream|

    descriptor := nativeContext receiver.
    fileNo := descriptor instVarNamed:'fd'.
    stream := self getOpenFileAt:fileNo.
    stream isNil ifTrue:[^ 0]. "/ FALSE
    stream isOpen ifFalse:[^ 0].  "/ FALSE

    ^ 1 "/ TRUE

    "Modified: / 11.12.1998 / 13:02:47 / cg"
!

_FileInputStream_close:nativeContext
    ^ self anyStream_close:nativeContext

    "Created: / 4.1.1998 / 17:45:23 / cg"
    "Modified: / 4.2.1998 / 15:20:46 / cg"
!

_FileOutputStream_close:nativeContext
    ^ self anyStream_close:nativeContext

    "Created: / 13.1.1998 / 09:33:16 / cg"
    "Modified: / 4.2.1998 / 15:20:53 / cg"
!

_File_canRead0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.

	FileAccessTrace == true ifTrue:[
	    path storeString print. ' ' print. thisContext printCR
	].

	path := self fixFilename:path.
	(f := path asFilename) isReadable ifTrue:[
	    ^ 1 "/ TRUE
	]
    ].
    ^ 0 "/ FALSE

    "Created: / 4.1.1998 / 18:09:55 / cg"
    "Modified: / 27.1.1999 / 18:57:55 / cg"
!

_File_canWrite0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	FileAccessTrace == true ifTrue:[
	    path storeString print. ' ' print. thisContext printCR
	].
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) isWritable ifTrue:[
	    ^ 1 "/ TRUE
	]
    ].
    ^ 0 "/ FALSE

    "Created: / 4.2.1998 / 00:19:55 / cg"
    "Modified: / 27.1.1999 / 18:57:52 / cg"
!

_File_canonPath:nativeContext
    "/ introduced with jdk1.2 ... (sigh)

    |jPath path realPath|

    jPath := nativeContext argAt:1.
    jPath isNil ifTrue:[^ jPath].

    path := Java as_ST_String:jPath.
    realPath := path asFilename pathName.

    ^ Java as_String:realPath

    "Created: / 27.1.1998 / 18:35:58 / cg"
    "Modified: / 27.1.1998 / 21:36:03 / cg"
!

_File_delete0:nativeContext
    "/ boolean delete0 ()
    |oldFile oldPath oldF|

    oldFile := nativeContext receiver.
    oldPath := oldFile instVarNamed:'path'.
    oldPath isNil ifTrue:[^ 0].    "/ FALSE

    oldPath := Java as_ST_String:oldPath.
    oldF := oldPath asFilename.

    oldF exists ifFalse:[
	^ 1 "/ TRUE
    ].

    (self checkWritePermissionOfDirectory:oldF directory message:('JAVA Security check\\Delete of ''' , oldPath , '''.\Grant permission ?'))
    ifFalse:[
	^ 0 "/ FALSE
    ].

    OperatingSystem accessDeniedErrorSignal handle:[:ex |
	^ 0 "/ FALSE
    ] do:[
	oldF delete.
	^ 1 "/ TRUE
    ].
    ^ 0 "/ FALSE

    "Modified: / 30.12.1998 / 20:15:06 / cg"
!

_File_exists0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	FileAccessTrace == true ifTrue:[
	    path storeString print. ' ' print. thisContext printCR
	].
	(f := path asFilename) exists ifTrue:[
	    ^ 1 "TRUE"
	]
    ].
    ^ 0 "FALSE"

    "Created: / 5.1.1998 / 02:07:48 / cg"
    "Modified: / 27.1.1999 / 18:57:46 / cg"
!

_File_initIDs:nativeContext
    "/ introduced with jdk1.2 ... (sigh)

    "Created: / 27.1.1998 / 18:25:19 / cg"
!

_File_isAbsolute:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) isAbsolute ifTrue:[
	    ^ 1 "/ TRUE
	]
    ].
    ^ 0 "/ FALSE

    "Created: / 11.1.1998 / 09:54:38 / cg"
    "Modified: / 20.10.1998 / 20:59:53 / cg"
!

_File_isDirectory0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	FileAccessTrace == true ifTrue:[
	    path storeString print. ' ' print. thisContext printCR
	].
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) exists ifTrue:[
	    f isDirectory ifTrue:[^ 1 "TRUE"]
	]
    ].
    ^ 0 "FALSE"

    "Created: / 7.1.1998 / 10:31:37 / cg"
    "Modified: / 27.1.1999 / 18:58:01 / cg"
!

_File_isFile0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	FileAccessTrace == true ifTrue:[
	    path storeString print. ' ' print. thisContext printCR
	].
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) exists ifTrue:[
	    f isDirectory ifFalse:[^ 1 "TRUE"]
	]
    ].
    ^ 0 "/ FALSE

    "Created: / 11.1.1998 / 11:40:22 / cg"
    "Modified: / 27.1.1999 / 18:58:04 / cg"
!

_File_lastModified0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) exists ifTrue:[
	    ^ f modificationTime getMilliseconds.
	]
    ].
    ^ 0

    "Created: / 4.2.1998 / 16:50:30 / cg"
    "Modified: / 20.10.1998 / 21:00:05 / cg"
!

_File_length0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	FileAccessTrace == true ifTrue:[
	    thisContext printCR
	].
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) exists ifTrue:[
	    ^ f fileSize
	]
    ].
    ^ -1

    "Created: / 7.1.1998 / 12:18:57 / cg"
    "Modified: / 27.1.1999 / 18:57:06 / cg"
!

_File_list0:nativeContext
    |file path f files|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	(f := path asFilename) exists ifTrue:[
	    f isDirectory ifTrue:[
		files := f directoryContents asArray.
		files := files collect:[:nm | Java as_String:nm].
		^ files
	    ]
	]
    ].
    ^ nil

    "Created: / 14.1.1998 / 21:30:22 / cg"
    "Modified: / 20.10.1998 / 21:00:21 / cg"
!

_File_mkdir0:nativeContext
    |file path f|

    file := nativeContext receiver.
    path := file instVarNamed:'path'.
    path notNil ifTrue:[
	path := Java as_ST_String:path.
	path := self fixFilename:path.
	f := path asFilename.
	(f exists and:[f isDirectory]) ifTrue:[
	    ^ 0 "/ FALSE
	].

	FileOpenConfirmation ifTrue:[
	    (self confirm:('JAVA Security check\\Create directory ''' , path , '''.\Grant permission ?') withCRs)
	    ifFalse:[
		^ 0 "/ FALSE
	    ]
	].
	OperatingSystem accessDeniedErrorSignal handle:[:ex |
	    ^ 0 "/ FALSE
	] do:[
	    f makeDirectory.
	].
	f  exists ifTrue:[
	    f isDirectory ifTrue:[^ 1 "TRUE"]
	]
    ].
    ^ 0 "FALSE"

    "Created: / 4.2.1998 / 00:19:05 / cg"
    "Modified: / 4.12.1998 / 14:04:03 / cg"
!

_File_renameTo0:nativeContext
    "/ void renameTo0 (java.io.File)

    |oldFile newFile oldPath newPath oldF newF|

    oldFile := nativeContext receiver.
    oldPath := oldFile instVarNamed:'path'.
    oldPath isNil ifTrue:[^ 0].    "/ FALSE

    oldPath := Java as_ST_String:oldPath.
    oldF := oldPath asFilename.

    newFile := nativeContext argAt:1.
    newPath := newFile instVarNamed:'path'.
    newPath isNil ifTrue:[^ 0].    "/ FALSE
    newPath := Java as_ST_String:newPath.

    newF := newPath asFilename.

    (self checkWritePermissionOfDirectory:oldF directory message:('JAVA Security check\\Rename of ''' , oldPath , ''' to ''' , newPath , '''.\Grant permission ?'))
    ifFalse:[
	^ 0 "/ FALSE
    ].
    oldF directory pathName ~= newF directory pathName ifTrue:[
	(self checkWritePermissionOfDirectory:newF directory message:('JAVA Security check\\Rename of ''' , oldPath , ''' to ''' , newPath , '''.\Grant permission ?'))
	ifFalse:[
	    ^ 0 "/ FALSE
	].
    ].

    OperatingSystem accessDeniedErrorSignal handle:[:ex |
	^ 0 "/ FALSE
    ] do:[
	oldF renameTo:newF.
	^ 1 "/ TRUE
    ].
    ^ 0 "/ FALSE

    "Modified: / 3.12.1998 / 21:01:08 / cg"
!

_File_rmdir0:nativeContext
    "/ boolean rmdir0 ()
    JavaVM unimplementedNativeMethodSignal raiseRequest

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:03:52 / cg"
!

_Float_floatToIntBits:nativeContext
    |f i|

    f := nativeContext argAt:1.

    UninterpretedBytes isBigEndian ifTrue:[
	i := f basicAt:4.
	i := i bitOr:((f basicAt:3) bitShift:8).
	i := i bitOr:((f basicAt:2) bitShift:16).
	i := i bitOr:((f basicAt:1) bitShift:24).
    ] ifFalse:[
	i := f basicAt:1.
	i := i bitOr:((f basicAt:2) bitShift:8).
	i := i bitOr:((f basicAt:3) bitShift:16).
	i := i bitOr:((f basicAt:4) bitShift:24).
    ].

    ^ i.

    "Created: / 4.1.1998 / 01:25:50 / cg"
!

_FontDescriptor_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:30:52 / cg"
!

_Font_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 27.1.1998 / 21:43:25 / cg"
!

_GifImageDecoder_parseImage:nativeContext
    |decoder width height bool1 depth subHdrBytes dstBytes i1 i2 colorModel
     stream byte compressedData compressedSize index count data
     leftOffs topOffs codeLen flags pixelStore clrModel t buffSize
     countGot countGot2|

    decoder := nativeContext receiver.

    i1 := nativeContext argAt:1.
    i2 := nativeContext argAt:2.
    width := nativeContext argAt:3.
    height := nativeContext argAt:4.
    bool1 := nativeContext argAt:5.
    depth := nativeContext argAt:6.
    subHdrBytes := nativeContext argAt:7.
    dstBytes := nativeContext argAt:8.
    colorModel := nativeContext argAt:9.

    leftOffs := subHdrBytes wordAt:1 MSB:false.
    topOffs := subHdrBytes wordAt:3 MSB:false.
    width := subHdrBytes wordAt:5 MSB:false.
    height := subHdrBytes wordAt:7 MSB:false.
    flags := subHdrBytes at:9.
    codeLen := subHdrBytes at:10.

    stream := decoder instVarNamed:'input'.
    pixelStore := decoder instVarNamed:'store'.
    pixelStore isNil ifTrue:[
	^ 0
    ].

    buffSize := (width * height // 2) max:4096.
    compressedData := ByteArray uninitializedNew:buffSize.
    "get compressed data"
    index := 1.
    count := stream perform:#'read()I'.

    [count notNil and:[count > 0]] whileTrue:[
	(index + count) > buffSize ifTrue:[
	    t := ByteArray uninitializedNew:(buffSize * 2).
	    t replaceFrom:1 to:buffSize with:compressedData startingAt:1.
	    compressedData := t.
	    buffSize := buffSize * 2.
	].
	[count ~~ 0] whileTrue:[
	    countGot := stream
			perform:#'read([BII)I'
			with:compressedData
			with:index-1
			with:count.

	    countGot > 0 ifTrue:[
		count := count - countGot.
		index := index + countGot.
	    ] ifFalse:[
		count := -1.
	    ]
	].

	count >= 0 ifTrue:[
	    count := stream perform:#read.
	]
    ].
    compressedSize := index - 1.

    data := pixelStore perform:#'allocateLines(I)Ljava/lang/Object;' with:height.
    (data isMemberOf:ByteArray) ifFalse:[
	self halt.
	^ 0.
    ].
"/    'GIFReader: decompressing ...' infoPrintCR.


    GIFReader
	decompressGIFFrom:compressedData
	count:compressedSize
	into:data
	startingAt:1
	codeLen:(codeLen + 1).

    clrModel := pixelStore instVarNamed:'colormodel'.

    pixelStore
	perform:#'setPixels(IIII[BII)Z'
	withArguments:
	    (Array
		with:0        "/ x
		with:0        "/ y
		with:width    "/ w
		with:height   "/ h
		with:data
		with:0        "/ offs
		with:width).   "/ scanSize

    pixelStore  perform:#'imageComplete()V'.
"/        perform:#'imageComplete(I)V'
"/        with:((Java at:'java.awt.image.ImageConsumer') instVarNamed:'STATICIMAGEDONE').

"/ self internalError:'breakPoint'.
    ^ 1 "/ true

    "Modified: / 10.4.1998 / 14:31:59 / cg"
!

_ImageRepresentation_disposeImage:nativeContext
    |imgRep img|

    imgRep := nativeContext receiver.

    img := imgRep instVarNamed:'pData'.
    (img notNil and:[img ~~ 0]) ifTrue:[
	ImageStretchCache notNil ifTrue:[
	    ImageStretchCache removeKey:img ifAbsent:nil.
	]
    ].

    imgRep instVarNamed:'pData' put:0.
"/    self halt.

    "Created: / 7.1.1998 / 22:31:46 / cg"
    "Modified: / 17.1.1998 / 13:26:55 / cg"
!

_ImageRepresentation_finish:nativeContext
    |imgRep bool|

    imgRep := nativeContext receiver.
    bool := nativeContext argAt:1.
"/ self halt.
"/    'JAVA: ImageRepresentation_finish ignored for now' infoPrintCR.

    ^ 1 "/ true

    "Created: / 8.1.1998 / 00:11:40 / cg"
    "Modified: / 6.2.1998 / 02:12:54 / cg"
!

_ImageRepresentation_imageDraw:nativeContext
    |imgRep x y img deviceImage jGraphics gc clr|

    imgRep := nativeContext receiver.
    img := imgRep instVarNamed:'pData'.
    (img isNil or:[img == 0]) ifTrue:[
	"/ self halt.
	^ self.
    ].
    jGraphics := nativeContext argAt:1.
    gc := jGraphics instVarNamed:'pData'.
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:2.
    y := nativeContext argAt:3.
    clr := nativeContext argAt:4.

    deviceImage := img onDevice:gc device.
    deviceImage ~~ img ifTrue:[
	imgRep instVarNamed:'pData' put:deviceImage.
    ].
    gc realized ifFalse:[^ self].
    deviceImage displayOn:gc x:x y:y.
    ^ 1.

    "Created: / 13.1.1998 / 13:32:28 / cg"
    "Modified: / 25.11.1998 / 15:36:38 / cg"
!

_ImageRepresentation_imageStretch:nativeContext
    |imgRep x1 y1 x2 y2 srcX1 srcY1 w h
     img deviceImage jGraphics gc clr stretchWidth stretchHeight|

    imgRep := nativeContext receiver.
    img := imgRep instVarNamed:'pData'.
    (img isNil or:[img == 0]) ifTrue:[
	"/ self halt.
	^ self.
    ].

    jGraphics := nativeContext argAt:1.
    gc := jGraphics instVarNamed:'pData'.
    gc realized ifFalse:[^ self].

    x1 := nativeContext argAt:2.
    y1 := nativeContext argAt:3.
    x2 := nativeContext argAt:4.
    y2:= nativeContext argAt:5.
    srcX1 := nativeContext argAt:6.
    srcY1 := nativeContext argAt:7.
    w := nativeContext argAt:8.
    h := nativeContext argAt:9.
    clr := nativeContext argAt:10.

    (srcX1 ~~ 0 or:[srcY1 ~~ 0]) ifTrue:[
	self halt.
	^ self.
    ].
    (w ~~ img width or:[h ~~ img height]) ifTrue:[
	self halt.
	^ self
    ].

    "/ TODO: remember magnified images somewhere for a while,
    "/ to avoid repeated action ...

    stretchWidth := (x2-x1).
    stretchHeight := (y2-y1).

    (stretchWidth == img width
    and:[stretchHeight == img height]) ifTrue:[
	deviceImage := img onDevice:gc device.
	deviceImage ~~ img ifTrue:[
	    imgRep instVarNamed:'pData' put:deviceImage.
	].
    ] ifFalse:[
	ImageStretchCache notNil ifTrue:[
	    deviceImage := ImageStretchCache at:img ifAbsent:nil.
	].
	(deviceImage isNil
	or:[deviceImage width ~~ stretchWidth
	or:[deviceImage height ~~ stretchHeight]]) ifTrue:[
	    deviceImage := (img magnifiedTo:stretchWidth@stretchHeight) onDevice:gc device.
	    ImageStretchCache isNil ifTrue:[
		ImageStretchCache := WeakIdentityDictionary new.
	    ].
	    ImageStretchCache at:img put:deviceImage
	].
    ].
    deviceImage displayOn:gc x:x1 y:y1

    "Created: / 13.1.1998 / 13:32:28 / cg"
    "Modified: / 15.1.1998 / 13:14:47 / cg"
!

_ImageRepresentation_offscreenInit:nativeContext
    |imgRep jclr w h form screenDevice|

    imgRep := nativeContext receiver.
    jclr := nativeContext argAt:1.

    w := imgRep instVarNamed:'width'.
    h := imgRep instVarNamed:'height'.

    screenDevice := Screen current.
    form := Form width:w height:h depth:(screenDevice depth) on:screenDevice.

    imgRep instVarNamed:'pData' put:form.
    "/ self halt.

    "Created: / 7.1.1998 / 22:31:46 / cg"
    "Modified: / 17.1.1998 / 12:36:43 / cg"
!

_ImageRepresentation_setBytePixels:nativeContext
    |imgRep x y w h clrModel bytes offs i2
     img depth cmap rgbMap opaque transparentColorIndex
     scanLineWidth nBytes srcIdx dstIdx|

    imgRep := nativeContext receiver.
    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    clrModel := nativeContext argAt:5.
    bytes := nativeContext argAt:6.
    offs := nativeContext argAt:7.  "/ offset ??
    scanLineWidth := nativeContext argAt:8.

    depth := clrModel instVarNamed:'pixel_bits'.
    (clrModel instVarNamed:'map_size') ~~ 0 ifTrue:[
	rgbMap := clrModel instVarNamed:'rgb'.
	cmap := Array new:rgbMap size.
	rgbMap
	    keysAndValuesDo:[:idx :rgb |
		cmap at:idx put:(Color rgbValue:(rgb bitAnd:16rFFFFFF))
	    ].
    ].

    opaque := (clrModel instVarNamed:'opaque') ~~ 0.
    opaque ifFalse:[
	transparentColorIndex := clrModel instVarNamed:'transparent_index'
    ].

    img := imgRep instVarNamed:'pData'.
    (img isNil or:[img == 0]) ifFalse:[
"/        self halt
    ].

    (offs ~~ 0 or:[scanLineWidth ~~ w]) ifTrue:[
	nBytes := ByteArray new:w*h.
	srcIdx := offs+1.
	dstIdx := 1.
	1 to:h do:[:y |
	    nBytes replaceFrom:dstIdx to:(dstIdx+w-1) with:bytes startingAt:srcIdx.
	    srcIdx := srcIdx + scanLineWidth.
	    dstIdx := dstIdx + w.
	].
	bytes := nBytes.
    ].
    img := Image width:w height:h depth:depth fromArray:bytes.
    cmap notNil ifTrue:[
	img colorMap:cmap.
	img photometric:#palette
    ].
    opaque ifFalse:[
	img mask:(ImageReader
		    buildMaskFromColor:transparentColorIndex
		    for:bytes
		    width:w
		    height:h)
    ].

    imgRep instVarNamed:'pData' put:img.
    ^ 1.

    "Created: / 7.1.1998 / 22:31:46 / cg"
    "Modified: / 21.10.1998 / 00:35:45 / cg"
!

_ImageRepresentation_setIntPixels:nativeContext
    |imgRep x y w h clrModel ints offs scanLineWidth
     img depth cmap rgbMap opaque transparentColorIndex
     bytes srcIdx dstIdx val red green blue
     redMask greenMask blueMask redShift greenShift blueShift|

    imgRep := nativeContext receiver.
    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    clrModel := nativeContext argAt:5.
    ints := nativeContext argAt:6.
    offs := nativeContext argAt:7.  "/ offset ??
    scanLineWidth := nativeContext argAt:8.  "/ scanLineWidth ??
    opaque := false.
offs ~~ 0 ifTrue:[
 self halt
].

    depth := clrModel instVarNamed:'pixel_bits'.
    clrModel class == (Java at:'java.awt.image.DirectColorModel') ifTrue:[
    ] ifFalse:[
	(clrModel instVarNamed:'map_size') ~~ 0 ifTrue:[
	    rgbMap := clrModel instVarNamed:'rgb'.
	    cmap := Array new:rgbMap size.
	    rgbMap
		keysAndValuesDo:[:idx :rgb |
		    cmap at:idx put:(Color rgbValue:(rgb bitAnd:16rFFFFFF))
		].
	].
	opaque := (clrModel instVarNamed:'opaque') ~~ 0.
	opaque ifFalse:[
	    transparentColorIndex := clrModel instVarNamed:'transparent_index'
	].
    ].

    img := imgRep instVarNamed:'pData'.
    (img isNil or:[img == 0]) ifFalse:[
"/        self halt.
    ].

    depth == 32 ifTrue:[
	"/ temporary kludge - ony use 24 bits/pixel
	bytes := ByteArray new:w*h*3.
	srcIdx := 1.
	dstIdx := 1.
	redMask := clrModel instVarNamed:'red_mask'.
	greenMask := clrModel instVarNamed:'green_mask'.
	blueMask := clrModel instVarNamed:'blue_mask'.
	redShift := (clrModel instVarNamed:'red_offset') negated.
	greenShift := (clrModel instVarNamed:'green_offset') negated.
	blueShift := (clrModel instVarNamed:'blue_offset') negated.

	1 to:h do:[:y |
	    1 to:w do:[:x |
		val := ints at:srcIdx.
		red := (val bitAnd:redMask) bitShift:redShift.
		green := (val bitAnd:greenMask) bitShift:greenShift.
		blue := (val bitAnd:blueMask) bitShift:blueShift.
		bytes at:dstIdx put:red.
		bytes at:dstIdx+1 put:green.
		bytes at:dstIdx+2 put:blue.
		dstIdx := dstIdx + 3.
		srcIdx := srcIdx + 1.
	    ].
	    srcIdx := srcIdx + (scanLineWidth - w).
	].
	img := Depth24Image width:w height:h depth:24 fromArray:bytes.
	img photometric:#rgb.
    ] ifFalse:[
	scanLineWidth ~~ w ifTrue:[
	    self halt
	].
	img := Image width:w height:h depth:depth fromArray:ints.
	cmap notNil ifTrue:[
	    img colorMap:cmap.
	    img photometric:#palette
	] ifFalse:[
	    img photometric:#rgb
	].
    ].
    opaque ifFalse:[
	img mask:(ImageReader
		    buildMaskFromColor:transparentColorIndex
		    for:ints
		    width:w
		    height:h)
    ].

    imgRep instVarNamed:'pData' put:img.
    ^ 1.

    "Created: / 1.2.1998 / 17:38:47 / cg"
    "Modified: / 21.10.1998 / 00:35:37 / cg"
!

_InetAddressImpl_getHostByAddr:nativeContext
    "/ java.lang.String getHostByAddr (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:08:04 / cg"
!

_InetAddressImpl_getInetFamily:nativeContext
    "/ self unimplementedNativeMethod.
    ^ 0

    "Modified: / 15.8.1997 / 17:04:43 / cg"
    "Created: / 5.1.1998 / 02:05:48 / cg"
!

_InetAddressImpl_getLocalHostName:nativeContext
    ""

    |hostName|

    hostName := OperatingSystem getHostName.

    ^ (Java as_String:hostName).

    "Modified: / 7.8.1997 / 21:16:55 / cg"
    "Created: / 5.1.1998 / 02:07:03 / cg"
!

_InetAddressImpl_lookupAllHostAddr:nativeContext
    ""

    |jAddrImpl jHostName hostName addrBytes|

    jAddrImpl := nativeContext receiver.
    jHostName := nativeContext argAt:1.

    hostName := Java as_ST_String:jHostName.
    addrBytes := Socket ipAddressOfHost:hostName.
    addrBytes isNil ifTrue:[
	addrBytes := #[0 0 0 0] copy
    ].
    ^ Array with:addrBytes

    "Modified: / 8.8.1997 / 12:04:25 / cg"
    "Created: / 7.1.1998 / 18:51:31 / cg"
!

_InetAddressImpl_makeAnyLocalAddress:nativeContext
    ""

    |jAddrImpl jAddr hostName addrBytes address|

    jAddrImpl := nativeContext receiver.
    jAddr := nativeContext argAt:1.

    hostName := OperatingSystem getHostName.
    addrBytes := Socket ipAddressOfHost:hostName.
    addrBytes isNil ifTrue:[
	addrBytes := #[127 0 0 0].
    ].
    "/ MSB first into an integer.
    address := (addrBytes at:1).
    address := (address bitShift:8) bitOr:(addrBytes at:2).
    address := (address bitShift:8) bitOr:(addrBytes at:3).
    address := (address bitShift:8) bitOr:(addrBytes at:4).

    jAddr instVarNamed:'hostName' put:(Java as_String:hostName).
    jAddr instVarNamed:'address' put:address.
    jAddr instVarNamed:'family' put:0.

    ^ nil

    "Created: / 5.1.1998 / 02:06:27 / cg"
    "Modified: / 21.10.1998 / 03:30:29 / cg"
!

_InetAddress_getInetFamily:nativeContext
    "/ self unimplementedNativeMethod.
    ^ 0

    "Modified: / 15.8.1997 / 17:04:43 / cg"
    "Created: / 17.11.1998 / 23:54:38 / cg"
!

_InetAddress_getLocalHostName:nativeContext
    ""

    |hostName|

    hostName := OperatingSystem getHostName.

    ^ Java as_String:hostName.

    "Modified: / 7.8.1997 / 21:16:55 / cg"
    "Created: / 17.11.1998 / 23:54:54 / cg"
!

_InetAddress_lookupAllHostAddr:nativeContext
    ""

    |jAddrImpl jHostName hostName addrBytes|

    jAddrImpl := nativeContext receiver.
    jHostName := nativeContext argAt:1.

    hostName := Java as_ST_String:jHostName.
    addrBytes := Socket ipAddressOfHost:hostName.
    addrBytes isNil ifTrue:[
	addrBytes := #[0 0 0 0] copy
    ].
    ^ Array with:addrBytes

    "Modified: / 8.8.1997 / 12:04:25 / cg"
    "Created: / 17.11.1998 / 23:56:10 / cg"
!

_InetAddress_lookupHostByAddr:nativeContext
    "java.lang.Object[] lookupHostByAddr (int)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:59:22 / cg"
!

_InetAddress_lookupHostByName:nativeContext
    "java.lang.Object[] lookupHostByName (java.lang.String)"

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 02:58:53 / cg"
!

_InetAddress_makeAnyLocalAddress:nativeContext
    ""

    |jAddrImpl jAddr hostName addrBytes address|

    jAddrImpl := nativeContext receiver.
    jAddr := nativeContext argAt:1.

    hostName := OperatingSystem getHostName.
    addrBytes := Socket ipAddressOfHost:hostName.
    addrBytes isNil ifTrue:[
	addrBytes := #[127 0 0 0].
    ].
    "/ MSB first into an integer.
    address := (addrBytes at:1).
    address := (address bitShift:8) bitOr:(addrBytes at:2).
    address := (address bitShift:8) bitOr:(addrBytes at:3).
    address := (address bitShift:8) bitOr:(addrBytes at:4).

    jAddr instVarNamed:'hostName' put:(Java as_String:hostName).
    jAddr instVarNamed:'address' put:address.
    jAddr instVarNamed:'family' put:0.

    ^ nil

    "Modified: / 21.10.1998 / 03:30:29 / cg"
    "Created: / 17.11.1998 / 23:54:00 / cg"
!

_Inflater_end0:nativeContext
    "/ void end0 ()

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:11:21 / cg"
!

_Inflater_getAdler0:nativeContext
    "/ int getAdler0 ()

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:12:15 / cg"
!

_Inflater_getTotalIn0:nativeContext
    "/ int getTotalIn0 ()

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 03:10:50 / cg"
    "Modified: / 27.1.2000 / 03:11:08 / cg"
!

_Inflater_getTotalOut0:nativeContext
    "/ int getTotalOut0 ()

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:12:01 / cg"
!

_Inflater_inflate0:nativeContext
    "/ int inflate0 (byte[] int int)

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:11:39 / cg"
!

_Inflater_reset0:nativeContext
    "/ void reset0 ()

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:11:02 / cg"
!

_Inflater_setDictionary0:nativeContext
    "/ void setDictionary0 (byte[] int int)

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:08:47 / cg"
    "Created: / 27.1.2000 / 03:10:33 / cg"
!

_InputThread_run:nativeContext
    self _WToolkit_eventLoop:nativeContext.

    "Created: / 28.1.1998 / 22:34:47 / cg"
    "Modified: / 28.1.1998 / 22:35:16 / cg"
!

_Introspector_getMethodDescriptor:nativeContext
    "java.lang.String getMethodDescriptor (java.lang.reflect.Method)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:47:43 / cg"
!

_Introspector_getMethodParameterCount:nativeContext
    "int getMethodParameterCount (java.lang.reflect.Method)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:49:15 / cg"
!

_Introspector_getPublicDeclaredMethods0:nativeContext
    "java.lang.reflect.Method[] getPublicDeclaredMethods0 (java.lang.Class)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:48:49 / cg"
!

_JPEGImageDecoder_readImage:nativeContext
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 18:53:30 / cg"
    "Modified: / 12.11.1998 / 18:53:40 / cg"
!

_MButtonPeer_create:nativeContext
    ^ self _WButtonPeer_create:nativeContext
!

_MCanvasPeer_create:nativeContext
    |jCanvasPeer jFrame frame subView|

    jCanvasPeer := nativeContext receiver.

    jFrame := nativeContext argAt:1.
    jFrame isNil ifTrue:[
	self halt:'no frame in canvasPeer create'.
	self internalError:'no frame in canvasPeer create'.
	^ self.
    ].
    frame := jFrame instVarNamed:'pData'.

    subView := JavaView in:frame.
    subView delegate:self.
    subView javaPeer:jCanvasPeer.

    self createdWindowsView:subView for:jCanvasPeer.

    WindowCreationTrace == true ifTrue:[
	'WCanvasPeer_create: ' print. frame print. ' -> ' print. subView printNL.
    ].

    "Modified: / 16.1.1998 / 13:40:00 / cg"
    "Created: / 18.11.1998 / 00:14:44 / cg"
!

_MComponentPeer_cacheInit:nativeContext

    "Created: / 28.1.1998 / 22:22:30 / cg"
!

_MComponentPeer_handleEvent:nativeContext
    ^ self _WComponentPeer_handleEvent:nativeContext

    "Created: / 18.11.1998 / 00:21:17 / cg"
!

_MComponentPeer_nativeHandleEvent:nativeContext
    ^ self _WComponentPeer_nativeHandleEvent:nativeContext
!

_MComponentPeer_pHide:nativeContext
    ^ self _WComponentPeer_hide:nativeContext

    "Created: / 18.11.1998 / 00:15:18 / cg"
!

_MComponentPeer_pInitialize:nativeContext

    "Created: / 28.1.1998 / 22:27:25 / cg"
!

_MComponentPeer_pReshape:nativeContext
    self commonReshapeComponent:nativeContext

    "Created: / 18.11.1998 / 00:18:17 / cg"
!

_MComponentPeer_pSetBackground:nativeContext
    |view jClr rgb clr|

    view := self viewForWPeer:nativeContext.
    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.

    clr := Color rgbValue:rgb.

    clr := clr on:(view device).
    (view isKindOf:ScrollableView) ifTrue:[
        view := view scrolledView
    ].
    view viewBackground:clr.
    view backgroundPaint:clr.
!

_MComponentPeer_pSetFont:nativeContext
    |view jFont stFont name style size|

    view := self viewForWPeer:nativeContext.
    jFont := nativeContext argAt:1.

    stFont := jFont instVarNamed:'pData'.
    (stFont isNil or:[stFont == 0]) ifTrue:[
        name := jFont instVarNamed:'name'.
        style := jFont instVarNamed:'style'.
        size := jFont instVarNamed:'size'.

        stFont := self replacementFontFor:(Java as_ST_String:name) style:style size:size.
        jFont instVarNamed:'pData' put:stFont.
    ].
    view font:stFont.

    ^ nil
!

_MComponentPeer_pSetForeground:nativeContext
    |view jClr rgb clr|

    view := self viewForWPeer:nativeContext.
    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.

    clr := Color rgbValue:rgb.

    clr := clr on:(view device).

    (view isKindOf:ScrollableView) ifTrue:[
        view := view scrolledView
    ].
    view foregroundColor:clr.
!

_MComponentPeer_pShow:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.

    "/ frame views are under my browsers own control
    (view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	view beVisible.
	view realize.
    ].

"/    view windowGroup notNil ifTrue:[
"/        windowServer addGroup:(view windowGroup)
"/    ].

    ^ nil

"/ self halt.

    "Modified: / 25.1.1998 / 09:54:07 / cg"
    "Created: / 18.11.1998 / 00:21:51 / cg"
!

_MComponentPeer_setBackground:nativeContext
    |jClr rgb clr view|

    view := self viewForWPeer:nativeContext.

    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.
"/ self halt.
    clr := Color rgbValue:rgb.


    clr := clr on:(view device).

    (view isKindOf:ScrollableView) ifTrue:[
	view := view scrolledView
    ].
    view viewBackground:clr.
    view backgroundPaint:clr.

    "Created: / 17.11.1998 / 23:49:41 / cg"
!

_MComponentPeer_setCursor:nativeContext

    "Created: / 28.1.1998 / 22:27:35 / cg"
!

_MComponentPeer_setFont:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/ self halt.

    "Modified: / 25.1.1998 / 01:22:19 / cg"
    "Created: / 17.11.1998 / 23:43:48 / cg"
!

_MComponentPeer_setForeground:nativeContext
    |jClr rgb clr view|

    view := self viewForWPeer:nativeContext.

    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.
"/ self halt.
    clr := Color rgbValue:rgb.

    clr := clr on:(view device).

    view paint:clr.

    "Created: / 17.11.1998 / 23:50:31 / cg"
    "Modified: / 17.11.1998 / 23:57:29 / cg"
!

_MFramePeer_create:nativeContext
    ^ self _WFramePeer_create:nativeContext

    "Created: / 28.1.1998 / 22:25:44 / cg"
!

_MFramePeer_getWindowBackgroundColor:nativeContext
    ^ View defaultViewBackgroundColor rgbValue.

    "Created: / 17.11.1998 / 23:55:42 / cg"
!

_MFramePeer_pHide:nativeContext
    ^ self _WComponentPeer_hide:nativeContext

    "Created: / 28.1.1998 / 22:27:04 / cg"
!

_MFramePeer_pReshape:nativeContext
    self commonReshapeComponent:nativeContext

    "Created: / 28.1.1998 / 22:28:00 / cg"
    "Modified: / 28.1.1998 / 22:29:34 / cg"
!

_MFramePeer_pSetTitle:nativeContext
    self _WWindowPeer__setTitle:nativeContext

    "Created: / 28.1.1998 / 22:30:23 / cg"
!

_MFramePeer_pShow:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.

    "/ frame views are under my browsers own control
    (view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	view beVisible.
	view realize.
    ].

"/    view windowGroup notNil ifTrue:[
"/        windowServer addGroup:(view windowGroup)
"/    ].

    ^ nil

"/ self halt.

    "Modified: / 25.1.1998 / 09:54:07 / cg"
    "Created: / 18.11.1998 / 00:19:59 / cg"
!

_MFramePeer_setInsets:nativeContext

    "Created: / 17.11.1998 / 23:55:32 / cg"
!

_MFramePeer_setResizable:nativeContext
    |view onOff|

    view := self viewForWPeer:nativeContext.

    onOff := (nativeContext argAt:1) == 1.
    view isTopView ifTrue:[
	onOff ifTrue:[
	    view minExtent:10@10.
	    view maxExtent:(Screen current extent).
	] ifFalse:[
	    view minExtent:view extent.
	    view maxExtent:view extent.
	]
    ] ifFalse:[
	(view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	    self halt.
	]
    ].

"/ 'JAVA: WWindowPeer_setResizable: ' print. view print. ' yes/no: ' print. onOff printNL.

    ^ nil

    "Modified: / 16.1.1998 / 18:08:00 / cg"
    "Created: / 17.11.1998 / 23:51:45 / cg"
!

_MToolkit_callbackLoop: nativeContext
    | toolKit |
    toolKit := nativeContext receiver.
    ^ self.
    self halt.
        self halt: 'monitors has changer, update me if you know how and why'.
    "self wakeup: toolKit."
    self halt.
    (JavaEventThread notNil and: [ JavaEventThread isDead not ]) ifTrue: [
        'JavaVM [warning]: oops - two threads executing eventLoop' errorPrintCR.
    ].
    JavaEventThread := Processor activeProcess.
    [
        [ true ] whileTrue: [
            AbortSignal handle: [:ex | ex return ] do: [ self doWindowsEventThread. ]
        ].
    ] valueNowOrOnUnwindDo: [ JavaEventThread := nil. ].

    "Created: / 17-11-1998 / 23:58:33 / cg"
    "Modified: / 08-01-1999 / 17:08:35 / cg"
    "Modified: / 22-11-2011 / 13:25:18 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_MToolkit_eventLoop: nativeContext
    | toolKit |
    (JavaEventThread notNil and: [ JavaEventThread isDead not ]) ifTrue: [
        'JavaVM [warning]: oops - two threads executing eventLoop' errorPrintCR.
    ].
    toolKit := nativeContext receiver.
    self halt: 'monitors has changer, update me if you know how and why'.
    "self wakeup: toolKit."
    self halt.
    JavaEventThread := Processor activeProcess.
    [
        [ true ] whileTrue: [
            AbortSignal handle: [:ex | ex return ] do: [ self doWindowsEventThread. ]
        ].
    ] valueNowOrOnUnwindDo: [ JavaEventThread := nil. ].

    "Created: / 17-11-1998 / 23:04:29 / cg"
    "Modified: / 08-01-1999 / 17:08:21 / cg"
    "Modified: / 22-11-2011 / 13:24:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_MToolkit_init:nativeContext

    "Created: / 28.1.1998 / 22:21:54 / cg"
!

_MToolkit_loadSystemColors:nativeContext
    ^ self _WToolkit_loadSystemColors:nativeContext
!

_MToolkit_run:nativeContext

    "Created: / 28.1.1998 / 22:22:10 / cg"
!

_Math_IEEEremainder:nativeContext
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 18:52:36 / cg"
!

_Math_acos:nativeContext
    "arc cosine"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>acos' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal arcCos

    "Created: / 7.5.1998 / 00:34:50 / cg"
    "Modified: / 11.11.1998 / 15:08:20 / cg"
!

_Math_asin:nativeContext
    "arc sine"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>asin' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal arcSin

    "Created: / 7.5.1998 / 00:34:26 / cg"
    "Modified: / 11.11.1998 / 15:08:15 / cg"
!

_Math_atan2:nativeContext
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 18:52:52 / cg"
!

_Math_atan:nativeContext
    "arc tangens"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>atan' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal arcTan

    "Created: / 6.2.1998 / 01:24:12 / cg"
    "Modified: / 11.11.1998 / 15:08:11 / cg"
!

_Math_ceil:nativeContext
    "ceiling"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>ceil' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal ceilingAsFloat

    "Created: / 7.1.1998 / 15:43:00 / cg"
    "Modified: / 11.11.1998 / 15:08:04 / cg"
!

_Math_cos:nativeContext
    "cosine"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>cos' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal cos

    "Created: / 7.1.1998 / 15:41:30 / cg"
    "Modified: / 11.11.1998 / 15:07:59 / cg"
!

_Math_exp:nativeContext
    "exponential"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>exp' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal exp

    "Created: / 7.5.1998 / 00:36:19 / cg"
    "Modified: / 11.11.1998 / 15:07:50 / cg"
!

_Math_floor:nativeContext
    "floor"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>floor' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal floorAsFloat

    "Created: / 7.1.1998 / 19:09:21 / cg"
    "Modified: / 11.11.1998 / 15:07:45 / cg"
!

_Math_log:nativeContext
    "natural logarithm"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>log' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal ln

    "Created: / 7.1.1998 / 15:42:19 / cg"
    "Modified: / 30.12.1998 / 17:41:42 / cg"
!

_Math_pow:nativeContext
    "power"

    |dVal1 dVal2|

    dVal1 := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal1 isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>pow' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    dVal2 := nativeContext argAt:3.
"/    (nativeContext argAt:4) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal2 isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>pow' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal1 raisedTo:dVal2

    "Created: / 7.1.1998 / 15:44:13 / cg"
    "Modified: / 11.11.1998 / 15:07:33 / cg"
!

_Math_rint:nativeContext
    |dVal|

    dVal := nativeContext argAt:1.
    ^ dVal rounded asFloat.
!

_Math_sin:nativeContext
    "sine"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>sin' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal sin

    "Created: / 7.1.1998 / 15:41:40 / cg"
    "Modified: / 11.11.1998 / 15:07:09 / cg"
!

_Math_sqrt:nativeContext
    "square root"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>sqrt' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].

    "/ how about domain errors ?
    dVal < 0 ifTrue:[
	^ 0.0
    ].
    ^ dVal sqrt

    "Created: / 7.1.1998 / 15:42:40 / cg"
    "Modified: / 29.12.1998 / 13:22:36 / cg"
!

_Math_tan:nativeContext
    "tangent"

    |dVal|

    dVal := nativeContext argAt:1.
"/    (nativeContext argAt:2) ~~ DUMMY_DOUBLE_HIGHWORD ifTrue:[
"/        dVal isReal ifTrue:[
"/            'JAVAVM [info]: missing double flag in Math>>tan' infoPrintCR.
"/        ] ifFalse:[
"/            self halt:'expected double arg'
"/        ]
"/    ].
    ^ dVal tan

    "Created: / 7.5.1998 / 00:34:03 / cg"
    "Modified: / 11.11.1998 / 15:07:14 / cg"
!

_MemoryAdvice_register0:nativeContext
    "private native void register0()"

    "/ UnimplementedNativeMethodSignal raise
!

_Method_getModifiers:nativeContext
    |jMethod mthd retVal|

    jMethod := nativeContext receiver.

    mthd := JavaMethods at:jMethod ifAbsent:nil.
    mthd isNil ifTrue:[
	self halt.
	^ 0
    ].
    ^ mthd accessFlags

    "Modified: / 9.4.1998 / 17:50:01 / cg"
!

_MozillaAppletContext_pMochaOnLoad:nativeContext
    |id|

    id := nativeContext argAt:1.
"/ 'JAVA: MozillaAppletContext_pMochaOnLoad: ' print. id printNL.
    ^ nil

    "Created: / 6.1.1998 / 20:37:13 / cg"
    "Modified: / 6.2.1998 / 02:13:09 / cg"
!

_MozillaAppletContext_pShowDocument:nativeContext
    |jAppletContext s1 s2 s3 js|

    jAppletContext := nativeContext receiver.
    js := nativeContext argAt:1.
    s1 := Java as_ST_String:js.
    js := nativeContext argAt:2.
    s2 := Java as_ST_String:js.
    js := nativeContext argAt:3.
    s2 := Java as_ST_String:js.

    "/ somehow pass it to the html browser ....
Transcript show:'pShowDocument: '; show:s1; show:' / ';
	   show:s2; show:' / '; showCR:s3.

    ^ nil

    "Created: / 29.3.1998 / 15:53:17 / cg"
    "Modified: / 29.12.1998 / 13:32:41 / cg"
!

_MozillaAppletContext_pShowStatus:nativeContext
    |s js|

    js := nativeContext argAt:1.
    js isNil ifTrue:[
	s := ''
    ] ifFalse:[
	s := Java as_ST_String:js.
    ].

    self activityNotification:s.
"/ Transcript showCR:s.
    ^ nil

    "Created: / 6.1.1998 / 18:31:34 / cg"
    "Modified: / 22.10.1998 / 01:17:46 / cg"
!

_MozillaAppletContext_setConsoleState0:nativeContext
    "/ void setConsoleState0 (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:23:22 / cg"
!

_ObjectInputStream_allocateNewArray:nativeContext
    "/ java.lang.Object allocateNewArray (java.lang.Class int)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:02:52 / cg"
!

_ObjectInputStream_allocateNewObject:nativeContext
    "/ java.lang.Object allocateNewObject (java.lang.Class java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:02:40 / cg"
!

_ObjectInputStream_inputClassFields:nativeContext
    "/ void inputClassFields (java.lang.Object java.lang.Class int[])
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:02:22 / cg"
!

_ObjectInputStream_invokeDefaultReadObject:nativeContext
    "/ void invokeDefaultReadObject (java.lang.Object java.lang.Class)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 03:00:47 / cg"
!

_ObjectInputStream_invokeObjectReader:nativeContext
    "/ boolean invokeObjectReader (java.lang.Object java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:03:06 / cg"
!

_ObjectInputStream_invokeReadObject:nativeContext
    "/ void invokeReadObject (java.lang.Object java.lang.Class)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 03:01:02 / cg"
!

_ObjectInputStream_loadClass0:nativeContext
    "/ java.lang.Class loadClass0 (java.lang.Class java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:01:15 / cg"
    "Modified: / 12.11.1998 / 19:01:48 / cg"
!

_ObjectOutputStream_invokeDefaultWriteObject:nativeContext
    "/ void invokeDefaultWriteObject (java.lang.Object java.lang.Class)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 03:01:36 / cg"
!

_ObjectOutputStream_invokeObjectWriter:nativeContext
    "/ boolean invokeObjectWriter (java.lang.Object java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:00:36 / cg"
    "Modified: / 12.11.1998 / 19:01:45 / cg"
!

_ObjectOutputStream_invokeWriteObject:nativeContext
    "/ void invokeWriteObject (java.lang.Object java.lang.Class)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 03:01:52 / cg"
!

_ObjectOutputStream_outputClassFields:nativeContext
    "/ void outputClassFields (java.lang.Object java.lang.Class int[])
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:00:09 / cg"
    "Modified: / 12.11.1998 / 19:01:42 / cg"
!

_ObjectStreamClass_doMismatchedRead:nativeContext
    "/ void doMismatchedRead (java.io.ObjectInputStream java.lang.Object)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 02:50:55 / cg"
!

_ObjectStreamClass_findObjectMethod0:nativeContext
    "/ boolean findObjectMethod0 (java.lang.Class int)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 02:51:50 / cg"
!

_ObjectStreamClass_getClassAccess:nativeContext
    "/ int getClassAccess (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:04:19 / cg"
!

_ObjectStreamClass_getClassDefinedUID:nativeContext
    "/ long getClassDefinedUID (java.lang.Class)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 02:51:33 / cg"
!

_ObjectStreamClass_getFieldAccess:nativeContext
    "/ int getFieldAccess (java.lang.Class java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:05:19 / cg"
!

_ObjectStreamClass_getFieldSignatures:nativeContext
    "/ java.lang.String[] getFieldSignatures (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:05:04 / cg"
!

_ObjectStreamClass_getFields0:nativeContext
    "/ java.io.ObjectStreamField[] getFields0 (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:05:32 / cg"
!

_ObjectStreamClass_getMethodAccess:nativeContext
    "/ int getMethodAccess (java.lang.Class java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:04:51 / cg"
!

_ObjectStreamClass_getMethodSignatures:nativeContext
    "/ java.lang.String[] getMethodSignatures (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:04:34 / cg"
!

_ObjectStreamClass_getSerialVersionUID:nativeContext
    "/ long getSerialVersionUID (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:05:43 / cg"
!

_ObjectStreamClass_hasWriteObject:nativeContext
    "/ boolean hasWriteObject (java.lang.Class)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 19:01:48 / cg"
    "Created: / 12.11.1998 / 19:05:53 / cg"
!

_OffScreenImageSource_sendPixels:nativeContext
    "/ self halt.
    "/ UnimplementedNativeMethodSignal raise

    "Modified: / 16.1.1998 / 18:22:23 / cg"
    "Created: / 17.1.1998 / 12:36:25 / cg"
!

_PackedColorModel_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:19:35 / cg"
!

_PlainDatagramSocketImpl_bind:nativeContext
    |jsock jaddr port sock hostName ok err|

    jsock := nativeContext receiver.
    port := nativeContext argAt:1.
    jaddr := nativeContext argAt:2.

    hostName := jaddr instVarNamed:'hostName'.
    hostName isNil ifTrue:[
	self halt.
    ] ifFalse:[
	hostName := Java as_ST_String:hostName
    ].

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket bind to ' , hostName printString, ' port ' , port printString) infoPrintCR
	].

	ok := sock bindTo:port address:nil "hostName".
	ok ifFalse:[
	    err := OperatingSystem lastErrorString.
	    Transcript showCR:'sock err: ' , err printString.
	    self throwIOExceptionWithMessage:'bind failed'.
	]
    ].

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_PlainDatagramSocketImpl_join:nativeContext
    "/ native void join (InetAddress arg1)

    |jsock addr sock ok err|

    jsock := nativeContext receiver.
    addr := nativeContext argAt:1.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket join ' , addr printString) infoPrintCR
	].
	self throwIOExceptionWithMessage:'unimplemented: join'.
self halt.
	^ nil.  "/ void
    ].

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_PlainDatagramSocketImpl_receive:nativeContext
    |jsock jdatagramPacket sock ok|

    jsock := nativeContext receiver.
    jdatagramPacket := nativeContext argAt:1.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket receive') infoPrintCR
	].
	^ -1.
    ].
    ^ -1

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_PlainDatagramSocketImpl_socketGetOption:nativeContext
    |jsock opt port sock hostName ok err|

    jsock := nativeContext receiver.
    opt := nativeContext argAt:1.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    ('JAVA: socket getOption ' , opt printString) infoPrintCR
	].
	self throwIOExceptionWithMessage:'unimplemented: getOption'.
self halt.
	^ -1.
    ].
    ^ -1.

    "Created: / 4.2.1998 / 15:06:20 / cg"
    "Modified: / 30.12.1998 / 20:10:16 / cg"
!

_PlainSocketImpl_socketAvailable:nativeContext
    |jSock sock n|

    jSock := nativeContext receiver.

    sock := self validateFile:jSock.
    sock isNil ifTrue:[
	self throwIOExceptionWithMessage:'socketAvailable on closed socket'.
	^ self.
    ].

    n := sock numAvailable.
    ^ n

    "Created: / 4.2.1998 / 16:58:49 / cg"
    "Modified: / 30.12.1998 / 20:10:08 / cg"
!

_PlainSocketImpl_socketClose:nativeContext
    |jsock sock|

    jsock := nativeContext receiver.

    sock := self validateFile:jsock.
    sock notNil ifTrue:[
	FileIOTrace ifTrue:[
	    'JAVA: close socket' infoPrintCR
	].
	sock close.
    ].

    "Modified: / 21.8.1997 / 17:09:40 / cg"
    "Created: / 25.1.1998 / 20:04:24 / cg"
!

_PlatformFont_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:30:41 / cg"
!

_PrintStream_isOutputStreamLocalised:nativeContext
    "/ boolean isOutputStreamLocalised (java.io.DataOutputStream)

    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 03:00:20 / cg"
!

_RandomAccessFile_close:nativeContext
    ^ self anyStream_close:nativeContext

    "Created: / 4.2.1998 / 13:26:53 / cg"
    "Modified: / 4.2.1998 / 15:21:08 / cg"
!

_Runtime_buildLibName:nativeContext
    |jPath jFileName path fileName libName|

    jPath := nativeContext argAt:1.
    jFileName := nativeContext argAt:2.

    path := Java as_ST_String:jPath.
    fileName := Java as_ST_String:jFileName.

    path = '__builtIn__' ifTrue:[
	libName := path , '/' , fileName
    ] ifFalse:[
	libName := path , '/lib' , fileName , '.so'.
    ].
    ^ Java as_String:libName.

    "Modified: / 8.8.1997 / 12:05:05 / cg"
    "Created: / 4.1.1998 / 19:07:14 / cg"
!

_Runtime_execInternal: nativeContext
    "Run a unix-command; return a process object."

    | cmdAndArgArray  envArray  cmd  jProcessClass  jProcess |

    cmdAndArgArray := nativeContext argAt: 1.
    envArray := nativeContext argAt: 2.
    cmd := cmdAndArgArray at: 1.
    OperatingSystem isUNIXlike ifTrue: [
        jProcessClass := self classForName: 'java.lang.UNIXProcess'.
    ] ifFalse: [ jProcessClass := Java classForName: 'java.lang.Win32Process'. ].

"/

    jProcessClass notNil ifTrue: [
        self halt.
        jProcess := jProcessClass newCleared.
        jProcess
            perform: #'<init>([Ljava/lang/String;[Ljava/lang/String;)V'
            with: cmdAndArgArray
            with: envArray.
        ^ jProcess
    ].
    self halt.
    self
        throwIOExceptionWithMessage: 'Process execution disabled/unimplemented'.
    ^ nil

    "Created: / 15.1.1998 / 01:50:31 / cg"
    "Modified: / 11.12.1998 / 13:09:36 / cg"
!

_Runtime_initializeLinkerInternal:nativeContext
    "init sharedLib linker, return searchPath as javaString"

    |path|

    "/ mhmh - what is done here ?

    path := ''.
    LibPath do:[:comp | path size == 0 ifTrue:[
			    path := path , comp
			] ifFalse:[
			    path := path , ':' , comp
			]
	       ].

    ^ Java as_String:path

    "Modified: / 7.8.1997 / 21:17:03 / cg"
    "Created: / 4.1.1998 / 17:53:15 / cg"
!

_Runtime_isInputStreamLocalised:nativeContext
    "/ boolean isInputStreamLocalised (java.io.DataInputStream)

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 03:03:01 / cg"
!

_Runtime_isOutputStreamLocalised:nativeContext
    "/ boolean isOutputStreamLocalised (java.io.DataOutputStream)

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 03:02:49 / cg"
!

_Runtime_loadFileInternal:nativeContext
    "load a sharedLib, return boolean 0 (false) if fail; 1 (true) if ok"

    |ret|

    ret := self _Runtime_loadFileInternalI:nativeContext.
    ret < 0 ifTrue:[ ret := 0 ].
    ^ ret

    "Created: / 4.1.1998 / 19:10:20 / cg"
    "Modified: / 4.1.1998 / 19:11:04 / cg"
!

_Runtime_loadFileInternalI:nativeContext
    "1.1b3 change; load a sharedLib like 'loadFileInternal',
     but return integer:
	-1   outOfMemory error
	0    failed to load
	1    loaded or already loaded (i.e. ok)"

    |jLibName libName libHandle|

    jLibName := nativeContext argAt:1.
    libName := Java as_ST_String:jLibName.

    (SimulatedLibs includes:libName) ifTrue:[
"/        ('JAVA: builtIn libLoad simulated: ' , libName) printNL.
	^ 1
    ].
    (LoadedLibs notNil and:[LoadedLibs includesKey:libName]) ifTrue:[
"/        ('JAVA: already loaded: ' , libName) printNL.
	^ 1
    ].

    libName asFilename exists ifFalse:[
	('JAVA: no file to load: ' , libName) printNL.
	^ 0
    ].

    (self confirm:'permission to load native library: ' , libName , ' ?') ifFalse:[
	^ 0
    ].

    libHandle := ObjectFileLoader loadLibrary:libName.
    libHandle isNil ifTrue:[
	('JAVA: failed to load: ' , libName) printNL.
	^ 0
    ].

    LoadedLibs isNil ifTrue:[
	LoadedLibs := Dictionary new.
    ].

    LoadedLibs at:libName put:libHandle.
    ^ 1

    "Created: / 4.1.1998 / 19:10:54 / cg"
    "Modified: / 6.2.1998 / 03:11:59 / cg"
!

_Runtime_runFinalization:nativeContext
    "/ void runFinalization ()
"/    UnimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:59:01 / cg"
!

_Runtime_runFinalizersOnExit0:nativeContext
    ""

    |onOff|

    onOff := nativeContext argAt:1.
    ^ 1

    "Modified: / 6.2.1998 / 03:11:59 / cg"
    "Created: / 15.10.1998 / 23:34:55 / cg"
!

_Runtime_setInputStreamLocalised:nativeContext

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:02:27 / cg"
!

_Runtime_setOutputStreamLocalised:nativeContext

JavaVM unimplementedNativeMethodSignal raise.

    "Modified: / 27.1.2000 / 03:02:32 / cg"
!

_Runtime_totalMemory:nativeContext
    "free memory - Returns the total number of bytes"

    ^ ObjectMemory oldSpaceSize + ObjectMemory newSpaceSize

    "Created: / 12.1.1998 / 12:59:23 / cg"
!

_Runtime_traceInstructions:nativeContext
    "/ void traceInstructions (boolean)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:59:18 / cg"
!

_Runtime_traceMethodCalls:nativeContext
    "/ void traceMethodCalls (boolean)
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:59:37 / cg"
!

_ScrollPane_initIDs:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 22:19:23 / cg"
!

_SecurityManager_classDepth:nativeContext
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:56:27 / cg"
!

_SecurityManager_classLoaderDepth:nativeContext
    |con depth|

    con := thisContext sender.
    depth := 1.
    [con notNil] whileTrue:[
	con receiver == JavaClassReader classLoaderQuerySignal ifTrue:[
	    con selector == #handle:do: ifTrue:[
		depth := depth + 1
	    ]
	].
	con := con sender.
    ].
'JAVA: classLoaderDepth -> ' infoPrint. depth infoPrintCR.
    ^ depth.

    "Created: / 13.1.1998 / 09:21:46 / cg"
    "Modified: / 13.1.1998 / 09:33:43 / cg"
!

_SecurityManager_currentClassLoader:nativeContext
    |loader|

    loader := JavaClassReader classLoaderQuerySignal query.
"/ 'JAVA: currentClassLoader -> ' infoPrint. loader displayString infoPrintCR.
    ^ loader.

    "Created: / 13.1.1998 / 09:23:28 / cg"
    "Modified: / 11.12.1998 / 12:39:59 / cg"
!

_SecurityManager_currentLoadedClass0:nativeContext
    JavaVM unimplementedNativeMethodSignal raise

    "Modified: / 12.11.1998 / 18:52:07 / cg"
    "Created: / 12.11.1998 / 18:56:41 / cg"
!

_SocketInputStream_socketRead:nativeContext
    ^ self anyStream_readBytes:nativeContext

    "Created: / 25.1.1998 / 20:56:53 / cg"
    "Modified: / 4.2.1998 / 15:52:31 / cg"
!

_SocketOutputStream_socketWrite:nativeContext
    ^ self anyStream_writeBytes:nativeContext

    "Created: / 25.1.1998 / 21:06:55 / cg"
    "Modified: / 4.2.1998 / 15:52:40 / cg"
!

_String_compareTo:nativeContext
    "int compareTo (java.lang.String)"

    |jString1 jString2|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:28:59 / cg"
!

_String_equals:nativeContext
    |jString1 jString2|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    ^ (jString1 instVarAt:1) = (jString2 instVarAt:1)

    "Created: / 18.11.1998 / 00:52:03 / cg"
    "Modified: / 18.11.1998 / 00:53:01 / cg"
!

_String_equalsIgnoreCase:nativeContext
    "boolean equalsIgnoreCase (java.lang.String)"

    |jString1 jString2|

self halt:'untested'.

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    ^ (jString1 instVarAt:1) sameAs: (jString2 instVarAt:1)

    "Modified: / 18.11.1998 / 00:53:01 / cg"
    "Created: / 27.1.2000 / 02:27:46 / cg"
!

_String_indexOf:nativeContext
    "int indexOf (java.lang.String int)"

    |jString1 jString2 idx|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    idx := nativeContext argAt:2.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:30:22 / cg"
!

_String_lastIndexOf:nativeContext
    "int lastIndexOf (java.lang.String int)"

    |jString1 jString2 idx|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    idx := nativeContext argAt:2.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:33:59 / cg"
!

_String_length:nativeContext
    |jString|

    jString := nativeContext receiver.
    ^ (jString instVarAt:3)

    "Created: / 18.11.1998 / 00:53:50 / cg"
    "Modified: / 18.11.1998 / 00:54:18 / cg"
!

_String_regionMatches2:nativeContext
    "boolean regionMatches (boolean int java.lang.String int int)"

    |jString1 bool jString2 idx1 idx2|

    jString1 := nativeContext receiver.
    bool := nativeContext argAt:1.
    jString2 := nativeContext argAt:2.
    idx1 := nativeContext argAt:3.
    idx2 := nativeContext argAt:4.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:33:40 / cg"
!

_String_regionMatches:nativeContext
    "boolean regionMatches (int java.lang.String int int)"

    |jString1 jString2 idx1 idx2|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    idx1 := nativeContext argAt:2.
    idx2 := nativeContext argAt:3.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:32:29 / cg"
!

_String_startsWith:nativeContext
    "boolean startsWith (java.lang.String int)"

    |jString1 jString2 idx|

    jString1 := nativeContext receiver.
    jString2 := nativeContext argAt:1.
    idx := nativeContext argAt:2.
JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:31:40 / cg"
!

_SystemColor_GetSysColor:nativeContext
    "/ int GetSysColor (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 27.1.2000 / 02:44:41 / cg"
!

_SystemResourceManager_getEntryFromKey:nativeContext
    "get a resource by name"

    |key s|

    key := nativeContext argAt:1.

    s := Java effectiveClassPath at:(key+1) ifAbsent:nil.
    s isNil ifTrue:[^ nil].
    ^ Java as_String:s

    "Modified: / 22-11-2010 / 13:44:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_SystemResourceManager_validateSystemResource:nativeContext
    "check a resource"

    |bool str1 str2|

    bool := nativeContext argAt:1.
    str1 := nativeContext argAt:2.
    str2 := nativeContext argAt:3.
    ^ 1 "/ true
!

_System_getCallerClass:nativeContext
    "/ introduced with jdk1.2

    |senderContext cls|

    senderContext := nativeContext sender.
    [senderContext receiver == (Java at:'java.lang.System')] whileTrue:[
	senderContext := senderContext sender.
    ].

    senderContext method isStatic ifTrue:[
	cls := senderContext receiver
    ] ifFalse:[
	cls := senderContext receiver class
    ].
    cls isJavaClass ifTrue:[
	^ self javaClassObjectForClass:cls
    ].
    (cls isMemberOf:(Java at:'java.lang.Class')) ifTrue:[
	^ Java at:'java.lang.Class'
    ].
    self halt.
    ^ nil

    "Modified: / 27.1.1998 / 18:33:13 / cg"
!

_System_validateSecurityManager:nativeContext
    "void validateSecurityManager (java.lang.SecurityManager)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:43:25 / cg"
!

_ThreadGroup_initMainThreadGroup0:nativeContext
    "void initMainThreadGroup0 (java.lang.ThreadGroup)"

JavaVM unimplementedNativeMethodSignal raise.

    "Created: / 27.1.2000 / 02:45:52 / cg"
!

_Thread_countStackFrames:nativeContext
    "/ int countStackFrames ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:06:21 / cg"
!

_Thread_start: nativeContext
    "start the thread"

    | jThread  jName  name  stProcess |
    jThread := nativeContext receiver.
    (jThread instVarNamed: 'priority') < 1 ifTrue: [
        self halt.
        jThread instVarNamed: 'priority' put: 1.
    ].
    stProcess := JavaProcess
                for: [
                    | procName |
                    Object abortSignal
                        handle: [
                            :ex |
                            procName := stProcess name.
                            (procName startsWith: 'JAVA-AWT-EventQueue') ifTrue: [
                                ('JAVA [info]: thread ' , procName , ' aborted - restarting process.')
                                    infoPrintCR.
                                ex restart.
                            ] ifFalse: [
                                (stProcess == JavaScreenUpdaterThread
                                    or: [ stProcess == JavaEventQueueThread ])
                                        ifTrue: [
                                            ('JAVA [info]: thread ' , procName , ' aborted - restarting process.')
                                                infoPrintCR.
                                            ex restart
                                        ]
                                        ifFalse: [ ('JAVA [info]: thread ' , procName , ' aborted.') infoPrintCR. ]
                            ].
                        ]
                        do: [
                            [
                                JavaVM javaExceptionSignal
                                    handle: [
                                        :ex |
                                        | exClass |
                                        procName := stProcess name.
                                        exClass := ex parameter class.
                                        exClass == (Java at: 'java.lang.ThreadDeath') ifTrue: [
                                            ('JAVA: thread ' , procName , ' terminated') infoPrintCR.
                                        ] ifFalse: [
                                            Transcript
                                                showCR: ('JAVA: thread ''' , procName , ''' terminated with exception: '
                                                        , exClass name).
                                        ].
                                        ex return.
                                    ]
                                    do: [
                                        Object messageNotUnderstoodSignal
                                            handle: [
                                                :ex |
                                                |
                                                "/ remap doesNotUnderstand with nil-receiver to
                                                "/ a nullPointerException ...
                                                 con  m |
                                                con := ex suspendedContext.
                                                con receiver isNil ifTrue: [
                                                    ((m := con sender method) notNil and: [ m isJavaMethod ]) ifTrue: [
                                                        self throwNullPointerException.
                                                        AbortSignal raise.

                                                        "/ ex proceed.
                                                    ]
                                                ].
                                                ex reject.
                                            ]
                                            do: [
                                                "/ Transcript showCR:(Timestamp now printString , 'start thread: ', stProcess name).
                                                jThread perform: #'run()V'.
                                                ThreadTrace == true ifTrue: [
                                                    ('JAVA: thread ' , stProcess name , ' terminated') infoPrintCR.
                                                ].
                                                jThread perform: #'exit()V'.
                                                ThreadTrace == true ifTrue: [
                                                    ('JAVA: after exit of thread ' , stProcess name) infoPrintCR.
                                                ]
                                            ]
                                    ]
                            ] ensure: [
                                | monitors |
                                monitors := EnteredMonitorsPerProcess at: stProcess ifAbsent: nil.
                                monitors notNil ifTrue: [
                                    monitors do: [
                                        :obj |
                                        | mon |
                                        mon := obj getJavaMonitorFor.
                                        mon notNil ifTrue: [
                                            mon owningProcess == stProcess ifTrue: [
                                                ('JAVA: release monitor owned by dying thread: ' , stProcess name)
                                                    infoPrintCR.
                                                mon exit
                                            ].
                                        ].
                                    ].
                                    EnteredMonitorsPerProcess removeKey: stProcess.
                                    stProcess == JavaScreenUpdaterThread ifTrue: [
                                        JavaScreenUpdaterThread := nil.
                                    ].
                                    stProcess == JavaEventQueueThread ifTrue: [ JavaEventQueueThread := nil. ].

"/                                    screenUpdaterClass := Java at:'sun.awt.ScreenUpdater'.
"/                                    screenUpdaterClass notNil ifTrue:[
"/                                        screenUpdaterClass instVarNamed:'updater' put:nil.
"/                                    ].
                                ].
                                Java removeThread: jThread ifAbsent: [].
                            ]
                        ]
                ]
                priority: (Processor activePriority).
    jName := jThread instVarNamed: 'name'.
    jName isString ifFalse: [ name := Java as_ST_String: jName. ] ifTrue: [
        name := jName
    ].

    "/ kludge - remember the ScreenUpdater ...

    name = 'Screen Updater' ifTrue: [ JavaScreenUpdaterThread := stProcess. ] ifFalse: [
        name = 'AWT-Windows' ifTrue: [ JavaEventThread := stProcess. ] ifFalse: [
            (name startsWith: 'AWT-EventQueue') ifTrue: [
                JavaEventQueueThread := stProcess.
            ].
        ]
    ].

"/name = 'UserDialogShowThread' ifTrue:[
"/self halt
"/].
    "/ when that process terminates, wakup any waiters

    stProcess addExitAction: [ self notify: jThread ].
    stProcess name: 'JAVA-' , name.
    stProcess restartable: true.
    stProcess resume.
    Java addThread: jThread for: stProcess.
    ^ nil

    "Created: / 03-01-1998 / 02:05:52 / cg"
    "Modified: / 24-12-1999 / 03:14:33 / cg"
    "Modified: / 09-12-2011 / 12:52:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 27-08-2012 / 11:36:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_Thread_suspend0:nativeContext
    "yield"

    |jThread stProcess|

    jThread := nativeContext receiver.
    stProcess := JavaVM stProcessForJavaThread:jThread.
    stProcess isNil ifTrue:[
	ThreadTrace == true ifTrue:[
	    ('JAVA: no stProcess for javaThread: ' , jThread displayString) printNL.
	].
	^ nil "void"
    ].
    stProcess suspend

    "Created: / 8.1.1998 / 01:05:49 / cg"
    "Modified: / 6.2.1998 / 02:15:23 / cg"
!

_Throwable_printStackTrace0:nativeContext
    |out outStream exceptionObject contextList|

    outStream := nativeContext argAt:1.
    exceptionObject := nativeContext receiver.

    contextList := exceptionObject instVarNamed:'backtrace'.

    out := self javaConsoleStream.
    out cr.
    out nextPutLine:'JAVA: stackTrace:'.

    contextList do:[:con |
	out
	    nextPutAll:'  ';
	    nextPutAll:(con method javaClass fullName);
	    nextPutAll:'.';
	    nextPutAll:(con method selector);
	    nextPutAll:' [';
	    nextPutAll:(con method javaClass sourceFile);
	    nextPutAll:' ';
	    nextPutAll:(con quickLineNumber displayString);
	    nextPutAll:']'.
	out cr
    ].
    out nextPutLine:'----------------------------------------------------'

    "Created: / 4.1.1998 / 14:27:40 / cg"
    "Modified: / 10.11.1998 / 14:19:32 / cg"
!

_URLConnection_close:nativeContext
    "/ void close ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:26:03 / cg"
!

_URLConnection_finalize:nativeContext
    "/ void finalize ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:22 / cg"
!

_URLConnection_getContentLength0:nativeContext
    "/ int getContentLength0 ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:34 / cg"
!

_URLConnection_getContentType0:nativeContext
    "/ java.lang.String getContentType0 ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:42 / cg"
!

_URLConnection_getHeaderField0:nativeContext
    "/ java.lang.String getHeaderField0 (java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:53 / cg"
!

_URLConnection_pCreate:nativeContext
    "/ void pCreate (java.lang.String java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:14 / cg"
!

_URLInputStream_available:nativeContext
    "/ int available ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:26 / cg"
!

_URLInputStream_open:nativeContext
    "/ void open ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:01 / cg"
!

_URLInputStream_read:nativeContext
    "/ int read (byte[] int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:12 / cg"
!

_URLOutputStream_open:nativeContext
    "/ void open ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:38 / cg"
!

_URLOutputStream_pClose:nativeContext
    "/ void pClose ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:25:02 / cg"
!

_URLOutputStream_write:nativeContext
    "/ void write (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:45 / cg"
!

_URLOutputStream_writeBytes:nativeContext
    "/ void writeBytes (byte[] int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:24:55 / cg"
!

_URLStreamHandlerFactory_pInit:nativeContext
    "/ self unimplementedNativeMethod.

    "Created: / 10.1.1998 / 15:47:24 / cg"
!

_URLStreamHandlerFactory_pSupportsProtocol:nativeContext
    "/ boolean pSupportsProtocol (java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:23:43 / cg"
!

_VM_getState:nativeContext
    "/ int getState ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:06:44 / cg"
!

_VM_resetJavaMonitor:nativeContext
    "/ void resetJavaMonitor ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 14.11.1998 / 10:43:23 / cg"
!

_VM_resumeJavaMonitor:nativeContext
    "/ void resumeJavaMonitor ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 14.11.1998 / 10:42:49 / cg"
!

_VM_suspendJavaMonitor:nativeContext
    "/ void suspendJavaMonitor ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 14.11.1998 / 10:43:07 / cg"
!

_VM_threadsSuspended:nativeContext
    "/ boolean threadsSuspended ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:07:10 / cg"
!

_VM_unsuspendSomeThreads:nativeContext
    "/ void unsuspendSomeThreads ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:07:29 / cg"
!

_VM_unsuspendThreads:nativeContext
    "/ void unsuspendThreads ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:07:20 / cg"
!

_VM_writeJavaMonitorReport:nativeContext
    "/ void writeJavaMonitorReport ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 14.11.1998 / 10:43:37 / cg"
!

_WButtonPeer_create:nativeContext
    |jButtonPeer jButton jFrame frame button
     lbl|

    jButtonPeer := nativeContext receiver.
    jButton := jButtonPeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    button := Button in:frame.
    button sizeFixed:true.
    button action:[
			jButtonPeer perform:#'handleAction()V'.
		  ].

    lbl := jButton instVarNamed:'label'.
    lbl notNil ifTrue:[
	lbl := Java as_ST_String:lbl.
	button label:lbl
    ].
    self createdWindowsView:button for:jButtonPeer.

    WindowCreationTrace == true ifTrue:[
	'WButtonPeer_create: ' print. frame print. ' -> ' print. button printNL.
    ].

    "Created: / 5.1.1998 / 01:53:30 / cg"
    "Modified: / 11.12.1998 / 00:19:22 / cg"
!

_WButtonPeer_setLabel:nativeContext
    |label jString|

    jString := nativeContext argAt:1.

    label := self viewForWPeer:nativeContext.
    label label:(Java as_ST_String:jString)

    "Modified: / 8.1.1998 / 17:35:50 / cg"
    "Created: / 1.2.1998 / 17:05:47 / cg"
!

_WCanvasPeer_create:nativeContext
    |jCanvasPeer jFrame frame subView|

    jCanvasPeer := nativeContext receiver.

    jFrame := nativeContext argAt:1.
    jFrame isNil ifTrue:[
	self halt:'no frame in canvasPeer create'.
	subView := JavaView new.
"/        self internalError:'no frame in canvasPeer create'.
"/        ^ self.
    ] ifFalse:[
	frame := jFrame instVarNamed:'pData'.
	subView := JavaView in:frame.
    ].

    subView delegate:self.
    subView javaPeer:jCanvasPeer.

    self createdWindowsView:subView for:jCanvasPeer.

    WindowCreationTrace == true ifTrue:[
	'WCanvasPeer_create: ' print. frame print. ' -> ' print. subView printNL.
    ].

    "Created: / 5.1.1998 / 00:59:19 / cg"
    "Modified: / 16.1.1998 / 13:40:00 / cg"
!

_WCheckboxMenuItemPeer_setState:nativeContext
    "/ void setState (boolean)
"/    UnimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:14:35 / cg"
    "Modified: / 3.12.1998 / 21:41:13 / cg"
!

_WCheckboxPeer_create:nativeContext
    |jCheckboxPeer jCheckbox jFrame frame checkBox lbl|

    jCheckboxPeer := nativeContext receiver.
    jCheckbox := jCheckboxPeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    checkBox := CheckBox in:frame.
    checkBox action:[
			jCheckboxPeer
			    perform:#'handleAction(Z)V'
			    with:(checkBox isOn ifTrue:[1] ifFalse:[0])
		    ].

    lbl := jCheckbox instVarNamed:'label'.
    lbl notNil ifTrue:[
	lbl := Java as_ST_String:lbl.
	checkBox label:lbl
    ].

    self createdWindowsView:checkBox for:jCheckboxPeer.

    WindowCreationTrace == true ifTrue:[
	'WCheckboxPeer_create: ' print. frame print. ' -> ' print. checkBox printNL.
    ].

    "Created: / 7.1.1998 / 21:48:03 / cg"
    "Modified: / 15.1.1998 / 12:27:04 / cg"
!

_WCheckboxPeer_setCheckboxGroup:nativeContext
    |checkBox jGroup|

    checkBox := self viewForWPeer:nativeContext.

    jGroup := nativeContext argAt:1.

    "Created: / 7.1.1998 / 21:48:47 / cg"
    "Modified: / 25.1.1998 / 01:20:42 / cg"
!

_WCheckboxPeer_setLabel:nativeContext
    "/ void setLabel (java.lang.String)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:14:53 / cg"
!

_WCheckboxPeer_setState:nativeContext
    |checkBox state|

    checkBox := self viewForWPeer:nativeContext.

    state := nativeContext argAt:1.
    state ~~ 0 ifTrue:[
	checkBox turnOn
    ] ifFalse:[
	checkBox turnOff
    ].

    "Created: / 7.1.1998 / 21:49:13 / cg"
    "Modified: / 25.1.1998 / 01:26:18 / cg"
!

_WChoicePeer_addItem:nativeContext
    |jString index comboBox|

    comboBox := self viewForWPeer:nativeContext.

    jString := nativeContext argAt:1.
    index := nativeContext argAt:2.

    comboBox model list addLast:(Java as_ST_String:jString).
    comboBox model changed:#list.

    "Created: / 7.1.1998 / 21:45:12 / cg"
    "Modified: / 24.1.1998 / 18:51:32 / cg"
!

_WChoicePeer_create:nativeContext
    |jChoicePeer jChoice jFrame frame comboBox|

    jChoicePeer := nativeContext receiver.
    jChoice := jChoicePeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    comboBox := ComboListView in:frame.
    comboBox model:(SelectionInList new list:(OrderedCollection new)).
    comboBox action:[:index |
			jChoicePeer
			    perform:#'handleAction(I)V'
			    with:(comboBox model selectionIndex - 1)
		    ].

    self createdWindowsView:comboBox for:jChoicePeer.

    WindowCreationTrace == true ifTrue:[
	'WChoicePeer_create: ' print. frame print. ' -> ' print. comboBox printNL.
    ].

    "Created: / 7.1.1998 / 21:44:31 / cg"
    "Modified: / 28.1.1998 / 23:19:17 / cg"
!

_WChoicePeer_remove:nativeContext
    "/ void remove (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:12:20 / cg"
!

_WChoicePeer_reshape:nativeContext
    self commonReshapeComponent:nativeContext.
"/    self pReshape:nativeContext.
    ^ self.

    "Created: / 7.1.1998 / 21:46:18 / cg"
    "Modified: / 23.12.1998 / 19:08:07 / cg"
!

_WChoicePeer_select:nativeContext
    |comboBox index|

    comboBox := self viewForWPeer:nativeContext.

    index := nativeContext argAt:1.
    comboBox model selectionIndex:(index + 1).  "/ JAVA indexing starts at 0

    "Created: / 7.1.1998 / 21:45:43 / cg"
    "Modified: / 25.1.1998 / 09:55:05 / cg"
!

_WClipboard_getClipboardText:nativeContext
    "/ java.lang.String getClipboardText ()

    |str|

    str := Screen current rootView getTextSelection.
    str isNil ifTrue:[
	str := ''.
    ].
    ^ Java as_String:''.

    "Modified: / 10.12.1998 / 21:28:29 / cg"
!

_WClipboard_init:nativeContext
"/ self halt.

    "Modified: / 18.3.1997 / 18:43:18 / cg"
    "Created: / 4.1.1998 / 19:03:59 / cg"
!

_WClipboard_setClipboardText:nativeContext
    "/ void setClipboardText (java.awt.datatransfer.StringSelection)

    |strSel data|

    strSel := nativeContext argAt:1.
    data := strSel instVarNamed:'data'.
    data class == (Java at:'java.lang.String') ifTrue:[
	Screen current rootView setTextSelection:(Java as_ST_String:data)
    ].
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:15:31 / cg"
    "Modified: / 10.12.1998 / 21:25:20 / cg"
!

_WColor_getDefaultColor: nativeContext
    | clrIndex  jClr  clr |

    clrIndex := nativeContext argAt: 1.

    "/ windows defaults:
    "/  1: view background

    clrIndex == 1 ifTrue: [
        clr := View defaultViewBackgroundColor.
        clr isColor ifFalse: [ clr := Color gray: 50. ].
    ].
    clrIndex == 2 ifTrue: [ clr := Color black. ].
    clr isNil ifTrue: [
        self halt.
        self internalError: 'breakpoint'.
        ^ nil.
    ].
    clr := clr on: (Screen current).
    jClr := (self classForName: 'java.awt.Color') new.
    jClr instVarNamed: 'pData' put: clr.
    jClr instVarNamed: 'value' put: (clr rgbValue).

"/ self halt.

    ^ jClr.

    "Created: / 15.8.1997 / 15:38:10 / cg"
    "Modified: / 4.1.1998 / 18:06:51 / cg"
!

_WComponentPeer__beginValidate:nativeContext
    "/ void _beginValidate ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:10:08 / cg"
!

_WComponentPeer__dispose:nativeContext
    |view jPeer|

    view := self viewForWPeer:nativeContext.

    Object errorSignal catch:[
	view destroy.
    ].
    JavaWindowGroup removeView:view.

    jPeer := nativeContext receiver.
    jPeer instVarNamed:'pData' put:0.

    "Created: / 7.1.1998 / 22:36:25 / cg"
    "Modified: / 25.1.1998 / 16:43:06 / cg"
!

_WComponentPeer__setBackground:nativeContext
    |rgb clr view|

    view := self viewForWPeer:nativeContext.
    view isNil ifTrue:[^ self].

    rgb := nativeContext argAt:1.
    clr := Color rgbValue:rgb.

"/ self halt.
"/ self internalError:'breakPoint'.

    clr := clr on:(view device).

"/    (view superView isMemberOf:JavaEmbeddedFrameView) ifTrue:[
"/        view viewBackground:(view superView viewBackground).
"/        view backgroundPaint:(view superView viewBackground).
"/    ] ifFalse:[
"/        (view isMemberOf:JavaView) ifTrue:[
"/            view viewBackground:clr.
"/            view backgroundPaint:clr.
"/        ]
"/    ].

    (view isKindOf:ScrollableView) ifTrue:[
	view := view scrolledView
    ].
    view viewBackground:clr.
    view backgroundPaint:clr.

    "Created: / 4.1.1998 / 18:07:39 / cg"
    "Modified: / 4.12.1998 / 17:26:06 / cg"
!

_WComponentPeer__setForeground:nativeContext
    |rgb clr view|

    view := self viewForWPeer:nativeContext.

    rgb := nativeContext argAt:1.
    clr := Color rgbValue:rgb.

"/ self halt.
"/ self internalError:'breakPoint'.

    clr := clr on:(view device).

    view paint:clr.

    "Created: / 4.1.1998 / 18:08:13 / cg"
    "Modified: / 8.1.1998 / 17:32:45 / cg"
!

_WComponentPeer_disable:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.

    Object errorSignal handle:[:ex |
    ] do:[
	view disable
    ]

    "Created: / 6.1.1998 / 18:26:36 / cg"
    "Modified: / 8.1.1998 / 17:32:53 / cg"
!

_WComponentPeer_enable:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.

    Object errorSignal handle:[:ex |
    ] do:[
	view enable
    ]

    "Modified: / 8.1.1998 / 17:32:53 / cg"
    "Created: / 13.1.1998 / 23:08:05 / cg"
!

_WComponentPeer_endValidate:nativeContext
    "/ void endValidate ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:10:20 / cg"
!

_WComponentPeer_getLocationOnScreen: nativeContext
    "/ java.awt.Point getLocationOnScreen ()

    | view  p  jP |

    view := self viewForWPeer: nativeContext.
    view isNil ifTrue: [ ^ nil ].
    p := view originRelativeTo: nil.
    jP := (self classForName: 'java.awt.Point') basicNew.
    jP instVarNamed: 'x' put: p x.
    jP instVarNamed: 'y' put: p y.
    ^ jP

    "Modified: / 5.12.1998 / 14:44:31 / cg"
!

_WComponentPeer_handleEvent:nativeContext
    "this is invoked by java, to let a widget handle any event which
     was not consumed (eaten) by java.
     If the view in question is some ST-widget, forward it.
     Ignore for JavaViews."

    |view jEv stEv ignore|

    view := self viewForWPeer:nativeContext.
    view notNil ifTrue:[
	jEv := nativeContext argAt:1.
	stEv := jEv instVarNamed:'data'.
	(stEv notNil and:[stEv ~~ 0]) ifTrue:[
	    ignore := true.
	    view isJavaView ifFalse:[
		ignore := false
	    ] ifTrue:[
		view isTopView ifTrue:[
		    stEv type == #terminate ifTrue:[
			ignore := false
		    ].
		]
	    ].

	    ignore ifFalse:[
		EventTrace == true ifTrue:[
		    ('JAVA: WComponent - handleEvent: ' , stEv type , ' for ' , view printString) infoPrintCR.
		].
		view dispatchEvent:stEv.
		^ self.
	    ].

	    EventTrace == true ifTrue:[
		('JAVA: WComponent - handleEvent ignored:' , stEv type) infoPrintCR.
	    ].
	    ^ self
	]
    ].
    EventTrace == true ifTrue:[
	('JAVA: WComponent - handleEvent ignored') infoPrintCR.
    ]

    "Created: / 6.1.1998 / 21:10:17 / cg"
    "Modified: / 11.12.1998 / 01:04:14 / cg"
!

_WComponentPeer_hide:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/ view isPopUpView ifTrue:[self halt].

    Object errorSignal handle:[:ex |
    ] do:[
	view beInvisible
    ]

    "Created: / 7.1.1998 / 22:35:32 / cg"
    "Modified: / 4.12.1998 / 17:53:41 / cg"
!

_WComponentPeer_nativeHandleEvent:nativeContext
    "this is invoked by java, to let a widget handle any event which
     was not consumed (eaten) by java.
     If the view in question is some ST-widget, forward it.
     Ignore for JavaViews."

    |view jEv stEv|

^self.
    view := self viewForWPeer:nativeContext.
    view notNil ifTrue:[
	(view isKindOf:JavaView) ifFalse:[
	    jEv := nativeContext argAt:1.
	    stEv := jEv instVarNamed:'data'.
	    (stEv notNil and:[stEv ~~ 0]) ifTrue:[
		EventTrace == true ifTrue:[
		    ('JAVA: WComponent - handleEvent: ' , stEv type , ' for ' , view printString) infoPrintCR.
		].
		stEv sendEventWithFocusOn:nil.
		^ self.
	    ]
	]
    ].
    EventTrace == true ifTrue:[
	('JAVA: WComponent - handleEvent ignored') infoPrintCR.
    ]

    "Created: / 19.10.1998 / 21:26:16 / cg"
    "Modified: / 19.10.1998 / 23:26:37 / cg"
!

_WComponentPeer_requestFocus:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/ 'getFocus - ' print. view displayString printCR.

"/    view getKeyboardFocus

    "Created: / 7.1.1998 / 22:30:03 / cg"
    "Modified: / 4.12.1998 / 19:42:18 / cg"
!

_WComponentPeer_reshape:nativeContext
    self commonReshapeComponent:nativeContext

    "Modified: / 18.3.1997 / 19:30:21 / cg"
    "Created: / 4.1.1998 / 18:01:11 / cg"
!

_WComponentPeer_setBackground:nativeContext
    |jClr rgb clr view|

    view := self viewForWPeer:nativeContext.

    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.
"/ self halt.
    clr := Color rgbValue:rgb.


    clr := clr on:(view device).

"/    (view superView isMemberOf:JavaEmbeddedFrameView) ifTrue:[
"/        view viewBackground:(view superView viewBackground).
"/        view backgroundPaint:(view superView viewBackground).
"/    ] ifFalse:[
"/        (view isMemberOf:JavaView) ifTrue:[
"/            view viewBackground:clr.
"/            view backgroundPaint:clr.
"/        ]
"/    ].

    (view isKindOf:ScrollableView) ifTrue:[
	view := view scrolledView
    ].
    view viewBackground:clr.
    view backgroundPaint:clr.

    "Created: / 16.10.1998 / 02:16:31 / cg"
    "Modified: / 16.10.1998 / 02:26:29 / cg"
!

_WComponentPeer_setCursor:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/ self halt.

    "Created: / 5.1.1998 / 01:52:30 / cg"
    "Modified: / 25.1.1998 / 01:21:52 / cg"
!

_WComponentPeer_setFont:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/ self halt.

    "Created: / 5.1.1998 / 00:55:17 / cg"
    "Modified: / 25.1.1998 / 01:22:19 / cg"
!

_WComponentPeer_setForeground:nativeContext
    |jClr rgb clr view|

    view := self viewForWPeer:nativeContext.

    jClr := nativeContext argAt:1.
    rgb := jClr instVarNamed:'value'.
"/ self halt.
    clr := Color rgbValue:rgb.


    clr := clr on:(view device).

    (view isKindOf:ScrollableView) ifTrue:[
	view := view scrolledView
    ].
    view paint:clr.

    "Created: / 16.10.1998 / 02:18:58 / cg"
    "Modified: / 16.10.1998 / 02:26:37 / cg"
!

_WComponentPeer_setZOrderPosition:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
"/    self unimplementedNativeMethod.
"/ self halt.
"/ self internalError:'breakPoint'

    "Created: / 4.1.1998 / 17:59:26 / cg"
    "Modified: / 25.1.1998 / 01:22:32 / cg"
!

_WComponentPeer_show:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.

    "/ frame views are under my browsers own control
    (view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	view beVisible.
	view realize.
    ].

"/    view windowGroup notNil ifTrue:[
"/        windowServer addGroup:(view windowGroup)
"/    ].

    ^ nil

"/ self halt.

    "Created: / 5.1.1998 / 01:26:22 / cg"
    "Modified: / 4.12.1998 / 17:43:53 / cg"
!

_WComponentPeer_start:nativeContext
"/ self halt.

    "Modified: / 18.3.1997 / 18:43:18 / cg"
    "Created: / 5.1.1998 / 00:58:40 / cg"
!

_WContainerPeer_calculateInsets:nativeContext
    "/ new with ns4.0 ...

    "Created: / 16.10.1998 / 02:12:59 / cg"
!

_WDefaultFontCharset_canConvert:nativeContext
    ^ 1

    "Modified: / 21.8.1997 / 15:56:57 / cg"
    "Created: / 5.1.1998 / 01:55:47 / cg"
!

_WDialogPeer__hide:nativeContext
    |dialog|

    dialog := self viewForWPeer:nativeContext.

    dialog hide.

    "Created: / 7.1.1998 / 22:34:10 / cg"
    "Modified: / 8.1.1998 / 17:34:10 / cg"
!

_WDialogPeer__show:nativeContext
    |dialog|

    dialog := self viewForWPeer:nativeContext.
"/
"/ show does not work (yet); must setup windowgroup
"/ for it to get events ...
"/    dialog realize.

dialog show.
"/dialog fixSize.
"/dialog makeFullyVisible.
"/dialog openModal:[true] inGroup:JavaWindowGroup

    "Created: / 7.1.1998 / 21:52:15 / cg"
    "Modified: / 11.12.1998 / 14:43:05 / cg"
!

_WDialogPeer_create:nativeContext
    |jDialogPeer dialog|

    jDialogPeer := nativeContext receiver.

    dialog := ModalBox new.
    jDialogPeer instVarNamed:'pData' put:dialog.

    self createdWindowsView:dialog for:jDialogPeer.
    dialog windowGroup:JavaWindowGroup.
    JavaWindowGroup addTopView:dialog.

    WindowCreationTrace == true ifTrue:[
	'WDialogPeer_create: ' print. dialog printNL.
    ].

    "Created: / 7.1.1998 / 21:51:00 / cg"
    "Modified: / 15.1.1998 / 16:12:44 / cg"
!

_WDrawingSurfaceInfo_getDepth:nativeContext
    "/ int getDepth ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:21:00 / cg"
!

_WDrawingSurfaceInfo_getHBitmap:nativeContext
    "/ int getHBitmap ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:32 / cg"
!

_WDrawingSurfaceInfo_getHDC:nativeContext
    "/ int getHDC ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:50 / cg"
!

_WDrawingSurfaceInfo_getHPalette:nativeContext
    "/ int getHPalette ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:21:07 / cg"
!

_WDrawingSurfaceInfo_getHWnd:nativeContext
    "/ int getHWnd ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:23 / cg"
!

_WDrawingSurfaceInfo_getPBits:nativeContext
    "/ int getPBits ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:41 / cg"
!

_WDrawingSurfaceInfo_lock:nativeContext
    "/ int lock ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:00 / cg"
!

_WDrawingSurfaceInfo_unlock:nativeContext
    "/ void unlock ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:20:13 / cg"
!

_WEmbeddedFramePeer_create:nativeContext
    "/ void create (sun.awt.windows.WComponentPeer)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:16:09 / cg"
!

_WFileDialogPeer_show:nativeContext
    |jDialogPeer jDialog dialogView stDialog
     title dir pattern f|

    jDialogPeer := nativeContext receiver.
    jDialog := jDialogPeer instVarNamed:'target'.
    dialogView := jDialogPeer instVarNamed:'pData'.

    stDialog := FileSelectionBox new.

    dir := jDialog instVarNamed:'dir'.
    dir notNil ifTrue:[
	stDialog directory:(Java as_ST_String:dir).
    ].
    pattern := jDialog instVarNamed:'file'.
    pattern notNil ifTrue:[
	stDialog pattern:(Java as_ST_String:pattern).
    ].
    title := jDialog instVarNamed:'title'.
    title notNil ifTrue:[
	stDialog title:(Java as_ST_String:title).
	stDialog label:(Java as_ST_String:title).
    ].

    stDialog show.

    stDialog accepted ifTrue:[
	f := stDialog pathName.

	"/ cannot use the one below - it has a builtIn fileSeparator if '\' (sigh)
	"/ jDialogPeer perform:#'handleSelected(Ljava/lang/String;)V' with:(Java as_String:f).

	jDialog
	    perform:#'setFile(Ljava/lang/String;)V'
	    with:(Java as_String:(f asFilename baseName)).
	jDialog
	    perform:#'setDirectory(Ljava/lang/String;)V'
	    with:(Java as_String:(f asFilename directoryName , Filename separator asString)).
	jDialog
	    perform:#'setVisible(Z)V'
	    with:0.
    ] ifFalse:[
	jDialogPeer
	    perform:#'handleCancel()V'
    ].
"/ self halt.

    "Created: / 7.1.1998 / 22:38:45 / cg"
    "Modified: / 15.1.1998 / 13:04:05 / cg"
!

_WFontMetrics_bytesWidth:nativeContext
    "/ int bytesWidth (byte[] int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:11:46 / cg"
!

_WFontMetrics_getMFCharSegmentWidth:nativeContext
    "get multi-font string-segment width.
     Not yet supported - use standard strings width"

    |jMetrics jFont jFontDescr stFont w
     bool1 cp offs lenght bp int1|

    jMetrics := nativeContext receiver.
    jFont := nativeContext argAt:1.
    jFontDescr := nativeContext argAt:2.
    bool1 := nativeContext argAt:3.
    cp := nativeContext argAt:4.
    offs := nativeContext argAt:5.
    lenght := nativeContext argAt:6.
    bp := nativeContext argAt:7.
    int1 := nativeContext argAt:8.

    stFont := jFont instVarNamed:'pData'.
    (stFont isNil or:[stFont == 0]) ifTrue:[
	self halt
    ].

    stFont device isNil ifTrue:[
	stFont := stFont on:Display.
	jFont instVarNamed:'pData' put:stFont.
    ].
    w := stFont widthOf:cp from:offs+1 to:offs+lenght.
    ^ w.

    "Created: / 5.1.1998 / 01:57:45 / cg"
    "Modified: / 13.1.1998 / 23:44:03 / cg"
!

_WFontMetrics_init:nativeContext
    |jMetrics jFont stFont widths family name style size|

    jMetrics := nativeContext receiver.
    jFont := jMetrics instVarNamed:'font'.

    family := jFont instVarNamed:'family'.
    family := Java as_ST_String:family.

    name := jFont instVarNamed:'name'.
    name := Java as_ST_String:name.

    style := jFont instVarNamed:'style'.
    size := jFont instVarNamed:'size'.

    stFont := Font family:family size:size.
    stFont isNil ifTrue:[
        stFont := Font family:'helvetica' size:size.
    ].
    stFont := stFont on:Display.
self halt.
"/    stFont := jFont instVarNamed:'pData'.
"/    stFont isNil ifTrue:[
"/        self halt
"/    ].

    stFont := stFont on:Display.
    jFont instVarNamed:'pData' put:stFont.

    jMetrics instVarNamed:'ascent'     put:stFont ascent.
    jMetrics instVarNamed:'descent'    put:stFont descent.
    jMetrics instVarNamed:'leading'    put:0.
    jMetrics instVarNamed:'height'     put:stFont height.
    jMetrics instVarNamed:'maxAscent'  put:stFont maxAscent.
    jMetrics instVarNamed:'maxDescent' put:stFont maxDescent.
    jMetrics instVarNamed:'maxHeight'  put:stFont maxHeight.
    jMetrics instVarNamed:'maxAdvance' put:stFont maxWidth.

    widths := Array new:256.
    0 to:255 do:[:i |
        widths at:(i+1) put:(stFont widthOf:(Character value:i))
    ].
    jMetrics instVarNamed:'widths' put:widths.
"/ self halt.

    "Modified: / 8.8.1997 / 12:06:53 / cg"
    "Created: / 5.1.1998 / 01:54:29 / cg"
!

_WFontMetrics_needsConversion:nativeContext
    |jFont jFontDescr stFont|

    jFont := nativeContext argAt:1.
    jFontDescr := nativeContext argAt:2.

    stFont := jFont instVarNamed:'pData'.
"/    stFont isNil ifTrue:[
"/        self halt
"/    ].
"/    stFont device isNil ifTrue:[
"/        stFont := stFont on:Display.
"/        jFont instVarNamed:'pData' put:stFont.
"/    ].
"/

    ^ 0

    "Modified: / 17.8.1997 / 17:16:29 / cg"
    "Created: / 5.1.1998 / 01:56:42 / cg"
!

_WFramePeer__setIconImage:nativeContext
    |frame imgRep image|

    frame := self viewForWPeer:nativeContext.
    imgRep := nativeContext argAt:1.
    imgRep notNil ifTrue:[
	image := imgRep instVarNamed:'pData'.
	(image notNil and:[image ~~ 0]) ifTrue:[
	    frame icon:image.
	]
    ].

    "Created: / 27.4.1998 / 17:15:09 / cg"
    "Modified: / 27.4.1998 / 17:18:24 / cg"
!

_WFramePeer_create:nativeContext
    |jFramePeer jFrame top frame pDataIdx|

    jFramePeer := nativeContext receiver.

    "/ for now: a kludge to create an embedded frame for
    "/ mozillaFrames

    jFrame := jFramePeer instVarNamed:'target'.
    (jFrame notNil
    and:[(pDataIdx := jFrame class instVarOffsetOf:'pData') notNil])
    ifTrue:[
	((frame := jFrame instVarAt:pDataIdx) notNil
	and:[frame ~~ 0]) ifTrue:[
	    WindowCreationTrace == true ifTrue:[
		'JAVA: targetFrame view already created: ' infoPrintCR.
	    ].
	    "/ sigh; pData was renamed to pNativeWidget in jdk1.2 ...
	    pDataIdx := jFramePeer class instVarOffsetOf:'pNativeWidget'.
	    pDataIdx isNil ifTrue:[
		"/ ok, we are < 1.2
		pDataIdx := jFramePeer class instVarOffsetOf:'pData'.
	    ].
	    jFramePeer instVarAt:pDataIdx put:frame.
	]
    ] ifFalse:[
	frame := jFramePeer instVarNamed:'pData'
    ].

    (frame notNil and:[frame ~~ 0]) ifTrue:[
	WindowCreationTrace == true ifTrue:[
	    'JAVA: frame view already created: ' infoPrint.
	    jFramePeer class name infoPrintCR.
	].
    ] ifFalse:[
"/ OLD
"/        frame := StandardSystemView new.
"/        self createdWindowsView:frame for:jFramePeer.
"/        JavaWindowGroup addTopView:frame.

	frame := JavaTopView new.
	frame delegate:self.
	frame javaPeer:jFramePeer.
	self createdWindowsView:frame for:jFramePeer.
	JavaWindowGroup addTopView:frame.

"/        top := StandardSystemView new.
"/        frame := JavaView origin:0.0@0.0 corner:1.0@1.0 in:top.
"/        frame delegate:self.
"/        frame javaPeer:jFramePeer.
"/        self createdWindowsView:frame for:jFramePeer.
"/        JavaWindowGroup addTopView:top.

    ].

    WindowCreationTrace == true ifTrue:[
	'JAVA: WFramePeer_create: ' print. jFramePeer displayString print.
	' frame: ' print. frame printNL.
    ].

    "Created: / 4.1.1998 / 17:56:39 / cg"
    "Modified: / 3.12.1998 / 00:10:21 / cg"
!

_WFramePeer_setMenuBar0:nativeContext
    |frame jMenuBarPeer menuPanel|

    frame := self viewForWPeer:nativeContext.

    jMenuBarPeer := nativeContext argAt:1.
    jMenuBarPeer isNil ifTrue:[
	"/ mhmh - JAVA wants to remove the frames menuPanel.
	"/ but I have no handle on it (for destroy).
	"/ search it in subViews of the frame.
	frame subViews copy do:[:v |
	    (v isKindOf:MenuPanel) ifTrue:[
		v destroy
	    ]
	]
    ] ifFalse:[
	menuPanel := jMenuBarPeer instVarNamed:'pData'.

	menuPanel origin:0.0@0.0 corner:1.0@(menuPanel preferredExtent y).
	frame addSubView:menuPanel.
    ].
    ^ nil

    "Created: / 7.1.1998 / 21:41:35 / cg"
    "Modified: / 8.1.1998 / 17:35:04 / cg"
!

_WFramePeer_setResizable:nativeContext
    |view onOff|

    view := self viewForWPeer:nativeContext.

    onOff := (nativeContext argAt:1) == 1.
    view isTopView ifTrue:[
	onOff ifTrue:[
	    view minExtent:10@10.
	    view maxExtent:(Screen current extent).
	] ifFalse:[
	    view minExtent:view extent.
	    view maxExtent:view extent.
	]
    ] ifFalse:[
	(view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	    self halt.
	]
    ].

"/ 'JAVA: WWindowPeer_setResizable: ' print. view print. ' yes/no: ' print. onOff printNL.

    ^ nil

    "Modified: / 16.1.1998 / 18:08:00 / cg"
    "Created: / 16.10.1998 / 02:21:34 / cg"
!

_WFramePeer_setTitle:nativeContext
    |view jString string|

    view := self viewForWPeer:nativeContext.

    jString := nativeContext argAt:1.
    string := Java as_ST_String:jString.

"/ 'JAVA: WFramePeer_pSetTitle: ' print. string print. ' ' print. view printNL.

    view label:string.
    ^ nil

    "Modified: / 8.1.1998 / 17:37:41 / cg"
    "Created: / 27.1.1998 / 21:42:57 / cg"
!

_WGraphics__dispose:nativeContext
    "/ void _dispose()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:17:51 / cg"
!

_WGraphics_changeClip:nativeContext
    |gc x y w h r bool|

    gc := self gcForWGraphics:nativeContext.

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    bool := (nativeContext argAt:5) ~~ 0.

    r := Rectangle left:x top:y width:w height:h.
"/ 'WGraphics_changeClip: ' infoPrint. r infoPrintCR.
    gc clippingRectangle:r.

    "Created: / 6.1.1998 / 20:57:21 / cg"
    "Modified: / 20.10.1998 / 19:40:10 / cg"
!

_WGraphics_clearRect:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].

    gc realized ifFalse:[
	'JAVA: drawing on unrealized gc - ignored' infoPrintCR.
	^ self
    ].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

"/ self halt.
"/ self internalError:'breakPoint'.

    gc clearRectangleX:x y:y width:w height:h.

    "Created: / 8.1.1998 / 00:16:00 / cg"
    "Modified: / 8.1.1998 / 00:21:09 / cg"
!

_WGraphics_close:nativeContext
    "/ void close (sun.awt.windows.WPrintJob)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:19:40 / cg"
!

_WGraphics_copyArea:nativeContext
    |gc srcX srcY w h deltaX deltaY|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].

    gc realized ifFalse:[
	'JAVA: copyArea on unrealized gc - ignored' infoPrintCR.
	^ self
    ].

    srcX := nativeContext argAt:1.
    srcY := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    deltaX := nativeContext argAt:5.
    deltaY := nativeContext argAt:6.

    gc
	copyFrom:gc
	x:srcX y:srcY
	toX:srcX+deltaX y:srcY+deltaY
	width:w height:h

    "Created: / 8.1.1998 / 00:16:00 / cg"
    "Modified: / 9.4.1998 / 22:01:32 / cg"
!

_WGraphics_createFromComponent:nativeContext
    |jGraphics jWin view|

    jGraphics := nativeContext receiver.
    jWin := nativeContext argAt:1.

    view := KnownWindows at:jWin ifAbsent:nil.
    view isNil ifTrue:[
	self halt.
	^ self
    ].
    view clippingRectangle:nil.

"/    "/ just a consistency check ...
"/    (jWin instVarNamed:'xid') ~~ view ifTrue:[
"/        self halt:'consistency check'
"/    ].

    jGraphics instVarNamed:'pData' put:view.

    "Created: / 6.1.1998 / 20:55:18 / cg"
    "Modified: / 20.10.1998 / 19:38:18 / cg"
!

_WGraphics_createFromGraphics:nativeContext
    |jGraphics graphics gc|

    jGraphics := nativeContext receiver.
    graphics := nativeContext argAt:1.
    gc := graphics instVarNamed:'pData'.

    jGraphics instVarNamed:'pData' put:gc.
    gc clippingRectangle:nil.

    "Created: / 8.1.1998 / 00:47:39 / cg"
    "Modified: / 20.10.1998 / 19:37:58 / cg"
!

_WGraphics_createFromHDC:nativeContext
    "/ void createFromHDC (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:17:32 / cg"
!

_WGraphics_createFromPrintJob:nativeContext
    "/ void createFromPrintJob (sun.awt.windows.WPrintJob)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:17:20 / cg"
!

_WGraphics_dispose:nativeContext
    |gc|

    gc := self gcForWGraphics:nativeContext.
    gc isNil ifTrue:[^ self].
    gc clippingRectangle:nil.

    "Created: / 6.1.1998 / 20:58:38 / cg"
    "Modified: / 20.10.1998 / 19:35:05 / cg"
!

_WGraphics_drawArc:nativeContext
    |gc x y w h startAngle endAngle|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    startAngle := nativeContext argAt:5.
    endAngle := nativeContext argAt:6.

    DrawOPTrace ifTrue:[
	'drawArc x/y= ' print. x print. '@' print. y print.
	       ' w/h= ' print. w print. '@' print. h print.
	       ' startAngle= ' print. startAngle print. ' endAngle= ' print. endAngle printCR.
    ].
    gc
	displayArcX:x y:y
	width:w height:h
	from:startAngle angle:(endAngle - startAngle).

    "Created: / 6.1.1998 / 21:00:15 / cg"
    "Modified: / 28.1.1999 / 17:38:45 / cg"
!

_WGraphics_drawBytes:nativeContext
    "/ void drawBytes (byte[] int int int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:18:56 / cg"
!

_WGraphics_drawLine:nativeContext
    |gc x y x2 y2|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    x2 := nativeContext argAt:3.
    y2 := nativeContext argAt:4.

    DrawOPTrace ifTrue:[
	'drawLine x/y= ' print. x print. '@' print. y print. ' x2/y2= ' print. x2 print. '@' print. y2 printCR.
    ].
    gc displayLineFromX:x y:y toX:x2 y:y2

    "Created: / 6.1.1998 / 20:59:27 / cg"
    "Modified: / 8.1.1998 / 00:34:23 / cg"
!

_WGraphics_drawMFCharsConvertedSegment:nativeContext
    "/ int drawMFCharsConvertedSegment (java.awt.Font sun.awt.FontDescriptor byte[] int int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:18:44 / cg"
!

_WGraphics_drawMFCharsSegment:nativeContext
    |jFont jFontDescr s gc x y offs len|

    gc := self gcForWGraphics:nativeContext.
    gc realized ifFalse:[^ self].

    jFont := nativeContext argAt:1.
    jFontDescr := nativeContext argAt:2.
    s := nativeContext argAt:3.
    offs := nativeContext argAt:4.
    len := nativeContext argAt:5.
    x := nativeContext argAt:6.
    y := nativeContext argAt:7.

    DrawOPTrace ifTrue:[
	'drawMFCharsSegment x/y= ' print. x print. '@' print. y print. ' s= ' print. s printCR.
    ].
    gc displayString:s from:offs+1 to:offs+len x:x y:y.
    ^ (gc font onDevice:(gc graphicsDevice)) widthOf:s.

    "Created: / 6.1.1998 / 21:01:07 / cg"
    "Modified: / 25.1.1998 / 20:45:55 / cg"
!

_WGraphics_drawOval:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

    DrawOPTrace ifTrue:[
	'drawOval x/y= ' print. x print. '@' print. y print.
		' w/h= ' print. w print. '@' print. h printCR.
    ].
    gc displayArcX:x y:y width:w height:h from:0 angle:360.

    "Created: / 8.1.1998 / 00:44:31 / cg"
    "Modified: / 9.4.1998 / 22:10:23 / cg"
!

_WGraphics_drawPolygon:nativeContext
    |gc xVector yVector count points|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    xVector := nativeContext argAt:1.
    yVector := nativeContext argAt:2.
    count := nativeContext argAt:3.

    DrawOPTrace ifTrue:[
	'drawPolgon' printCR.
    ].

    points := (1 to:count) collect:[:i | (xVector at:i) @ (yVector at:i)].
    gc displayPolygon:points

    "Created: / 8.1.1998 / 00:57:28 / cg"
    "Modified: / 8.1.1998 / 00:57:49 / cg"
!

_WGraphics_drawPolyline:nativeContext
    "/ void drawPolyline (int[] int[] int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:19:07 / cg"
!

_WGraphics_drawRect:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

"/ self halt.
"/ self internalError:'breakPoint'.

    gc displayRectangleX:x y:y width:w height:h.

    "Modified: / 8.1.1998 / 00:34:33 / cg"
    "Created: / 8.1.1998 / 00:59:05 / cg"
!

_WGraphics_drawRoundRect:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

"/ self halt.
"/ self internalError:'breakPoint'.

    gc displayRectangleX:x y:y width:w height:h.

    "Modified: / 8.1.1998 / 00:34:33 / cg"
    "Created: / 8.1.1998 / 00:59:26 / cg"
!

_WGraphics_drawSFChars:nativeContext
    "/ void drawSFChars (char[]s, int pos1, int len, int x, int y)

    |gc str x y idx1 nChars|

    gc := self gcForWGraphics:nativeContext.
    gc realized ifFalse:[^ self].

    str := nativeContext argAt:1.
    idx1 := nativeContext argAt:2.
    nChars := nativeContext argAt:3.
    x := nativeContext argAt:4.
    y := nativeContext argAt:5.

    DrawOPTrace ifTrue:[
	'drawSFChars x/y= ' print. x print. '@' print. y print.
	       ' s= ' print. str printCR.
    ].
    gc displayString:str from:idx1+1 to:idx1+nChars x:x y:y

    "Created: / 6.1.1998 / 21:11:31 / cg"
    "Modified: / 8.1.1998 / 00:33:59 / cg"

!

_WGraphics_fillArc:nativeContext
    |gc x y w h startAngle endAngle|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.
    startAngle := nativeContext argAt:5.
    endAngle := nativeContext argAt:6.

    DrawOPTrace ifTrue:[
	'fillArc x/y= ' print. x print. '@' print. y print.
	       ' w/h= ' print. w print. '@' print. h print.
	       ' startAngle= ' print. startAngle print. ' endAngle= ' print. endAngle printCR.
    ].
    gc fillArcX:x y:y width:w height:h from:startAngle angle:(endAngle - startAngle)

    "Created: / 6.1.1998 / 21:11:31 / cg"
    "Modified: / 8.1.1998 / 00:33:59 / cg"
!

_WGraphics_fillOval:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

    DrawOPTrace ifTrue:[
	'drawOval x/y= ' print. x print. '@' print. y print.
		' w/h= ' print. w print. '@' print. h printCR.
    ].
    gc fillArcX:x y:y width:w height:h from:0 angle:360

    "Created: / 8.1.1998 / 00:46:00 / cg"
    "Modified: / 8.1.1998 / 00:46:20 / cg"
!

_WGraphics_fillPolygon:nativeContext
    |gc xVector yVector count points|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    xVector := nativeContext argAt:1.
    yVector := nativeContext argAt:2.
    count := nativeContext argAt:3.

    DrawOPTrace ifTrue:[
	'fillPolgon' printCR.
    ].

    points := (1 to:count) collect:[:i | (xVector at:i) @ (yVector at:i)].
    gc fillPolygon:points

    "Created: / 8.1.1998 / 00:58:09 / cg"
    "Modified: / 25.1.1998 / 11:03:19 / cg"
!

_WGraphics_fillRect:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

"/ self halt.
"/ self internalError:'breakPoint'.

    gc fillRectangleX:x y:y width:w height:h.

    "Created: / 15.8.1997 / 15:43:10 / cg"
    "Modified: / 8.1.1998 / 00:34:33 / cg"
!

_WGraphics_fillRoundRect:nativeContext
    |gc x y w h|

    gc := self gcForWGraphics:nativeContext.
"/    gc isNil ifTrue:[^ self].
    gc realized ifFalse:[^ self].

    x := nativeContext argAt:1.
    y := nativeContext argAt:2.
    w := nativeContext argAt:3.
    h := nativeContext argAt:4.

"/ self halt.
"/ self internalError:'breakPoint'.

    gc displayRectangleX:x y:y width:w height:h.

    "Modified: / 8.1.1998 / 00:34:33 / cg"
    "Created: / 8.1.1998 / 00:59:36 / cg"
!

_WGraphics_getClipBounds: nativeContext
    | gc  rect  r  x  y  w  h |

    gc := self gcForWGraphics: nativeContext.

"/    gc isNil ifTrue:[^ nil].

    rect := (self classForName: 'java.awt.Rectangle') basicNew.
    (gc isMemberOf: JavaView) ifTrue: [
        "/ r := gc clippingRectangleOrNil.
        r := gc getNextUpdateRectangle.
    ].
    r isNil ifTrue: [ r := gc clippingRectangleOrNil. ].
    r isNil ifTrue: [
        x := y := 0.
        w := (gc width).
        h := (gc height).
    ] ifFalse: [
        x := (r left).
        y := (r top).
        w := (r width).
        h := (r height).
    ].
    rect instVarNamed: 'x' put: x.
    rect instVarNamed: 'y' put: y.
    rect instVarNamed: 'width' put: w.
    rect instVarNamed: 'height' put: h.

"/ 'WGraphics__getClipBounds ' infoPrint. (x@y extent:w@h) infoPrintCR.

    ^ rect

    "Created: / 6.1.1998 / 20:58:07 / cg"
    "Modified: / 23.12.1998 / 20:14:09 / cg"
!

_WGraphics_imageCreate:nativeContext
    |jGraphics imgRep|

    jGraphics := nativeContext receiver.
    imgRep := nativeContext argAt:1.

    jGraphics instVarNamed:'pData' put:(imgRep instVarNamed:'pData').
"/ self halt.

    "Created: / 11.1.1998 / 16:34:30 / cg"
    "Modified: / 17.1.1998 / 12:37:18 / cg"
!

_WGraphics_pSetFont:nativeContext
    |gc jFont stFont|

    gc := self gcForWGraphics:nativeContext.
    jFont := nativeContext argAt:1.

    stFont := jFont instVarNamed:'pData'.
    (stFont isNil or:[stFont == 0]) ifTrue:[
"/ self halt.
    ] ifFalse:[
	gc font:stFont
    ].

    "Created: / 6.1.1998 / 20:56:47 / cg"
    "Modified: / 15.1.1998 / 12:31:20 / cg"
!

_WGraphics_pSetForeground:nativeContext
    |gc rgb clr|

    gc := self gcForWGraphics:nativeContext.

    rgb := nativeContext argAt:1.
    rgb isInteger ifFalse:[
        "/ its a java.awt.Color
        rgb := rgb instVarNamed:'value'.
    ].
    clr := Color rgbValue:rgb.
    gc paint:(clr nearestOn:gc device).

"/ self halt.
"/ self internalError:'breakPoint'.

    "Created: / 6.1.1998 / 20:56:14 / cg"
    "Modified: / 23.12.1998 / 20:10:49 / cg"
!

_WGraphics_print:nativeContext
    "/ void print (sun.awt.windows.WComponentPeer)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:19:25 / cg"
!

_WGraphics_removeClip:nativeContext
    "/ void removeClip ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:18:05 / cg"
!

_WGraphics_setPaintMode:nativeContext
    |gc|

    gc := self gcForWGraphics:nativeContext.
    gc function:#copy.

    true "DrawOPTrace" ifTrue:[
	'copyMode' infoPrintCR.
    ].

    "Created: / 8.1.1998 / 00:33:44 / cg"
    "Modified: / 28.1.1998 / 23:25:56 / cg"
!

_WGraphics_setXORMode:nativeContext
    |gc jColor rgb invColor device|

    gc := self gcForWGraphics:nativeContext.
    jColor := nativeContext argAt:1.
    device := gc graphicsDevice.

"/    "/ on trueColor systems, use the provided
"/    "/ rgb value for inverting.
"/    "/ on palette systems, use white ^ black
"/
"/    device visualType == #TrueColor ifTrue:[
"/        rgb := jColor instVarNamed:'value'.
"/        rgb := rgb bitAnd:16rFFFFFF.
"/        rgb == 0 ifTrue:[
"/            rgb := 16rFFFFFF.
"/        ].
"/        invColor := rgb
"/    ] ifFalse:[
"/        invColor := device blackpixel bitXor:device whitepixel.
"/    ].

    invColor := device blackpixel bitXor:device whitepixel.

"/    gc foreground:(Color colorId:invColor)
"/       background:device blackColor.
    device
	setForeground:invColor background:0
	in:gc gcId.
    gc function:#xor.

    true "DrawOPTrace" ifTrue:[
	'xorMode' infoPrintCR.
    ].

    "Created: / 8.1.1998 / 00:36:17 / cg"
    "Modified: / 28.1.1998 / 23:45:03 / cg"
!

_WLabelPeer_create:nativeContext
    |jLabelPeer jLabel jFrame frame label
     lbl|

    jLabelPeer := nativeContext receiver.
    jLabel := jLabelPeer instVarNamed:'target'.

    lbl := jLabel instVarNamed:'text'.
    lbl notNil ifTrue:[
	lbl := Java as_ST_String:lbl
    ].

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    label := Label in:frame.
    label sizeFixed:true.
    lbl notNil ifTrue:[
	label label:lbl
    ].
    self createdWindowsView:label for:jLabelPeer.

    WindowCreationTrace == true ifTrue:[
	'WLabelPeer_create: ' print. frame print. ' -> ' print. label printNL.
    ].

    "Created: / 7.1.1998 / 21:42:31 / cg"
    "Modified: / 13.1.1998 / 22:10:47 / cg"
!

_WLabelPeer_setAlignment:nativeContext
    |label alignNr|

    alignNr := nativeContext argAt:1.
    label := self viewForWPeer:nativeContext.
    label notNil ifTrue:[
    ].

    "Created: / 7.1.1998 / 21:43:12 / cg"
    "Modified: / 8.1.1998 / 17:35:29 / cg"
!

_WLabelPeer_setText:nativeContext
    |label jString str|

    jString := nativeContext argAt:1.

    label := self viewForWPeer:nativeContext.
    jString notNil ifTrue:[
	str := Java as_ST_String:jString
    ].
    label label:str

    "Created: / 7.1.1998 / 21:43:51 / cg"
    "Modified: / 3.12.1998 / 14:59:18 / cg"
!

_WListPeer__addItem:nativeContext
    |jString index1 length selListView m|

    selListView := self viewForWPeer:nativeContext.

    jString := nativeContext argAt:1.
    index1 := nativeContext argAt:2.
    length := nativeContext argAt:3.

    (m := selListView model) notNil ifTrue:[
	m list addLast:(Java as_ST_String:jString).
	m changed:#list.
    ].

    "Created: / 26.10.1998 / 20:11:30 / cg"
    "Modified: / 14.11.1998 / 01:21:03 / cg"
!

_WListPeer_addItem:nativeContext
    |jString index selListView m|

    selListView := self viewForWPeer:nativeContext.

    jString := nativeContext argAt:1.
    index := nativeContext argAt:2.

    m := selListView model.
    m isNil ifTrue:[
	Transcript showCR:'JAVA: access to listModel of closed view'.
    ] ifFalse:[
	m list addLast:(Java as_ST_String:jString).
	m changed:#list.
    ]

    "Created: / 24.1.1998 / 21:10:05 / cg"
    "Modified: / 2.11.1998 / 17:12:52 / cg"
!

_WListPeer_create:nativeContext
    |jListPeer jFrame frame selectionInListView|

    jListPeer := nativeContext receiver.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    selectionInListView := ScrollableView for:SelectionInListView in:frame.
    selectionInListView action:[:index | jListPeer perform:#'handleListChanged(I)V' with:(index - 1)].
    selectionInListView doubleClickAction:[:index | jListPeer perform:#'handleAction(I)V' with:(index - 1)].
    selectionInListView model:(SelectionInList new list:(List new)).
    selectionInListView useIndex:true.

    self createdWindowsView:selectionInListView for:jListPeer.

    WindowCreationTrace == true ifTrue:[
	'WTextAreaPeer_create: ' print. frame print. ' -> ' print. selectionInListView printNL.
    ].

    "Created: / 24.1.1998 / 19:58:54 / cg"
    "Modified: / 9.4.1998 / 22:19:07 / cg"
!

_WListPeer_delItems:nativeContext
    |jString index1 index2 selListView model list|

    selListView := self viewForWPeer:nativeContext.

    index1 := (nativeContext argAt:1) + 1. "/ java indices are 0-based.
    index2 := (nativeContext argAt:2) + 1. "/ st indices are 1-based.

    model := selListView model.
    model isNil ifTrue:[^ self].
    list := model list.
    list size >= index1 ifTrue:[
	list removeFromIndex:index1 toIndex:(index2 min:list size).
	model changed:#list.
    ].

    "Created: / 9.4.1998 / 22:19:25 / cg"
    "Modified: / 30.12.1998 / 20:00:50 / cg"
!

_WListPeer_deselect:nativeContext
    "/ void deselect (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:15:10 / cg"
!

_WListPeer_getMaxWidth:nativeContext
    "/ int getMaxWidth ()

    ^ 1000 "/ a dummy value

"/    UnimplementedNativeMethodSignal raise

    "Created: / 14.11.1998 / 10:44:29 / cg"
!

_WListPeer_isSelected:nativeContext
    |selectionInListView index model|

    selectionInListView := self viewForWPeer:nativeContext.

    index := nativeContext argAt:1.
    (model := selectionInListView model) notNil ifTrue:[
	(model selectionIndex == (index + 1))  "/ JAVA indexing starts at 0
	ifTrue:[
	    ^ 1
	]
    ].
    ^ 0.

    "Created: / 24.1.1998 / 22:42:31 / cg"
    "Modified: / 25.1.1998 / 01:35:32 / cg"
!

_WListPeer_makeVisible:nativeContext
    |selectionInListView lineNr|

    selectionInListView := self viewForWPeer:nativeContext.

    lineNr := nativeContext argAt:1.

    selectionInListView makeLineVisible:(lineNr + 1)

    "Modified: / 24.1.1998 / 20:01:06 / cg"
    "Created: / 20.10.1998 / 14:14:50 / cg"
!

_WListPeer_select:nativeContext
    |selectionInListView index model|

    selectionInListView := self viewForWPeer:nativeContext.

    index := nativeContext argAt:1.
    (model := selectionInListView model) notNil ifTrue:[
	model selectionIndex:(index + 1).  "/ JAVA indexing starts at 0
    ]

    "Created: / 24.1.1998 / 22:32:35 / cg"
    "Modified: / 25.1.1998 / 01:28:46 / cg"
!

_WListPeer_setMultipleSelections:nativeContext
    |selectionInListView onOff|

    selectionInListView := self viewForWPeer:nativeContext.

    onOff := (nativeContext argAt:1) ~~ 0.

    selectionInListView multipleSelectOk:onOff.

    "Modified: / 24.1.1998 / 20:01:06 / cg"
!

_WListPeer_updateMaxItemWidth:nativeContext
    |selectionInListView lineNr|

    selectionInListView := self viewForWPeer:nativeContext.

    "Created: / 26.10.1998 / 20:09:46 / cg"
!

_WMenuBarPeer_addMenu:nativeContext
    "/ void addMenu (java.awt.Menu)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:14:00 / cg"
!

_WMenuBarPeer_create:nativeContext
    |jMenuBarPeer jMenuBar jFrame frame menuBar|

    jMenuBarPeer := nativeContext receiver.
    jMenuBar := jMenuBarPeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    menuBar := MenuPanel in:frame.
    menuBar verticalLayout:false.
    menuBar realize.

    self createdWindowsView:menuBar for:jMenuBarPeer.

    WindowCreationTrace == true ifTrue:[
	'WMenuBarPeer_create: ' print. frame print. ' -> ' print. menuBar printNL.
    ].

    "Created: / 7.1.1998 / 21:38:31 / cg"
    "Modified: / 25.1.1998 / 13:19:03 / cg"
!

_WMenuBarPeer_delMenu:nativeContext
    "/ void delMenu (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:14:11 / cg"
!

_WMenuItemPeer__dispose:nativeContext
    |jMenuItemPeer item|

    jMenuItemPeer := nativeContext receiver.
    item := jMenuItemPeer instVarNamed:'pData'.

"/ what should be done here ?

    "Created: / 29.3.1998 / 17:16:05 / cg"
    "Modified: / 29.3.1998 / 17:16:35 / cg"
!

_WMenuItemPeer__setLabel:nativeContext
    "/ void _setLabel (java.lang.String)

    |jMenuItemPeer item label|

    jMenuItemPeer := nativeContext receiver.
    item := jMenuItemPeer instVarNamed:'pData'.
    (item isNil or:[item == 0]) ifTrue:[
	'JAVA [warning]: NULL menu item in setLabel' infoPrintCR.
	^ self
    ].

    label := nativeContext argAt:1.
    label isNil ifTrue:[
	label := ''
    ] ifFalse:[
	label := Java as_ST_String:label
    ].
    item label:label.

    "Modified: / 11.12.1998 / 16:40:18 / cg"
!

_WMenuItemPeer_create:nativeContext
    |jMenuItemPeer jMenuItem jMenuPeer menu item lbl|

    jMenuItemPeer := nativeContext receiver.
    jMenuItem := jMenuItemPeer instVarNamed:'target'.

    jMenuPeer := nativeContext argAt:1.
    menu := jMenuPeer instVarNamed:'pData'.
    (menu isNil or:[menu == 0]) ifTrue:[
	'JAVA: no menu to create item in' infoPrintCR.
	^ self
    ].
    item := menu createAtIndex:nil.
    item value:[
		jMenuItemPeer perform:#'handleAction(I)V' with:0
	       ].

    lbl := jMenuItem instVarNamed:'label'.
    lbl notNil ifTrue:[
	lbl := Java as_ST_String:lbl.
	item label:lbl
    ].

    jMenuItemPeer instVarNamed:'pData' put:item.

    WindowOPTrace == true ifTrue:[
	'WMenuItem_create: ' print. menu print. ' -> ' print. item printNL.
    ].

    "Created: / 7.1.1998 / 21:40:44 / cg"
    "Modified: / 3.12.1998 / 20:43:20 / cg"
!

_WMenuItemPeer_enable:nativeContext
    |jMenuItemPeer item state|

    jMenuItemPeer := nativeContext receiver.
    item := jMenuItemPeer instVarNamed:'pData'.
    (item isNil or:[item == 0]) ifTrue:[
	'JAVA [warning]: NULL menu item in enable' infoPrintCR.
	^ self
    ].

    state := nativeContext argAt:1.
    item enabled:(state ~~ 0)

    "Created: / 7.1.1998 / 22:41:38 / cg"
    "Modified: / 11.12.1998 / 16:40:26 / cg"
!

_WMenuPeer_addSeparator:nativeContext
    "/ void addSeparator ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:13:14 / cg"
!

_WMenuPeer_createMenu:nativeContext
    |jMenuPeer jMenu jMenuBarPeer menuPanel menu
     lbl item|

    jMenuPeer := nativeContext receiver.
    jMenu := jMenuPeer instVarNamed:'target'.

    jMenuBarPeer := nativeContext argAt:1.
    menuPanel := jMenuBarPeer instVarNamed:'pData'.

    item := menuPanel createAtIndex:nil.
    lbl := jMenu instVarNamed:'label'.
    lbl notNil ifTrue:[
	lbl := Java as_ST_String:lbl.
	item label:lbl
    ].

    menu := MenuPanel new.
    item submenu:menu.

    jMenuPeer instVarNamed:'pData' put:menu.

'createMenuPeer: ' print. menuPanel print. ' -> ' print. menu printNL.

    "Created: / 7.1.1998 / 21:39:50 / cg"
    "Modified: / 13.1.1998 / 22:11:09 / cg"
!

_WMenuPeer_createSubMenu:nativeContext
    "/ void createSubMenu (sun.awt.windows.WMenuPeer)
"/    UnimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:13:43 / cg"
    "Modified: / 3.12.1998 / 21:41:07 / cg"
!

_WMenuPeer_delItem:nativeContext
    "/ void delItem (int)
    |jMenuPeer jMenu menuPanel itemIndex|

    jMenuPeer := nativeContext receiver.
    menuPanel := jMenuPeer instVarNamed:'pData'.

    itemIndex := nativeContext argAt:1.
    menuPanel remove:itemIndex.

"/    UnimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:13:30 / cg"
    "Modified: / 10.12.1998 / 21:12:29 / cg"
!

_WPanelPeer_calculateInsets:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 27.1.1998 / 21:40:00 / cg"
!

_WPopupMenuPeer__show:nativeContext
    "/ void _show (java.awt.Event)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:12:53 / cg"
!

_WPopupMenuPeer_createMenu:nativeContext
    "/ void createMenu (sun.awt.windows.WComponentPeer)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:12:43 / cg"
!

_WPrintJob_end:nativeContext
    "/ void end ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:11:28 / cg"
!

_WScrollPanePeer__getHScrollbarHeight:nativeContext
    |scrollPane|

    scrollPane := self viewForWPeer:nativeContext.
    ^ HorizontalScrollBar new preferredExtent y.

    "Created: / 9.4.1998 / 17:30:56 / cg"
    "Modified: / 10.4.1998 / 14:59:28 / cg"
!

_WScrollPanePeer__getVScrollbarWidth:nativeContext
    |scrollPane|

    scrollPane := self viewForWPeer:nativeContext.
    ^ ScrollBar new preferredExtent x.

    "Created: / 9.4.1998 / 17:29:48 / cg"
    "Modified: / 10.4.1998 / 15:00:33 / cg"
!

_WScrollPanePeer_create:nativeContext
    |jScrollPanePeer jScrollPane jFrame frame scrollPane
     lbl|

    jScrollPanePeer := nativeContext receiver.
    jScrollPane := jScrollPanePeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    "/ create with a simple view ...
    scrollPane := ScrollableView for:JavaView in:frame.

    self createdWindowsView:scrollPane for:jScrollPanePeer.

    WindowCreationTrace == true ifTrue:[
	'WScrollPanePeer_create: ' print. frame print. ' -> ' print. scrollPane printNL.
    ].

    "Created: / 9.4.1998 / 17:25:08 / cg"
    "Modified: / 9.4.1998 / 22:06:09 / cg"
!

_WScrollPanePeer_getOffset:nativeContext
    "/ int getOffset (int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:16:29 / cg"
!

_WScrollPanePeer_getScrollChild:nativeContext
    "/ java.awt.Component getScrollChild ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:17:00 / cg"
!

_WScrollPanePeer_setInsets:nativeContext

    "Modified: / 9.4.1998 / 17:26:11 / cg"
    "Created: / 9.4.1998 / 17:29:10 / cg"
!

_WScrollPanePeer_setScrollPosition:nativeContext
    "/ void setScrollPosition (int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:16:44 / cg"
!

_WScrollPanePeer_setSpans:nativeContext

    "Created: / 9.4.1998 / 17:31:44 / cg"
!

_WScrollbarPeer__setValues:nativeContext
    |scrollBar value visibleAmount min max|

    scrollBar := self viewForWPeer:nativeContext.

    value := nativeContext argAt:1.
    visibleAmount := nativeContext argAt:2.
    min := nativeContext argAt:3.
    max := nativeContext argAt:4.

    (min ~~ 0 or:[max ~~ 100]) ifTrue:[
	scrollBar thumb start:min stop:max.
    ].

    scrollBar thumbOrigin:value thumbHeight:visibleAmount.

    "Created: / 13.1.1998 / 22:13:57 / cg"
    "Modified: / 14.10.1998 / 14:53:00 / cg"
!

_WScrollbarPeer_create:nativeContext
    |jScrollbarPeer jScrollbar jFrame frame scrollBar
     min max|

    jScrollbarPeer := nativeContext receiver.
    jScrollbar := jScrollbarPeer instVarNamed:'target'.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    (jScrollbar instVarNamed:'orientation') == 0 "HORIZONTAL" ifTrue:[
	scrollBar := HorizontalScrollBar in:frame.
    ] ifFalse:[
	scrollBar := ScrollBar in:frame.
    ].
    min := jScrollbar instVarNamed:'minimum'.
    max := jScrollbar instVarNamed:'maximum'.

    scrollBar scrollDownAction:[
			scrollBar thumbOrigin:(scrollBar thumbOrigin + ((max-min)/10) min:max).
			jScrollbarPeer perform:#'dragAbsolute(I)V' with:scrollBar thumbOrigin rounded.
		     ].
    scrollBar scrollUpAction:[
			scrollBar thumbOrigin:(scrollBar thumbOrigin - ((max-min)/10) max:min).
			jScrollbarPeer perform:#'dragAbsolute(I)V' with:scrollBar thumbOrigin rounded.
		     ].
    scrollBar scrollAction:[:org |
			jScrollbarPeer perform:#'dragAbsolute(I)V' with:org rounded.
		     ].
    self createdWindowsView:scrollBar for:jScrollbarPeer.

    WindowCreationTrace == true ifTrue:[
	'WScrollbarPeer_create: ' print. frame print. ' -> ' print. scrollBar printNL.
    ].

    "Created: / 5.1.1998 / 01:53:30 / cg"
    "Modified: / 14.10.1998 / 15:36:19 / cg"
!

_WScrollbarPeer_setLineIncrement:nativeContext
    |scrollBar inc|

Transcript showCR:'JavaVM: WScrollbarPeer_setLineIncrement unimplemented'.

    scrollBar := self viewForWPeer:nativeContext.

    inc := nativeContext argAt:1.
"/    scrollBar thumb lineIncrement:inc.

    "Created: / 25.1.1998 / 11:52:19 / cg"
    "Modified: / 14.10.1998 / 14:53:56 / cg"
!

_WScrollbarPeer_setPageIncrement:nativeContext
    |scrollBar inc|

Transcript showCR:'JavaVM: WScrollbarPeer_setPageIncrement unimplemented'.

    scrollBar := self viewForWPeer:nativeContext.

    inc := nativeContext argAt:1.
"/    scrollBar thumb pageIncrement:inc.

    "Created: / 25.1.1998 / 11:52:01 / cg"
    "Modified: / 14.10.1998 / 14:54:04 / cg"
!

_WTextAreaPeer_create:nativeContext
    |jTextAreaPeer jFrame frame editTextView|

    jTextAreaPeer := nativeContext receiver.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    editTextView := HVScrollableView for:EditTextView in:frame.

    self createdWindowsView:editTextView for:jTextAreaPeer.

    WindowCreationTrace == true ifTrue:[
	'WTextAreaPeer_create: ' print. frame print. ' -> ' print. editTextView printNL.
    ].

    "Created: / 7.1.1998 / 21:49:49 / cg"
    "Modified: / 15.1.1998 / 12:56:18 / cg"
!

_WTextAreaPeer_insertText:nativeContext
    |textView pos string jstring|

    textView := self viewForWPeer:nativeContext.
    (textView isKindOf:ScrollableView) ifTrue:[
	textView := textView scrolledView
    ].

    jstring := nativeContext argAt:1.
    string := Java as_ST_String:jstring.
    pos := nativeContext argAt:2.

    textView insert:string at:pos.
    textView cursorToCharacterPosition:pos + string size.
    textView makeCursorVisible.
"/ textView invalidateRepairNow:true.
    ^ nil

    "Created: / 7.1.1998 / 21:50:23 / cg"
    "Modified: / 5.4.1998 / 17:37:24 / cg"
!

_WTextAreaPeer_replaceText:nativeContext
    "/ void replaceText (java.lang.String int int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:11:14 / cg"
!

_WTextComponentPeer_enableEditing:nativeContext
    |textView enabled|

    textView := self viewForWPeer:nativeContext.
    enabled := (nativeContext argAt:1) ~~ 0.

    ^ textView readOnly:enabled not

    "Created: / 5.1.1998 / 01:29:38 / cg"
    "Modified: / 25.1.1998 / 16:29:56 / cg"
!

_WTextComponentPeer_getSelectionEnd:nativeContext
    |textView|

    textView := self viewForWPeer:nativeContext.

    ^ textView characterPositionOfSelectionEnd

    "Created: / 8.1.1998 / 17:41:56 / cg"
    "Modified: / 15.1.1998 / 15:47:18 / cg"
!

_WTextComponentPeer_getSelectionStart:nativeContext
    |textView|

    textView := self viewForWPeer:nativeContext.

    ^ textView characterPositionOfSelection - 1

    "Created: / 15.8.1997 / 15:45:45 / cg"
    "Modified: / 15.1.1998 / 15:46:51 / cg"
!

_WTextComponentPeer_getText:nativeContext
    |textView string jString|

    textView := self viewForWPeer:nativeContext.

    string := textView contents asString.
    jString := Java as_String:string.
    ^ jString

    "Created: / 6.1.1998 / 21:05:15 / cg"
    "Modified: / 8.1.1998 / 17:36:52 / cg"
!

_WTextComponentPeer_select:nativeContext
    |textView selStart selEnd|

    textView := self viewForWPeer:nativeContext.
    selStart := nativeContext argAt:1.
    selEnd := nativeContext argAt:2.

    selStart == selEnd ifTrue:[
	"/ clear selection
	textView unselect.
	"/ and set caret
	textView cursorToCharacterPosition:selStart + 1
    ] ifFalse:[
	"/ change selection
	textView selectFromCharacterPosition:selStart+1 to:selEnd
    ].

    "Created: / 15.8.1997 / 15:45:58 / cg"
    "Modified: / 15.1.1998 / 21:55:57 / cg"
!

_WTextComponentPeer_setText:nativeContext
    |textView string jstring|

    textView := self viewForWPeer:nativeContext.

    jstring := nativeContext argAt:1.
    jstring notNil ifTrue:[
	string := Java as_ST_String:jstring
    ].

    textView contents:string.

    "Created: / 5.1.1998 / 01:28:23 / cg"
    "Modified: / 11.12.1998 / 12:16:46 / cg"
!

_WTextFieldPeer_create:nativeContext
    |jTextFieldPeer jFrame frame editField|

    jTextFieldPeer := nativeContext receiver.

    jFrame := nativeContext argAt:1.
    frame := jFrame instVarNamed:'pData'.

    editField := EditField in:frame.

    self createdWindowsView:editField for:jTextFieldPeer.

    editField crAction:[
			jTextFieldPeer perform:#handleAction.
		  ].
    WindowCreationTrace == true ifTrue:[
	'WTextFieldPeer_create: ' print. frame print. ' -> ' print. editField printNL.
    ].

    "Created: / 5.1.1998 / 01:27:37 / cg"
    "Modified: / 4.11.1998 / 21:07:30 / cg"
!

_WTextFieldPeer_setEchoCharacter:nativeContext
    |editField char|

    editField := self viewForWPeer:nativeContext.

    char := nativeContext argAt:1.
    editField passwordCharacter:(Character value:char).

    "Created: / 25.1.1998 / 16:28:30 / cg"
!

_WToolkit_beep:nativeContext
    "/ void beep ()

    Screen current beep

    "Created: / 12.11.1998 / 19:09:23 / cg"
    "Modified: / 11.12.1998 / 12:15:23 / cg"
!

_WToolkit_eventLoop:nativeContext
    (JavaEventThread notNil and:[JavaEventThread isDead not]) ifTrue:[
	'JavaVM [warning]: oops - two threads executing eventLoop' errorPrintCR.
    ].

    JavaEventThread := Processor activeProcess.
    [
	[true] whileTrue:[
	    AbortSignal handle:[:ex |
		ex return
	    ] do:[
		self doWindowsEventThread.
	    ]
	].
    ] valueNowOrOnUnwindDo:[
	JavaEventThread := nil.
    ].

    "Created: / 6.1.1998 / 21:01:44 / cg"
    "Modified: / 8.1.1999 / 17:08:00 / cg"
!

_WToolkit_getComboHeightOffset:nativeContext
    ^ 0

    "Modified: / 20.3.1997 / 13:50:04 / cg"
    "Created: / 22.10.1998 / 00:59:14 / cg"
!

_WToolkit_getScreenHeight:nativeContext
    ^ Screen current height

    "Modified: / 20.3.1997 / 13:50:04 / cg"
    "Created: / 13.1.1998 / 09:24:45 / cg"
!

_WToolkit_getScreenResolution:nativeContext
    ^ Screen current resolution x rounded

    "Modified: / 20.3.1997 / 13:50:04 / cg"
    "Created: / 17.1.1998 / 21:54:48 / cg"
!

_WToolkit_getScreenWidth:nativeContext
    ^ Screen current width

    "Modified: / 20.3.1997 / 13:50:04 / cg"
    "Created: / 13.1.1998 / 09:24:37 / cg"
!

_WToolkit_init:nativeContext

    "Created: / 3.1.1998 / 02:30:57 / cg"
!

_WToolkit_loadSystemColors:nativeContext
"/ self halt.

    "Modified: / 18.3.1997 / 18:43:26 / cg"
    "Created: / 5.1.1998 / 02:19:09 / cg"
!

_WToolkit_makeColorModel:nativeContext
    "/ java.awt.image.ColorModel makeColorModel ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:08:47 / cg"
!

_WToolkit_sync:nativeContext
    "/ void sync ()
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:09:14 / cg"
!

_WWindowPeer__setResizable:nativeContext
    |view onOff|

    view := self viewForWPeer:nativeContext.

    onOff := (nativeContext argAt:1) == 1.
    view isTopView ifTrue:[
	onOff ifTrue:[
	    view minExtent:10@10.
	    view maxExtent:(Screen current extent).
	] ifFalse:[
	    view minExtent:view extent.
	    view maxExtent:view extent.
	]
    ] ifFalse:[
	(view isMemberOf:JavaEmbeddedFrameView) ifFalse:[
	    self halt.
	]
    ].

"/ 'JAVA: WWindowPeer_setResizable: ' print. view print. ' yes/no: ' print. onOff printNL.

    ^ nil

    "Created: / 5.1.1998 / 00:57:59 / cg"
    "Modified: / 16.1.1998 / 18:08:00 / cg"
!

_WWindowPeer__setTitle:nativeContext
    |view jString string|

    view := self viewForWPeer:nativeContext.

    jString := nativeContext argAt:1.
    string := Java as_ST_String:jString.

"/ 'JAVA: WWindowPeer_pSetTitle: ' print. string print. ' ' print. view printNL.

    view label:string.
    ^ nil

    "Created: / 5.1.1998 / 00:57:17 / cg"
    "Modified: / 8.1.1998 / 17:37:41 / cg"
!

_WWindowPeer_create:nativeContext
    "/ void create (sun.awt.windows.WComponentPeer)
    |jWindowPeer jWindow top window pDataIdx|

    jWindowPeer := nativeContext receiver.

    jWindow := jWindowPeer instVarNamed:'target'.
    window := jWindowPeer instVarNamed:'pData'.

    (window notNil and:[window ~~ 0]) ifTrue:[
	WindowCreationTrace == true ifTrue:[
	    'JAVA: window view already created: ' infoPrint.
	    jWindowPeer class name infoPrintCR.
	].
    ] ifFalse:[
"/ OLD
"/        window := StandardSystemView new.
"/        self createdWindowsView:window for:jWindowPeer.
"/        JavaWindowGroup addTopView:window.

	window := JavaPopUpView new.
	window borderWidth:0.
	window level:0.
	window delegate:self.
	window javaPeer:jWindowPeer.
	self createdWindowsView:window for:jWindowPeer.
	JavaWindowGroup addTopView:window.

"/        top := StandardSystemView new.
"/        window := JavaView origin:0.0@0.0 corner:1.0@1.0 in:top.
"/        window delegate:self.
"/        window javaPeer:jWindowPeer.
"/        self createdWindowsView:window for:jWindowPeer.
"/        JavaWindowGroup addTopView:top.

    ].

    WindowCreationTrace == true ifTrue:[
	'JAVA: WWindowPeer_create: ' print. jWindowPeer displayString print.
	' window: ' print. window printNL.
    ].

    "Created: / 4.1.1998 / 17:56:39 / cg"
    "Modified: / 4.12.1998 / 17:37:59 / cg"
!

_WWindowPeer_getContainerElement:nativeContext
    "/ java.awt.Component getContainerElement (java.awt.Container int)
    JavaVM unimplementedNativeMethodSignal raise

    "Created: / 12.11.1998 / 19:10:54 / cg"
!

_WWindowPeer_toBack:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
    view lower.

    "Created: / 7.5.1998 / 00:23:03 / cg"
!

_WWindowPeer_toFront:nativeContext
    |view|

    view := self viewForWPeer:nativeContext.
    view raise.

    "Created: / 9.4.1998 / 22:17:28 / cg"
!

_WWindowPeer_updateInsets:nativeContext
"/ self halt.

    "Modified: / 18.3.1997 / 18:43:18 / cg"
    "Created: / 4.1.1998 / 18:09:04 / cg"
!

_Win32Process_create:nativeContext
    "really create a win32 process"

    |env cmd jProcess p inPipe outPipe errorPipe|

    jProcess := nativeContext receiver.
    cmd := nativeContext argAt:1.
    cmd := Java as_ST_String:cmd.

    env := nativeContext argAt:2.
    env notNil ifTrue:[
	self halt
    ].
self halt.

    p := Win32Process new.
    p command:cmd.
    p environment:env.
    p inStream:inPipe.
    p outStream:outPipe.
    p errorStream:errorPipe.
    p directory:nil.
    p startProcess.
self halt.

    jProcess instVarNamed:'handle' put:p.

    "Created: / 10.11.1998 / 19:50:31 / cg"
    "Modified: / 10.11.1998 / 21:34:18 / cg"
!

_X11FontMetrics_getMFCharSegmentWidth:nativeContext
    "get multi-font string-segment width.
     Not yet supported - use standard strings width"

    |jMetrics jFont jFontDescr stFont w
     bool1 cp offs lenght bp int1|

    jMetrics := nativeContext receiver.
    jFont := nativeContext argAt:1.
    jFontDescr := nativeContext argAt:2.
    cp := nativeContext argAt:3.
    lenght := nativeContext argAt:4.

    stFont := jFont instVarNamed:'pData'.
    (stFont isNil or:[stFont == 0]) ifTrue:[
        self halt
    ].

    stFont device isNil ifTrue:[
        stFont := stFont on:Display.
        jFont instVarNamed:'pData' put:stFont.
    ].
    w := stFont widthOf:cp from:1 to:lenght.
    ^ w.
!

_X11FontMetrics_init:nativeContext
    ^ self _WFontMetrics_init:nativeContext
!

_X11GraphicsDevice_getConfigType:nativeContext
    "/ new with jdk1.2 ...

    |configNr cls|

    "/ for now, only one config.
    configNr := nativeContext argAt:1.

    cls := Java classNamed:'java.awt.GraphicsDevice'.
    ^ cls instVarNamed:'TYPE_RASTER_SCREEN'.

    "Created: / 28.1.1998 / 22:19:05 / cg"
!

_X11GraphicsDevice_getNumConfigs:nativeContext
    "/ new with jdk1.2 ...

    ^ 1

    "Created: / 28.1.1998 / 22:13:26 / cg"
    "Modified: / 28.1.1998 / 22:14:33 / cg"
!

_X11GraphicsEnvironment_getNumScreens:nativeContext
    "/ new with jdk1.2 ...

    "/ could return the actual number of screens ...

    ^ 1

    "Created: / 28.1.1998 / 01:50:22 / cg"
    "Modified: / 28.1.1998 / 22:12:32 / cg"
!

_X11GraphicsEnvironment_initDisplay:nativeContext
    "/ new with jdk1.2 ...

    "Created: / 28.1.1998 / 01:50:22 / cg"
!

_X11Graphics_changeClip:nativeContext
    ^ self _WGraphics_changeClip:nativeContext
!

_X11Graphics_createFromComponent:nativeContext
    ^ self _WGraphics_createFromComponent:nativeContext
!

_X11Graphics_disposeImpl:nativeContext
    ^ self _WGraphics_dispose:nativeContext
!

_X11Graphics_drawMFCharsSegment:nativeContext
    ^ self _WGraphics_drawMFCharsSegment:nativeContext
!

_X11Graphics_drawRect:nativeContext
    ^ self _WGraphics_drawRect:nativeContext
!

_X11Graphics_fillOval:nativeContext
    ^ self _WGraphics_fillOval:nativeContext
!

_X11Graphics_fillRect:nativeContext
    ^ self _WGraphics_fillRect:nativeContext
!

_X11Graphics_pSetFont:nativeContext
    ^ self _WGraphics_pSetFont:nativeContext
!

_X11Graphics_pSetForeground:nativeContext
    ^ self _WGraphics_pSetForeground:nativeContext
! !

!JavaVM class methodsFor:'native - old-style (converted)'!

_FileInputStream_skip:nativeContext
    "/ long skip (long)
    |file nSkip nSkipped|

    file := self validateFile:(nativeContext receiver).
    nSkip := nativeContext argAt:1.

    file == Stdin ifTrue:[
	file := StdinReplacementFileQuerySignal raiseRequest.
	file isNil ifTrue:[
	    ^ -1
	]
    ].

    FileIOTrace ifTrue:[
	(('JAVA: skip %1 byte(s) from ' bindWith:nSkip printString) , file pathName) infoPrintCR.
    ].

    file skip:nSkip.
    ^ nSkip

    "Modified: / 27.1.1999 / 20:36:11 / cg"
! !

!JavaVM class methodsFor:'native - stx.libjava'!

_stx_libjava_ClassLoader_findClassS: nativeContext

    <javanative: 'stx/libjava/ClassLoader' name: 'findCla'>

    | nm cls |
    nm := Java as_ST_String: (nativeContext argAt: 1).
    (nm startsWith: 'SMALLTALK.') ifFalse:[
        self throwClassNotFoundException: ('No such smalltalk class (%1)' bindWith: nm).
        ^self
    ].
    nm := nm copyFrom: 'SMALLTALK.' size + 1.
    cls := Smalltalk at: nm asSymbol.
    cls isNil ifTrue:[
        self throwClassNotFoundException: ('No such smalltalk class (%1)' bindWith: nm).
        ^self
    ].
    ^Reflection javaClassObjectForClass: cls.

    "Modified: / 30-07-2012 / 23:19:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - stx.libjava.groovy'!

_stx_libjava_groovy_GroovyClassLoader_SystemClassCollector_getDefiningClassLoader: nativeContext

    <javanative: 'stx/libjava/groovy/GroovyClassLoader$SystemClassCollector' name: 'getDefiningClassLoader()Lstx/libjava/groovy/GroovyClassLoader;'>

    ^ SystemClassLoader

    "Modified: / 20-02-2012 / 22:30:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - stx.libjava.tests'!

_stx_libjava_tests_MonitorTests_abort: nativeContext

    <javanative: 'stx/libjava/tests/MonitorTests' name: 'abort()V'>

    AbortOperationRequest raiseRequest.

    "Modified: / 04-11-2011 / 21:50:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - stx.libjava.tests.lang'!

_stx_libjava_tests_lang_MonitorTests_abort: nativeContext
    <javanative: 'stx/libjava/tests/lang/MonitorTests' name: 'abort()V'>
        AbortOperationRequest raiseRequest.

    "Modified: / 10-09-2012 / 22:56:16 / m"
! !

!JavaVM class methodsFor:'native - stx.libjava.tests.vm'!

_stx_libjava_tests_vm_XLOAD_forcePatchupAndUnfix: nativeContext

    <javanative: 'stx/libjava/tests/MonitorTests' name: 'abort()V'>

    | ctx |

    ctx := thisContext.

    ObjectMemory garbageCollect.
    [ ctx notNil ] whileTrue:[
        1 to: ctx size do:[:i|
                Transcript showCR: i printString , ' -> ', (ctx at: i) printString.
        ].
        ctx := ctx sender.

    ].
    ObjectMemory garbageCollect.


    "Modified: / 04-11-2011 / 21:50:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.font'!

_sun_font_FontManager_initIDs: nativeContext

    <javanative: 'sun/font/FontManager' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:56:51 / mh <hlopik@gmail.com>"
!

_sun_font_FreetypeFontScaler_initIDs: nativeContext

    <javanative: 'sun/font/FreetypeFontScaler' name: 'initIDs(Ljava/lang/Class;)V'>


!

_sun_font_StrikeCache_getGlyphCacheDescription: nativeContext
    <javanative: 'sun/font/StrikeCache' name: 'getGlyphCacheDescription([J)V'>
    (nativeContext argAt:1) at: 1 put: 4.

    "Modified: / 09-02-2012 / 22:57:08 / mh <hlopik@gmail.com>"
    "Modified: / 05-11-2012 / 17:07:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.io'!

_sun_io_Win32ErrorMode_setErrorMode: nativeContext

    <javanative: 'sun/io/Win32ErrorMode' name: 'setErrorMode(J)J'>

    "FIXME: Ignored for now"
    ^0

    "Modified (format): / 14-08-2012 / 11:35:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.java2d'!

_sun_java2d_Disposer_initIDs: nativeContext

    <javanative: 'sun/java2d/Disposer' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:54:59 / mh <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'native - sun.java2d.cmm.lcms'!

_sun_java2d_cmm_lcms_LCMS_getTagData: nativeContext

    <javanative: 'sun/java2d/cmm/lcms/LCMS' name: 'getTagData(JI[B)V'>

    | profileId tag data |

    profileId := nativeContext argAt: 1.
    tag := nativeContext argAt: 3.
    data := nativeContext argAt: 4.

    self assert: (nativeContext argAt: 1) = 12344321.

    tag = 1751474532 ifTrue:[
        data replaceBytesFrom:1
                with:#[0  3  146  96  108  99  109  115  4  0  0  0  115  112  97  99  51  67  76  82  88  89  90  32  7  216  0  4  0  10  0  10  0  24  0  22  97  99  115  112  65  80  80  76  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  1  0  0  246  214  0  1  0  0  0  0  211  45  108  99  109  115  240  231  92  85  210  30  77  140  137  67  22  250  239  246  146  191  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
                startingAt: 1.
        ^self.
    ].

    self breakPoint: #jv.

    "Modified: / 18-04-2012 / 08:29:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_java2d_cmm_lcms_LCMS_getTagSize: nativeContext

    <javanative: 'sun/java2d/cmm/lcms/LCMS' name: 'getTagSize(JI)I'>

    | profileId tag |
    profileId := nativeContext argAt: 1.
    tag := nativeContext argAt: 3.

    self assert: (nativeContext argAt: 1) = 12344321.

    "Magic numbers based on trace of real Java code"

    tag = 1751474532 ifTrue:[ ^ 128 ].


    self breakPoint: #jv.

    ^128 "Some magic default"

    "Modified: / 18-04-2012 / 08:29:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_java2d_cmm_lcms_LCMS_initLCMS: nativeContext

    <javanative: 'sun/java2d/cmm/lcms/LCMS' name: 'initLCMS(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V'>

    "Nothing to do"

    "Modified: / 09-12-2011 / 18:25:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_java2d_cmm_lcms_LCMS_loadProfile: nativeContext

    <javanative: 'sun/java2d/cmm/lcms/LCMS' name: 'loadProfile([B)J'>

    "FAKE, return some magic"
    ^12344321

    "Modified: / 09-12-2011 / 18:56:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.java2d.pipe'!

_sun_java2d_pipe_Region_initIDs: nativeContext

    <javanative: 'sun/java2d/pipe/Region' name: 'initIDs()V'>

    "Modified: / 09-02-2012 / 22:55:09 / mh <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'native - sun.management'!

_sun_management_MemoryImpl_getMemoryManagers0: nativeContext

    <javanative: 'sun/management/MemoryImpl' name: 'getMemoryManagers0()[Ljava/lang/management/MemoryManagerMXBean;'>

    "HACK, we'll see"

    | beanCls |
    beanCls := self classForName: 'java.lang.management.MemoryManagerMXBean'.
    ^beanCls javaArrayClass new:0.

    "Modified: / 04-12-2011 / 19:57:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_management_MemoryImpl_getMemoryPools0: nativeContext

    <javanative: 'sun/management/MemoryImpl' name: 'getMemoryPools0()[Ljava/lang/management/MemoryPoolMXBean;'>

    "HACK, we'll see"

    | beanCls |
    beanCls := self classForName: 'java.lang.management.MemoryPoolMXBean'.
    ^beanCls javaArrayClass new:0.

    "Modified: / 04-12-2011 / 19:58:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_management_VMManagementImpl_getStartupTime: nativeContext
    <javanative: 'sun/management/VMManagementImpl' name: 'getStartupTime()J'>
    ^ StartupTime.

    "Modified: / 03-11-2011 / 19:17:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_sun_management_VMManagementImpl_getVersion0: nativeContext
    <javanative: 'sun/management/VMManagementImpl' name: 'getVersion0'>
    ^ Java as_String: '1.2'.

    "Modified: / 03-11-2011 / 18:42:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_sun_management_VMManagementImpl_initOptionalSupportFields: nativeContext
    <javanative: 'sun/management/VMManagementImpl' name: 'initOptionalSupportFields()V'>
    | cls |
    cls := nativeContext receiver.

    cls instVarNamed: #compTimeMonitoringSupport put: 0.
    cls instVarNamed: #threadContentionMonitoringSupport put: 0.
    cls instVarNamed: #currentThreadCpuTimeSupport put: 0.
    cls instVarNamed: #otherThreadCpuTimeSupport put: 0.
    cls instVarNamed: #bootClassPathSupport put: 0.
    cls instVarNamed: #synchronizerUsageSupport put: 0.
    cls instVarNamed: #objectMonitorUsageSupport put: 0.
    ^ self.

    "Modified: / 13-12-2011 / 14:35:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_sun_management_VMManagementImpl_isThreadCpuTimeEnabled: nativeContext

    <javanative: 'sun/management/VMManagementImpl' name: 'isThreadCpuTimeEnabled()Z'>

    ^ 0 "/false should be safe, we'll see...

    "Modified: / 03-11-2011 / 22:45:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.misc'!

_sun_misc_GC_maxObjectInspectionAge: nativeContext

    <javanative: 'sun/misc/GC' name: 'maxObjectInspectionAge()J'>

    "
    /**
     * Returns the maximum <em>object-inspection age</em>, which is the number
     * of real-time milliseconds that have elapsed since the
     * least-recently-inspected heap object was last inspected by the garbage
     * collector.
     *
     * <p> For simple stop-the-world collectors this value is just the time
     * since the most recent collection.  For generational collectors it is the
     * time since the oldest generation was most recently collected.  Other
     * collectors are free to return a pessimistic estimate of the elapsed
     * time, or simply the time since the last full collection was performed.
     *
     * <p> Note that in the presence of reference objects, a given object that
     * is no longer strongly reachable may have to be inspected multiple times
     * before it can be reclaimed.
     */
    public static native long maxObjectInspectionAge();
    "

    ^Random nextIntegerBetween: 0 and: 3600. "Just return some number"

    "Modified: / 02-12-2011 / 21:56:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Signal_findSignal: aJavaContext

    <javanative: 'sun/misc/Signal' name: 'findSignal'>

        | input signame |

    input := Java as_ST_String: (aJavaContext argAt: 1).
    OperatingSystem isUNIXlike ifTrue:[
        signame := 'SIG', (input asUppercase).
        ^UnixOperatingSystem signalNamed: signame asSymbol.
    ].
    OperatingSystem isMSWINDOWSlike ifTrue:[
        signame := 'sig', (input asUppercase).
        ^Win32OperatingSystem perform: signame asSymbol.
    ].
    self error: 'Unsupported OS'

    "Created: / 11-12-2010 / 15:22:07 / Jan Kurs <kurs.jan@post.cz>"
!

_sun_misc_Signal_handle0: aJavaContext

    <javanative: 'sun/misc/Signal' name: 'handle0'>

        self breakPoint: #libjava.
    ^ 0.

    "Created: / 11-12-2010 / 16:33:38 / Jan Kurs <kurs.jan@post.cz>"
!

_sun_misc_Unsafe_addressSize: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'addressSize()I'>

    ^ExternalAddress pointerSize

    "Modified: / 10-07-2012 / 01:19:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_allocateInstance: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'allocateInstance'>

        "
    /** Allocate an instance but do not run any constructor.
        Initializes the class if it has not yet been. */
    public native Object allocateInstance(Class cls)
        throws InstantiationException;
    "
    | cls |
    cls := self reflection classForJavaClassObject: (nativeContext argAt:1).
    cls classInit.
    ^cls newCleared

    "Created: / 05-02-2011 / 23:10:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_allocateMemory: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'allocateMemory'>


    | size |
    size := aJavaContext argAt: 1.
    ^SimulatedNativeMemory malloc: size.

    "Created: / 07-12-2010 / 21:04:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 07-12-2010 / 23:46:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_arrayBaseOffset: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'arrayBaseOffset'>
    "
    /**
    * Report the offset of the first element in the storage allocation of a
    * given array class.  If {@link #arrayIndexScale} returns a non-zero value
    * for the same class, you may use that scale factor, together with this
    * base offset, to form new offsets to access elements of arrays of the
    * given class.
    *
    * @see #getInt(Object, long)
    * @see #putInt(Object, long, int)
    */
    public native int arrayBaseOffset(Class arrayClass);
    "

    ^ 1

    "Modified (comment): / 10-08-2011 / 01:22:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_arrayIndexScale: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'arrayIndexScale'>

    "
      /**
      * Report the scale factor for addressing elements in the storage
      * allocation of a given array class.  However, arrays of 'narrow' types
      * will generally not work properly with accessors like {@link
      * #getByte(Object, int)}, so the scale factor for such classes is reported
      * as zero.
      *
      * @see #arrayBaseOffset
      * @see #getInt(Object, long)
      * @see #putInt(Object, long, int)
      */
    public native int arrayIndexScale(Class arrayClass);
    "
    ^ 1

    "Modified: / 10-08-2011 / 01:26:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_compareAndSwapInt: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'compareAndSwapInt'>

    ^self _sun_misc_Unsafe_compareAndSwapObject: aJavaContext

    "Created: / 22-11-2010 / 18:40:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 07-08-2011 / 21:50:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_compareAndSwapLong: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'compareAndSwapLong'>

        "
    /**
     * Atomically update Java variable to <tt>x</tt> if it is currently
     * holding <tt>expected</tt>.
     * @return <tt>true</tt> if successful
     */
    public final native boolean compareAndSwapInt(Object o, long offset,
                                                  long expected,
                                                  long new);
    "
    | o offset expected real new ok |
    o := aJavaContext argAt:1.
    offset := aJavaContext argAt:2.
    "offset is long, so aJavaContext at:3 is dummy nil!!!!!!"
    expected := aJavaContext argAt:4.
    new := aJavaContext argAt:6.

    OperatingSystem blockInterrupts.
    real := o instVarAt: offset.
    (real == expected)
            ifTrue:[o instVarAt: offset put: new. ok := 1]
            ifFalse:[ok := 1].
    OperatingSystem unblockInterrupts.
    ^ok

    "Modified: / 18-10-2011 / 21:59:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_compareAndSwapObject: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'compareAndSwapInt'>

        "
    /**
     * Atomically update Java variable to <tt>x</tt> if it is currently
     * holding <tt>expected</tt>.
     * @return <tt>true</tt> if successful
     */
    public final native boolean compareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int new);
    "
    | o offset expected real new ok |
    o := aJavaContext argAt:1.
    offset := aJavaContext argAt:2.
    "offset is long, so aJavaContext at:3 is dummy nil!!!!!!"
    expected := aJavaContext argAt:4.
    new := aJavaContext argAt:5.

    OperatingSystem blockInterrupts.
    o isArray ifTrue:[
        real := o at: offset.
    ] ifFalse:[
        real := o instVarAt: offset.
    ].
    (real == expected) ifTrue:[
        o isArray ifTrue:[
            o at: offset put: new.
        ] ifFalse:[
            o instVarAt: offset put: new.
        ].
        ok := 1
    ] ifFalse:[
        ok := 0
    ].
    OperatingSystem unblockInterrupts.
    ^ok

    "Modified: / 03-09-2012 / 19:02:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_copyMemory: nativeContext
    "
    /**
     * Sets all bytes in a given block of memory to a copy of another
     * block.
     */
    public native void copyMemory(long srcAddress, long destAddress,
                                  long bytes);
    "

    <javanative: 'sun/misc/Unsafe' name: 'copyMemory(JJJ)V'>

    | srcAddress dstAddress bytes |

    srcAddress := nativeContext argAt:1.
    dstAddress := nativeContext argAt:3.
    bytes      := nativeContext argAt:5.
    SimulatedNativeMemory bcopy: srcAddress to: dstAddress length: bytes.

    "Modified (format): / 11-07-2012 / 10:25:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_defineClass: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'defineClass'>

        "
    /**
     * Tell the VM to define a class, without security checks.  By default, the
     * class loader and protection domain come from the caller's class.
     */
    public native Class defineClass(String name, byte[] b, int off, int len,
                                    ClassLoader loader,
                                    ProtectionDomain protectionDomain);
    "
    | name b off len loader protectionDomain bs cls |
    name := nativeContext argAt: 1.
    b := nativeContext argAt: 2.
    off := nativeContext argAt: 3.
    len := nativeContext argAt: 4.
    loader := nativeContext argAt: 5.
    protectionDomain := nativeContext argAt: 6.

    bs := (off = 0 and: [len = b size])
            ifTrue:[b readStream]
            ifFalse:[(b copyFrom: off + 1 to: off + len) readStream].

    cls := JavaClassReader readStream: bs.
    cls classLoader: loader.

    ^self reflection javaClassObjectForClass: cls.

    "Created: / 05-02-2011 / 22:57:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_ensureClassInitialized: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'ensureClassInitialized'>

        |class|

    class := self reflection classForJavaClassObject:(aJavaContext argAt:1).
     "Sometimes there is a nil. I don't know why, so I did quickfix"
    self breakPoint:#libjava.
    class ifNotNil:[class classInit.].

    "Created: / 11-12-2010 / 15:01:36 / Jan Kurs <kurs.jan@post.cz>"
    "Modified: / 25-12-2010 / 09:43:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-01-2011 / 15:11:21 / Jan Kurs <kurs.jan@post.cz>"
    "Modified: / 28-01-2011 / 15:19:31 / Marcel Hlopko <hlopik@gmail.com>"
!

_sun_misc_Unsafe_freeMemory: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'freeMemory'>

    | address  |
    address := aJavaContext argAt: 1.
    ^SimulatedNativeMemory free: address

    "Created: / 09-12-2010 / 17:56:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getBoolean: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getBoolean(Ljava/lang/Object;J)Z'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 19-11-2011 / 10:49:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getByte: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getByte(Ljava/lang/ObjectJ)B'>
    <javanative: 'sun/misc/Unsafe' name: 'getByte(J)B'>

    | object offset address |
    nativeContext numArgs == 3 ifTrue:[
        "getByte(Ljava/lang/Object;J)V"
        object := nativeContext argAt: 1.
        offset := nativeContext argAt: 2.
        ^object instVarAt: offset
    ].
    nativeContext numArgs == 2 ifTrue:[
        "getByte(J)V"
        address := nativeContext argAt: 1.
        ^SimulatedNativeMemory byteAt: address
    ].

    self internalError:'Unssuported getByte() variant'

    "Created: / 09-12-2010 / 17:29:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getChar: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getChar(Ljava/lang/Object;J)C'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 22-11-2011 / 14:51:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getDouble: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getDouble(Ljava/lang/Object;J)D'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 10-05-2012 / 17:01:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getFloat: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getFloat(Ljava/lang/Object;J)F'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 22-11-2011 / 14:53:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getFloatVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getFloatVolatile(Ljava/lang/Object;J)F'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 10-05-2012 / 17:01:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getInt: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getInt'>
    "
    /**
    * Fetches a integer value from a given Java variable.
    */
    public native int getInt(Object o, long offset);
    "
    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 18-10-2011 / 20:33:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getIntVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getIntVolatile(Ljava/lang/Object;J)I'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 28-03-2012 / 15:03:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getLong: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getLong(Ljava/lang/Object;J)J'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 25-08-2012 / 11:15:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getLongVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getLongVolatile(Ljava/lang/Object;J)J'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 31-08-2011 / 23:57:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getObject: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getObject'>
    "
    /**
    * Fetches a reference value from a given Java variable.
    * @see #getInt(Object, long)
    */
    public native Object getObject(Object o, long offset);
    "
    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o isArray ifTrue:[
        o at: offset
    ] ifFalse:[
        o instVarAt: offset
    ]

    "Modified: / 03-09-2012 / 19:00:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getObjectVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getObjectVolatile(Ljava/lang/Object;J)Ljava/lang/Object;'>
    "
    /**
    * Fetches a reference value from a given Java variable, with volatile
    * load semantics. Otherwise identical to {@link #getObject(Object, long)}
    */
    public native Object getObjectVolatile(Object o, long offset);
    "

    ^self _sun_misc_Unsafe_getObject: nativeContext

    "Modified: / 03-09-2012 / 19:00:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getShort: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getShort(Ljava/lang/Object;J)S'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 22-11-2011 / 14:52:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_getShortVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'getShortVolatile(Ljava/lang/Object;J)S'>

    | o offset |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    ^o instVarAt: offset

    "Modified: / 29-06-2012 / 19:05:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_objectFieldOffset: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'objectFieldOffset'>


    | javaFieldObject |
    javaFieldObject := aJavaContext argAt: 1.
    ^javaFieldObject instVarNamed: #slot

    "Created: / 22-11-2010 / 17:58:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_pageSize: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'pageSize'>

    ^ 4096"4K is the page size on x86, I think... "

    "Modified: / 25-11-2011 / 19:24:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_park: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'park(ZJ)V'>
    "
    /**
     * Block current thread, returning when a balancing
     * <tt>unpark</tt> occurs, or a balancing <tt>unpark</tt> has
     * already occurred, or the thread is interrupted, or, if not
     * absolute and time is not zero, the given time nanoseconds have
     * elapsed, or if absolute, the given deadline in milliseconds
     * since Epoch has passed, or spuriously (i.e., returning for no
     * 'reason'). Note: This operation is in the Unsafe class only
     * because <tt>unpark</tt> is, so it would be strange to place it
     * elsewhere.
     */
    "

    | absolute millis tout process |

    absolute := nativeContext argAt: 1.
    millis := nativeContext argAt: 2.

    millis ~~ 0 ifTrue:[
        absolute == 1 ifTrue:[
            tout := millis - OperatingSystem getOSTime.
            tout < 1 ifTrue:[
                tout := nil.
            ].
        ] ifFalse:[
            tout := millis.
        ]
    ] ifFalse:[
        tout := nil.
    ].

    process := Processor activeProcess.
    self park: process timeout: tout.

    "Modified: / 16-08-2012 / 21:52:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putBoolean: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putBoolean(Ljava/lang/Object;JZ)V'>

    "Like putInt:, see _sun_misc_Unsafe_putInt:"

    | o offset x |

    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.
    ^o instVarAt: offset put: x.

    "Modified: / 27-10-2011 / 16:23:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putByte: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putByte(Ljava/lang/Object;JB)V'>
    <javanative: 'sun/misc/Unsafe' name: 'putByte(JB)V'>

    nativeContext selector == #'putByte(JB)V' ifTrue:[
        | address value |
        address := nativeContext argAt: 1.
        value := nativeContext argAt: 3.
        SimulatedNativeMemory byteAt: address put: (value bitAnd: 16rFF).
        ^nil.
    ].

    nativeContext selector = #'putByte(Ljava/lang/Object;JB)V' ifTrue:[
        | o offset x |
        o := nativeContext argAt: 1.
        offset := nativeContext argAt: 2.
        x := nativeContext argAt: 4.
        ^o instVarAt: offset put: x.
    ].

    self shouldNotImplement

    "Modified: / 31-07-2012 / 11:47:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putChar: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putChar(Ljava/lang/Object;JC)V'>

    | o offset x |

    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.
    ^o instVarAt: offset put: x.

    "Modified: / 22-11-2011 / 14:52:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putDouble: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putDouble(Ljava/lang/Object;JD)V'>
    <javanative: 'sun/misc/Unsafe' name: 'putDouble(JD)V'>

    | o offset x |

    nativeContext numArgs == 5 ifTrue:[
        "putDouble(Ljava/lang/Object;JD)V"
        o := nativeContext argAt: 1.
        offset := nativeContext argAt: 2.
        x := nativeContext argAt: 4.
        o instVarAt: offset put: x.
        ^nil
    ].
    nativeContext numArgs == 4 ifTrue:[
        "putDouble(JD)V"
        o := nativeContext argAt: 1.
        x := nativeContext argAt: 3.
        SimulatedNativeMemory doubleAt: o put: x.
        ^nil
    ].
    self internalError:'Unknown variant of putDouble() native!!'

    "Modified: / 30-08-2011 / 15:58:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putFloat: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putFloat(Ljava/lang/Object;JF)V'>

    | o offset x |

    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.
    ^o instVarAt: offset put: x.

    "Modified: / 22-11-2011 / 14:53:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putInt: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putInt'>
    "
    /**
     * Stores a value into a given Java variable.
     * <p>
     * The first two parameters are interpreted exactly as with
     * {@link #getInt(Object, long)} to refer to a specific
     * Java variable (field or array element).  The given value
     * is stored into that variable.
     * <p>
     * The variable must be of the same type as the method
     * parameter <code>x</code>.
     *
     * @param o Java heap object in which the variable resides, if any, else
     *        null
     * @param offset indication of where the variable resides in a Java heap
     *        object, if any, else a memory address locating the variable
     *        statically
     * @param x the value to store into the indicated Java variable
     * @throws RuntimeException No defined exceptions are thrown, not even
     *         {@link NullPointerException}
     */
    public native void putInt(Object o, long offset, int x);
    "

    | o offset x |

    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.
    ^o instVarAt: offset put: x.

    "Modified: / 30-08-2011 / 15:48:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putLong: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putDouble(Ljava/lang/Object;JJ)V'>
    <javanative: 'sun/misc/Unsafe' name: 'putDouble(JJ)V'>

    | o offset x |

    nativeContext numArgs == 5 ifTrue:[
        "putDouble(Ljava/lang/Object;JD)V"
        o := nativeContext argAt: 1.
        offset := nativeContext argAt: 2.
        x := nativeContext argAt: 4.
        o instVarAt: offset put: x.
        ^nil
    ].
    nativeContext numArgs == 4 ifTrue:[
        "putDouble(JD)V"
        o := nativeContext argAt: 1.
        x := nativeContext argAt: 3.
        SimulatedNativeMemory sint64At: o put: x.
        ^nil
    ].
    self internalError:'Unknown variant of putLong() native!!'

    "Created: / 07-12-2010 / 23:50:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-07-2012 / 16:03:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putObject: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putObject'>

    "
    /**
     * Stores a reference value into a given Java variable.
     * <p>
     * Unless the reference <code>x</code> being stored is either null
     * or matches the field type, the results are undefined.
     * If the reference <code>o</code> is non-null, car marks or
     * other store barriers for that object (if the VM requires them)
     * are updated.
     * @see #putInt(Object, int, int)
     */
     public native void putObject(Object o, long offset, Object x);
     "
    | o offset x |
    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.

    ^o isArray ifTrue:[
        o at: offset put: x
    ] ifFalse:[
        o instVarAt: offset put: x.
    ].

    "Modified: / 03-09-2012 / 18:59:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putObjectVolatile: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putObjectVolatile(Ljava/lang/Object;JLjava/lang/Object;)V'>

    ^self _sun_misc_Unsafe_putObject: nativeContext

    "Modified: / 03-09-2012 / 18:59:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putOrderedObject: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putOrderedObject(Ljava/lang/Object;JLjava/lang/Object;)V'>

    "
    /**
     * Version of {@link #putObjectVolatile(Object, long, Object)}
     * that does not guarantee immediate visibility of the store to
     * other threads. This method is generally only useful if the
     * underlying field is a Java volatile (or if an array cell, one
     * that is otherwise only accessed using volatile accesses).
     */
    "

    ^ self _sun_misc_Unsafe_putObject: nativeContext

    "Modified (comment): / 03-09-2012 / 18:56:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_putShort: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'putShort(Ljava/lang/Object;JS)V'>

    | o offset x |

    o := nativeContext argAt: 1.
    offset := nativeContext argAt: 2.
    x := nativeContext argAt: 4.
    ^o instVarAt: offset put: x.

    "Modified: / 22-11-2011 / 14:52:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_registerNatives: aJavaContext

    <javanative: 'sun/misc/Unsafe' name: 'registerNatives'>


     "Nothing to do, native method are bound lazily"

    "Created: / 25-10-2010 / 16:14:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_setMemory: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'setMemory(JJB)V'>

    | address bytes value|

    address := nativeContext argAt: 1.
    bytes := nativeContext argAt: 3.
    value := nativeContext argAt: 5.
    SimulatedNativeMemory memset: address value: value length: bytes.

    "Modified (format): / 11-07-2012 / 10:29:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_staticFieldBase: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'staticFieldBase(Ljava/lang/reflect/Field;)Ljava/lang/Object;'>
    "
      /**
      * Report the location of a given static field, in conjunction with {@link
      * #staticFieldOffset}.
      * <p>Fetch the base 'Object', if any, with which static fields of the
      * given class can be accessed via methods like {@link #getInt(Object,
      * long)}.  This value may be null.  This value may refer to an object
      * which is a 'cookie', not guaranteed to be a real Object, and it should
      * not be used in any way except as argument to the get and put routines in
      * this class.
      */
      public native Object staticFieldBase(Field f);
    "
     | javaFieldObject javaClassObject |
     javaFieldObject := nativeContext argAt: 1.
     javaClassObject := javaFieldObject instVarNamed: #clazz.
     ^self classForJavaClassObject: javaClassObject.

    "Modified: / 17-08-2011 / 09:42:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_staticFieldOffset: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'staticFieldOffset(Ljava/lang/reflect/Field;)J'>

    | javaFieldObject |
    javaFieldObject := nativeContext argAt: 1.
    ^javaFieldObject instVarNamed: #slot

    "Modified: / 17-08-2011 / 09:12:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_Unsafe_unpark: nativeContext

    <javanative: 'sun/misc/Unsafe' name: 'unpark(Ljava/lang/Object;)V'>
    "
    /**
     * Unblock the given thread blocked on <tt>park</tt>, or, if it is
     * not blocked, cause the subsequent call to <tt>park</tt> not to
     * block.  Note: this operation is 'unsafe' solely because the
     * caller must somehow ensure that the thread has not been
     * destroyed. Nothing special is usually required to ensure this
     * when called from Java (in which there will ordinarily be a live
     * reference to the thread) but this is not nearly-automatically
     * so when calling from native code.
     * @param thread the thread to unpark.
     *
     */
    public native void unpark(Object thread);
    "

    | thread process |

    thread := nativeContext argAt: 1.
    process := Java threads at: thread ifAbsent:[
        self error: 'No process for given thread'.
    ].
    self unpark: process.

    "Modified: / 16-08-2012 / 21:52:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_misc_VM_initialize: aJavaContext

    <javanative: 'sun/misc/VM' name: 'initialize'>


    "Nothing to do"

    "Created: / 26-11-2010 / 18:43:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.nio.ch'!

_sun_nio_ch_FileChannelImpl_initIDs: nativeContext

    <javanative: 'sun/nio/ch/FileChannelImpl' name: 'initIDs()J'>

    ^ 4096 "/page size, see

    "Modified: / 10-07-2012 / 01:08:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileChannelImpl_map0: nativeContext

    <javanative: 'sun/nio/ch/FileChannelImpl' name: 'map0(IJJ)J'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_sun_nio_ch_FileChannelImpl_position0: nativeContext

    <javanative: 'sun/nio/ch/FileChannelImpl' name: 'position0(Ljava/io/FileDescriptor;J)J'>

    | fd position stream |

    fd := nativeContext argAt: 1.
    position := nativeContext argAt: 2.
    stream := self validateFileDescriptor: fd.
    stream isFileStream ifFalse:[
        self throwIOExceptionWithMessage: 'Not a file stream'.
        ^nil.
    ].
    ^position = -1
        ifTrue:[stream position0Based]
        ifFalse:[stream position0Based: position. 0].

    "Modified: / 10-07-2012 / 01:30:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileChannelImpl_size0: nativeContext

    <javanative: 'sun/nio/ch/FileChannelImpl' name: 'size0(Ljava/io/FileDescriptor;)J'>

    | fd stream |

    fd := nativeContext argAt: 1.
    stream := self validateFileDescriptor: fd.
    stream isFileStream ifFalse:[
        self throwIOExceptionWithMessage: 'Not a file stream'.
        ^nil.
    ].
    ^stream fileSize max: stream position0Based.

    "Modified: / 10-07-2012 / 01:28:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileChannelImpl_truncate0: nativeContext

    <javanative: 'sun/nio/ch/FileChannelImpl' name: 'truncate0(Ljava/io/FileDescriptor;J)I'>

    | fd size stream |

    fd := nativeContext argAt: 1.
    size := nativeContext argAt: 2.
    stream := self validateFileDescriptor: fd.
    stream isFileStream ifFalse:[
        self throwIOExceptionWithMessage: 'Not a file stream'.
        ^nil.
    ].
    stream truncateTo: size.
    ^0.

    "Modified: / 10-07-2012 / 01:02:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileDispatcher_init: nativeContext

    <javanative: 'sun/nio/ch/FileDispatcher' name: 'init()V'>

    ^ JavaNioSupport _sun_nio_ch_FileDispatcher_init

    "Modified: / 06-07-2012 / 22:35:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileDispatcher_preClose0: nativeContext

    <javanative: 'sun/nio/ch/FileDispatcher' name: 'preClose0(Ljava/io/FileDescriptor;)V'>

    "Nothing to do here"

    "Modified: / 10-07-2012 / 00:47:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileDispatcher_read0: nativeContext

    <javanative: 'sun/nio/ch/FileDispatcher' name: 'read0(Ljava/io/FileDescriptor;JI)I'>

    | fd address len stream read |

    fd := nativeContext argAt: 1.
    address := nativeContext argAt: 2.
    len := nativeContext argAt: 4.

    stream := self validateFileDescriptor: fd.
    stream atEnd ifTrue:[ ^ -1 ].
    [
        self shouldImplement
        "/WAS: read := stream nextBytes:len into:SimulatedNativeMemory memory startingAt: address
    ] on: Error do:[:ex|
        self throwIOExceptionWithMessage: ex description.
        ^0
    ].
    ^read

    "Modified (comment): / 11-07-2012 / 10:38:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_FileDispatcher_write0: nativeContext

    <javanative: 'sun/nio/ch/FileDispatcher' name: 'write0(Ljava/io/FileDescriptor;JI)I'>

    | fd address len stream writtem |

    fd := nativeContext argAt: 1.
    address := nativeContext argAt: 2.
    len := nativeContext argAt: 4.

    stream := self validateFileDescriptor: fd.
    [
        self shouldImplement.
        "/WAS: writtem := stream nextPutBytes:len from:SimulatedNativeMemory memory startingAt: address
    ] on: Error do:[:ex|
        self throwIOExceptionWithMessage: ex description.
        ^0
    ].
    ^writtem

    "Modified: / 11-07-2012 / 10:38:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_IOUtil_initIDs: nativeContext

    <javanative: 'sun/nio/ch/IOUtil' name: 'initIDs()V'>

    "Nothing to do here"

    "Modified: / 06-07-2012 / 22:10:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_IOUtil_initPipe: nativeContext

    <javanative: 'sun/nio/ch/IOUtil' name: 'initPipe([IZ)V'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_sun_nio_ch_NativeThread_current: nativeContext

    <javanative: 'sun/nio/ch/NativeThread' name: 'current()J'>

    ^ JavaNioSupport _sun_nio_ch_NativeThread_current

    "Modified: / 06-07-2012 / 22:39:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_NativeThread_init: nativeContext

    <javanative: 'sun/nio/ch/NativeThread' name: 'init()V'>

    ^ JavaNioSupport _sun_nio_ch_NativeThread_init

    "Modified: / 06-07-2012 / 22:38:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_Net_initIDs: nativeContext

    <javanative: 'sun/nio/ch/Net' name: 'initIDs()V'>

    "Nothing to do here"

    "Modified: / 10-05-2012 / 17:00:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_nio_ch_Net_socket0: nativeContext

    <javanative: 'sun/nio/ch/Net' name: 'socket0(ZZ)I'>

    ^ JavaVM unimplementedNativeMethodSignal raise
!

_sun_nio_ch_ServerSocketChannelImpl_initIDs: nativeContext

    <javanative: 'sun/nio/ch/ServerSocketChannelImpl' name: 'initIDs()V'>

    "Nothing to do here"

    "Modified: / 10-05-2012 / 16:58:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.reflect'!

_sun_reflect_ConstantPool_getDoubleAt0: nativeContext

    <javanative: 'sun/reflect/ConstantPool' name: 'getDoubleAt0'>

        | cpool  index  double |

    cpool := self reflection constantPoolFor:(nativeContext receiver).
    index := nativeContext at:3.
     "TODO: why 3?"
    double := cpool at:index.
    self assert:double isFloat description:'Not a float constant!!'.
    ^ double

    "Modified: / 25-02-2011 / 18:40:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 28-02-2011 / 17:24:17 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 02-11-2011 / 11:24:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

_sun_reflect_ConstantPool_getIntAt0: nativeContext

    <javanative: 'sun/reflect/ConstantPool' name: 'getIntAt0'>

        | cpool  index  int |

    cpool := self reflection constantPoolFor:(nativeContext receiver).
    index := nativeContext at:3.
     "TODO: why 3?"
    int := cpool at:index.
    self assert:int isInteger description:'Not an integer constant!!'.
    ^ int

    "Modified: / 25-02-2011 / 18:40:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 28-02-2011 / 17:28:10 / Marcel Hlopko <hlopik@gmail.com>"
!

_sun_reflect_ConstantPool_getLongAt0: nativeContext

    <javanative: 'sun/reflect/ConstantPool' name: 'getLongAt0'>

        | cpool  index  long |

    cpool := self reflection constantPoolFor:(nativeContext receiver).
    index := nativeContext at:3.
     "TODO: why 3?"
    long := cpool at:index.
    self assert:long isInteger description:'Not a float constant!!'.
    ^ long

    "Modified: / 28-02-2011 / 17:40:02 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 28-02-2011 / 18:54:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_reflect_ConstantPool_getUTF8At0: nativeContext

    <javanative: 'sun/reflect/ConstantPool' name: 'getUTF8At0'>


    | cpool index string |
    cpool := self reflection constantPoolFor: (nativeContext receiver).
    index := nativeContext at: 3.
    "TODO: why 3?"

    string := cpool at: index.
    self assert: string isString description: 'Not an UTF8 constant!!'.
    ^Java as_String: string

    "Created: / 06-02-2011 / 12:56:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_reflect_NativeConstructorAccessorImpl_newInstance0: aJavaContext

    <javanative: 'sun/reflect/NativeConstructorAccessorImpl' name: 'newInstance0'>


    | ctor args method instance class |
    ctor := aJavaContext argAt: 1.
    args := aJavaContext argAt: 2.
    class := self reflection classForJavaConstructorObject: ctor.
    method := self reflection methodForJavaConstructorObject: ctor.

    instance := class new.
    self invoke: ctor receiver: instance arguments: args context: aJavaContext constructor: true.
    ^instance

    "Created: / 26-11-2010 / 11:41:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 01:12:10 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 22-08-2012 / 12:25:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_reflect_NativeMethodAccessorImpl_invoke0: nativeContext

    <javanative: 'sun/reflect/NativeMethodAccessorImpl' name: 'invoke0'>
    "
    private static native Object invoke0(Method m, Object obj, Object[] args);
    "
    | m obj args method |
    m := nativeContext argAt: 1.
    obj := nativeContext argAt: 2.
    args := nativeContext argAt: 3.
    method := self reflection methodForJavaMethodObject: m.

    ^ self invoke: m receiver: obj arguments: args context: nativeContext constructor: false.

    "Created: / 06-02-2011 / 00:00:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-02-2011 / 16:57:31 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 19-08-2011 / 15:06:00 / cg"
    "Modified: / 05-07-2012 / 23:49:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_reflect_Reflection_getCallerClass: aJavaContext

    <javanative: 'sun/reflect/Reflection' name: 'getCallerClass'>
    "
    /** Returns the class of the method <code>realFramesToSkip</code>
        frames up the stack (zero-based), ignoring frames associated
        with java.lang.reflect.Method.invoke() and its implementation.
        The first frame is that associated with this method, so
        <code>getCallerClass(0)</code> returns the Class object for
        sun.reflect.Reflection. Frames associated with
        java.lang.reflect.Method.invoke() and its implementation are
        completely ignored and do not count toward the number of 'real'
        frames skipped. */
    "

    | framesToSkip framesSkipped frame cls |


    framesToSkip := aJavaContext argAt: 1.
    framesSkipped := 0.
    frame := aJavaContext.
    [ framesSkipped == framesToSkip ] whileFalse:[
        frame := frame sender.
        "Frames for java,lang.reflect.Method.invoke() does not count, sigh.
         What a crappy implementation"
        (frame selector == #'invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;'
            and:[ frame receiver class name = #'java/lang/reflect/Method']) ifFalse:[
                framesSkipped := framesSkipped + 1
            ]
    ].

    "Returns the __class of the method__, not !!!!!! the class of method's receiver !!!!!!"
    "                  |                                                            "
    "                  V                                                            "
    cls := frame method mclass theNonMetaclass.
    ^cls isJavaClass
        ifTrue:[JavaVM javaClassObjectForClass:cls]
        ifFalse:[nil]

    "Created: / 25-10-2010 / 16:32:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_sun_reflect_Reflection_getClassAccessFlags: aJavaContext

    <javanative: 'sun/reflect/Reflection' name: 'getClassAccessFlags'>

        |class|

    class := self reflection classForJavaClassObject:(aJavaContext argAt:1).
    ^(class isJavaPrimitiveType or:[class isJavaArrayClass]) ifTrue:[
        1041"FIXME: make it symbolic"
    ] ifFalse:[
        class accessFlags
    ]

    "Created: / 26-11-2010 / 10:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 15:19:28 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 01-09-2011 / 09:46:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'native - sun.security.provider'!

_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed: nativeContext

    <javanative: 'sun/security/provider/NativeSeedGenerator' name: 'nativeGenerateSeed([B)Z'>

    ^ JavaVM unimplementedNativeMethodSignal raise
! !

!JavaVM class methodsFor:'queries'!

booted

    | jVM |

    "/Slightly faster variant of the code below
    ^SystemClassLoader notNil and:[
        jVM := JavaVM classNamed: 'sun.misc.VM'.
        jVM notNil and: [ (jVM instVarNamed: #booted) == 1 ]
    ].

"/    jVM := JavaVM classNamed: 'sun.misc.VM'.
"/    ^ jVM notNil and: [ (jVM instVarNamed: #booted) == 1 ] and: [self systemClassLoader notNil].

    "
     JavaVM booted"

    "Created: / 08-08-2011 / 10:04:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2011 / 22:08:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 04-12-2011 / 10:32:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'threads'!

clearInterrupted: process
    ThreadInterrupts removeKey: process ifAbsent: []

    "Created: / 16-08-2012 / 22:03:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isInterrupted: process
    ^ThreadInterrupts at: process ifAbsent:[false].

    "Created: / 16-08-2012 / 22:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

park: process timeout: tout
    "A helper for sun.misc.Unsafe.park()"

    | blocked sema |

    blocked := OperatingSystem blockInterrupts.
    ParkUnparkSemaphores isNil ifTrue:[
        ParkUnparkSemaphores := Dictionary new.
    ].
    sema := ParkUnparkSemaphores at: process ifAbsentPut:[Semaphore new].
    blocked ifFalse:[ OperatingSystem unblockInterrupts ].

    Logger log: 'parking thread ', process printString severity: #debug facility: #JVM.
    sema parkWithTimeoutMs: tout.
    Logger log: 'parked thread ', process printString , ' resumed' severity: #debug facility: #JVM.

    "Created: / 16-08-2012 / 21:51:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

setInterrupted: process
    ThreadInterrupts at: process put: true

    "Created: / 16-08-2012 / 22:03:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

terminateAllThreads
    Java terminateAllThreads.
    JavaEventThread := nil.
    JavaScreenUpdaterThread := JavaEventQueueThread := nil.

    "Created: / 8.1.1998 / 17:43:54 / cg"
    "Modified: / 24.12.1999 / 02:33:16 / cg"
!

threadStart: nativeContext
    "start the thread"

    | jThread  jName  nm  stProcess  helper |
    jThread := nativeContext receiver.
    self assert: (jThread instVarNamed: 'priority') > 0.
    stProcess := JavaProcess for: (helper := JavaProcess newHelper)
                priority: (Processor activePriority).
    helper javaThreadObject: jThread.
    helper javaProcess: stProcess.
    jName := jThread instVarNamed: 'name'.
    jName isString ifFalse: [ nm := Java as_ST_String: jName. ] ifTrue: [
        nm := jName
    ].

    "/ kludge - remember the ScreenUpdater ...

    nm = 'Screen Updater' ifTrue: [ JavaScreenUpdaterThread := stProcess. ] ifFalse: [
        nm = 'AWT-Windows' ifTrue: [ JavaEventThread := stProcess. ] ifFalse: [
            (nm startsWith: 'AWT-EventQueue') ifTrue: [
                JavaEventQueueThread := stProcess.
            ].
        ]
    ].

    "/ when that process terminates, wakup any waiters
    "/mh 29.11.11 this makes join work
    "/mh 30.11.11 disable wait is to ensure that join can be called on thread after its finished and dont wait forever"

    stProcess
        addExitAction: [
            Logger
                log: ('%1 is going to die, notifying all waiters and disabling waiting on its monitor'
                        bindWith: jThread printString)
                severity: #debug
                facility: #JVM.
            jThread instVarNamed: 'threadStatus' put: 0.
            jThread getJavaMonitor disableWait.
            self acquireMonitorAndNotifyAll: jThread.
            ThreadInterrupts notNil ifTrue:[
                ThreadInterrupts removeKey: stProcess ifAbsent:[]
            ].
        ].
    stProcess name: 'JAVA-' , nm.
    stProcess restartable: true.
    jThread instVarNamed: 'threadStatus' put: 1.
    Java addThread: jThread for: stProcess.
    stProcess resume.
    ^ nil

    "Modified: / 24-12-1999 / 03:14:33 / cg"
    "Created: / 14-12-2010 / 21:31:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-12-2011 / 12:58:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 03-09-2012 / 18:42:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

unpark: process
    "A helper for sun.misc.Unsafe.unpark()"

    | blocked sema |

    blocked := OperatingSystem blockInterrupts.
    ParkUnparkSemaphores isNil ifTrue:[ParkUnparkSemaphores dictionary new].
    sema := ParkUnparkSemaphores at: process ifAbsentPut:[Semaphore new].
    blocked ifFalse:[ OperatingSystem unblockInterrupts ].

    Logger log: 'unparking thread ', process printString severity: #debug facility: #JVM.
    sema signal.

    "Created: / 16-08-2012 / 21:52:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'vm support'!

_ANEWARRAY:cls _:size
    "Returns a new array of elements of type class."

    self assert: cls isBehavior.
    size <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    self assert:cls javaArrayClass isJavaArrayClass.
    ^ cls javaArrayClass new:size

    "Created: / 17-12-2010 / 14:28:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 22-11-2011 / 09:46:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_ARRAYLENGTH:arr
    arr isNil ifTrue:[
        "/self halt:'should not happen'.
        self throwNullPointerException.
    ].
    ^ arr size

    "Created: / 08-01-1999 / 14:38:27 / cg"
    "Modified: / 31-05-2011 / 10:09:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_ATHROW:aJavaException

    <resource: #skipInDebuggersWalkBack>

    aJavaException isNil ifTrue:[
        self halt:'cannot happen'
    ].
    "When an exception is handled in Smalltalk code and the stack is
     being unwound, then all intermediate Java finally blocks are executed.
     This is done by fake-throwing special FinallyToken, as there must an
     exception instance for Java. A Java compiler compiles unconditional
     ATHROW at the end of finally block to pass execution to another handler.
     We don't want to do so, in case we're manually invoking finally blocks.
     Hence following hack: we teleport back to handler caller"
    aJavaException class == JavaContext::FinallyToken ifTrue:[
        aJavaException pass.
        self halt:'Should never be reached'.
    ].
    self throwException:aJavaException

    "Created: / 08-01-1999 / 14:15:36 / cg"
    "Modified: / 08-11-2011 / 16:32:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 09-04-2012 / 21:00:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_CHECKCAST2: object _: classRef
    "Called by the VM (java bytecode interpreter) for unhandled cases.
     Unlike in _CHECKCAST:_: the second parameter is a class reference,
     not the class itself!! Will wanish!!"

    | class |

    classRef isJavaRef ifTrue: [ class := classRef resolve ] ifFalse: [
        self error: 'I expected classRefs only - maybe I was wrong'
    ].
    (object isNil or: [ (self canCast: object class to: class) not ]) ifTrue: [
        self breakPoint: #mh.
        self throwClassCastException.
        ^ false
    ].

    ^ true.

    "Created: / 19-05-2011 / 10:12:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (comment): / 09-10-2012 / 11:56:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_CHECKCAST: object _: class
    "Called from the JIT-compiled code for unhandled cases.
     Unlike in _CHECKCAST2:_: the second parameter is a class,,
     not a class class reference!!

     This method *MUST* return the object for this may lead
     into GC. See ___checkcast() VM function
     "

    (self canCast: object class to: class) ifFalse: [
        self throwClassCastException.
        ^ nil "Not reached"
    ].
    ^ object

    "Created: / 08-01-1999 / 14:53:51 / cg"
    "Modified: / 09-01-1999 / 00:45:21 / cg"
    "Modified: / 09-10-2012 / 11:53:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_D2I:op1
    |v|

    v := op1 asInteger.
    v > 16r7FFFFFFF ifTrue:[
	self halt.
	v := 16r7FFFFFFF
    ] ifFalse:[
	v < 16r80000000 negated ifTrue:[
	    self halt.
	    v := 16r80000000 negated
	]
    ].
    ^ v

    "Modified: / 17.10.1998 / 21:55:49 / cg"
    "Created: / 8.1.1999 / 14:47:13 / cg"
!

_D2L:op1
    |v|

    v := op1 asInteger.
    v > 16r7FFFFFFFFFFFFFFF ifTrue:[
	self halt.
	v := 16r7FFFFFFFFFFFFFFF
    ] ifFalse:[
	v < 16r8000000000000000 negated ifTrue:[
	    self halt.
	    v := 16r8000000000000000 negated
	]
    ].
    ^ v

    "Modified: / 17.10.1998 / 21:55:49 / cg"
    "Created: / 8.1.1999 / 14:46:44 / cg"
!

_DADD:op1 _:op2
    ^ op1 asFloat + op2 asFloat

    "Created: / 8.1.1999 / 15:11:59 / cg"
!

_DDIV:op1 _:op2
    ^ op1 asFloat uncheckedDivide: op2 asFloat.

    "Created: / 08-01-1999 / 15:09:10 / cg"
    "Modified: / 06-09-2011 / 19:31:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_DMUL:op1 _:op2
    ^ op1 asFloat * op2 asFloat

    "Created: / 8.1.1999 / 14:49:52 / cg"
!

_DNEG:op
    ^ op asFloat negated

    "Created: / 8.1.1999 / 15:06:15 / cg"
!

_DSUB:op1 _:op2
    ^ op1 asFloat - op2 asFloat

    "Created: / 8.1.1999 / 15:10:59 / cg"
!

_F2I:op1
    ^ self _D2I:op1

    "Created: / 8.1.1999 / 14:47:42 / cg"
!

_F2L:op1
    ^ self _D2L:op1

    "Created: / 8.1.1999 / 14:47:53 / cg"
!

_FADD:op1 _:op2
    ^ op1 asShortFloat + op2 asShortFloat

    "Created: / 8.1.1999 / 15:11:36 / cg"
!

_FDIV:op1 _:op2

    op1 isZero ifTrue:[
        op2 isZero ifTrue:[ ^ Float NaN ]
    ].
    op2 isZero ifTrue:[
        ^ Float infinity
    ].
    ^ op1 asShortFloat / op2 asShortFloat.

    "Created: / 08-01-1999 / 15:09:32 / cg"
    "Modified: / 06-07-2012 / 13:12:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_FMUL:op1 _:op2
    ^ op1 asShortFloat * op2 asShortFloat

    "Created: / 8.1.1999 / 14:50:10 / cg"
!

_FNEG:op
    ^ op asShortFloat negated

    "Created: / 8.1.1999 / 15:06:33 / cg"
!

_FSUB:op1 _:op2
    ^ op1 asShortFloat - op2 asShortFloat

    "Created: / 8.1.1999 / 15:08:17 / cg"
!

_INSTANCEOF:object _:class
    "Called from the jitted code for unhandled cases.
     Unlike in _INSTANCEOF_R:_: the second parameter is a class,,
     not a class class reference!!"

    object isNil ifTrue:[^0].
    ^(self canCast: object class to: class)
        ifTrue:[1]
        ifFalse:[0]

    "Created: / 08-01-1999 / 14:52:54 / cg"
    "Modified: / 27-01-1999 / 20:56:25 / cg"
    "Modified: / 09-10-2012 / 11:55:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 15-10-2012 / 21:51:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_INSTANCEOF_R: object _: classRef
    "Called by the VM (java bytecode interpreter) for unhandled cases.
     Unlike _INSTANCEOF:_: the second parameter is a class reference,
     not the class itself!! Will wanish!!"

    | class |

    classRef isJavaRef ifFalse: [self error: 'expected only classRefs - maybe I was wrong'].
    class := classRef resolve.
    object isNil ifTrue: [ ^ 0 ].
    ^ (self canCast: object class to: class) ifTrue: [ 1 ] ifFalse: [ 0 ].

    "Created: / 15-10-2012 / 21:51:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_L2D:op1
    ^ op1 asFloat

    "Created: / 8.1.1999 / 14:46:09 / cg"
!

_L2F:op1
    ^ op1 asShortFloat

    "Created: / 8.1.1999 / 14:46:18 / cg"
    "Modified: / 8.1.1999 / 14:50:18 / cg"
!

_LADD:op1 _:op2
    |sum|

    sum := (op1 + op2) bitAnd:16rFFFFFFFFFFFFFFFF.
    ^ sum

    "Created: / 8.1.1999 / 15:07:39 / cg"
!

_LAND:op1 _:op2
    |rslt|

    (op1 < 0 or:[op2 < 0]) ifTrue:[
	self halt.
    ].
    rslt := op1 bitAnd: op2.
    ^ rslt

    "Modified: / 7.1.1998 / 21:21:53 / cg"
    "Created: / 8.1.1999 / 14:54:22 / cg"
!

_LDC_R: ref
    "Called by JIT-compiled code for non-constant
     reference (StringRef or ClassRef"

    ^ref isJavaClassRef ifTrue:[
        self javaClassObjectForClass: ref resolve
    ] ifFalse:[
        ref resolve
    ]

    "Created: / 16-10-2012 / 09:34:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_LDIV:op1 _:op2
    |quo|

    quo := op1 quo: op2.
    ^ quo

    "Created: / 8.1.1999 / 15:04:47 / cg"
!

_LMUL:op1 _:op2
    |prod o1 o2 sign|

"/ self halt.
    "/ ST's largeIntegers compute a correct result;
    "/ but here, we want the overflow to flow into the
    "/ sign bit ... (sigh)

    sign := 1.
    (o1 := op1) < 0 ifTrue:[
	sign := -1.
	o1 := o1 negated.
    ].
    (o2 := op2) < 0 ifTrue:[
	sign := sign negated.
	o2 := o2 negated.
    ].

    prod := (o1 * o2) bitAnd:16rFFFFFFFFFFFFFFFF.
    (prod bitAnd:16r8000000000000000) ~~ 0 ifTrue:[
    ].
    sign == -1 ifTrue:[
	prod := prod negated
    ].
    ^ prod

    "Created: / 8.1.1999 / 15:10:04 / cg"
!

_LNEG:op
    ^ op asInteger negated

    "Created: / 8.1.1999 / 15:06:59 / cg"
!

_LOR:op1 _:op2
    |rslt|

    (op1 < 0 or:[op2 < 0]) ifTrue:[
	self halt.
    ].
    rslt := op1 bitOr: op2.
    ^ rslt

    "Created: / 8.1.1999 / 15:05:10 / cg"
!

_LREM:op1 _:op2
    |rem|

    rem := op1 rem: op2.
    ^ rem

    "Modified: / 7.1.1998 / 00:23:11 / cg"
    "Created: / 8.1.1999 / 15:04:23 / cg"
!

_LSHL:op1 _:op2
    |rslt|

    (op1 < 0) ifTrue:[
	self halt.
    ].
    rslt := (op1 bitShift:op2) bitAnd:16rFFFFFFFFFFFFFFFF.
    ^ rslt

    "Created: / 8.1.1999 / 14:51:08 / cg"
!

_LSHR:op1 _:op2
    |rslt|

    op1 < 0 ifTrue:[
	self halt
    ].

    (op1 < 0) ifTrue:[
	self halt.
    ].
    rslt := (op1 bitShift:op2 negated) bitAnd:16rFFFFFFFFFFFFFFFF.
    ^ rslt

    "Created: / 8.1.1999 / 14:51:57 / cg"
!

_LSUB:op1 _:op2
    |diff|

    diff := (op1 - op2) bitAnd:16rFFFFFFFFFFFFFFFF.
    ^ diff

    "Created: / 8.1.1999 / 15:10:33 / cg"
!

_LUSHR:op1 _:op2
    |rslt|

    op1 < 0 ifTrue:[
	self halt
    ].

    (op1 < 0) ifTrue:[
	self halt.
    ].
    rslt := (op1 bitShift:op2 negated) bitAnd:16rFFFFFFFFFFFFFFFF.
    ^ rslt

    "Modified: / 7.1.1998 / 21:22:17 / cg"
    "Created: / 8.1.1999 / 14:51:32 / cg"
!

_LXOR:op1 _:op2
    |rslt|

    (op1 < 0 or:[op2 < 0]) ifTrue:[
	self halt.
    ].
    rslt := op1 bitXor: op2.
    ^ rslt

    "Created: / 8.1.1999 / 15:12:28 / cg"
!

_MONITORENTER: someObject
    self assert: (thisContext sender isJavaContext).
    self assert: (thisContext sender isMarkedForUnwind).

    self monitorEnter: someObject in: thisContext sender.

    "Created: / 08-01-1999 / 14:23:10 / cg"
    "Modified: / 08-01-1999 / 18:47:26 / cg"
    "Modified: / 10-08-2011 / 20:19:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-11-2011 / 19:23:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 26-08-2012 / 15:20:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MONITOREXIT: someObject
    self monitorExit: someObject in: thisContext sender.

    "Created: / 08-01-1999 / 14:23:19 / cg"
    "Modified: / 08-01-1999 / 18:47:08 / cg"
    "Modified: / 09-11-2011 / 12:42:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 26-08-2012 / 23:51:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW2: classRef _: dim1

    | arrCls arr |

    dim1 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    self assert: classRef isJavaClassRef.
    arrCls := classRef resolve.
    arr := arrCls new: dim1.
    ^ arr.

    "Created: / 19-05-2011 / 10:46:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 22-11-2011 / 09:45:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW2: classRef _: dim1 _: dim2

    | arrCls arr |

    dim1 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    dim2 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].


    self assert: classRef isJavaClassRef.
    arrCls := classRef resolve.
    arr := arrCls new: dim2.
    1 to: dim2 do:[:i|
        arr at: i put: (arrCls javaComponentClass new: dim1)
    ].
    ^ arr.

    "Created: / 19-05-2011 / 10:47:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 22-11-2011 / 09:45:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW2: classRef _: dim1 _: dim2 _: dim3

    | arrCls arr |

    dim1 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    dim2 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].
    dim3 <  0 ifTrue:[
        self throwExceptionClassName:'java.lang.NegativeArraySizeException'
                         withMessage:'negative array size not allowed'.
        ^nil
    ].


    self assert: classRef isJavaClassRef.
    arrCls := classRef resolve.
    arr := arrCls new: dim3.
    1 to: dim3 do:[:i|
        | arr2 |
        arr2 := arrCls javaComponentClass new: dim2.
        1 to: dim2 do:[:j|
            arr2 at: j put: (arrCls javaComponentClass javaComponentClass new: dim1).
        ].
        arr at: i put: arr2.
    ].
    ^ arr.

    "Created: / 19-05-2011 / 10:47:50 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 22-11-2011 / 09:45:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW:typeRef _:dim1

    |arr|

    arr := typeRef new:dim1.

    ^ arr

    "Created: / 08-01-1999 / 14:15:42 / cg"
    "Modified: / 08-01-1999 / 18:03:05 / cg"
    "Modified: / 16-03-2011 / 16:20:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW: typeRef _: dim1 _: dim2
    | arr |

    arr := typeRef new: dim2.
    1 to: dim2
        do: [:idx | arr at: idx put: (self _MULTINEW: typeRef javaComponentClass _: dim1) ].
    ^ arr

    "Created: / 08-01-1999 / 14:15:46 / cg"
    "Modified: / 08-01-1999 / 17:58:11 / cg"
    "Modified: / 16-03-2011 / 16:19:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_MULTINEW:typeRef _:dim1 _:dim2 _:dim3
    |clsRef cls arr elType elSizes|

    clsRef := typeRef asClassPointerRef.
    cls := clsRef javaArrayClass.
    arr := cls new:dim3.
    elType := typeRef deref.
    1 to:dim3
        do:
            [:idx |
            arr at:idx
                put:(self
                        _MULTINEW:elType
                        _:dim1
                        _:dim2) ].

"/ self halt.

    ^ arr

    "Modified: / 6.1.1998 / 23:34:35 / cg"
    "Created: / 8.1.1999 / 14:15:49 / cg"
!

_NEW: cls
    | inst |

    cls classInit. "/initializes the class if it is not already"
    inst := cls basicNew.
    thisContext sender method flushCode.
    ^inst.

    "Created: / 15-10-2012 / 21:53:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2012 / 21:09:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_NEWARRAY:type _:size
    "VM helper method NEWARRAY insn. Called only when
     size is not an SmallInt or negative"

    size < 0 ifTrue:[
        self throwNegativeArraySizeException: size.
    ]

    "Created: / 13-05-2012 / 14:46:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

_NEW_R: clsRef
    | cls inst |

    cls := clsRef resolve. "/initializes the class if it is not already"
    inst := cls basicNew.
    thisContext sender method flushCode.
    ^inst.

    "Created: / 15-10-2012 / 21:54:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 02-11-2012 / 21:10:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM class methodsFor:'windows - events'!

awtEventsForEvent: anEvent javaWindow: jWin
    "given an ST/X event, create corresponding AWT event(s) for it"

    | jEv  jEv1  jEv2  modifiers  key  keyChar  untranslatedKey  id  type  x  y  w  h  view  menu  resized  moved  eventArgs  clickCount  jRect  jKeyEventClass  jInputEventClass  jMouseEventClass  jWindowEventClass  jPaintEventClass  jComponentEventClass |

    type := anEvent type.
    eventArgs := anEvent arguments.
    key := 0.
    modifiers := 0.
    x := 0.
    y := 0.
    ((type == #exposeX:y:width:height:)
        or: [ (type == #graphicExposeX:y:width:height:) or: [ (type == #damage) ] ])
            ifTrue: [
                "/        jWindowEventClass := Java classForName:'java.awt.event.WindowEvent'.
                "/        id := (jPaintEventClass instVarNamed:'PAINT').
                jPaintEventClass := self classForName: 'java.awt.event.PaintEvent'.
                id := (jPaintEventClass instVarNamed: 'UPDATE').
                ((type == #exposeX:y:width:height:)
                    or: [ (type == #graphicExposeX:y:width:height:) ])
                        ifTrue: [
                            x := eventArgs at: 1.
                            y := eventArgs at: 2.
                            w := eventArgs at: 3.
                            h := eventArgs at: 4.
                        ]
                        ifFalse: [
                            x := eventArgs left.
                            y := eventArgs top.
                            w := eventArgs width.
                            h := eventArgs height.
                        ].
                jRect := (Java classForName: 'java.awt.Rectangle') basicNew.
                jRect instVarNamed: 'x' put: x.
                jRect instVarNamed: 'y' put: y.
                jRect instVarNamed: 'width' put: w.
                jRect instVarNamed: 'height' put: h.
                jEv := jPaintEventClass newCleared.
                jEv instVarNamed: 'id' put: id.
                jEv instVarNamed: 'updateRect' put: jRect.

"/        jEv instVarNamed:'g'         put:jWin.

                ^ Array with: jEv.
            ].
    (anEvent isKeyEvent
        or: [ anEvent isButtonEvent or: [ anEvent isPointerEnterLeaveEvent ] ])
            ifTrue: [
                jInputEventClass := Java classForName: 'java.awt.event.InputEvent'.
                anEvent hasAlt ifTrue: [
                    modifiers := modifiers bitOr: (jInputEventClass instVarNamed: 'ALT_MASK')
                ].
                anEvent hasCtrl ifTrue: [
                    modifiers := modifiers bitOr: (jInputEventClass instVarNamed: 'CTRL_MASK')
                ].
                anEvent hasMeta ifTrue: [
                    modifiers := modifiers bitOr: (jInputEventClass instVarNamed: 'META_MASK')
                ].
                anEvent hasShift ifTrue: [
                    modifiers := modifiers
                                bitOr: (jInputEventClass instVarNamed: 'SHIFT_MASK')
                ].
                anEvent hasButton1 ifTrue: [
                    modifiers := modifiers
                                bitOr: (jInputEventClass instVarNamed: 'BUTTON1_MASK')
                ].
                anEvent hasButton2 ifTrue: [
                    modifiers := modifiers
                                bitOr: (jInputEventClass instVarNamed: 'BUTTON2_MASK')
                ].
                anEvent hasButton3 ifTrue: [
                    modifiers := modifiers
                                bitOr: (jInputEventClass instVarNamed: 'BUTTON3_MASK')
                ].
                anEvent isPointerEnterLeaveEvent ifFalse: [
                    "/ ST/X does not (yet) record this information
                    "/ with pointerLeave events.
                    x := anEvent x.
                    y := anEvent y.
                ].
            ].
    anEvent isKeyEvent ifTrue: [
        jKeyEventClass := Java classForName: 'java.awt.event.KeyEvent'.
        key := 0.
        keyChar := 0.
        key := anEvent key.
        key isCharacter ifTrue: [ key := keyChar := key asciiValue ] ifFalse: [
            untranslatedKey := anEvent view device keyboardMap keyAtValue: key
                        ifAbsent: key.
            untranslatedKey == #Insert ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_INSERT'
            ].
            untranslatedKey == #Delete ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_DELETE'
                "/ 127
            ].
            untranslatedKey == #BackSpace ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_BACK_SPACE'
                "/ 8
            ].
            untranslatedKey == #Return ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_ENTER'
                "/ 13
            ].
            untranslatedKey == #Tab ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_TAB'
                "/ 9
            ].
            untranslatedKey == #Home ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_HOME'
            ].
            untranslatedKey == #End ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_END'
            ].
            (key == #PreviousPage or: [ untranslatedKey == #Prior ]) ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_PAGE_UP'
            ].
            (key == #NextPage or: [ key == #EndOfText ]) ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_PAGE_DOWN'
            ].
            untranslatedKey == #CursorUp ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_UP'
            ].
            untranslatedKey == #CursorDown ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_DOWN'
            ].
            untranslatedKey == #CursorLeft ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_LEFT'
            ].
            untranslatedKey == #CursorRight ifTrue: [
                key := jKeyEventClass instVarNamed: 'VK_RIGHT'
            ].
            (#( #F1 #F2 #F3 #F4 #F5 #F6 #F7 #F8 #F9 #F10 #F11 #F12 )
                includes: untranslatedKey)
                    ifTrue: [ key := jKeyEventClass instVarNamed: ('VK_' , untranslatedKey) ].
        ].
        (type == #keyPress:x:y:) ifTrue: [
            id := jKeyEventClass instVarNamed: 'KEY_PRESSED'
        ] ifFalse: [ id := jKeyEventClass instVarNamed: 'KEY_RELEASED' ].
        jEv := jKeyEventClass newCleared.
        jEv instVarNamed: 'modifiers' put: modifiers.
        jEv instVarNamed: 'keyCode' put: key.
        jEv instVarNamed: 'keyChar' put: keyChar.
        jEv instVarNamed: 'id' put: id.

"/        jEv instVarNamed:'x'         put:x.
"/        jEv instVarNamed:'y'         put:y.

        jEv instVarNamed: 'when' put: (OperatingSystem getMillisecondTime).
        ^ Array with: jEv
    ].
    (anEvent isButtonEvent or: [ anEvent isPointerEnterLeaveEvent ]) ifTrue: [
        jMouseEventClass := Java classForName: 'java.awt.event.MouseEvent'.
        clickCount := 1.
        (type == #buttonPress:x:y:) ifTrue: [
            id := jMouseEventClass instVarNamed: 'MOUSE_PRESSED'.
        ] ifFalse: [
            (type == #buttonRelease:x:y:) ifTrue: [
                id := jMouseEventClass instVarNamed: 'MOUSE_RELEASED'.
            ] ifFalse: [
                (type == #buttonMotion:x:y:) ifTrue: [
                    (anEvent state bitAnd: (anEvent view device anyButtonMotionMask)) == 0 ifTrue: [
                        id := jMouseEventClass instVarNamed: 'MOUSE_MOVED'.
                    ] ifFalse: [ id := jMouseEventClass instVarNamed: 'MOUSE_DRAGGED'. ].
                ] ifFalse: [
                    "/                    (type == #'pointerMotion:x:y:') ifTrue:[
                    "/                        id := jMouseEventClass instVarNamed:'MOUSE_MOVED'.
                    "/                    ] ifFalse:[
                    (type == #pointerEnter:x:y:) ifTrue: [
                        id := jMouseEventClass instVarNamed: 'MOUSE_ENTERED'.
                    ] ifFalse: [
                        (type == #pointerLeave:) ifTrue: [
                            id := jMouseEventClass instVarNamed: 'MOUSE_EXITED'.
                        ] ifFalse: [
                            (type == #buttonMultiPress:x:y:) ifTrue: [
                                id := jMouseEventClass instVarNamed: 'MOUSE_PRESSED'.
                                clickCount := 2.
                            ] ifFalse: [ self halt. ]

"/                        ]
                        ]
                    ]
                ]
            ]
        ].
        jEv := jMouseEventClass newCleared.
        jEv instVarNamed: 'modifiers' put: modifiers.
        jEv instVarNamed: 'id' put: id.
        jEv instVarNamed: 'x' put: x.
        jEv instVarNamed: 'y' put: y.
        jEv instVarNamed: 'when' put: (OperatingSystem getMillisecondTime).
        ^ Array with: jEv
    ].
    (type == #configureX:y:width:height:) ifTrue: [
        view := anEvent view.
        x := eventArgs at: 1.
        y := eventArgs at: 2.
        w := eventArgs at: 3.
        h := eventArgs at: 4.
        resized := (w ~~ view width or: [ h ~~ view height ]).
        moved := (x ~~ view left or: [ y ~~ view top ]).

"/        (view isTopView or:[view isPopUpView]) ifTrue:[
        "/ view must update its origin/extent.

        view dispatchEvent: anEvent.

"/        ].
        "/
        "/ must change the components extent
        "/ is there no cleaner way to do this ?
        "/

        view isTopView ifTrue: [
            view isPopUpView ifFalse: [
                "/
                "/ sigh - don't include the menu.
                "/
                menu := self topViewsMenu: view.
                menu notNil ifTrue: [
                    "/ must add the menus height
                    h := h - menu height
                ]
            ]
        ].
        jWin instVarNamed: 'width' put: w.
        jWin instVarNamed: 'height' put: h.
        jWin instVarNamed: 'x' put: x.
        jWin instVarNamed: 'y' put: y.
        jComponentEventClass := Java classForName: 'java.awt.event.ComponentEvent'.
        moved ifTrue: [
            id := (jComponentEventClass instVarNamed: 'COMPONENT_MOVED').
            jEv1 := jComponentEventClass newCleared.
            jEv1 instVarNamed: 'id' put: id.
        ].
        resized ifTrue: [
            id := (jComponentEventClass instVarNamed: 'COMPONENT_RESIZED').
            jEv2 := jComponentEventClass newCleared.
            jEv2 instVarNamed: 'id' put: id.
        ].
        jEv1 isNil ifTrue: [
            jEv2 isNil ifTrue: [ ^ nil ].
            ^ Array with: jEv2
        ] ifFalse: [ jEv2 isNil ifTrue: [ ^ Array with: jEv1 ] ].
        ^ Array with: jEv1 with: jEv2.
    ].
    (type == #focusIn) ifTrue: [
        "/ 'focusIn' printCR.
        jComponentEventClass := Java classForName: 'java.awt.event.FocusEvent'.
        id := (jComponentEventClass instVarNamed: 'FOCUS_GAINED').
        jEv := jComponentEventClass newCleared.
        jEv instVarNamed: 'id' put: id.
        ^ Array with: jEv.
    ].
    (type == #focusOut) ifTrue: [
        "/ 'focusOut' printCR.
        jComponentEventClass := Java classForName: 'java.awt.event.FocusEvent'.
        id := (jComponentEventClass instVarNamed: 'FOCUS_LOST').
        jEv := jComponentEventClass newCleared.
        jEv instVarNamed: 'id' put: id.
        ^ Array with: jEv.
    ].
    (type == #mapped) ifTrue: [
        "/ 'mapped' printCR.
        jComponentEventClass := Java classForName: 'java.awt.event.ComponentEvent'.
        id := (jComponentEventClass instVarNamed: 'COMPONENT_SHOWN').

"/        x := eventArgs at:1.
"/        y := eventArgs at:2.

        jEv := jComponentEventClass newCleared.
        jEv instVarNamed: 'id' put: id.
        ^ Array with: jEv.
    ].
    (type == #unmapped) ifTrue: [
        "/ 'unmapped' printCR.
        jComponentEventClass := Java classForName: 'java.awt.event.ComponentEvent'.
        id := (jComponentEventClass instVarNamed: 'COMPONENT_HIDDEN').

"/        x := eventArgs at:1.
"/        y := eventArgs at:2.

        jEv := jComponentEventClass newCleared.
        jEv instVarNamed: 'id' put: id.
        ^ Array with: jEv.
    ].
    (type == #terminate) ifTrue: [
        jWindowEventClass := Java classForName: 'java.awt.event.WindowEvent'.
         "NEW
         id := (jWindowEventClass instVarNamed:'WINDOW_CLOSING').
        " "OLD "
        id := (jWindowEventClass instVarNamed: 'WINDOW_CLOSED').

        jEv := jWindowEventClass newCleared.
        jEv instVarNamed: 'id' put: id.
        ^ Array with: jEv.
    ].
    EventTrace == true ifTrue: [ ('JAVA: unhandled event:' , type) infoPrintCR. ].
    ^ nil.

    "Created: / 6.1.1998 / 20:38:58 / cg"
    "Modified: / 9.1.1999 / 09:29:58 / cg"
!

delegatesTo:someOne
    ^ false

    "Created: / 25.9.1999 / 16:11:48 / cg"
!

doWindowsEventThread
    "invoked in an endless loop by the WToolkit-eventLoop
     native method."

    | sensor  event  more |
    (JavaWindowGroup isNil or: [ KnownWindows isNil ]) ifTrue: [
        "/ '*** eventThread: no windowGroup / views ...' printCR.
        self halt: 'monitors are reimplemented, change me if you know how and why'.
        "self
            waitFor: FirstWindowCreationSemaphore
            state: #eventWait
            timeOut: nil."

        "/ Delay waitForSeconds:0.1.

        ^ self
    ].

    "/ wait for an event to arrive ...

    sensor := JavaWindowGroup sensor.
    [ sensor hasEvents or: [ sensor damageCount ~~ 0 ] ] whileFalse: [
        EventTrace ifTrue: [ '*** eventThread waiting ...' printCR. ].
        Processor activeProcess state: #eventWait.
        self
            waitFor: sensor eventSemaphore
            state: #eventWait
            timeOut: nil.
    ].
    EventTrace ifTrue: [ '*** eventThread event arrived ...' printCR. ].

    "/ EventTrace := true

    more := true.
    [ more ] whileTrue: [
        sensor hasDamage ifTrue: [
            EventTrace ifTrue: [ '*** eventThread: damage arrived ...' printCR. ].
            event := sensor nextDamage.
        ] ifFalse: [ event := sensor nextEvent. ].
        event isNil ifTrue: [
            EventTrace == true ifTrue: [ '*** eventThread: nil event ignored' printCR. ].
            ^ self
        ].
        more := self processEvent: event
    ]

    "Created: / 06-01-1998 / 21:02:40 / cg"
    "Modified: / 30-12-1998 / 19:21:36 / cg"
    "Modified: / 22-11-2011 / 13:22:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

processEvent: event
    | evQ  jEvents  jWToolKitClass  jWToolKit  jWinPeer  jWin  v  eventConsumed |

    KnownWindows isNil ifTrue: [ ^ false ].
    v := event view.
    jWinPeer := self jPeerForView: v.
    jWinPeer isNil ifTrue: [
        v isJavaView ifTrue: [
            "/ mhmh - an event for a JavaView,
            "/ which has no peer (anyMore ?)
            "/ should not happen.
        ] ifFalse: [
            "/ mhmh - an event for a subcomponent of an ST widget.
            "/ let it be handled normally.
            EventTrace ifTrue: [
                ('*** eventThread: ' , event type
                    , '-event for unknown java-view - passed to view.') printCR.
            ].
            event view dispatchEvent: event.
        ].
        ^ true
    ].

    "/ change:
    "/ in the previous version, events for ST/X widgets (i.e. buttons etc)
    "/ where not passed to java, but instead forwarded directly to the widget
    "/ by the code below.
    "/ This has changed, to pass it to Java, which eventually passes it to the
    "/ peer via the handleEvent native method (unless the event got consumed).
    "/ This is req'd to let java keep track of keyboard/mouse input for widgets.

    (event isDamage and: [ v isJavaView ]) ifTrue: [
        "/    "/ most views handle their events themself (being ST/X views) ...
        "/
        "/    v class ~~ JavaView ifTrue:[
        "/"/        v class ~~ StandardSystemView ifTrue:[
        "/"/            EventTrace ifTrue:[
        "/"/                    ('*** eventThread: event handled by view itself (' , v class name , ')') printCR.
        "/"/            ].
        "/"/            event sendEventWithFocusOn:nil.
        "/"/            ^ self.
        "/"/        ].
        "/        (event type == #'exposeX:y:width:height'
        "/        or:[event type == #'graphicsExposeX:y:width:height']) ifTrue:[
        "/            "/ send to view, but also handle in JAVA
        "/            event sendEventWithFocusOn:nil.
        "/        ]
        "/    ].
        (#( #mapped
         #unmapped
         #configureX:y:width:height:
         #exposeX:y:width:height:
         #graphicsExposeX:y:width:height: ) includes: event type) ifTrue: [
            event sendEventWithFocusOn: nil.
        ].
    ].

    "/ what a kludge - some events are passed back to
    "/ ST via the WComponent-handleEvent native method.
    "/ However, repaints are not.
    "/ In order to let ST widgets do the drawing,
    "/ selectively filter exposeEvents from Java ...

    eventConsumed := false.
    v isJavaView ifTrue: [
        "/ all events handled by Java ...
    ] ifFalse: [
        eventConsumed := true.

        "/ let widget handle it.

        event view dispatchEvent: event.

        "/ some are not passed to Java ...

        event isDamage ifTrue: [
            (v isKindOf: Button) ifTrue: [ ^ true ].
            (v isKindOf: TextView) ifTrue: [ ^ true ].
            (v isKindOf: Label) ifTrue: [ ^ true ].
            (v isKindOf: ComboBoxView) ifTrue: [ ^ true ].
            (v isKindOf: ScrollBar) ifTrue: [ ^ true ].
            (v isKindOf: Scroller) ifTrue: [ ^ true ].
            (v isKindOf: MenuPanel) ifTrue: [ ^ true ].
        ].
    ].
    jWin := jWinPeer instVarNamed: 'target'.
    EventTrace ifTrue: [
        ('*** eventThread: event (' , event type , ') handled by JAVA: ')
            infoPrint.
        jWinPeer class name infoPrint.
        ' (' infoPrint.
        jWin class name infoPrint.
        ')' infoPrintCR.
    ].

    "/ create an event

    jEvents := self awtEventsForEvent: event javaWindow: jWin.
    jEvents isNil ifTrue: [
        EventTrace ifTrue: [
            ('*** eventThread: event ignored: ' , event type) printCR.
        ].
        ^ true
    ].

"/    v superView isNil ifTrue:[
"/        ('*** eventThread: event ignored for topView: ' , event type) printCR.
"/        ^ self
"/    ].

    jWToolKitClass := self classForName: 'java.awt.Toolkit'.

    "/ jWToolKit := jWToolKitClass perform:#getDefaultToolkit.

    jWToolKit := jWToolKitClass
                performStatic: #'getDefaultToolkit()Ljava/awt/Toolkit;'.
    jEvents do: [
        :jEv |
        jEv instVarNamed: 'source' put: jWin.
        jEv instVarNamed: 'consumed' put: 0.
        eventConsumed ifFalse: [
            "/ the first gets the original event as data
            jEv instVarNamed: 'data' put: event.
            eventConsumed := true
        ].

        "/ post it (them) to the event queue

        EventTrace == true ifTrue: [ 'postEvent to Java ...' printCR. ].
        jWToolKit "class" perform: #'postEvent(Ljava/awt/AWTEvent;)V' with: jEv.
    ].
    ^ false

    "Created: / 6.1.1998 / 20:36:36 / cg"
    "Modified: / 10.12.1998 / 19:36:59 / cg"
! !

!JavaVM::Performance class methodsFor:'documentation'!

documentation
"
    A helper class to keep performance counters for JavaVM

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!JavaVM::Performance class methodsFor:'instance creation'!

for: aJavaVM

    ^self new setVM: aJavaVM.

    "Created: / 21-12-2010 / 19:42:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Performance methodsFor:'accessing-counters'!

get: name
    "Return the value of given performance counter."

    ^self set: name to: -1
!

monitorEnterCount: fatOnly
    "Return the number of monitor enter operations.
     If fatOnly is true, return only those that involves
     fat-lock enter (i.e,, uses JavaMonitor, not thinlock)"

%{
    extern unsigned int __monitorEnterCount(int fat, int new);
    RETURN ( __MKUINT ( __monitorEnterCount( fatOnly == true ? 1 : 0, -1 ) ) )
%}.
    ^ 0

    "Created: / 28-08-2012 / 10:37:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

monitorExitCount: fatOnly
    "Return the number of monitor enter operations.
     If fatOnly is true, return only those that involves
     fat-lock enter (i.e,, uses JavaMonitor, not thinlock)"

%{
    extern unsigned int __monitorEnterCount(int fat, int new);
    RETURN ( __MKUINT ( __monitorEnterCount( fatOnly == true ? 1 : 0, -1 ) ) )
%}.
    ^ 0

    "Created: / 28-08-2012 / 10:37:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

set: name to: newValue
    "Set and return the value of given performance counter.
     If newValue >= 0, performance counter is set to given
     value and previous value is returned. If newValue < 0,
     then the current value is returned"

    | value |
%{
    extern OBJ __javaPerfCounter(OBJ _name, OBJ _newValue );
    value =  __javaPerfCounter( name, newValue );
%}.
    value isSymbol ifTrue:[
        self error: value.
        ^nil
    ].
    ^value

! !

!JavaVM::Performance methodsFor:'initialization'!

setVM: aJavaVM

    "Now, aJavaVM == JavaVM (i.e, the class JavaVM
    itself, not its instance)"

    vm := aJavaVM

    "Created: / 21-12-2010 / 19:44:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Performance methodsFor:'orinting-streams'!

printOpenExternalStream: stream number: index on: output
    "Print info about given external stream to output. Return true,
     if the instance is executor, false otherwise"

    | executor |

    executor := ((3 to: stream class instSize) allSatisfy:[:index|
        index == 6 or:[index == 7 or:[(stream instVarAt: index) isNil]]
    ]).

    '%-4d %-30s %-15s %s' printf:{
        index .
        stream class name.
        executor ifTrue:['(executor)'] ifFalse:[(self printOpenExternalStreamIdentificationOf: stream)].
        executor ifTrue:[''] ifFalse:[stream isFileStream ifTrue:[stream pathName ? '??? no pathName ???'] ifFalse:['']]
    } on: output.

    ^ executor

    "
        JavaVM::Performance new printOpenExternalStreams
    "

    "Created: / 14-08-2012 / 01:02:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printOpenExternalStreamIdentificationOf:stream
    | zc oft |

    (oft := Smalltalk at:#'JavaVM:OpenFileTable') notNil ifTrue:[
        | idx |
        idx := oft identityIndexOf: stream.
        idx ~~ 0 ifTrue:[
            ^ 'VM   OFT[' ,idx printString, ']'.
        ].
    ].
    (zc := Smalltalk at:#'JavaVM:ZipCache') notNil ifTrue:[
        | idx |
        idx := zc identityIndexOf: stream.
        idx ~~ 0 ifTrue:[
            ^ 'VM   ZC[' ,idx printString, ']'.
        ]
    ].

     ((Smalltalk at:#'Java:SourceCache') ? #()) do:[:each|
        each == stream ifTrue:[
            ^ 'Java SC'
        ].
    ].

    ((Smalltalk at:#'JavaClassReader:JavaArchiveCache') ? #()) do:[:each|
        (each instVarAt:1 "named: #file") == stream ifTrue:[
            ^ 'JCR  JAC'
        ].
    ].

    ((Smalltalk at:#'Java:SourceArchiveCache') ? #()) do:[:each|
        (each instVarAt:1 "named: #file") == stream ifTrue:[
            ^ 'Java SAC'
        ].
    ].

    ^''

    "Created: / 14-08-2012 / 01:17:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printOpenExternalStreams
    ^self printOpenExternalStreamsOn: Transcript

    "Created: / 14-08-2012 / 01:03:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printOpenExternalStreamsOn: aStream

    | nOpenStreams nExecutors |

    aStream nextPutLine: '=== JavaVM open external stream statistics ==='.
    aStream nextPutLine: Timestamp now printString.

    nOpenStreams := 0.
    nExecutors := 0.
    ExternalStream allSubInstancesDo:[:each|
        each isOpen ifTrue:[
            nOpenStreams := nOpenStreams + 1.
            (self printOpenExternalStream: each number: nOpenStreams on: aStream) ifTrue:[
                nExecutors := nExecutors + 1
            ].
            aStream cr.
        ]
    ].
    aStream cr.
    aStream nextPutLine:
        ('SUMMARY: open=%1, executors=%4, java.io=%2, java.util.zip=%3'
            bindWith: nOpenStreams
                with: (((Smalltalk at:#'JavaVM:OpenFileTable') ? #()) inject:0 into:[:a :s|a + (s notNil ifTrue:[1] ifFalse:[0])])
                with: (((Smalltalk at:#'JavaVM:ZipCache') ? #())      inject:0 into:[:a :s|a + (s notNil ifTrue:[1] ifFalse:[0])])
                with: nExecutors
        ).

    aStream nextPutLine: '=============================================='.
    aStream nextPutLine: ''

    "
        JavaVM::Performance new printOpenExternalStreams
    "

    "Created: / 14-08-2012 / 00:48:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Performance methodsFor:'printing-counters'!

printCounters

    self printCountersOn: Transcript

    "Created: / 14-08-2012 / 00:43:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCountersOn: aStream

    aStream nextPutLine: '=== JavaVM performance statistics ============'.
    aStream nextPutLine: Timestamp now printString.
    self printCounters_ExecutionOn: aStream.
    aStream cr.
    self printCounters_CompilationOn: aStream.
    aStream cr.
    self printCounters_MonitorOn: aStream.
    aStream cr.
    self printCounters_TopTenNativesOn: aStream.
    aStream nextPutLine: '=============================================='.
    aStream nextPutLine: ''

    "
        JavaVM performance printCounters
    "

    "Created: / 14-08-2012 / 00:43:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 27-10-2012 / 18:12:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounters_CompilationOn: aStream

    self printCounterGroup:'Just-In-Time Compilation' on: aStream.
    self printCounter:'methodsCompiled' on: aStream labeled: 'methods compiled'.
    self printCounter:'methodsCompiledAndBailedOut' on: aStream labeled: 'methods compiled (failed)'.

    "Created: / 15-10-2012 / 15:33:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounters_ExecutionOn: aStream

    self printCounterGroup:'Execution' on: aStream.
    self printCounter:'methodsInterpreted' on: aStream labeled: 'methods (interpreted)'.
    self printCounter:'bytecodesInterpreted' on: aStream labeled: 'bytecodes (interpreted)'.
    self printCounter:'bytecodesInterpretedWrap' on: aStream labeled: 'bytecodes wrap(interpreted)'.

    "Created: / 15-10-2012 / 15:33:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounters_MonitorOn: aStream

    self printCounterGroup:'Monitors' on: aStream.
    self printCounter:'monitorEnterCount' on: aStream labeled: 'MONITOR ENTER'.
    self printCounter:'monitorEnterCountFat' on: aStream labeled: 'MONITOR ENTER (fat)'.

    self printCounter:'monitorExitCount' on: aStream labeled: 'MONITOR EXIT'.
    self printCounter:'monitorExitCountFat' on: aStream labeled: 'MONITOR EXIT (fat)'.

    "Created: / 28-08-2012 / 10:42:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-10-2012 / 15:31:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounters_Top: n nativesOn: aStream

    | nativesSorted  |

    self printCounterGroup:'top ', n printString , ' (unoptimized) natives' on: aStream.
    nativesSorted := JavaNativeMethod allInstances asSortedCollection:
                        [:a :b| a nCalls > b nCalls ].
    1 to: n do:[:idx|
        | m |

        m := nativesSorted at: idx.
        aStream nextPutAll: (m nCalls printStringRadix:10 size:8 fill:Character space).
        aStream nextPutAll:'   '.
        aStream
            nextPutAll: m mclass name;
            nextPutAll: ' >> ';
            nextPutAll: m selector;
            cr.
    ]

    "Created: / 27-10-2012 / 18:09:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounters_TopTenNativesOn: aStream

    self printCounters_Top: 10 nativesOn: aStream

    "Created: / 27-10-2012 / 18:12:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Performance methodsFor:'printing-counters-private'!

printCounter: name on: stream

    self printCounter: name on: stream labeled: name

    "Created: / 15-10-2012 / 15:28:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounter: name on: stream labeled: label

    [
        '  %-35s : %10d' printf: { label . (self get: name) } on: stream
    ] on: Error do:[
        '  %-35s : N/A' printf: { label } on: stream
    ].
    stream cr.

    "Created: / 15-10-2012 / 15:25:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

printCounterGroup: gname on: stream

    stream nextPut:$-; nextPut:$-; space; nextPutAll: gname; space; nextPut:$-; nextPut:$-; cr.

    "Created: / 15-10-2012 / 15:29:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Reflection class methodsFor:'documentation'!

documentation
"
    A helper class to deal with Java reflection

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!JavaVM::Reflection class methodsFor:'instance creation'!

for: aJavaVM

    ^self new setVM: aJavaVM.

    "Created: / 21-12-2010 / 19:42:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

new
    "return an initialized instance"

    ^ self basicNew initialize.
! !

!JavaVM::Reflection methodsFor:'debugging'!

returnNilIfMissing
    ^ returnNilIfMissing.

    "Created: / 28-01-2011 / 15:14:37 / Marcel Hlopko <hlopik@gmail.com>"
!

returnNilIfMissing:aBoolean
    returnNilIfMissing:= aBoolean.

    "Created: / 28-01-2011 / 15:25:35 / Marcel Hlopko <hlopik@gmail.com>"
! !

!JavaVM::Reflection methodsFor:'initialization'!

flush
    self initialize.

    "Created: / 09-01-2013 / 16:00:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initialize
    constantPoolMapping := IdentityDictionary new.
    javaClasses := Dictionary new.
    javaArrayClasses := IdentityDictionary new.
    realMethods := OrderedCollection new.
    javaMethodsPerMethod := Dictionary new

    "Created: / 21-12-2010 / 19:46:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-02-2011 / 00:24:28 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 05-12-2011 / 09:56:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

setVM: aJavaVM

    "Now, aJavaVM == JavaVM (i.e, the class JavaVM
    itself, not its instance)"

    vm := aJavaVM

    "Created: / 21-12-2010 / 19:44:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Reflection methodsFor:'reflection - classes'!

arrayClassFor: javaClass ifAbsentPut: block
    ^javaArrayClasses at: javaClass ifAbsentPut: block

    "Created: / 05-07-2012 / 23:21:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

classForJavaClassObject: aJavaClassObject
    "
        Given an instance of java.lang.Class, answers
        real (Java) class associated with it. The instance
        of java.lang.Class should be first created by myself
        (by sending #javaClassObjectForClass:)"

    (javaClasses at: aJavaClassObject ifAbsent: [ 123 ])
        == (JavaVM classNamed: 'stx/libjava/tests/junir/JUnit3Tests')
            ifTrue: [ self breakPoint: #jv ].
    ^ javaClasses at: aJavaClassObject
        ifAbsent: [
            vm internalError: 'No class associated with given java.lang.Class!!'.

            "/Please, no nils

            self returnNilIfMissing ifTrue: nil
        ].

    "Created: / 28-01-2011 / 15:22:39 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 05-02-2011 / 20:26:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-10-2011 / 13:41:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

javaClassObjectArrayForClasses: classes
    "
        Answers an instance of java.lang.Class[] for given
        real (Java) classes."

    | array |

    array := (vm classForName: 'java.lang.Class') javaArrayClass
                new: classes size.
    classes isNilOrEmptyCollection ifTrue: [ ^ array ].
    classes
        withIndexDo: [:cls :idx | array at: idx put: (self javaClassObjectForClass: cls) ].
    ^ array

    "Modified: / 28-01-2011 / 15:15:44 / Marcel Hlopko <hlopik@gmail.com>"
    "Created: / 04-02-2011 / 22:08:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 11-02-2011 / 10:21:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaClassObjectForClass:aClass

    ^self javaClassObjectForClass:aClass init: true.

    "Modified: / 28-01-2011 / 15:15:44 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 12-08-2011 / 19:07:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaClassObjectForClass: aClass init: init
    "
        Answers an instance of java.lang.Class for given
        real (Java) class."

    | javaClassObj |

    self assert: aClass isBehavior message: 'aClass is not behavior'.
    self assert: aClass ~~ Array message: 'aClass should not be Array (old impl)'.

    javaClasses at: aClass ifPresent: [:javaClassObj | ^ javaClassObj ].

    "/ class must be initialized (with all of its superclasses ?).

    "/ false ifTrue: [ aClass isJavaClass ifTrue: [ aClass classInit ]. ].

    "/ Here, install Java lookup as Java may send a messages to that
    "/ object
    (aClass isJavaClass not and:[aClass isJavaArrayClass not and:[aClass isJavaPrimitiveType not]]) ifTrue:[
        aClass == Object ifTrue:[ self halt. ].
        aClass lookupObject: JavaLookup instance.
    ].
    javaClassObj := (vm classForName: 'java.lang.Class') new.
    self rememberJavaClassObject: javaClassObj for: aClass.
    ^ javaClassObj

    "Modified: / 28-01-2011 / 15:15:44 / Marcel Hlopko <hlopik@gmail.com>"
    "Created: / 12-08-2011 / 19:07:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaClassObjectForClassNamed: className
    "
        Answers an instance of java.lang.Class for given
        (java) class name. The className may be name of primitive
        type, i.e. 'int', 'double'."

    | cls |

    cls := JavaDescriptor baseTypesByTypeName at: className
                ifAbsent: [ vm classForName: className ].
    ^ self javaClassObjectForClass: cls.

    "Created: / 03-02-2011 / 21:12:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 08-04-2011 / 14:45:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

rememberJavaClassObject: jclass for: class

    javaClasses at: class put: jclass.
    javaClasses at: jclass put: class.

    "Created: / 05-12-2011 / 09:57:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Reflection methodsFor:'reflection - constant pool'!

constantPoolFor:javaConstantPoolObject
    ^ constantPoolMapping at:javaConstantPoolObject
        ifAbsent:[self error:'Given ConstantPool was not created by JVM']

    "Created: / 21-12-2010 / 19:56:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-01-2011 / 14:56:54 / Marcel Hlopko <hlopik@gmail.com>"
!

javaConstantPoolObjectFor: aConstantPool

    ^constantPoolMapping at: aConstantPool ifAbsent:
        [| javaConstantPoolObject |
        javaConstantPoolObject := (vm classForName:'sun.reflect.ConstantPool') new.
        constantPoolMapping at: aConstantPool put: javaConstantPoolObject.
        constantPoolMapping at: javaConstantPoolObject put: aConstantPool.
        javaConstantPoolObject]

    "Created: / 21-12-2010 / 19:54:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Reflection methodsFor:'reflection - methods & ctors'!

classForJavaConstructorObject:constructor
     "given a java.lang.reflect.Constructor, return the corresponding class for it."

    | jclass |
    jclass := constructor instVarNamed: #clazz.
    ^self classForJavaClassObject: jclass.

    "Created: / 22-08-2012 / 12:23:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaConstructorObjectForMethod:method
     "given a real method, return the corresponding java.lang.reflect.Constructor
      instance for it."

    | jCtor |

    javaMethodsPerMethod at:method ifPresent:[:existingCtor|^existingCtor].

    jCtor := (Java classForName:'java.lang.reflect.Constructor') new.
    self javaMethodObjectLikeSlotsInto: jCtor forMethod: method.
    self rememberJavaMethodObject: jCtor for: method.

    ^ jCtor

    "Created: / 09-02-2011 / 10:28:12 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 05-12-2011 / 10:02:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaMethodObjectForMethod:method
     "given a real method, return the corresponding java.lang.reflect.Constructor
      instance for it."
     | jMethod |

    javaMethodsPerMethod at:method ifPresent:[:existingCtor|^existingCtor].

    jMethod := (Java classForName:'java.lang.reflect.Method') new.
    self javaMethodObjectLikeSlotsInto: jMethod forMethod: method.
    self rememberJavaMethodObject: jMethod for: method.

    jMethod
        instVarNamed: #name       put: (self javaStringObjectForString: (method selector upTo:$() interned: true);
        instVarNamed: #returnType put: (method descriptor returnClassObject);
        instVarNamed: #annotationDefault put: (method annotations default bytes);

        yourself.

    ^jMethod

    "Created: / 09-02-2011 / 10:29:46 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 05-12-2011 / 10:02:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

javaMethodObjectLikeSlotsInto: jMethod forMethod: method
    "
       Fill in slots of given instance of java.lang.Method or
       java.lang.Constructor"

    | desc |

    desc := method descriptor.
    jMethod
        instVarNamed: #clazz put: (self javaClassObjectForClass: method javaClass);
        instVarNamed: #slot put: 0;
        instVarNamed: #modifiers put: method accessFlags;
        instVarNamed: #parameterTypes
            put: (self javaClassObjectArrayForClasses: desc parameterClasses);
        instVarNamed: #exceptionTypes
            put: (self javaClassObjectArrayForClasses: method javaExceptionTable);
        instVarNamed: #annotations put: (method annotations runtimeVisible bytes);
        yourself.

    method signature notNil ifTrue:[
        jMethod
            instVarNamed: #signature
            put: (self javaStringObjectForString: method signature interned: true)
    ].

    ^ jMethod

    "Created: / 11-02-2011 / 06:44:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-06-2011 / 17:17:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 04-12-2011 / 19:40:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

methodForJavaConstructorObject:constructor
     "given a java.lang.reflect.Constructor, return the corresponding method
      it."

    | slot |
    slot := constructor instVarNamed: #slot.
    ^slot
"/    ^realMethods at: slot ifAbsent:[self error: 'No ctor found for java ctor object'].

"/    |class signature|
"/    class := self classForJavaClassObject:(constructor instVarNamed:#clazz).
"/    signature := Java as_ST_String:(constructor instVarNamed:#signature).
"/    class methodsDo:[:mthd|
"/        mthd signature = signature ifTrue:[
"/            ^mthd
"/        ].
"/    ].

    "Created: / 09-02-2011 / 10:36:07 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 01-08-2012 / 11:05:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

methodForJavaMethodObject:jmethod
     "
         Given an instance of java.lang.reflect.Method, answers
         real method associated with it.
    "

    | slot |
    slot := jmethod instVarNamed: #slot.
    ^slot
"/    ^realMethods at: slot ifAbsent:[self error: 'No method found for java method object'].

"/    |class name signature |
"/
"/    class := self classForJavaClassObject:(aJavaMethodObject instVarNamed:#clazz).
"/    name := Java as_ST_String:(aJavaMethodObject instVarNamed:#name).
"/    signature := Java as_ST_String:(aJavaMethodObject instVarNamed:#signature).
"/    class methodsDo:[:mthd|
"/        (mthd name = name and:[mthd signature = signature]) ifTrue:[
"/            ^mthd
"/        ]
"/    ].
"/    self assert: false description: 'No such method, malformed java.lang.reflect.Method object?'.
"/    ^nil.

    "Created: / 09-02-2011 / 10:32:14 / Marcel Hlopko <hlopik@gmail.com>"
    "Modified: / 01-08-2012 / 11:19:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

rememberJavaMethodObject: jmethod for: method

    javaMethodsPerMethod at: method put: jmethod.
    realMethods add: method.
    jmethod instVarNamed: #slot put: realMethods size.

    "Created: / 05-12-2011 / 10:00:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaVM::Reflection methodsFor:'reflection - other'!

javaStringObjectForString:string
    ^ self javaStringObjectForString: string interned: false

    "Created: / 09-02-2011 / 10:34:57 / Marcel Hlopko <hlopik@gmail.com>"
!

javaStringObjectForString:string interned:intern
    | s |
    s := Java as_String: string.
    ^intern ifTrue:[Java intern: s] ifFalse:[s]

    "Modified: / 22-11-2010 / 17:57:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 09-02-2011 / 10:34:29 / Marcel Hlopko <hlopik@gmail.com>"
! !

!JavaVM class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '§Header: /cvs/stx/stx/libjava/JavaVM.st,v 1.186 2011/08/22 14:49:28 vrany Exp §'
!

version_HG

    ^ '$Changeset: <not expanded> $'
!

version_SVN
    ^ '§Id§'
! !

JavaVM initialize!