Giter Site home page Giter Site logo

opensmalltalk / opensmalltalk-vm Goto Github PK

View Code? Open in Web Editor NEW
544.0 41.0 109.0 553.76 MB

Cross-platform virtual machine for Squeak, Pharo, Cuis, and Newspeak.

Home Page: http://opensmalltalk.org/

License: Other

Perl 0.02% Shell 0.97% Makefile 0.38% Objective-C 0.48% HTML 0.03% C 93.28% Smalltalk 0.36% C++ 3.84% Assembly 0.21% Pawn 0.01% DTrace 0.01% M4 0.37% CSS 0.01% CMake 0.05% Batchfile 0.01% Awk 0.01% DIGITAL Command Language 0.01% R 0.01% Elixir 0.01% Emacs Lisp 0.01%
smalltalk vm jit squeak pharo newspeak cuis macos linux win

opensmalltalk-vm's Introduction

The Cog VM source tree

This is the README for the Cog Git source tree: https://github.com/OpenSmalltalk/opensmalltalk-vm

Download stable Download latestBuild Download latestAssertBuild Download latestDebugBuild

Build for macOS Build for Windows Build for Linux (x86) Build for Linux (ARM)

DOI

Builds are tested automatically on each commit, for Windows, macOS, and Linux. Windows and Linux also have 32-bit targets. Squeak and Pharo VMs are built with and without JIT, with and without Spur, and with and without Sista, as available per platform. All build artifacts remain accessible for 90 days for each workflow run; the latest artifacts are uploaded to a dedicated release tag (e.g., "latest-build"), overwritten with each successful run. If you wish to commit without triggering a build, for example if you were to only edit this documentation, then if you add [ci skip] somewhere in your commit message, no workflow run will be started for that commit.

Important notice for Developers:

We rely on source file substitutions in the src tree, specifically, any sq*SCCSVersion.h files anywhere in the tree are processed to replace $Rev$, $Date$, and $URL$ with the current revision (defined as the timestamp %Y%m%d%H%M of the latest commit), the human readable date of that commit, and the url of the origin repository these sources were cloned from.

The first time you clone this repository, you must therefore run this command:

./scripts/updateSCCSVersions

This will install filters, post-commit, and post-merge hooks to update the sq*SCCSVersion.h files anytime you commit or merge.

For easier use, we include the scripts/gitci and scripts/gitciplugins scripts to commit changes to this branch and changes to the Cross and win32 plugins (which are shared with the old Squeak interpreter trunk). If you decide not to use these scripts for checking in sources, you should also run the updateSCCSVersions script anytime you decide to use git-reset or git-checkout to make sure the stamps are updated correctly. Failing to do so will result in incorrect version stamps in your compiled VMs.

Contents:

  • Overview
  • VM source directories
  • Platform build directories
  • Other directories (platforms, processors, deployment, image)

Overview

First, opensmalltalk-vm (a.k.a. the Cog VM) is the virtual machine beneath the Cuis, Pharo and Squeak Smalltalk dialects. For issues related to these systems that are unrelated to the VM itself, please use their forums:

Second, the core VM, which comprises the execution engine and garbage collector, and the core plugins, is developed in Smalltalk, using the VM Simulator. This repository contains the code generated by the Simulator, and the platform support code for the entire VM, its CI infrastructure and so on. The core VM should not be developed by editing the generated code. The core VM should be developed using Smalltalk. The source code repository for the VM is
http://source.squeak.org/VMMaker.html.
You can find scripts to build a Smalltalk image in which to do core VM development in the image directory in this repository. You can read about the Simulator here:

Cog is an evolution of the Squeak Back-to-the-future Smalltalk virtual machine that provides a number of different Smalltalk virtual machines. The VMs are developed in Smalltalk, using all the dynamic and reflective facilities of the Squeak/Pharo Smalltalk system. As such, developing in Cog is a delight. The Smalltalk framework comprising the various Cog VMs is translated into C by its Slang component to produce VM source that is combined with platform-specific support sources and compiled via a C compiler to obtain a fast production VM. This directory tree includes the output of Slang for various configurations of "Cog VM" and the associated platform support code, plus build directories that can be used to produce production VMs.

This directory tree also includes an instance of the Smalltalk Cog development system, suitable for developing the VM in Smalltalk, and for generating new VM sources.

The "Cog VM" comes in a bewildering variety of forms. The first distinction is between Stack, Cog and Sista VMs. Stack VMs are those with context-to-stack mapping that optimise message sending by keeping method activations on a stack instead of in contexts. These are pure interpreters but are significantly faster than the standard context-based Interpreter VM. Cog VMs add a JIT to the mix, compiling methods used more than once to machine code on the fly. Sista VMs, as yet unrealised and in development, add support for adaptive optimization that does speculative inlining at the bytecode-to-bytecode level.

Another distinction is between "v3" VMs and Spur VMs. "v3" is the original object representation for Squeak as described in the back-to-the-future paper. Spur, as described on the www.mirandabanda.org blog, is a faster object representation which uses generation scavenging, lazy forwarding for fast become, a single object header format common to 32 and 64 bit versions, and a segmented heap that can grow and shrink, releasing memory back to the host OS. Squeak 5.0, Cuis 5 and Pharo 5 and subsequent releases use Spur.

Another distinction is between normal single-threaded VMs that schedule "green" Smalltalk light-weight processes above a single-threaded VM, and multi-threaded VMs that share the VM between any number of native threads such that only one native thread owns the VM at any one time, switching between threads on FFI calls and callbacks or on Smalltalk process switches when Smalltalk processes are owned by threads. This architecture offers non-blocking FFI calls and interoperability with multiple native threads, but does /not/ provide true concurrency. This multi-threaded support is as yet experimental.

VM source directories

The Slang output of the various VMs are kept in "vm source" directories. These C sources define the core VM (the Smalltalk execution engine and the memory manager), and a substantial set of "plugins" that provide interfaces to various external facilities via Smalltalk primitive methods. Each vm source directory is specific to a particular VM, be it Squeak Cog Spur, or V3 Stack, etc. The plugins can be shared between VMs, choosing the set of plugins to include in a VM at build time (see plugins.int & plugins.ext in build directories).

The VM source are in directories such as

	src/v3.sista		- Smalltalk Sista V3
	src/spur32.sista	- Smalltalk Sista Spur
	src/spur32.cog 		- Smalltalk Cog Spur
	src/spur64.cog 		- Smalltalk Cog Spur 64-bit
	src/spur32.stack 	- Smalltalk Stack Spur
	src/spur64.stack 	- Smalltalk Stack Spur 64-bit
	src/v3.cog			- Smalltalk Cog V3
	src/v3.stack 		- Smalltalk Stack V3

All plugins are in the directory

	src/plugins

These contain many, but not all, of the plugins available for the VM. Others can be found in Cog, or in various Monticello packages in various repositories.

Each vm source directory contains several files, a subset of the following:

	cogit.c				- the JIT; a Cogit cooperates with a CoInterpreter.
                          This simply includes a processor-specific JIT file
	cogitIA32.c et al   - relevant processor-specific JIT, selected by cogit.c
	cogit.h				- the Cogit's API, as used by the CoInterpreter
	cogmethod.h			- the structure of a CogMethod, the output of the Cogit
	cointerp.c			- the CoInterpreter's source file
	cointerp.h			- the API of the CoInterpreter, as used by the Cogit
	cointerpmt.c		- the multi-threaded CoInterpreterMT's source file
	cointerpmt.h		- the API of the CoInterpreterMT, as used by the Cogit
	gcc3x-cointerp.c	- cointerp.c massaged to interpret faster if using gcc
	gcc3x-cointerpmt.c	- ditto for cointerpmt.c
	gcc3x-interp.c		- ditto for interp.c
	interp.c			- the StackInterpreter's source file
	interp.h			- defines for the VM configuration, word size, etc
	vmCallback.h		- the structure of the VM's VMCallbackContext

Platform build directories

The current "official" build directories are of the form building/OS_WordSize_Processor, and include

	building/linux32x86	- uses autoconf, gcc and make
	building/macos32x86	- 32-bit Mac OS X using clang and gmake
	building/macos64x64	- 64-bit Mac OS X using clang and gmake
	building/win32x86		- uses cygwin, gcc and gmake

More can be added as required. In each there is a HowToBuild that describes the necessary steps to compile a VM.

Within each building/OS_WordSize_Processor directory are a set of build directories for specific configurations of Cog, and for support code and makefiles. For example, there exist

	building/macos32x86/squeak.cog.spur   - A Cog JIT VM with Squeak branding,
                                         using the Spur memory manager.
	building/macos32x86/squeak.stack.spur - A Stack interpreter VM with Squeak
                                         branding, and the Spur memory manager.
	building/macos32x86/squeak.cog.v3     - A Cog JIT VM with Squeak branding,
                                         using the old Squeak memory manager.
	building/macos32x86/pharo.cog.spur    - A Cog JIT VM with Pharo branding and
                                         plugins (not yet implemented) using the
                                         Spur memory manager.
etc.

