--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaVM.st Thu Nov 15 22:10:02 2012 +0000
@@ -0,0 +1,19993 @@
+"
+ 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
+ FullExceptionTrace StackTrace TraceHistory LockTable
+ LockTableAccess LibPath SimulatedLibs LoadedLibs
+ SimulatedNativeLibs LoadedNativeLibs JavaWindowGroup KnownWindows
+ DrawOPTrace WindowOPTrace WindowCreationTrace EventTrace
+ ThreadTrace MonitorTrace MonitorTraceId ExceptionTrace InsnCount
+ InsnCounts FileOpenTrace FileAccessTrace FileOpenConfirmation
+ SocketConnectConfirmation FileIOTrace OpenFileTable
+ OpenFileTableLock CachedNativeMethodTable ExceptionDebug
+ ExitDebug JavaConsoleStream StandardThreadGroup
+ EnteredMonitorsPerProcess AcquiredMonitorsPerProcess JavaMethods
+ DUMMY_LONG_HIGHWORD DUMMY_DOUBLE_HIGHWORD NoAudio
+ FirstWindowCreationSemaphore PermittedDirectories
+ PermittedHostConnects SimulatedOS O_WGgraphics_originX
+ O_WGgraphics_originY O_WGgraphics_pData O_FramePeer_pNativeWidget
+ O_FramePeer_pData ImageStretchCache LastGraphics LastGC
+ EnteredMonitorObject EnteredMonitorObjectCount
+ EnteredMonitorProcess LeftMonitorObject JavaEventThread
+ JavaScreenUpdaterThread JavaEventQueueThread SystemProperties
+ ExceptionDebugPatterns NullPointerExceptionDebug
+ DivisionByZeroExceptionDebug IOExceptionDebug
+ StdinReplacementFileQuerySignal AssertionsEnabled
+ SimulatedNativeMemory Reflection ZipCache ZipEntryCache
+ ZipLastModTimesCache ZipInflaters JavaPrivilegedAccessQuery
+ ClassRegistry SystemClassLoader ExtClassLoader
+ SmalltalkClassLoader StartupTime FinalizationEnabled
+ FinalizationLobby ParkUnparkSemaphores ThreadInterrupts
+ EagerResolvingEnabled OldspaceIncreased PerfCounters
+ AboutToSnapshotAction SnapshotFinishedAction'
+ poolDictionaries:'JavaConstants'
+ 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'.
+ '/usr/lib/jvm/java-6-openjdk/jre'.
+ '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: 'stx.libjava.tomcat.dir'
+ put: (JavaLibraries directory / 'tomcat6') pathName.
+ props at: 'libjava.tests.dir'
+ put: (JavaTestsResource antProjectDir) pathName.
+
+"/ props at: 'sun.misc.URLClassPath.debug' put: 'true'.
+
+ ^ 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: / 12-12-2011 / 15:23:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 21-12-2011 / 23:05:11 / jv"
+ "Modified: / 13-09-2012 / 20:33:56 / m"
+!
+
+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
+
+ 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.
+ ThreadInterrupts := Dictionary new.
+
+ 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: / 06-09-2012 / 11:18:07 / 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>"
+!
+
+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: / 2.1.1998 / 18:06:40 / cg"
+! !
+
+!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 classPath
+ do:[:p | s nextPutAll:p asString ]
+ separatedBy: [s nextPut: OperatingSystem pathSeparator].
+
+ ^ s contents
+
+ "
+ self defaultCLASSPATH
+ "
+
+ "Created: / 03-01-1998 / 14:27:21 / cg"
+ "Modified: / 27-07-2012 / 19:31:58 / 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 name 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.
+ ].
+
+ name := nativeContext argAt:1.
+ name := Java as_ST_String:name.
+
+ FileOpenTrace ifTrue:[
+ ('JAVA: opening ' , name) infoPrintCR.
+ ].
+
+ fn := name 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 ' , name , ' for writing').
+ ].
+
+ fileNo := self addOpenFile:stream.
+
+ FileOpenTrace ifTrue:[
+ ('JAVA: opened ' , name , ' 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: / 23-07-2012 / 19:38:39 / 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'>
+
+ ^ 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
+ ].
+ ^ byte
+
+ "Created: / 5.1.1998 / 02:17:08 / cg"
+ "Modified: / 5.1.1998 / 02:17:25 / cg"
+!
+
+_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.
+ fdobj := (nativeContext receiver instVarNamed: #fd).
+ fd := fdobj instVarNamed: #fd.
+ stream := self getOpenFileAt:fd.
+ [
+ stream nextPut: b asCharacter
+ ] on: Error do:[:ex|
+ self throwIOExceptionWithMessage: ex description
+ ]
+
+ "Modified: / 10-08-2011 / 14:15:22 / 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'>
+
+ ^ UnimplementedNativeMethodSignal raise
+!
+
+_java_io_WinNTFileSystem_createDirectory: nativeContext
+
+ <javanative: 'java/io/WinNTFileSystem' name: 'createDirectory(Ljava/io/File;)Z'>
+
+ ^ 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'>
+
+ ^ 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.
+
+ "Created: / 10-11-2010 / 14:48:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 07-08-2011 / 21:43:49 / 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.
+
+ "Created: / 4.1.1998 / 01:45:00 / cg"
+!
+
+_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 = 0.0) ifTrue:[^0].
+ (f = -0.0) ifTrue:[^(1 bitShift: 31) ].
+
+ b := ByteArray streamContents:[:s|ShortFloat storeBinaryIEEESingle:f on:s].
+ ^ (LargeInteger digitBytes: b MSB: UninterpretedBytes isBigEndian not) compressed
+
+ "Created: / 09-11-2010 / 20:59:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 07-08-2011 / 21:45:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Float_intBitsToFloat: nativeContext
+
+ <javanative: 'java/lang/Float' name: 'intBitsToFloat(I)F'>
+
+ |i aFloat|
+
+ i := nativeContext argAt:1.
+
+ aFloat := ShortFloat basicNew.
+ UninterpretedBytes isBigEndian ifTrue:[
+ aFloat basicAt:1 put:((i bitShift:-24) bitAnd:16rFF).
+ aFloat basicAt:2 put:((i bitShift:-16) bitAnd:16rFF).
+ aFloat basicAt:3 put:((i bitShift:-8) bitAnd:16rFF).
+ aFloat basicAt:4 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.
+
+ "Modified: / 13-09-2011 / 20:05:58 / 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;'>
+
+ ^ 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> + 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> - 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'>
+
+ ^ 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> - e<sup>-x</sup></i>)/(<i>e<sup>x</sup> + 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;'>
+
+ ^ 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;'>
+
+ ^ UnimplementedNativeMethodSignal raise
+!
+
+_java_net_NetworkInterface_getByName0: nativeContext
+
+ <javanative: 'java/net/NetworkInterface' name: 'getByName0(Ljava/lang/String;)Ljava/net/NetworkInterface;'>
+
+ ^ 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'>
+
+ ^ 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'>
+
+ ^ 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.
+ [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: / 08-12-2011 / 01:13:20 / 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/']].
+ 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: / 05-08-2011 / 20:18:06 / 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'>
+
+ ^ UnimplementedNativeMethodSignal raise
+!
+
+_java_util_zip_CRC32_update: nativeContext
+
+ <javanative: 'java/util/zip/CRC32' name: 'update(II)I'>
+
+ ^ 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
+ UnimplementedNativeMethodSignal raiseRequest
+
+ "Modified: / 12.11.1998 / 19:23:00 / cg"
+!
+
+_ColorModel_deletepData:nativeContext
+ "/ void deletepData ()
+ 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 ()
+
+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[])
+
+UnimplementedNativeMethodSignal raiseRequest.
+
+ "Modified: / 27.1.2000 / 02:53:55 / cg"
+!
+
+_Double_doubleToLongBits:nativeContext
+ |f i|
+
+ f := nativeContext argAt:1.
+
+ UninterpretedBytes isBigEndian ifTrue:[
+ i := f basicAt:8.
+ i := i bitOr:((f basicAt:7) bitShift:8).
+ i := i bitOr:((f basicAt:6) bitShift:16).
+ i := i bitOr:((f basicAt:5) bitShift:24).
+ i := i bitOr:((f basicAt:4) bitShift:32).
+ i := i bitOr:((f basicAt:3) bitShift:40).
+ i := i bitOr:((f basicAt:2) bitShift:48).
+ i := i bitOr:((f basicAt:1) bitShift:56).
+ ] 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 := i bitOr:((f basicAt:5) bitShift:32).
+ i := i bitOr:((f basicAt:6) bitShift:40).
+ i := i bitOr:((f basicAt:7) bitShift:48).
+ i := i bitOr:((f basicAt:8) bitShift:56).
+ ].
+
+ ^ i.
+
+ "Created: / 4.1.1998 / 01:39:12 / cg"
+!
+
+_Double_valueOf0:nativeContext
+ |s d|
+
+ s := nativeContext argAt:1.
+ s notNil ifTrue:[
+ s := Java as_ST_String:s.
+ d := Float readFrom:s onError:nil.
+ ].
+ d isNil ifTrue:[
+ self throwNumberFormatException.
+ "/ not reached
+ ].
+
+ ^ d
+
+ "Modified: / 8.8.1997 / 12:03:55 / cg"
+ "Created: / 7.1.1998 / 11:09:43 / cg"
+!
+
+_Field_get:nativeContext
+ "/ java.lang.Object get (java.lang.Object)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+UnimplementedNativeMethodSignal raiseRequest.
+
+ "Modified: / 27.1.2000 / 02:53:55 / cg"
+ "Created: / 27.1.2000 / 03:05:54 / cg"
+!
+
+_Field_getModifiers:nativeContext
+ "/ int getModifiers ()
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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)
+
+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 ()
+ 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)
+ 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)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:59:22 / cg"
+!
+
+_InetAddress_lookupHostByName:nativeContext
+ "java.lang.Object[] lookupHostByName (java.lang.String)"
+
+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 ()
+
+UnimplementedNativeMethodSignal raise.
+
+ "Modified: / 27.1.2000 / 03:08:47 / cg"
+ "Created: / 27.1.2000 / 03:11:21 / cg"
+!
+
+_Inflater_getAdler0:nativeContext
+ "/ int getAdler0 ()
+
+UnimplementedNativeMethodSignal raise.
+
+ "Modified: / 27.1.2000 / 03:08:47 / cg"
+ "Created: / 27.1.2000 / 03:12:15 / cg"
+!
+
+_Inflater_getTotalIn0:nativeContext
+ "/ int getTotalIn0 ()
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 03:10:50 / cg"
+ "Modified: / 27.1.2000 / 03:11:08 / cg"
+!
+
+_Inflater_getTotalOut0:nativeContext
+ "/ int getTotalOut0 ()
+
+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)
+
+UnimplementedNativeMethodSignal raise.
+
+ "Modified: / 27.1.2000 / 03:08:47 / cg"
+ "Created: / 27.1.2000 / 03:11:39 / cg"
+!
+
+_Inflater_reset0:nativeContext
+ "/ void reset0 ()
+
+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)
+
+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)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:47:43 / cg"
+!
+
+_Introspector_getMethodParameterCount:nativeContext
+ "int getMethodParameterCount (java.lang.reflect.Method)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:49:15 / cg"
+!
+
+_Introspector_getPublicDeclaredMethods0:nativeContext
+ "java.lang.reflect.Method[] getPublicDeclaredMethods0 (java.lang.Class)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:48:49 / cg"
+!
+
+_JPEGImageDecoder_readImage:nativeContext
+ 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
+ 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
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:23:22 / cg"
+!
+
+_ObjectInputStream_allocateNewArray:nativeContext
+ "/ java.lang.Object allocateNewArray (java.lang.Class int)
+ 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)
+ 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[])
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 03:00:47 / cg"
+!
+
+_ObjectInputStream_invokeObjectReader:nativeContext
+ "/ boolean invokeObjectReader (java.lang.Object java.lang.Class)
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 03:01:02 / cg"
+!
+
+_ObjectInputStream_loadClass0:nativeContext
+ "/ java.lang.Class loadClass0 (java.lang.Class java.lang.String)
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 03:01:36 / cg"
+!
+
+_ObjectOutputStream_invokeObjectWriter:nativeContext
+ "/ boolean invokeObjectWriter (java.lang.Object java.lang.Class)
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 03:01:52 / cg"
+!
+
+_ObjectOutputStream_outputClassFields:nativeContext
+ "/ void outputClassFields (java.lang.Object java.lang.Class int[])
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 02:50:55 / cg"
+!
+
+_ObjectStreamClass_findObjectMethod0:nativeContext
+ "/ boolean findObjectMethod0 (java.lang.Class int)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 02:51:50 / cg"
+!
+
+_ObjectStreamClass_getClassAccess:nativeContext
+ "/ int getClassAccess (java.lang.Class)
+ 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)
+
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 27.1.2000 / 02:51:33 / cg"
+!
+
+_ObjectStreamClass_getFieldAccess:nativeContext
+ "/ int getFieldAccess (java.lang.Class java.lang.String)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+
+ 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)
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 03:03:01 / cg"
+!
+
+_Runtime_isOutputStreamLocalised:nativeContext
+ "/ boolean isOutputStreamLocalised (java.io.DataOutputStream)
+
+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
+
+UnimplementedNativeMethodSignal raise.
+
+ "Modified: / 27.1.2000 / 03:02:27 / cg"
+!
+
+_Runtime_setOutputStreamLocalised:nativeContext
+
+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)
+ UnimplementedNativeMethodSignal raise
+
+ "Modified: / 12.11.1998 / 18:52:07 / cg"
+ "Created: / 12.11.1998 / 18:59:18 / cg"
+!
+
+_Runtime_traceMethodCalls:nativeContext
+ "/ void traceMethodCalls (boolean)
+ 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
+ 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
+ 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.
+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.
+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.
+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.
+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.
+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.
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:31:40 / cg"
+!
+
+_SystemColor_GetSysColor:nativeContext
+ "/ int GetSysColor (int)
+ 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)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:43:25 / cg"
+!
+
+_ThreadGroup_initMainThreadGroup0:nativeContext
+ "void initMainThreadGroup0 (java.lang.ThreadGroup)"
+
+UnimplementedNativeMethodSignal raise.
+
+ "Created: / 27.1.2000 / 02:45:52 / cg"
+!
+
+_Thread_countStackFrames:nativeContext
+ "/ int countStackFrames ()
+ 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 ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:26:03 / cg"
+!
+
+_URLConnection_finalize:nativeContext
+ "/ void finalize ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:22 / cg"
+!
+
+_URLConnection_getContentLength0:nativeContext
+ "/ int getContentLength0 ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:34 / cg"
+!
+
+_URLConnection_getContentType0:nativeContext
+ "/ java.lang.String getContentType0 ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:42 / cg"
+!
+
+_URLConnection_getHeaderField0:nativeContext
+ "/ java.lang.String getHeaderField0 (java.lang.String)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:53 / cg"
+!
+
+_URLConnection_pCreate:nativeContext
+ "/ void pCreate (java.lang.String java.lang.String)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:14 / cg"
+!
+
+_URLInputStream_available:nativeContext
+ "/ int available ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:24:26 / cg"
+!
+
+_URLInputStream_open:nativeContext
+ "/ void open ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:24:01 / cg"
+!
+
+_URLInputStream_read:nativeContext
+ "/ int read (byte[] int int)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:24:12 / cg"
+!
+
+_URLOutputStream_open:nativeContext
+ "/ void open ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:24:38 / cg"
+!
+
+_URLOutputStream_pClose:nativeContext
+ "/ void pClose ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:25:02 / cg"
+!
+
+_URLOutputStream_write:nativeContext
+ "/ void write (int)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:24:45 / cg"
+!
+
+_URLOutputStream_writeBytes:nativeContext
+ "/ void writeBytes (byte[] int int)
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:23:43 / cg"
+!
+
+_VM_getState:nativeContext
+ "/ int getState ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:06:44 / cg"
+!
+
+_VM_resetJavaMonitor:nativeContext
+ "/ void resetJavaMonitor ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 14.11.1998 / 10:43:23 / cg"
+!
+
+_VM_resumeJavaMonitor:nativeContext
+ "/ void resumeJavaMonitor ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 14.11.1998 / 10:42:49 / cg"
+!
+
+_VM_suspendJavaMonitor:nativeContext
+ "/ void suspendJavaMonitor ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 14.11.1998 / 10:43:07 / cg"
+!
+
+_VM_threadsSuspended:nativeContext
+ "/ boolean threadsSuspended ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:07:10 / cg"
+!
+
+_VM_unsuspendSomeThreads:nativeContext
+ "/ void unsuspendSomeThreads ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:07:29 / cg"
+!
+
+_VM_unsuspendThreads:nativeContext
+ "/ void unsuspendThreads ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:07:20 / cg"
+!
+
+_VM_writeJavaMonitorReport:nativeContext
+ "/ void writeJavaMonitorReport ()
+ 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)
+ 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)
+ 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)
+ ].
+ 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 ()
+ 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 ()
+ 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 ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:21:00 / cg"
+!
+
+_WDrawingSurfaceInfo_getHBitmap:nativeContext
+ "/ int getHBitmap ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:32 / cg"
+!
+
+_WDrawingSurfaceInfo_getHDC:nativeContext
+ "/ int getHDC ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:50 / cg"
+!
+
+_WDrawingSurfaceInfo_getHPalette:nativeContext
+ "/ int getHPalette ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:21:07 / cg"
+!
+
+_WDrawingSurfaceInfo_getHWnd:nativeContext
+ "/ int getHWnd ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:23 / cg"
+!
+
+_WDrawingSurfaceInfo_getPBits:nativeContext
+ "/ int getPBits ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:41 / cg"
+!
+
+_WDrawingSurfaceInfo_lock:nativeContext
+ "/ int lock ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:00 / cg"
+!
+
+_WDrawingSurfaceInfo_unlock:nativeContext
+ "/ void unlock ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:20:13 / cg"
+!
+
+_WEmbeddedFramePeer_create:nativeContext
+ "/ void create (sun.awt.windows.WComponentPeer)
+ 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)
+ 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()
+ 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)
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:17:32 / cg"
+!
+
+_WGraphics_createFromPrintJob:nativeContext
+ "/ void createFromPrintJob (sun.awt.windows.WPrintJob)
+ 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)
+ 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)
+ 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)
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:19:25 / cg"
+!
+
+_WGraphics_removeClip:nativeContext
+ "/ void removeClip ()
+ 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)
+ 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)
+ 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)
+ 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 ()
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:12:53 / cg"
+!
+
+_WPopupMenuPeer_createMenu:nativeContext
+ "/ void createMenu (sun.awt.windows.WComponentPeer)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:12:43 / cg"
+!
+
+_WPrintJob_end:nativeContext
+ "/ void end ()
+ 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)
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:16:29 / cg"
+!
+
+_WScrollPanePeer_getScrollChild:nativeContext
+ "/ java.awt.Component getScrollChild ()
+ 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)
+ 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)
+ 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 ()
+ UnimplementedNativeMethodSignal raise
+
+ "Created: / 12.11.1998 / 19:08:47 / cg"
+!
+
+_WToolkit_sync:nativeContext
+ "/ void sync ()
+ 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)
+ 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'>
+
+ ^ 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'>
+
+ ^ 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'>
+
+ ^ 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'>
+
+ ^ 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'!
+
+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
+ ^ '$Id$'
+!
+
+version_CVS
+ ^ '§Header: /cvs/stx/stx/libjava/JavaVM.st,v 1.186 2011/08/22 14:49:28 vrany Exp §'
+!
+
+version_SVN
+ ^ '$Id$'
+! !
+
+JavaVM initialize!