There exist

    building/macos64x64/bochsx86 - Support libraries for the BochsIA32Plugin which
                                is used to develop Cog itself.
    building/macos64x64/bochsx64 - Support libraries for the BochsX64Plugin which
                                is used to develop Cog itself.
    building/macos64x64/gdbarm32 - Support libraries for the GdbARMPlugin which
                                is used to develop Cog itself.
    building/macos64x64/gdbarm64 - Support libraries for the GdbARMv8Plugin which
                                is used to develop Cog itself.

and the intention is to add such directories to contain e.g. support code for the Pharo Cairo and Freetype plugins, and anything else needed. By placing support directories in each build directory they can be shared between various branded VM builds, avoiding duplication.

There exist

	building/macos32x86/common - Gnu Makefiles for building the various branded VMs
	building/macos64x64/common - Gnu Makefiles for building the various branded VMs
	building/win32x86/common   - Gnu Makefiles for building the various branded VMs
	building/win64x64/common   - Gnu Makefiles for building the various branded VMs

And the intention is to add building/linuxNN????/common as soon as possible to use Gnu Makefiles to build all VMs on all platforms.

The scripts directory contains various scripts for validating and checking-in generated sources, packaging builds into installable artifacts (tar, msi, zip), and so on. The linux builds and the packaging scripts produce outputs in the products directory tree. The packaging scripts may choose to include Smalltalk source files included in the sources directory.

Other directories

The platforms directory contains the associated platform-specific files that combine with the Slang-generated source to produce complete VMs. The structure is

	platforms/Cross/vm
	platforms/Cross/plugins
	platforms/iOS/vm
	platforms/iOS/plugins
	platforms/unix/vm*
	platforms/unix/plugins
	platforms/win32/vm
	platforms/win32/plugins

Each vm directory contains support for the core VM. Each plugin directory contains run-time and build-time support for various plugins.

The processors directory contains the source for various processor simulators. The JIT is developed in Smalltalk by using one of these processor simulators to execute the code the JIT produces. Currently x86 & x86-64 are derived from Bochs, and ARMv6/v7 & ARMv8 are derived from gdb.

Customization of builds may be done in two main ways, by adapting an existing build directory, and by using facilities designed to be applied after the fact to a preexisting build. Such facilities live in the top-level deploy directory and are documented there; e.g. see deploy/packaging/README.win32.

Finally the image directory contains scripts that will build a "VMMaker" image, a Squeak Smalltalk image containing all the packages that comprise the Cog system, suitable for developing the VM and for generating (or updating) the sources in the vm source directories. There is also a script for generating a 64-bit Spur image from a 32-bit Spur image, and the VMMaker.oscog package includes code for converting Spur images in either direction.

opensmalltalk-vm's People

Contributors

akgrant avatar akgrant43 avatar andreasraab avatar clementbera avatar codefrau avatar cstes avatar demarey avatar dtlewis290 avatar eliotmiranda avatar estebanlm avatar fniephaus avatar guillep avatar jecisc avatar johnmci avatar kendickey avatar kksubbu avatar krono avatar lauraperezcerrato avatar linqlover avatar marceltaeumel avatar nicolas-cellier-aka-nice avatar piumarta avatar ronsaldo avatar shingarov avatar smalltalking avatar tesonep avatar timfel avatar timrowledge avatar vincentblondeau avatar zecke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opensmalltalk-vm's Issues

genPrimitiveAt and/or genPrimitiveAtPut are incorrect for HalfWordArray

See recent Collection and Kernel tests in squeak trunk inbox:

When ran with Stack VM (without JIT), the HalfWordArrayTests>>tellAllPossibleValues works OK (well, except the signed unsigned bug), producing a HalfWordArray with (1 2 3 ...).

When using the JIT, the HalfWordArray is broken (513 770 1027 1284 1541 1798 2055 2312 2569 2826 3083 3340 3597 3854 4111 4368 4625 4882 5139 5396 5653 5910 6167 6424 6681 6938 7195 7452 7709 7966 8223 8480 8737 8994 9251 9508 9765...).

That corresponds to sequence of bytes (1 2 2 3 3 4 4 5 5 ...) instead of (1 0 2 0 3 0 ...).

HostWindowPlugin does not account for window decorations on resize

VM: 201608171728 (Cog, Spur)
HostWindowPlugin: VMMaker.oscog-eem.1716 (i)
Platform: Windows 10 1607, OS X El Capitan 10.11.6

If you call the named primitive primitiveHostWindowSizeSet, the Display will not have the correct size after the call.

Try it in Squeak 5.1rc1:

DisplayScreen
   hostWindowExtent: 800@600;
   checkForNewScreenSize.
self assert: Project current world extent = (800@600).

In Squeak, there is a image-side workaround for that in DisplayScreen >> #setNewScreenSize:, which calculates the difference and then calls the primitive again.

On OS X the bug seems to affect only the window title bar and hence only the height. On Windows 10 also the left/right shadows interfere and hence both height and width are wrong.

This bug affects both the 32-bit and the 64-bit versions.

Release notes for Linux - Add note about adjusting real-time priority without logout/login

In the release r3732 notes for linux it asks the user to logout/login again in order to apply the real-time priority settings.

I've tried adjusting that setting for my current shell process instead of logout/login, and it worked fine:

# On Debian, prlimit is provided by util-linux package.
sudo prlimit --pid $$ --rtprio=2

# Now start Squeak
~/bin/Squeak5.1-16548-32bit-201608171728-Linux/squeak.sh

Future release notes could be mention prlimit as an option for users who don't want to logout/login before using Squeak ๐Ÿ˜„

build.macos*/third-party could be better organised.

Hi Esteban, Hi volunteers,

I somewhat like this structure:

build.macos32x86/third-party:
cairo libgit2 libsdl2 openssl pkgconfig
freetype2 libpng libssh2 pixman

build.macos64x64/third-party:
cairo libgit2 libsdl2 openssl pkgconfig
freetype2 libpng libssh2 pixman

What's wrong currently is that e.g. build.macos_/pharo.cog.spur builds each library in its build subdirectories (build.macos_/pharo.cog.spur/{build,buildast,building}/third-party) and so there is duplication.

Instead can we not organise it this way: Add build, buildast and builddbg directories to each of the third-party directories and cd there to do the builds? That way we build each library once only per production,assert or debug build, and not once per specific build. This way we can share e.g. the openssl library built from build.macos*/third-party/openssl between all of the builds (stack & cog x pharo,squeak,newspeak), which is 6 times less build effort.

,,,^..^,,,
best, Eliot

Move processors to another repository or download gdb-7.10 when required.

Ignoring the overhead of git itself, about 148Mb of the source true is for the processor simulators under processors, of which fully 128Mb is a copy of the gdb-7.10 source tree with some modifications. Ignoring the overhead of git itself, the remaining source, platforms and build directories take about 218Mb. So the overhead of the processors tree is some 40% of the total but it is useful only to VM developers. There seem to be three approaches

  • ignore the issue and tolerate clones, pushes and pulls being significantly slower than they need be
  • move the processors tree to another repository, opensmalltalk-vm-support?
  • extract the changed files in processors/ARM/gdb-7.1 and arrange to download gdb-7.10 when building the ARM support plugin, and patch it with the affected files.

trackpad scroll events handled improperly on macOS Sierra with squeak.cog.spur

Strange selection behavior when nothing should happen... To duplicate, scroll to the top or bottom of a text pane using a two-finger scroll trackpad gesture, and keep scrolling after you get there. This doesn't happen with a non-trackpad mouse, or with older versions of the Squeak VM on the same OS.

If someone can get to this before I have time, please feel free. Thanks!

Proposal: Extend the VM with additional integration with native code

I'd like to add the following features to newer Spur VMs:

  • Allow native objects, that are outside the Smalltalk object memory and are not saved on the image. The Spur object headers for them have bit 54 set to 1. This will require adding a primitive to test this bit.
  • Allow pointer mixes, that are objects that are made of managed (tracked by the garbage collector) and unmanaged (not tracked by the garbage collector). This will require adding two new primitives, Behavior>>basicNew:unmanagedPointers: and Object>>unmanagedPointerCount.
  • Allow native contexts, that have the following instance variables: 'sender contextData method v4 v5 v6 v7 v8'. contextData is a ByteArray containing the bytes of a CONTEXT structure (716 bytes in x86). method is a pointer to a NativeMethod, or nil if not yet initialised or queried. sender is the sender of the native context (See ContextPart>>sender). v4 through v8 are reserved for extensibility, and native contexts MUST have 8 instance variables to fit nicely with byte arrays containing x86 CONTEXT structures in native memory.
  • Allow native methods, that have the following instance variables: 'address size selector methodClass callingConvention numArgs portions v8 v9 v10 v11 v12 v13 v14'. v8 through v14 are reserved for extensibility, and native methods MUST have 14 instance variables to occupy exactly 64 bytes in 32 bit environments.
  • A new class (NativeCallGate) with only one instance and that contains methods for gating native methods.
  • Support for two-way throwing and resuming of exceptions (at least in Win32). A new exception class called NativeError will be added, that has the following instance variables in addition to the inherited variables: 'ntstatus flags returnAddress inner parameters translatedError nestedContext'. translatedError was used in internal experiments, please feel free to rename it. ntstatus is the NTSTATUS value of the exception (same as the exception code in Win32, in other operating systems you can autogenerate from other error code systems based on the NTSTATUS values table at MSDN. flags is the exception flags (1 for unresumable exception, 2 for unwind, 4 for exit unwind, 8 for stack invalid, 16 for nested exception). returnAddress is the native return address, that can be nil for exceptions thrown from Smalltalk code. inner is the inner exception, a feature taken from C# and Java. parameters is an array of parameters. nestedContext can be used for nested exceptions, a feature of Structured Exception Handling.
    • NTSTATUS values for common exceptions go here: 0xE0234902 for MessageNotUnderstood, 0xE0234903 for PrimitiveFailed (a new exception class that is to be added to make primitiveFailed resumable) and 0xE0234901 for insufficient object memory (you can use the Microsoft-defined code 0xC0000017 or this one, it's your choice). These three codes are custom NTSTATUS values.
    • Please try to add NTSTATUS values for as much exception classes as you can, by making them inherit from NativeError and adding to initialize the statement "ntstatus := " followed by the value if the NTSTATUS value is different between superclass and subclass. If no initialize method is present, write "super initialize." and then follow the instructions in the preceding sentence.
  • Numbered primitive support for reading and writing to native memory (primitives 1010 and 1011).

SPECIFICATION FOR THE NEW SPECIAL OBJECTS ARRAY SLOTS

5 new special objects array slots will be allocated (numbers are based on Squeak 5.1 final):

  • 61: NativeCallGate
  • 62: NativeContext (subclass of NativeInstructionStream)
  • 63: NativeError (subclass of Exception/Error)
  • 64: NativeMethod (subclass of SequenceableCollection)
  • 65: NativeObjectStub, or nil if you choose not to implement it

SPECIFICATION FOR ANOTHER CLASSES

NativeObjectStub is a stub for a native object that is replaced by the object when a message is sent to it. When an image is saved, pointers to native objects are replaced with pointers to stubs representing them. Identity must be preserved, such that the results of == and identityHash are not changed by the replacing operation. These stubs point to a string referencing the object, that can be passed to the native module handling the stub to resolve the stub, that is, retrieving a pointer to the native object corresponding to the stub.

NativeInstructionStream is similar to InstructionStream, except it works with native instructions. Clients of NativeInstructionStream implement a message, #receiveInstruction:, that takes as argument a NativeInstruction, whose protocol is platform-specific.

SPECIFICATION FOR THE NEW PRIMITIVES

Primitives 1000-1199 are reserved for my proposal and future versions of it.

Primitive 1010 is the readFromNativeMemory: primitive, that replaces the bytes of the receiver with bytes from native memory starting at the address which is the argument, as an Integer. The primitive fails if the receiver is not a ByteArray or if the argument is not an Integer.

Primitive 1011 is the writeFromNativeMemory: primitive, that writes to native memory starting at the address which is the argument, as an Integer, the bytes of the receiver.

Primitive 1013 is the unwind primitive, that unwinds the receiver, which is a NativeContext. The primitive fails if the receiver is not a NativeContext.

Primitive 1032 (Only in Win32 VM!) returns the segment of the Thread Environment Block as a SmallInteger. In Windows 8.1 WOW64 today this should be 0x0053 (83).

Primitive 1033 is the unmanagedPointerCount primitive, that answers the unmanaged pointer count of the receiver. The primitive fails if the receiver is not a pointer mix.

Primitive 1034 is the basicNew:unmanagedPointers: primitive, that answers a new instance of the receiver (which is a behaviour) with the number of indexable managed pointer fields specified by the first argument (sizeRequested) and with the number of unmanaged indexable pointer fields specified by the second argument (unmanagedPointers). The primitive fails if the receiver's format is not a format for pointer mixes; if either of the arguments are negative or not a SmallInteger.

Primitive 1043 is the supportsNativeContexts primitive. It should return true if the VM fully supports native contexts. A fallback may be written that returns false.

Primitive 1045 is the fullParse primitive, that fully parses (fills instance variables according to the bytes of the instruction) the receiver, which is a NativeInstruction. The primitive fails if the receiver is not a NativeInstruction. This primitive is optional.

Primitive 1075 is the isNativeObject primitive, that determines whether an object is a native object. A fallback may be written that returns false.

Add tests that check the VM can run, not just build

The current Travis and Appveyor jobs merely test that the VM can build. They should also run the Squeak or Pharo test suite or Newspeak bootstrap depending on flavor. Even just ignore the test results and merely checking the test suite can complete without crashing would be a huge improvement in coverage.

Unambiguously differentiating official and local builds

As requested by eliot on vm-dev.

Hi Tim,

> On Jun 17, 2016, at 12:22 AM, Tim Felgentreff <[email protected]> wrote:
>
>
> Hi Eliot,
>
> how secure does this need to be? One way to differentiate the official
> VMs is to sign them directly on Travis (which we'll want to do anyway,
> just didn't get to it, yet).
>
> Another option is to just change the URL replacement code to do
> something else when not running on Travis --- like adding your
> hostname and path instead --- but this could be fairly easily messed
> with.
>
> Not sure how much malicious intent we want to prevent.

None.  I don't think there's malicious intent at all.  I do think we should
differentiate between "personal" and Travis builds.  It's more for my own
information, so u don't get confused, than to prevent maliciousness.  
So do the simplest thing that could possibly work TSTTCPW.  I like 
username,host name,path as in an scp, eg 
eliot@McStalker:oscogvm (path relative to ~eliot).

High Performance AsyncIO - kqueue/epoll/IOCP

I happened across commit 3664 [1] which indicates epoll and kqueue support is planned. The core devs probably already know what they want to do, but I got curious to understand the background and wanted somewhere to hang the info I found. Perhaps its useful for discussion or history.

Nginx summarises the per platform options[2]...
select โ€” standard method for platforms that lack more efficient methods.
poll โ€” standard method on platforms that lack more efficient methods.
kqueue โ€” efficient method used on FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, and Mac OS X.
epoll โ€” efficient method used on Linux 2.6+.
eventport โ€” event ports, efficient method used on Solaris 10.

Code examples of epoll & kqueue provided by [3].

I/O Completion Ports seem to be the similar mechanism on Windows[4], and [9] discusses the "practical difference between epoll and Windows IO Completion Ports" and in particular... its "fairly easy to emulate IOCP with epoll while using a separate thread pool. However it is not that easy to do the reverse, and I donโ€™t know of any easy way to emulate epoll with IOCP, and it looks rather impossible to keep the same or close performance."

Should an existing third-party cross platform library like libevent(BSD)[5] or libuv(MIT)[6][7] be used?
Both these are git repositories and so could be maintained as a subtree repository.
Pros and cons are listed in the comments of [11] for: LibEvent, Libev, Libuv, Libae, Boost asio.

Perhaps the http & ssl support in libevent is too much of a kitchen sink, or perhaps it could be useful to provide out-of-band management of a VM running in the cloud (if that might ever be useful). Per [8]... "Having to provide access to the functionality from the dramatically different methods, libevent has a rather complex API which is much more difficult to use than poll or even epoll. It is however easier to use libevent than to write separate backends if you need to support FreeBSD (epoll and kqueue) [and Windows]".

libuv seems a lighter option than libevent. The difference between *nix "Reactor" and Windows "Proactor" approach to AIO is described at [12]. (Does Libuv provide a cross platform proactor interface?) [13] says "libuv offers considerable child process management, abstracting the platform differences." (So maybe uv_spawn() will help get OSSubprocess working on Windows.) [14] says "you can also embed libuvโ€™s event loop into another event loop based library."

[10] says "multiple SIGIO signals will not be queued and there is no way to detect if signals have been lost" . [10] also says of POSIX AIO is "totally screwed. The people who came up with it were on drugs or something. Really. I'll go through various issues, starting with the ones that aren't so bad and ending with the rool doozies [...and... ] is implemented at user level, using threads [which is a high overhead for large numbers of aio]"

[15] notes that Window's other AIO mechanism WSAWaitForMultipleEvents won't let you wait for more than 64 events.

[1] http://forum.world.st/commit-3664-Format-aio-c-according-to-Eliot-s-predilections-before-adding-kqueue-and-epoll-td4887256.html
[2] http://nginx.org/en/docs/events.html
[3] http://austingwalters.com/io-multiplexing/
[4] http://tinyclouds.org/iocp-links.html
[5] https://en.wikipedia.org/wiki/Libevent
[6] https://en.wikipedia.org/wiki/Libuv
[7] http://docs.libuv.org/en/latest/design.html
[8] http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/
[9] http://www.ulduzsoft.com/2014/01/practical-difference-between-epoll-and-windows-io-completion-ports-iocp/
[10] http://davmac.org/davpage/linux/async-io.html#sigio
[11] https://www.reddit.com/r/linux/comments/1drwuw/why_doesnt_linux_implement_kqueue/
[12] http://somdoron.com/2014/11/netmq-iocp/
[13] https://nikhilm.github.io/uvbook/processes.html
[14] https://nikhilm.github.io/uvbook/eventloops.html
[15] http://blog.omega-prime.co.uk/?p=155

jpeg plugin crashes in Win64

My 1st finding is that crashes allways occur in setjump().

setjump() is used in primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgrWriteScanlines as the return point for the error_exit() - called by jpeg library in case of error.
See platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c

error_exit() will then use longjmp to go to the exit point.
See platforms/Cross/plugins/JPEGReadWriter2Plugin/Error.c

But the call to setjump does not allways crash. It sometimes succeed, sometimes crash.

My 2nd finding is that it works when the jump_buf is 16-bytes aligned (hex address ending by 0), but fails when 8 bytes-aligned (hex address ending by 8).

This seems confirmed by other bug reports (google: setjmp win64 failure 16bytes aligned)
https://bugs.launchpad.net/pbxt/+bug/688404

A workaround would be to store a pointer to the jump_buf in struct error_mgr2, and properly align the jump_buf with alloca() or something...

Mac OS X builds: set LSMinimumSystemVersion in Info.plist to accord with SDK used in build

Tim Johnson [email protected]
Sep 12

to vm-dev
Hello,

If VM developers were to update LSMinimumSystemVersion in the Info.plist for the OS X VM, it stands to reason that the VM will stop crashing on earlier, no-longer supported versions of OS X. On my Cog V3 VM 4.5-3732, the value is set to 10.6.0, which probably sends the wrong message to OS X.

I'm sorry if this issue has already been addressed -- it is unclear to me how to acquire new binaries of the latest VMs through GitHub.

Thanks,
Tim

macOS VM crashes when attempting to access CameraPlugin

Open an updated to 16693 or thereabouts image with the latest macOS vm (on Sierra) and try CameraInterface class>>#cameraIsAvailable
Boom! A veritable Earth-shattering Kaboom!

I donโ€™t think posting a 79Mb crash.dmp file is a good thing to do here but the top few lines are

VM: 201701281910 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $ Date: Sat Jan 28 11:10:24 2017 -0800 $
Plugins: 201701281910 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $

C stack backtrace & registers:
eax 0x8351d480 ebx 0x7bc04028 ecx 0x90301065 edx 0x38351ad1
edi 0x7bc04028 esi 0x7bc04028 ebp 0xbff2ab28 esp 0xbff2a8e8
eip 0x9ef2c013
0 libobjc.A.dylib 0x9ef2c013 objc_msgSend + 19
1 Squeak 0x00149c93 reportStackState + 706
2 Squeak 0x00149feb sigsegv + 113
3 libsystem_platform.dylib 0x9f98eebb _sigtramp + 43
4 ??? 0xffffffff 0x0 + 4294967295
5 CoreFoundation 0x94672888 _CFAutoreleasePoolPop + 24
6 Foundation 0x95d8a3d7 -[NSAutoreleasePool drain] + 120
7 AppKit 0x92570bbb -[NSApplication run] + 738
8 AppKit 0x9253dc26 NSApplicationMain + 1368
9 libdyld.dylib 0x9f7883b5 start + 1

Smalltalk stack dump:
0xbff0ad04 M CameraInterface class>DoIt 0x88809d0: a(n) CameraInterface class
0xbff0ad30 I Compiler>evaluateCue:ifFail: 0x55fa288: a(n) Compiler
0xbff0ad5c I Compiler>evaluateCue:ifFail:logged: 0x55fa288: a(n) Compiler

An older 5.0 AiO vm does not crash but then again it doesnโ€™t appear to have the plugin to crash...
tim

Source: http://forum.world.st/macOS-vm-latest-packaged-Squeak5-1-16549-32bit-201701281910-macOS-crashes-when-attempting-to-access-n-td4936707.html

Newspeak VMs do not open the Newspeak UI on Windows

Citing @gbracha:

I've tried the new spur VM that Fabio linked to, and its behavior is similar to the other windows nsvm builds on open smalltalk. It runs, but fails to open the Newspeak UI. More precisely, it will ask for an image (if you double-click on the VM instead of on an image directly) and then continue running. The task manager shows it as a background process. This would explain why the builds past any testing, as the background process seems to work.
I suspect something is amiss with the FFI. This probably broke between 2016.05.26 and 2016.06.30.

Here are the corresponding VMs:
https://bintray.com/opensmalltalk/vm/download_file?file_path=cog_win64x64_newspeak.cog.spur_201709050420.zip
https://bintray.com/opensmalltalk/vm/download_file?file_path=cog_win64x64_newspeak.stack.spur_201709050420.zip

@nicolas-cellier-aka-nice: would you have some time to look into this? VMs for other flavors don't seem to have this problem, otherwise we should have noticed and fixed it already.

primitiveAt for HalfWordArray return signed short

SpurVM support HalfWord (16 bits) and DoubleWord (64 bits) variable subclass.
But commonAt: -> stObject:at: -> subscript:with: currently uses fetchShort16:ofObject: -> shortAt: which is currently signed.
Consequently ((HalfWordArray with: 65535) at: 1) = -1.
This shouldn't be so, this should be unsigned as ByteArray and WordArray, and logically (HalfWordArray with: -1) will fail!

See recent Collections and Kernel packages in squeak trunk inbox for testing this feature.

README.md should include description of check-in & contribution processes, etc

README.md does describe the contents of the repository but it is thin on how to interact with the repository at a process level. The README should

  • tell people how the repository is managed (master vs branches etc)
  • tell people how to submit issues with the repository (such as this issue)
  • tell people how to become a member, get promoted to an admin etc.

"r" in Version string

AFAIK, we agreed on this version number format: YYYYMMDDHHSS.
Inside an image, the VM reports a version like r201608141014. Shall we remove the r here in order to make it consistent?

Related code.

macOS: asking about reopening windows even though feature is off

I'm getting the "App crashed; reopen windows?" dialog even though I have this feature off in the system preferences. Clicking the "Reopen" button results in a segfault, clicking "Don't Reopen" launches the image as intended. The whole problem goes away after save-quitting the image cleanly, but I'm pretty sure I can reproduce by killing the pharo-ui wrapper from the terminal.

reopen windows after crash

preferences

stack trace (collapsed 'cuz it's long and I just learnt the HTML tags to do that)

Segmentation fault Tue Oct  3 15:43:26 2017


VM: 201708271955 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $ Date: Sun Aug 27 21:55:26 2017 +0200 $
Plugins: 201708271955 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $

C stack backtrace & registers:
	eax 0x09fb5004 ebx 0x79e4f0d0 ecx 0x79e4f0d0 edx 0x79e4f0d0
	edi 0x7a08a000 esi 0x7a08a000 ebp 0xbff3ca58 esp 0xbff3ca20
	eip 0x0739b21a
0   libfreetype.6.dylib                 0x0739b21a FT_Stream_ReadULong + 202
1   Pharo                               0x00141400 reportStackState + 819
2   Pharo                               0x001417a2 sigsegv + 191
3   libsystem_platform.dylib            0xa776802b _sigtramp + 43
4   ???                                 0xffffffff 0x0 + 4294967295
5   libfreetype.6.dylib                 0x07404c8d sfnt_open_font + 109
6   libfreetype.6.dylib                 0x073fd69a sfnt_init_face + 266
7   libfreetype.6.dylib                 0x073a9d3a tt_face_init + 218
8   libfreetype.6.dylib                 0x07393f1c open_face + 476
9   libfreetype.6.dylib                 0x073937d6 FT_Open_Face + 678
10  libfreetype.6.dylib                 0x07393d29 FT_New_Memory_Face + 121
11  libFT2Plugin.dylib                  0x07351689 primitiveNewMemoryFaceFromExternalMemoryAndIndex + 200
12  Pharo                               0x000d2f08 primitiveExternalCall + 671
13  Pharo                               0x000c2528 interpret + 26051
14  Pharo                               0x000cb9da enterSmalltalkExecutiveImplementation + 135
15  Pharo                               0x000bc1eb interpret + 646
16  Pharo                               0x00142979 -[sqSqueakMainApplication runSqueak] + 476
17  Foundation                          0x953797ec __NSFirePerformWithOrder + 432
18  CoreFoundation                      0x9391c0a6 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 22
19  CoreFoundation                      0x9391bfc2 __CFRunLoopDoObservers + 498
20  CoreFoundation                      0x938ff47d __CFRunLoopRun + 1661
21  CoreFoundation                      0x938fead1 CFRunLoopRunSpecific + 641
22  CoreFoundation                      0x938fe83a CFRunLoopRunInMode + 122
23  HIToolbox                           0x92effd3b RunCurrentEventLoopInMode + 321
24  HIToolbox                           0x92eff91f ReceiveNextEventCommon + 454
25  HIToolbox                           0x92eff73b _BlockUntilNextEventMatchingListInModeWithFilter + 71
26  AppKit                              0x91358fa5 _DPSNextEvent + 2101
27  AppKit                              0x91aca594 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 2859
28  AppKit                              0x91ac9a61 -[NSApplication(NSEvent) nextEventMatchingMask:untilDate:inMode:dequeue:] + 134
29  AppKit                              0x9134def9 -[NSApplication run] + 763
30  AppKit                              0x9131ff0e NSApplicationMain + 1228
31  libdyld.dylib                       0xa74e8711 start + 1


Smalltalk stack dump:
0xbff42b78 I FreeTypeFace(FT2Face)>newFaceFromExternalMemory:index: 0x5f30bc8: a(n) FreeTypeFace
0xbff42ba0 I FreeTypeFace>create 0x5f30bc8: a(n) FreeTypeFace
0xbff42bc0 I FreeTypeFace>validate 0x5f30bc8: a(n) FreeTypeFace
0xbff42be0 I FreeTypeFont>face 0x35648f0: a(n) FreeTypeFont
0xbff42c1c I FreeTypeFontProvider>fontFor:familyName: 0x44da478: a(n) FreeTypeFontProvider
0xbff42c48 M [] in LogicalFontManager>bestFontFor:whenFindingAlternativeIgnoreAll: 0x4cf3ab8: a(n) LogicalFontManager
0xbff42c6c M OrderedCollection>do: 0x4cf9310: a(n) OrderedCollection
0xbff42c90 M [] in LogicalFontManager>bestFontFor:whenFindingAlternativeIgnoreAll: 0x4cf3ab8: a(n) LogicalFontManager
0xbff42cb4 M Array(SequenceableCollection)>do: 0x3563840: a(n) Array
0xbff42cdc I LogicalFontManager>bestFontFor:whenFindingAlternativeIgnoreAll: 0x4cf3ab8: a(n) LogicalFontManager
0xbff42d04 I LogicalFontManager>bestFontFor: 0x4cf3ab8: a(n) LogicalFontManager
0xbff42d28 I LogicalFont>findRealFont 0x4cf3ba0: a(n) LogicalFont
0xbff42d48 I LogicalFont>realFont 0x4cf3ba0: a(n) LogicalFont
0xbff42d68 I LogicalFont>descentKern 0x4cf3ba0: a(n) LogicalFont
0xbff42d90 I RubCharacterBlockScanner(RubCharacterScanner)>setFont 0x3563698: a(n) RubCharacterBlockScanner
0xbff42db0 I RubCharacterBlockScanner>setFont 0x3563698: a(n) RubCharacterBlockScanner
0xbff42dd0 I RubCharacterBlockScanner>setStopConditions 0x3563698: a(n) RubCharacterBlockScanner
0xbff42dfc I RubCharacterBlockScanner>characterBlockAtPoint:index:in: 0x3563698: a(n) RubCharacterBlockScanner
0xbff42e2c I RubParagraph>characterBlockForIndex: 0x5953e08: a(n) RubParagraph
0xbff3fab0 I RubEditingState>markIndex:pointIndex: 0x5953e38: a(n) RubEditingState
0xbff3fae0 I [] in RubTextFieldArea(RubAbstractTextArea)>markIndex:pointIndex: 0x5951608: a(n) RubTextFieldArea
0xbff3fb0c I RubTextFieldArea(RubAbstractTextArea)>handleSelectionChange: 0x5951608: a(n) RubTextFieldArea
0xbff3fb30 I RubTextFieldArea(RubAbstractTextArea)>markIndex:pointIndex: 0x5951608: a(n) RubTextFieldArea
0xbff3fb58 I RubTextFieldArea(RubAbstractTextArea)>recomputeSelection 0x5951608: a(n) RubTextFieldArea
0xbff3fb78 I RubParagraph>moveBy: 0x5953e08: a(n) RubParagraph
0xbff3fba0 I [] in RubTextFieldArea(RubAbstractTextArea)>privateMoveBy: 0x5951608: a(n) RubTextFieldArea
0xbff3fbc8 I RubTextFieldArea(RubAbstractTextArea)>handleBoundsChange: 0x5951608: a(n) RubTextFieldArea
0xbff3fbec I RubTextFieldArea(RubAbstractTextArea)>privateMoveBy: 0x5951608: a(n) RubTextFieldArea
0xbff3fc08 M RubTextFieldArea(Morph)>privateFullMoveBy: 0x5951608: a(n) RubTextFieldArea
0xbff3fc28 M [] in PanelMorph(Morph)>privateFullMoveBy: 0x59516f8: a(n) PanelMorph
0xbff3fc4c M Array(SequenceableCollection)>do: 0x5953f10: a(n) Array
0xbff3fc68 M PanelMorph(Morph)>privateFullMoveBy: 0x59516f8: a(n) PanelMorph
0xbff3fc88 M [] in NautilusAnnotationDisplayer(Morph)>privateFullMoveBy: 0x5951778: a(n) NautilusAnnotationDisplayer
0xbff3fcac M Array(SequenceableCollection)>do: 0x59540b8: a(n) Array
0xbff3fcc8 M NautilusAnnotationDisplayer(Morph)>privateFullMoveBy: 0x5951778: a(n) NautilusAnnotationDisplayer
0xbff3fce8 M [] in RubScrolledTextMorph(Morph)>privateFullMoveBy: 0x5950018: a(n) RubScrolledTextMorph
0xbff3fd0c M Array(SequenceableCollection)>do: 0x5951a50: a(n) Array
0xbff3fd28 M RubScrolledTextMorph(Morph)>privateFullMoveBy: 0x5950018: a(n) RubScrolledTextMorph
0xbff3fd48 M [] in PanelMorph(Morph)>privateFullMoveBy: 0x595d400: a(n) PanelMorph
0xbff3fd6c M Array(SequenceableCollection)>do: 0x595e068: a(n) Array
0xbff3fd88 M PanelMorph(Morph)>privateFullMoveBy: 0x595d400: a(n) PanelMorph
0xbff3fda8 M [] in PanelMorph(Morph)>privateFullMoveBy: 0x595d428: a(n) PanelMorph
0xbff3fdcc M Array(SequenceableCollection)>do: 0x595e0c0: a(n) Array
0xbff3fde8 M PanelMorph(Morph)>privateFullMoveBy: 0x595d428: a(n) PanelMorph
0xbff3fe08 M [] in NautilusWindow(Morph)>privateFullMoveBy: 0x59518b8: a(n) NautilusWindow
0xbff3fe2c M Array(SequenceableCollection)>do: 0x595d230: a(n) Array
0xbff3eb1c M NautilusWindow(Morph)>privateFullMoveBy: 0x59518b8: a(n) NautilusWindow
0xbff3eb48 I NautilusWindow(Morph)>position: 0x59518b8: a(n) NautilusWindow
0xbff3eb70 I NautilusWindow(SystemWindow)>position: 0x59518b8: a(n) NautilusWindow
0xbff3eb94 I NautilusWindow(SystemWindow)>makeMeVisible 0x59518b8: a(n) NautilusWindow
0xbff3ebac M [] in WorldMorph>fullRepaintNeeded 0x44840c8: a(n) WorldMorph
0xbff3ebd0 M [] in WorldMorph(PasteUpMorph)>windowsSatisfying: 0x44840c8: a(n) WorldMorph
0xbff3ebf4 M Array(SequenceableCollection)>do: 0x5f4ecd8: a(n) Array
0xbff3ec1c I WorldMorph(PasteUpMorph)>windowsSatisfying: 0x44840c8: a(n) WorldMorph
0xbff3ec40 I WorldMorph>fullRepaintNeeded 0x44840c8: a(n) WorldMorph
0xbff3ec60 I WorldMorph>viewBox: 0x44840c8: a(n) WorldMorph
0xbff3ec88 I WorldMorph(PasteUpMorph)>restoreMorphicDisplay 0x44840c8: a(n) WorldMorph
0xbff3ecac I WorldMorph class>startUp 0x3f78e18: a(n) WorldMorph class
0xbff3eccc I WorldMorph class(Behavior)>startUp: 0x3f78e18: a(n) WorldMorph class
0xbff3ece8 M ClassSessionHandler>startup: 0x44841f0: a(n) ClassSessionHandler
0xbff3ed08 M [] in WorkingSession>runStartup: 0x3453490: a(n) WorkingSession
0xbff3ed2c M [] in WorkingSession>runList:do: 0x3453490: a(n) WorkingSession
0xbff3ed44 M BlockClosure>on:do: 0x3539498: a(n) BlockClosure
0xbff3ed68 M [] in WorkingSession>runList:do: 0x3453490: a(n) WorkingSession
0xbff3ed8c M Array(SequenceableCollection)>do: 0x3453668: a(n) Array
0xbff3edb0 I WorkingSession>runList:do: 0x3453490: a(n) WorkingSession
0xbff3edd8 I WorkingSession>runStartup: 0x3453490: a(n) WorkingSession
0xbff3edfc I WorkingSession>start: 0x3453490: a(n) WorkingSession
0xbff3ee28 I SessionManager>snapshot:andQuit: 0x3c16758: a(n) SessionManager
 0x5fa0418 s [] in SmalltalkImage>snapshot:andQuit:
 0x5fa3428 s CurrentExecutionEnvironment class>activate:for:
 0x5fa5608 s DefaultExecutionEnvironment(ExecutionEnvironment)>beActiveDuring:
 0x5fa7138 s DefaultExecutionEnvironment class>beActiveDuring:
 0x5fa5668 s SmalltalkImage>snapshot:andQuit:
 0x5fa7198 s [] in WorldState class>saveAndQuit
 0x5faa0a0 s BlockClosure>ensure:
 0x5fad838 s CursorWithMask(Cursor)>showWhile:
 0x5fad8b0 s WorldState class>saveAndQuit
 0x5fb0138 s [] in ToggleMenuItemMorph(MenuItemMorph)>invokeWithEvent:
 0x5fb1700 s BlockClosure>ensure:
 0x5fb1ef8 s CursorWithMask(Cursor)>showWhile:
 0x5fb1f70 s ToggleMenuItemMorph(MenuItemMorph)>invokeWithEvent:
 0x5fb2318 s ToggleMenuItemMorph(MenuItemMorph)>mouseUp:
 0x5fb25b8 s ToggleMenuItemMorph(MenuItemMorph)>handleMouseUp:
 0x5fb27b8 s MouseButtonEvent>sentTo:
 0x5fb2a70 s ToggleMenuItemMorph(Morph)>handleEvent:
 0x5fb2cc8 s MorphicEventDispatcher>dispatchDefault:with:
 0x5fb2f30 s MorphicEventDispatcher>handleMouseUp:
 0x5fb3128 s MouseButtonEvent>sentTo:
 0x5fb3290 s [] in MorphicEventDispatcher>dispatchEvent:with:
 0x5fb3428 s BlockClosure>ensure:
 0x5fb3580 s MorphicEventDispatcher>dispatchEvent:with:
 0x5fb3640 s ToggleMenuItemMorph(Morph)>processEvent:using:
 0x5fb36a0 s MorphicEventDispatcher>dispatchDefault:with:
 0x5fb3700 s MorphicEventDispatcher>handleMouseUp:
 0x5fb3790 s MouseButtonEvent>sentTo:
 0x5fb37f0 s [] in MorphicEventDispatcher>dispatchEvent:with:
 0x5fb3850 s BlockClosure>ensure:
 0x5fb38c8 s MorphicEventDispatcher>dispatchEvent:with:
 0x5fb3940 s MenuMorph(Morph)>processEvent:using:
 0x5fb39a0 s MenuMorph(Morph)>processEvent:
 0x5fb3a00 s MenuMorph>handleFocusEvent:
 0x5fb3a60 s [] in HandMorph>sendFocusEvent:to:clear:
 0x5fb3ac0 s BlockClosure>on:do:
 0x5fb3b50 s WorldMorph(PasteUpMorph)>becomeActiveDuring:
 0x5fb3bd0 s HandMorph>sendFocusEvent:to:clear:
 0x5fb3c58 s HandMorph>sendEvent:focus:clear:
 0x5fb3ce0 s HandMorph>sendMouseEvent:
 0x5fb3d40 s HandMorph>handleEvent:
 0x5fb3da0 s HandMorph>processEventsFromQueue:
 0x5fb3e00 s HandMorph>processEvents
 0x5fb3e60 s [] in WorldState>doOneCycleNowFor:
 0x5fb3ec0 s Array(SequenceableCollection)>do:
 0x5fb3f38 s WorldState>handsDo:
 0x5fb3f98 s WorldState>doOneCycleNowFor:
 0x5fb3ff8 s WorldState>doOneCycleFor:
 0x5fb4058 s WorldMorph>doOneCycle
 0x5fb40b8 s WorldMorph class>doOneCycle
 0x5d93630 s [] in MorphicUIManager>spawnNewProcess
 0x5d93690 s [] in BlockClosure>newProcess

Most recent primitives
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
truncated
truncated
@
@
@
@
@
value:
+
@
+
@
digitCompare:
@
digitCompare:
digitCompare:
@
**StackOverflow**
value:

class
class
class
**StackOverflow**
**StackOverflow**
basicNew
size
at:
at:
value:value:value:
value:
at:
class
class
basicNew
new:
value:
value
basicNew
value
primCurrentLibrary
stringHash:initialHash:
compare:with:collated:
value:
at:
at:
value:value:
**StackOverflow**
**StackOverflow**
-
*
*
*
*
*
raisedToInteger:
raisedToInteger:
at:
third
asFloat
sqrt
truncated
sqrt
sqrt
sqrt
sqrt
sqrt
bitShift:
**PrimitiveFailure**
bitShiftMagnitude:
digitLength
digitAt:
digitLength
digitAt:
asFloat
digitAt:
asFloat
digitAt:
asFloat
digitAt:
asFloat
digitAt:
asFloat
digitAt:
asFloat
digitAt:
asFloat
timesTwoPower:
>=
at:
value:value:
**StackOverflow**


+
+
+
truncated
+
+
+
+
+
truncated
value:value:
**StackOverflow**
truncated
truncated

**PrimitiveFailure**
bitShiftMagnitude:















**PrimitiveFailure**
basicAt:
bitShiftMagnitude:
basicAt:
bitAnd:
bitShiftMagnitude:
basicAt:
+
bitOr:
digitCompare:
bitShiftMagnitude:
bitShift:
**PrimitiveFailure**
bitShiftMagnitude:
basicNew
digitCompare:
<
perform:with:
*
**PrimitiveFailure**
~~
digitMultiply:neg:
*
*
at:
value:value:
**StackOverflow**
truncated
truncated
at:
value:value:
truncated
truncated
value:value:
value:value:
value:value:
third
third
third
third
third
third
third
at:
at:
at:put:
at:put:
at:
value:value:
truncated
truncated
sort:to:
sort:to:
sort:to:
sort:to:
truncated
truncated
truncated
truncated
bitShiftMagnitude:
timesTwoPower:
basicNew
allInstancesOrNil
value:
index
value:
value:
size
primNewFaceFromExternalMemory:size:index:

stack page bytes 4096 available headroom 2788 minimum unused headroom 2992

	(Segmentation fault)

JIT failing testMediumIntegerDiv and testMediumIntegerRem

From Newspeak's KernelTestsConfiguration, these tests pass on the stack VM but fail on the JIT.

assert: minInt31 // -1 equals: 1073741824.
Equality assertion failed; expected: 1073741824, was: -1073741824

assert: (minInt31 rem: -1) equals: 0.
Equality assertion failed; expected: 0, was: -2147483648

Keyboard Event issues on Windows

VM: 201608171728
OS: Windows 10 1607
Keyboard: German

Here is how I observed the keyboard events in Squeak5.1rc1 (after filing in the attached files):

KeyboardEvent-printOn.st.txt
KeyboardEvent-printKeyStringOn.st.txt

| filter |
filter := PluggableEventFilter on: [:evt :target |
    Transcript showln: evt printString.
    evt].

Preferences disable: #duplicateControlAndAltKeys.
Preferences disable: #swapControlAndAltKeys.
Preferences disable: #duplicateAllControlAndAltKeys.

ActiveHand addKeyboardCaptureFilter: filter.

"After observation finished."
ActiveHand removeKeyboardCaptureFilter: filter.
Preferences enable: #duplicateAllControlAndAltKeys.

I observed the following bugs:

  • There are way too many keyDown events when holding, for example, the letter 'x' key. I would expect a single keyDown, multiple keystroke, and after letting it go, a single keyUp. Since whe have keystroke events in the first place, there is no need for multiple keyDown (or a repeat field as in SDL).
  • If I add the modifier key after pressing the key to be modified, there will be no keystrokes at all and not even the correct keydown event (e.g. [up] + [ctrl] instead of [ctrl] + [up])
  • The values for keyDown and keyUp for key characters 65 < c > 90 are wrong. For example, pressing '#' gives keyDown/Up value 192, while the keystroke is good with 35. On German keyboard.
  • There are no keystroke events generated for CTRL+[0..9].
  • keystroke events using the CTRL modifier are wrong for [a..zA..z] while the keyDown events are good. CTRL+C yields 67 for keyDown but 3 for keystroke, which is ENTER. Adding the SHIFT modifier to CTRL shows the same bug.
  • On German keyboards, the [AltGr] modifier is mapped to a mixture of [CTRL] 17 and [CMD] 18 for keyUp/Down. The resulting keyCharacter for keystroke events is good.
  • The keystroke for [CTRL]+[backspace] shows up as [CTRL]+[delete]. keyUp/Down are good.

Should edit output of git remote show origin to obtain url in .git_filters/RevDateURL.smudge using perl, not unix shell commands

in .git_filters/RevDateURL.smudge the URL is obtained with "git remote get-url origin", but that doesn't work on Mac OS X git version 1.9.5 (Apple Git-50.3). Instead one has to use git remote show origin.

I'm modifying .git_filters/RevDateURL.smudge to read

$url=git remote get-url origin 2>/dev/null;
if (!$url) { $url=git remote show origin | grep -i fetch | sed 's/^.*URL: //' 2>/dev/null }
$url =~ s/\s+$//m;

But it strikes me that the editing down from

  • remote origin
    Fetch URL: http://github.com/OpenSmalltalk/vm
    Push URL: http://github.com/OpenSmalltalk/vm
    HEAD branch: Cog
    Remote branches:
    Cog tracked
    master tracked
    oldTrunk tracked
    platform/Cross/plugins tracked
    platform/win32/plugins tracked
    Local branch configured for 'git pull':
    Cog merges with remote Cog
    Local ref configured for 'git push':
    Cog pushes to Cog (up to date)

to

Fetch URL: http://github.com/OpenSmalltalk/vm

and thence to

http://github.com/OpenSmalltalk/vm

would best be done in Perl. So anyone who's motivated, please fix my poor fix.

"LC_ALL: cannot change locale" warnings during ARM builds

These warnings add quite some noise to the Travis log. Not sure how to remove them in the schroot. Maybe @timfel knows more.

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = "en_US.UTF-8",
    LC_CTYPE = "en_US.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = "en_US.UTF-8",
    LC_CTYPE = "en_US.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

Example

build.linux*/*/*/mvm files being ignored

make a change to any of build.linux32ARMv7/newspeak./build/mvm (i.e. changing INSTALLDIR=nscogspurlinuxhtARM to INSTALLDIR=nscogspurlinuxhtARMv7) and then say git status. No joy!

I need to check in these fixes. can some kind soul who understands the .gitignore conventions fix .gitignore to not ignore at the least the mvm files three levels down in the build.linux* builds?

Build Error

Hi,
Been trying to build for centos 7 64bit machine and i keep
getting this error:

/usr/bin/ld: cannot find -lvm-display-X11
collect2: error: ld returned 1 exit status
make[1]: *** [XDisplayControlPlugin.la] Error 1
make: *** [XDisplayControlPlugin.la] Error 2

Can you kindly help
Thanks

Display depth < 32 bpp broken on Mac

The display becomes garbled when selecting a lower bit depth.

Note: in Squeak Trunk you have to disable the workaround in supportsDisplayDepth: to see the problem.

Control keys broken on OS X

VM: 201608171728
OS: OS X El Capitan 10.11.6
Keyboard: German

Here is how I observed the keyboard events in Squeak5.1rc1 (after filing in the attached files):

KeyboardEvent-printOn.st.txt
KeyboardEvent-printKeyStringOn.st.txt

| filter |
filter := PluggableEventFilter on: [:evt :target |
    Transcript showln: evt printString.
    evt].

Preferences disable: #duplicateControlAndAltKeys.
Preferences disable: #swapControlAndAltKeys.
Preferences disable: #duplicateAllControlAndAltKeys.

ActiveHand addKeyboardCaptureFilter: filter.

"After observation finished."
ActiveHand removeKeyboardCaptureFilter: filter.
Preferences enable: #duplicateAllControlAndAltKeys.

I observed the following bugs:

  • Repeated key strokes are not working for [b..xB..X]. Not kidding.
  • The values for keyDown and keyUp events are wrong. For example, hitting 'x' gives 7 for keyDown, 120 for keystroke, and 7 for keyUp. 120 is correct. Includes backspace, enter, etc.
  • For the working keystrokes, there are way too many keyDown events when holding, for example, the letter 'x' key. I would expect a single keyDown, multiple keystroke, and after letting it go, a single keyUp. Since whe have keystroke events in the first place, there is no need for multiple keyDown (or a repeat field as in SDL).
  • The values for keyDown and keyUp for arrow keys are wrong. The values for keystroke events are good. Adding modifiers such as CMD or SHIFT shows the same bug.
  • No keyUp/down events for CTRL, SHIFT, CMD keys.
  • The CTRL modifier in combination with other keys is totally off. CTRL+C gives a single keyUp with value 8 (backspace). CTRL+down gives keyDown 121 (y), keystroke 12 (page-down) and keyUp 9 (tab)

Mac OS X: MIDIPlugin needs to be updated

../../platforms/iOS/plugins/MIDIPlugin/sqMacMIDI.m:4:10: fatal error: 'QuickTime/QuickTimeMusic.h' file not found

QuickTime was deprecated with Carbon, and removed in XCode 8 / OS X Sierra. It's not in the default 10.12 SDK. The MIDIPlugin has not worked ever since we switched to Cocoa.

The fix would be to re-implement MIDIPlugin in terms of CoreAudio (using AVAudioSequencer).

VM should build with -Wall, -Wextra, -Werror

Warnings typically mean one's program is relying on Undefined Behavior, and should be taken seriously to avoid bugs that are hard to track down. A C program that fails to compile with warnings-as-errors can't be considered production quality.

Mouse Wheel Events

As documented on squeak-dev, Bert, Tim and I came up with a simple format for mouse-wheel events -- consistent with other (mouse) event types.

The low-level event array format is straightforward:

{
   7. "EventTypeMouseWheel"
   stamp.
   deltaX. "VM converts OS values into multiples of 120 units per notch"
   deltaY. "(see above)"
   buttons. "like mouse event"
   modifiers. "like mouse event"
   nil. "unused"
   window index.
}

The VM should normalize wheel deltas to 120 units per notch as suggested in the Mozilla Dev Docs. Having this, one could easily implement smooth scrolling in the image.

The image-side code in Squeak 5.1rc1 for mouse-wheel events is here:

{
   EventSensor >> #processMouseWheelEvent:.
   EventSensor >> #processEvent:.
   HandMorph >> #processEvents.
   HandMorph >> #generateMouseWheelEvent:.
   HandMorph >> #handleEvent:.
   MouseWheelState >> #initialize. "The whole class. Raises wheelUp|Down|Left|Right every 120 units."
   MouseWheelEvent >> #initialize. "The whole class."
   Morph >> #handleMouseWheel:.
   Morph >> #handlesMouseWheel:.
   Morph >> #mouseWheel:.
   EventHandler >> #on:send:to:.
   EventHandler >> #handlesMouseWheel:.
   EventHandler >> #mouseWheel:fromMorph:.
} do: [:method | ToolSet browse: method methodClass selector: method selector].

At the time of writing, mouse-wheel events are synthesized from CTRL+up/down keyboard events. This hack could then be removed from the VM and the respective keyboard events freed for real use cases. Since the image-side code has been updated to use wheel events in ScrollPane etc., most applications would remain compatible after this change. One could also easily add a preference to the image and synthesize CTRL+up/down events for 100% backwards compatibility.

To check whether it works, just disable the mouse-wheel event synthesis, clear ScrollPane >> #scrollByKeyboard:, and try to scroll some lists by wheel:

HandMorph synthesizeMouseWheelEvents: false.
ScrollPane compile: 'scrollByKeyboard: evt\ ^ false' withCRs classified: 'event handling'.

Note that scroll-by-keyboard can also work after such a change because enabling that aformentioned preference has an effect, of course, also if the use actually pressed CTRL+up/down on the keyboard.

Automate updating the generated sources

We might want to have a separate (CRON) Travis build that continuously generates the sources from the VMMaker Monticello repository, tries to build and run tests with the latest sources, and (if all works out) opens a pull request on this repository to update the src/ tree. This way we won't have to wait for @eliotmiranda or anyone else to generate and commit new SlangC code.

Improve vm clock

When the in-Image Delay scheduling code used a millisecond clock that rolled over every six days, it required a backward moving clock to be handled by adjusting resumption times. With Delays now based on a microsecond clock that rolls over >10,000 years there is opportunity to remove that handling. However the Unix VM currently uses gettimeofday(), which return UTC time but is not monotonic and can jump wildly due to settime()/settimeofday() as well as be frequency corrected by NTP in some circumstances.

While gettimeofday() was a good choice for cross-platform compatibility, POSIX.1-2008 marks gettimeofday() as obsolete - recommending the use of clock_gettime() instead. Indeed gettimeofday() uses the clock_gettime(CLOCK_REALTIME) back end. The use of clock_gettime(CLOCK_MONOTONIC) is recommended for time intervals since it is not affected by settime()/settimeofday() jumps but it is frequency corrected by NTP. Only clock_gettime(CLOCK_MONOTONIC_RAW is not affected by NTP.

Background info:

ioGetClockLogSizeUsecsIdxMsecsIdx prototype is not 64bits compatible

The first argument runInNOutp is declared sqInt* in the prorotype sq.h and implementation in platforms specific files sq*Heartbeat.c

BUT: the function is explicitely used with a int * argument in VMMaker generated VM sources (primitiveClockLogAddresses).
That's not 64bits compatible.

Note that the content of the pointer is copied to a static int logClock in various implementations.
This could theoretically lead to truncation, but as I understand it, the content is a boolean (0 or 1), so there won't be any truncation. If we want to use pedantic C compiler warnings it would be better to declare the parameter as int * though.

Don't hardcode gcc in win32 Makefile

We should not hardcode gcc in build.win32/common/Makefile*
CC:= gcc
LD:= gcc

It prevents overriding at command line.
For example, when compiling with a recent cygwin:

CC=i686-w64-mingw32-gcc ./mvm -A

Eventually we could set
LD := $(CC)

Sign Windows VMs

To avoid unknown publisher warnings, please sign the Win32 VM with an Authenticode certificate.

pulseaudio plugin not included with binary on 64-bit

I've been able to build it without any problems from the source, but without it sound refuses to work with a pulseaudio-enabled Linux system. I don't know if it is being stripped out or you are just not enabling it (even though I didn't have to enable it for it to build).
I've at least got it for myself.

Thanks for the 64-bit VMs!!!

Need Debian package script

We want such a script to build debian packages automatically (or better yet: include a debian folder so that the normal debian build tools work). Travis supports Launchpad as a deployment provider, which means if we had such a deian folder, we could automatically build debian packages and have them hosted for free on Launchpad (under https://launchpad.net/opensmalltalk, so any Ubuntu user could add the repository with ppa:opensmalltalk/vm and get debian packages for each build).

Does anyone have experience with building debian packages?

Crashes while typing on macOS Sierra

While typing in a Pharo image while on macOS Sierra, the VM just crashes.

For example, I encountered such events repeatedly with:

The dump is:


Segmentation fault Fri May 26 08:02:01 2017


VM: 201705021552 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $ Date: Tue May 2 08:52:41 2017 -0700 $
Plugins: 201705021552 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $

C stack backtrace & registers:
	eax 0x70235710 ebx 0x6fb3aca0 ecx 0x9030a9f5 edx 0xb0000000
	edi 0x6fb3aca0 esi 0x6fb3aca0 ebp 0xbffb07e8 esp 0xbffb05a8
	eip 0xa0e32fd3
0   libobjc.A.dylib                     0xa0e32fd3 objc_msgSend + 19
1   Pharo                               0x0009d233 reportStackState + 819
2   Pharo                               0x0009d57b sigsegv + 101
3   libsystem_platform.dylib            0xa18b8e5b _sigtramp + 43
4   ???                                 0xffffffff 0x0 + 4294967295
5   CoreFoundation                      0x942222e8 _CFAutoreleasePoolPop + 24
6   HIToolbox                           0x93bc4575 IMKInputSessionProcessEventRefWithCompletionHandler + 125
7   HIToolbox                           0x93bc3712 InputMethodInstanceProcessEventRef_WithCompletionHandler + 135
8   HIToolbox                           0x93bab72c __TSMEventToInputMethod_WithCompletionHandler_block_invoke + 121
9   HIToolbox                           0x93bafe8a __TrySendLockEvent_BeforeEventToInputMethod_WithContinuationHandler_block_invoke + 27
10  HIToolbox                           0x93baff26 __SendTSMDocumentLockEvent_WithCompletionHandler_block_invoke + 90
11  HIToolbox                           0x939810c1 __SendTSMEvent_WithCompletionHandler_block_invoke + 66
12  HIToolbox                           0x93984061 __SendEventToEventTargetWithCompletionHandler_block_invoke + 22
13  HIToolbox                           0x93984044 ___ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec_block_invoke + 106
14  AppKit                              0x9211439b ___NSTSMEventHandler_block_invoke + 22
15  AppKit                              0x9210e8a7 -[NSTextInputContext handleTSMEvent:completionHandler:] + 3125
16  AppKit                              0x9210dc24 _NSTSMEventHandler + 231
17  HIToolbox                           0x93987abe _Z22_InvokeEventHandlerUPPP25OpaqueEventHandlerCallRefP14OpaqueEventRefPvPFlS0_S2_S3_E + 26
18  HIToolbox                           0x93933112 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2013
19  HIToolbox                           0x93932288 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 419
20  HIToolbox                           0x939320d7 SendEventToEventTargetWithOptions + 40
21  HIToolbox                           0x93980f32 SendTSMEvent_WithCompletionHandler + 869
22  HIToolbox                           0x93bab673 TrySendLockEvent_BeforeEventToInputMethod_WithContinuationHandler + 320
23  HIToolbox                           0x93bab4c3 TSMEventToInputMethod_WithCompletionHandler + 140
24  HIToolbox                           0x9397ed41 TSMProcessRawKeyEventWithOptionsAndCompletionHandler + 4335
25  AppKit                              0x92949133 __84-[NSTextInputContext _handleEvent:options:allowingSyntheticEvent:completionHandler:]_block_invoke.1124 + 118
26  AppKit                              0x929481b4 __204-[NSTextInputContext tryTSMProcessRawKeyEvent_orSubstitution:dispatchCondition:setupForDispatch:furtherCondition:doubleSpaceSubstitutionCondition:doubleSpaceSubstitutionWork:dispatchTSMWork:continuation:]_block_invoke.1042 + 144
27  AppKit                              0x929482ff -[NSTextInputContext tryDoubleSpaceSubstitution_WithDispatchCondition:dispatchSubstitutionWork:continuation:] + 109
28  AppKit                              0x92947fc6 -[NSTextInputContext tryTSMProcessRawKeyEvent_orSubstitution:dispatchCondition:setupForDispatch:furtherCondition:doubleSpaceSubstitutionCondition:doubleSpaceSubstitutionWork:dispatchTSMWork:continuation:] + 222
29  AppKit                              0x92948acc -[NSTextInputContext _handleEvent:options:allowingSyntheticEvent:completionHandler:] + 1823
30  AppKit                              0x92947e71 -[NSTextInputContext _handleEvent:allowingSyntheticEvent:] + 111
31  AppKit                              0x9210cbb3 -[NSTextInputContext handleEvent:] + 31
32  AppKit                              0x9210cb20 -[NSView interpretKeyEvents:] + 192
33  Pharo                               0x0009955e -[sqSqueakOSXOpenGLView keyDown:] + 310
34  AppKit                              0x928614bb -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 5876
35  AppKit                              0x9285fa49 -[NSWindow(NSEventRouting) sendEvent:] + 547
36  AppKit                              0x926ea6aa -[NSApplication(NSEvent) sendEvent:] + 3418
37  Pharo                               0x00091dcb -[SqueakOSXApplication sendEvent:] + 163
38  Pharo                               0x000939a4 -[sqSqueakOSXApplication(events) pumpRunLoopEventSendAndSignal:] + 115
39  Pharo                               0x00093a42 -[sqSqueakOSXApplication(events) pumpRunLoop] + 76
40  Pharo                               0x0009b88a nativeIoProcessEvents + 208
41  Pharo                               0x0009b8de ioProcessEvents + 35
42  Pharo                               0x0002f470 checkForEventsMayContextSwitch + 880
43  Pharo                               0x00030cea ceCheckForInterrupts + 16
44  ???                                 0x06ab109b 0x0 + 111874203
45  Pharo                               0x0001d1bc interpret + 647
46  Pharo                               0x0009e6ad -[sqSqueakMainApplication runSqueak] + 476
47  Foundation                          0x95ac4adb __NSFirePerformWithOrder + 419
48  CoreFoundation                      0x942811fe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
49  CoreFoundation                      0x94281157 __CFRunLoopDoObservers + 391
50  CoreFoundation                      0x942614a2 __CFRunLoopRun + 1058
51  CoreFoundation                      0x94260e1a CFRunLoopRunSpecific + 506
52  CoreFoundation                      0x94260c0b CFRunLoopRunInMode + 123
53  HIToolbox                           0x93954396 RunCurrentEventLoopInMode + 268
54  HIToolbox                           0x93954057 ReceiveNextEventCommon + 195
55  HIToolbox                           0x93953f7b _BlockUntilNextEventMatchingListInModeWithFilter + 83
56  AppKit                              0x91f86015 _DPSNextEvent + 1227
57  AppKit                              0x926ebbbb -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1742
58  AppKit                              0x926eb4e5 -[NSApplication(NSEvent) nextEventMatchingMask:untilDate:inMode:dequeue:] + 132
59  AppKit                              0x91f7acb6 -[NSApplication run] + 943
60  AppKit                              0x91f47d1e NSApplicationMain + 1368
61  libdyld.dylib                       0xa16af395 start + 1


Smalltalk stack dump:
0xbffdcdd0 M ProcessorScheduler class>idleProcess 0x72caf68: a(n) ProcessorScheduler class
0xbffdcdf0 I [] in ProcessorScheduler class>startUp 0x72caf68: a(n) ProcessorScheduler class
0xbffdce10 I [] in BlockClosure>newProcess 0x15d2a6b8: a(n) BlockClosure

Most recent primitives
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
millisecondClockValue
signal
primSignal:atMilliseconds:
millisecondClockValue
wait
wait
signal
basicNew
wait
signal
millisecondClockValue
primSignal:atMilliseconds:
millisecondClockValue
wait
signal
wait
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
millisecondClockValue
signal
primSignal:atMilliseconds:
millisecondClockValue
wait
millisecondClockValue
@
actualScreenSize
millisecondClockValue
@
@
@
truncated
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
**StackOverflow**
**StackOverflow**
**StackOverflow**
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
**StackOverflow**
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
@
@
@
@
@
@
@
@
@
@
@
@
@
**StackOverflow**
@
@
@
@
@
@
**StackOverflow**
@
@
@
@
@
@
@
**StackOverflow**
**StackOverflow**
perform:withArguments:inSuperclass:
@
**StackOverflow**
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
perform:withArguments:inSuperclass:
@
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
**StackOverflow**
**StackOverflow**
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
**StackOverflow**
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
tempAt:
tempAt:put:
tempAt:
terminateTo:
findNextUnwindContextUpTo:
terminateTo:
millisecondClockValue
yield
millisecondClockValue
wait
signal
millisecondClockValue
primSignal:atMilliseconds:
millisecondClockValue
wait
signal
wait
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:
relinquishProcessorForMicroseconds:

stack page bytes 4096 available headroom 2788 minimum unused headroom 2088

	(Segmentation fault)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.