[Vm-dev] [commit][3591] CogVM source as per VMMaker.oscog-eem.1677

commits at squeakvm.org commits at squeakvm.org
Sat Feb 13 03:33:47 UTC 2016


Revision: 3591
Author:   eliot
Date:     2016-02-12 19:33:43 -0800 (Fri, 12 Feb 2016)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1677

NewspeakVM: Don't use cppIf: #NewspeakVM in VM code.  It is appropriate only in
plugin code.  VM code should use the NewspeakVM variable from VMBasicConstants.
Nuke the obsolete Newspeak interpreter src (nssrc).

Slang:
Fix nilOrBooleanConditionFor: to also work for symbol arguments (such as
#Newspeak).
Emit "# define FOO" for conditionally defined FOO instead of "#define FOO"
which is nice for grepping.

IMMUTABILITY:
Fix the declaration/definition of ceCannotAssignTo:withIndex:valueToAssign:
which needs to be included, but only if -DIMMUTABILITY=1.  So modify Slang to
output #if FOO && !BAR code around functions that include option: pragmas
whose arguments are in namesDefinedAtCompileTime.  This also fixes generation
of Pharo-specific support code in the FilePlugin.

MacOS X build
Fix memory support for v3 VMs; sqMacV2Memory.[ch] must be in Common;
sqUnixMemory should not be used.
Fix stack backtrace for STACKVMs (no writeback of machine stack pointers).
Fix makefiles to chose correct sources for stack VM builds.

Modified Paths:
--------------
    branches/Cog/build.macos32x86/common/Makefile.app
    branches/Cog/build.macos32x86/common/Makefile.vm
    branches/Cog/build.macos32x86/pharo.cog.spur/plugins.int
    branches/Cog/build.macos32x86/squeak+immutability.cog.spur/plugins.int
    branches/Cog/build.macos32x86/squeak.cog.spur/plugins.int
    branches/Cog/build.macos32x86/squeak.cog.v3/plugins.int
    branches/Cog/build.macos32x86/squeak.sista.spur/plugins.int
    branches/Cog/build.macos32x86/squeak.stack.spur/plugins.int
    branches/Cog/build.macos32x86/squeak.stack.v3/plugins.int
    branches/Cog/build.macos64x64/common/Makefile.app
    branches/Cog/build.macos64x64/common/Makefile.vm
    branches/Cog/build.macos64x64/pharo.cog.spur/plugins.int
    branches/Cog/build.macos64x64/squeak.cog.spur/plugins.int
    branches/Cog/build.macos64x64/squeak.sista.spur/plugins.int
    branches/Cog/build.macos64x64/squeak.stack.spur/plugins.int
    branches/Cog/nsspur64src/vm/cogit.h
    branches/Cog/nsspur64src/vm/cogitX64.c
    branches/Cog/nsspur64src/vm/cointerp.c
    branches/Cog/nsspur64src/vm/cointerp.h
    branches/Cog/nsspur64src/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/nsspursrc/vm/cogitMIPSEL.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstack64src/vm/gcc3x-interp.c
    branches/Cog/nsspurstack64src/vm/interp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m
    branches/Cog/platforms/iOS/vm/OSX/sqPlatformSpecific.h
    branches/Cog/platforms/unix/vm/sqUnixMain.c
    branches/Cog/spur64src/vm/cogit.h
    branches/Cog/spur64src/vm/cogitX64.c
    branches/Cog/spur64src/vm/cointerp.c
    branches/Cog/spur64src/vm/cointerp.h
    branches/Cog/spur64src/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogitARMv5.c
    branches/Cog/spursistasrc/vm/cogitIA32.c
    branches/Cog/spursistasrc/vm/cogitMIPSEL.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogitARMv5.c
    branches/Cog/spursrc/vm/cogitIA32.c
    branches/Cog/spursrc/vm/cogitMIPSEL.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/plugins/FilePlugin/FilePlugin.c
    branches/Cog/src/plugins/IA32ABI/IA32ABI.c
    branches/Cog/src/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c
    branches/Cog/src/plugins/SerialPlugin/SerialPlugin.c
    branches/Cog/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c
    branches/Cog/src/vm/cogitMIPSEL.c
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

Added Paths:
-----------
    branches/Cog/platforms/iOS/vm/Common/sqMacV2Memory.c
    branches/Cog/platforms/iOS/vm/Common/sqMacV2Memory.h

Removed Paths:
-------------
    branches/Cog/nssrc/
    branches/Cog/platforms/iOS/vm/iPhone/sqMacV2Memory.c
    branches/Cog/platforms/iOS/vm/iPhone/sqMacV2Memory.h

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/build.macos32x86/common/Makefile.app
===================================================================
--- branches/Cog/build.macos32x86/common/Makefile.app	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/common/Makefile.app	2016-02-13 03:33:43 UTC (rev 3591)
@@ -54,10 +54,10 @@
 VMICONS:=$(addprefix $(APP)/Contents/Resources/,$(notdir $(OSXICONS)))
 VMMENUNIB:=$(APP)/Contents/Resources/English.lproj/MainMenu.nib
 SOURCES:=
-ifneq ("$(SOURCEFILE)",)
+ifneq ($(SOURCEFILE),)
 SOURCES:=./$(SOURCEFILE)
 endif
-ifneq ("$(APPSOURCE)",)
+ifneq ($(APPSOURCE),)
 SOURCES:=$(SOURCES) $(APP)/Contents/Resources/$(APPSOURCE)
 endif
 
@@ -96,7 +96,7 @@
 # To sign the app, set SIGNING_IDENTITY in the environment, e.g.
 # export SIGNING_IDENTITY="Developer ID Application: Eliot Miranda"
 #
-ifeq ("$(SIGNING_IDENTITY)",)
+ifeq ($(SIGNING_IDENTITY),)
 signapp:
 	echo "No signing identity found (SIGNING_IDENTITY unset). Not signing app."
 else
@@ -121,4 +121,7 @@
 	@echo VMBUNDLES=$(VMBUNDLES)
 	@echo VMPLIST=$(VMPLIST)
 	@echo VMICONS=$(VMICONS)
+	@echo SIGNING_IDENTITY=$(SIGNING_IDENTITY)
+	@echo SOURCEFILE=$(SOURCEFILE)
+	@echo APPSOURCE=$(APPSOURCE)
 	@echo -----------------------------------------------------

Modified: branches/Cog/build.macos32x86/common/Makefile.vm
===================================================================
--- branches/Cog/build.macos32x86/common/Makefile.vm	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/common/Makefile.vm	2016-02-13 03:33:43 UTC (rev 3591)
@@ -52,14 +52,14 @@
 OSXPLUGINSDIR:=$(PLATDIR)/iOS/plugins
 UNIXVMDIR:=$(PLATDIR)/unix/vm
 
-MAKERSRC:=$(addprefix $(VMSRCDIR)/,gcc3x-cointerp.c cogit.c)
+MAKERSRC:=$(wildcard $(VMSRCDIR)/gcc3x-*interp.c $(VMSRCDIR)/cogit.c)
 CROSSSRC:= $(wildcard $(CROSSDIR)/*.c)
 XEX:=%/sqSqueakMainApplication+screen.m
 OSXSRC:=$(wildcard $(OSXDIR)/*.c) $(filter-out $(XEX),$(wildcard $(OSXDIR)/*.m)) \
 		$(wildcard $(OSXCOMMONDIR)/*.c) $(wildcard $(OSXCOMMONDIR)/*.m) \
 		$(wildcard $(OSXCLASSESDIR)/*.c) $(wildcard $(OSXCLASSESDIR)/*.m)
-UNIXSRC:=$(addprefix $(UNIXVMDIR)/,aio.c sqUnixHeartbeat.c sqUnixMemory.c \
-						sqUnixSpurMemory.c sqUnixThreads.c sqUnixVMProfile.c)
+UNIXSRC:=$(addprefix $(UNIXVMDIR)/,aio.c sqUnixHeartbeat.c sqUnixSpurMemory.c \
+                     sqUnixThreads.c sqUnixVMProfile.c)
 VMSRC:= $(MAKERSRC) $(CROSSSRC) $(OSXSRC) $(UNIXSRC)
 VMOBJ:=	$(notdir $(VMSRC))
 VMOBJ:=	$(VMOBJ:.c=.o)

Modified: branches/Cog/build.macos32x86/pharo.cog.spur/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/pharo.cog.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/pharo.cog.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak+immutability.cog.spur/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak+immutability.cog.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak+immutability.cog.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak.cog.spur/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak.cog.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak.cog.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak.cog.v3/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak.cog.v3/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak.cog.v3/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak.sista.spur/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak.sista.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak.sista.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak.stack.spur/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak.stack.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak.stack.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos32x86/squeak.stack.v3/plugins.int
===================================================================
--- branches/Cog/build.macos32x86/squeak.stack.v3/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos32x86/squeak.stack.v3/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos64x64/common/Makefile.app
===================================================================
--- branches/Cog/build.macos64x64/common/Makefile.app	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/common/Makefile.app	2016-02-13 03:33:43 UTC (rev 3591)
@@ -54,10 +54,10 @@
 VMICONS:=$(addprefix $(APP)/Contents/Resources/,$(notdir $(OSXICONS)))
 VMMENUNIB:=$(APP)/Contents/Resources/English.lproj/MainMenu.nib
 SOURCES:=
-ifneq ("$(SOURCEFILE)",)
+ifneq ($(SOURCEFILE),)
 SOURCES:=./$(SOURCEFILE)
 endif
-ifneq ("$(APPSOURCE)",)
+ifneq ($(APPSOURCE),)
 SOURCES:=$(SOURCES) $(APP)/Contents/Resources/$(APPSOURCE)
 endif
 
@@ -96,7 +96,7 @@
 # To sign the app, set SIGNING_IDENTITY in the environment, e.g.
 # export SIGNING_IDENTITY="Developer ID Application: Eliot Miranda"
 #
-ifeq ("$(SIGNING_IDENTITY)",)
+ifeq ($(SIGNING_IDENTITY),)
 signapp:
 	echo "No signing identity found (SIGNING_IDENTITY unset). Not signing app."
 else
@@ -121,4 +121,7 @@
 	@echo VMBUNDLES=$(VMBUNDLES)
 	@echo VMPLIST=$(VMPLIST)
 	@echo VMICONS=$(VMICONS)
+	@echo SIGNING_IDENTITY=$(SIGNING_IDENTITY)
+	@echo SOURCEFILE=$(SOURCEFILE)
+	@echo APPSOURCE=$(APPSOURCE)
 	@echo -----------------------------------------------------

Modified: branches/Cog/build.macos64x64/common/Makefile.vm
===================================================================
--- branches/Cog/build.macos64x64/common/Makefile.vm	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/common/Makefile.vm	2016-02-13 03:33:43 UTC (rev 3591)
@@ -52,14 +52,14 @@
 OSXPLUGINSDIR:=$(PLATDIR)/iOS/plugins
 UNIXVMDIR:=$(PLATDIR)/unix/vm
 
-MAKERSRC:=$(addprefix $(VMSRCDIR)/,gcc3x-cointerp.c cogit.c)
+MAKERSRC:=$(wildcard $(VMSRCDIR)/gcc3x-*interp.c $(VMSRCDIR)/cogit.c)
 CROSSSRC:= $(wildcard $(CROSSDIR)/*.c)
 XEX:=%/sqSqueakMainApplication+screen.m
 OSXSRC:=$(wildcard $(OSXDIR)/*.c) $(filter-out $(XEX),$(wildcard $(OSXDIR)/*.m)) \
 		$(wildcard $(OSXCOMMONDIR)/*.c) $(wildcard $(OSXCOMMONDIR)/*.m) \
 		$(wildcard $(OSXCLASSESDIR)/*.c) $(wildcard $(OSXCLASSESDIR)/*.m)
-UNIXSRC:=$(addprefix $(UNIXVMDIR)/,aio.c sqUnixHeartbeat.c sqUnixMemory.c \
-						sqUnixSpurMemory.c sqUnixThreads.c sqUnixVMProfile.c)
+UNIXSRC:=$(addprefix $(UNIXVMDIR)/,aio.c sqUnixHeartbeat.c sqUnixSpurMemory.c \
+                     sqUnixThreads.c sqUnixVMProfile.c)
 VMSRC:= $(MAKERSRC) $(CROSSSRC) $(OSXSRC) $(UNIXSRC)
 VMOBJ:=	$(notdir $(VMSRC))
 VMOBJ:=	$(VMOBJ:.c=.o)

Modified: branches/Cog/build.macos64x64/pharo.cog.spur/plugins.int
===================================================================
--- branches/Cog/build.macos64x64/pharo.cog.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/pharo.cog.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -30,5 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# SerialPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos64x64/squeak.cog.spur/plugins.int
===================================================================
--- branches/Cog/build.macos64x64/squeak.cog.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/squeak.cog.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,4 +30,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos64x64/squeak.sista.spur/plugins.int
===================================================================
--- branches/Cog/build.macos64x64/squeak.sista.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/squeak.sista.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -26,7 +26,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -35,4 +34,5 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-# JoystickTabletPlugin
+# JoystickTabletPlugin \
+# SerialPlugin

Modified: branches/Cog/build.macos64x64/squeak.stack.spur/plugins.int
===================================================================
--- branches/Cog/build.macos64x64/squeak.stack.spur/plugins.int	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/build.macos64x64/squeak.stack.spur/plugins.int	2016-02-13 03:33:43 UTC (rev 3591)
@@ -22,7 +22,6 @@
 MiscPrimitivePlugin \
 RePlugin \
 SecurityPlugin \
-SerialPlugin \
 SocketPlugin \
 SoundCodecPrims \
 SoundGenerationPlugin \
@@ -31,8 +30,9 @@
 SurfacePlugin \
 UUIDPlugin \
 VMProfileMacSupportPlugin \
-#B3DAcceleratorPlugin \
-#ClipboardExtendedPlugin \
-#MIDIPlugin \
-#InternetConfigPlugin \
-# JoystickTabletPlugin
+# B3DAcceleratorPlugin \
+# ClipboardExtendedPlugin \
+# InternetConfigPlugin \
+# JoystickTabletPlugin \
+# MIDIPlugin \
+# SerialPlugin

Modified: branches/Cog/nsspur64src/vm/cogit.h
===================================================================
--- branches/Cog/nsspur64src/vm/cogit.h	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/nsspur64src/vm/cogit.h	2016-02-13 03:33:43 UTC (rev 3591)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1670 uuid: 6ba2dd3d-ab44-468e-9184-1c85580f980b
+	CCodeGenerator VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37
  */
 
 

Modified: branches/Cog/nsspur64src/vm/cogitX64.c
===================================================================
--- branches/Cog/nsspur64src/vm/cogitX64.c	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/nsspur64src/vm/cogitX64.c	2016-02-13 03:33:43 UTC (rev 3591)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1668 uuid: 1f0b27be-e423-42d3-a18d-1c7e292a4f14
+	CCodeGenerator VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1668 uuid: 1f0b27be-e423-42d3-a18d-1c7e292a4f14
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1668 uuid: 1f0b27be-e423-42d3-a18d-1c7e292a4f14 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -185,7 +185,7 @@
 #define HeaderIndex 0
 #define IDIVR 117
 #if !defined(IMMUTABILITY) /* Allow this to be overridden on the compiler command line */
-#define IMMUTABILITY 0
+# define IMMUTABILITY 0
 #endif
 #define IMULRR 118
 #define InstanceSpecificationIndex 2
@@ -817,7 +817,16 @@
 static sqInt NoDbgRegParms genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(sqInt sourceReg, sqInt destReg, sqInt scratchRegOrNone);
 static sqInt NoDbgRegParms genGetNumSlotsOfinto(sqInt srcReg, sqInt destReg);
 static sqInt NoDbgRegParms genGetRawSlotSizeOfNonImminto(sqInt sourceReg, sqInt destReg);
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms genJumpBaseHeaderImmutable(sqInt baseHeaderReg);
+#endif /* IMMUTABILITY */
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms genJumpBaseHeaderMutable(sqInt baseHeaderReg);
+#endif /* IMMUTABILITY */
 static AbstractInstruction * NoDbgRegParms genJumpImmediate(sqInt aRegister);
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms genJumpMutablescratchReg(sqInt sourceReg, sqInt scratchReg);
+#endif /* IMMUTABILITY */
 static sqInt NoDbgRegParms genNewArrayOfSizeinitialized(sqInt size, sqInt initialized);
 static sqInt NoDbgRegParms genNoPopCreateClosureAtnumArgsnumCopiedcontextNumArgslargeinBlock(sqInt bcpc, sqInt numArgs, sqInt numCopied, sqInt ctxtNumArgs, sqInt isLargeCtxt, sqInt isInBlock);
 static sqInt genPrimitiveAsCharacter(void);
@@ -1171,6 +1180,7 @@
 void (*ceCallCogCodePopReceiverArg0Regs)(void);
 void (*ceCallCogCodePopReceiverArg1Arg0Regs)(void);
 void (*ceCallCogCodePopReceiverReg)(void);
+static sqInt ceCannotAssignToWithIndexTrampoline;
 sqInt ceCannotResumeTrampoline;
 void (*ceCaptureCStackPointers)(void);
 static unsigned long (*ceCheckFeaturesFunction)(void);
@@ -7574,13 +7584,9 @@
 			markAndTraceLiteralinat((cogMethod->selector), cogMethod, (&((cogMethod->selector))));
 			maybeMarkCountersIn(cogMethod);
 			/* begin maybeMarkIRCsIn: */
-			
-#      if NewspeakVM
 			markIfIRC((cogMethod->nextMethodOrIRCs));
 
 
-#      endif /* NewspeakVM */
-
 			/* begin mapFor:performUntil:arg: */
 			mcpc = (((sqInt)cogMethod)) + cmNoCheckEntryOffset;
 			map = ((((usqInt)cogMethod)) + ((cogMethod->blockSize))) - 1;
@@ -7622,13 +7628,9 @@
 			markAndTraceLiteralinat((cogMethod->selector), cogMethod, (&((cogMethod->selector))));
 			maybeMarkCountersIn(cogMethod);
 			/* begin maybeMarkIRCsIn: */
-			
-#      if NewspeakVM
 			markIfIRC((cogMethod->nextMethodOrIRCs));
 
 
-#      endif /* NewspeakVM */
-
 			/* begin mapFor:performUntil:arg: */
 			mcpc1 = (((sqInt)cogMethod)) + cmNoCheckEntryOffset;
 			map1 = ((((usqInt)cogMethod)) + ((cogMethod->blockSize))) - 1;
@@ -7730,13 +7732,9 @@
 			markAndTraceLiteralinat((cogMethod->selector), cogMethod, (&((cogMethod->selector))));
 			maybeMarkCountersIn(cogMethod);
 			/* begin maybeMarkIRCsIn: */
-			
-#      if NewspeakVM
 			markIfIRC((cogMethod->nextMethodOrIRCs));
 
 
-#      endif /* NewspeakVM */
-
 			/* begin mapFor:performUntil:arg: */
 			mcpc = (((sqInt)cogMethod)) + cmNoCheckEntryOffset;
 			map = ((((usqInt)cogMethod)) + ((cogMethod->blockSize))) - 1;
@@ -8101,8 +8099,6 @@
 {
     sqInt objOop;
 
-	
-#  if NewspeakVM
 	indexOfIRC = (theIRCs = 0);
 	if (numIRCs > 0) {
 		assert((noAssertMethodClassAssociationOf(methodObj)) != (nilObject()));
@@ -8115,11 +8111,6 @@
 	}
 	return 1;
 
-#  else /* NewspeakVM */
-	return 1;
-
-#  endif /* NewspeakVM */
-
 }
 
 
@@ -12779,7 +12770,7 @@
     AbstractInstruction * jumpFixedFieldsOutOfBounds;
     AbstractInstruction *jumpHasFixedFields;
     AbstractInstruction *jumpImmediate;
-    sqInt jumpImmutable;
+    AbstractInstruction * jumpImmutable;
     AbstractInstruction *jumpIsBytes;
     AbstractInstruction * jumpIsCompiledMethod;
     AbstractInstruction *jumpIsContext;
@@ -12801,7 +12792,6 @@
     sqInt quickConstant5;
     sqInt quickConstant6;
 
-	jumpImmutable = 0;
 	/* begin genLoadArgAtDepth:into: */
 	assert(1 < (numRegArgs()));
 	/* begin genLoadArgAtDepth:into: */
@@ -14081,7 +14071,7 @@
     AbstractInstruction *jumpBadIndex;
     AbstractInstruction *jumpBytesOutOfBounds;
     AbstractInstruction *jumpBytesOutOfRange;
-    sqInt jumpImmutable;
+    AbstractInstruction * jumpImmutable;
     AbstractInstruction *jumpIsBytes;
     AbstractInstruction * jumpIsCompiledMethod;
     AbstractInstruction *jumpIsShorts;
@@ -14096,7 +14086,6 @@
     sqInt quickConstant3;
     sqInt quickConstant4;
 
-	jumpImmutable = 0;
 	/* begin genLoadArgAtDepth:into: */
 	assert(1 < (numRegArgs()));
 	/* begin genLoadArgAtDepth:into: */
@@ -14736,8 +14725,6 @@
 static void
 generateObjectRepresentationTrampolines(void)
 {
-    sqInt ceCannotAssignToWithIndexTrampoline;
-
 	
 #  if IMMUTABILITY
 
@@ -15297,6 +15284,46 @@
 	return 0;
 }
 
+
+/*	baseHeader holds at least the least significant 32 bits of the object */
+
+	/* CogObjectRepresentationForSpur>>#genJumpBaseHeaderImmutable: */
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms
+genJumpBaseHeaderImmutable(sqInt baseHeaderReg)
+{
+    AbstractInstruction *anInstruction;
+    sqInt quickConstant;
+
+	/* begin TstCq:R: */
+	quickConstant = immutableBitMask();
+	/* begin gen:quickConstant:operand: */
+	anInstruction = genoperandoperand(TstCqR, quickConstant, baseHeaderReg);
+	/* begin JumpNonZero: */
+	return genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
+}
+#endif /* IMMUTABILITY */
+
+
+/*	baseHeader holds at least the least significant 32 bits of the object */
+
+	/* CogObjectRepresentationForSpur>>#genJumpBaseHeaderMutable: */
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms
+genJumpBaseHeaderMutable(sqInt baseHeaderReg)
+{
+    AbstractInstruction *anInstruction;
+    sqInt quickConstant;
+
+	/* begin TstCq:R: */
+	quickConstant = immutableBitMask();
+	/* begin gen:quickConstant:operand: */
+	anInstruction = genoperandoperand(TstCqR, quickConstant, baseHeaderReg);
+	/* begin JumpZero: */
+	return genConditionalBranchoperand(JumpZero, ((sqInt)0));
+}
+#endif /* IMMUTABILITY */
+
 	/* CogObjectRepresentationForSpur>>#genJumpImmediate: */
 static AbstractInstruction * NoDbgRegParms
 genJumpImmediate(sqInt aRegister)
@@ -15312,7 +15339,20 @@
 	return genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
 }
 
+	/* CogObjectRepresentationForSpur>>#genJumpMutable:scratchReg: */
+#if IMMUTABILITY
+static AbstractInstruction * NoDbgRegParms
+genJumpMutablescratchReg(sqInt sourceReg, sqInt scratchReg)
+{
+    AbstractInstruction *anInstruction;
 
+	/* begin MoveMw:r:R: */
+	anInstruction = genoperandoperandoperand(MoveMwrR, 0, sourceReg, scratchReg);
+	return genJumpBaseHeaderMutable(scratchReg);
+}
+#endif /* IMMUTABILITY */
+
+
 /*	Generate a call to code that allocates a new Array of size.
 	The Array should be initialized with nils iff initialized is true.
 	The size arg is passed in SendNumArgsReg, the result
@@ -23829,12 +23869,8 @@
 		blockStart = blockStartAt(compiledBlocksCount);
 		scanBlock(blockStart);
 		initialOpcodeIndex = opcodeIndex;
-		
-#    if NewspeakVM
 		initialIndexOfIRC = indexOfIRC;
 
-#    endif /* NewspeakVM */
-
 		while (1) {
 			compileBlockEntry(blockStart);
 			initialStackPtr = simStackPtr;
@@ -23849,12 +23885,8 @@
 			bzero(abstractOpcodes + initialOpcodeIndex,
 									(opcodeIndex - initialOpcodeIndex) * sizeof(AbstractInstruction));
 			opcodeIndex = initialOpcodeIndex;
-			
-#      if NewspeakVM
 			indexOfIRC = initialIndexOfIRC;
 
-#      endif /* NewspeakVM */
-
 		}
 		compiledBlocksCount += 1;
 	}
@@ -24185,15 +24217,11 @@
 	}
 	/* begin annotateBytecode: */
 	(stackCheckLabel->annotation = HasBytecodePC);
-	
-#  if NewspeakVM
 	if (numIRCs > 0) {
 		/* begin PrefetchAw: */
 		anInstruction2 = genoperand(PrefetchAw, theIRCs);
 	}
 
-#  endif /* NewspeakVM */
-
 	initSimStackForFramefulMethod(initialPC);
 }
 
@@ -26197,13 +26225,17 @@
 genStorePopLiteralVariable(sqInt popBoolean, sqInt litVarIndex)
 {
     AbstractInstruction *abstractInstruction;
+    AbstractInstruction *abstractInstruction1;
+    AbstractInstruction *abstractInstruction2;
     AbstractInstruction *anInstruction;
+    AbstractInstruction *anInstruction1;
     sqInt association;
-    sqInt immutabilityFailure;
+    AbstractInstruction *fail;
+    AbstractInstruction * immutabilityFailure;
+    AbstractInstruction *mutableJump;
     sqInt needStoreCheck;
     sqInt topReg;
 
-	immutabilityFailure = 0;
 	assert(needsFrame);
 	
 #  if IMMUTABILITY
@@ -26230,8 +26262,26 @@
 	topReg = ClassReg;
 	ssStoreAndReplacePoptoReg(popBoolean, ClassReg);
 	ssFlushTo(simStackPtr);
-	immutabilityFailure = genImmutableCheckslotIndexsourceRegscratchRegneedRestoreRcvr(ReceiverResultReg, ValueIndex, ClassReg, TempReg, 0);
+	/* begin genImmutableCheck:slotIndex:sourceReg:scratchReg:needRestoreRcvr: */
+	assert(ReceiverResultReg == ReceiverResultReg);
+	assert(TempReg == TempReg);
+	assert(ClassReg == ClassReg);
 
+	/* We reach this code if the object mutated is immutable. */
+	mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg);
+	/* begin MoveCq:R: */
+	anInstruction1 = genoperandoperand(MoveCqR, ValueIndex, TempReg);
+	/* begin CallRT: */
+	abstractInstruction1 = genoperand(Call, ceCannotAssignToWithIndexTrampoline);
+	(abstractInstruction1->annotation = IsRelativeCall);
+	/* begin annotateBytecode: */
+	abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
+	(abstractInstruction2->annotation = HasBytecodePC);
+	/* begin Jump: */
+	fail = genoperand(Jump, ((sqInt)0));
+	jmpTarget(mutableJump, gLabel());
+	immutabilityFailure = fail;
+
 #  else /* IMMUTABILITY */
 	topReg = allocateRegForStackEntryAtnotConflictingWith(0, registerMaskFor(ReceiverResultReg));
 	ssStorePoptoReg(popBoolean, topReg);
@@ -26261,17 +26311,21 @@
 {
     AbstractInstruction *abstractInstruction;
     AbstractInstruction *abstractInstruction1;
+    AbstractInstruction *abstractInstruction11;
+    AbstractInstruction *abstractInstruction2;
     AbstractInstruction *anInstruction;
-    sqInt immutabilityFailure;
+    AbstractInstruction *anInstruction1;
+    AbstractInstruction *fail;
+    AbstractInstruction * immutabilityFailure;
     AbstractInstruction *jmpDone;
     AbstractInstruction *jmpSingle;
+    AbstractInstruction *mutableJump;
     sqInt needStoreCheck;
 
 
 	/* The reason we need a frame here is that assigning to an inst var of a context may
 	   involve wholesale reorganization of stack pages, and the only way to preserve the
 	   execution state of an activation in that case is if it has a frame. */
-	immutabilityFailure = 0;
 	assert(needsFrame);
 	
 #  if IMMUTABILITY
@@ -26318,8 +26372,29 @@
 	}
 	
 #  if IMMUTABILITY
-	immutabilityFailure = genImmutableCheckslotIndexsourceRegscratchRegneedRestoreRcvr(ReceiverResultReg, ValueIndex, ClassReg, TempReg, 1);
+	/* begin genImmutableCheck:slotIndex:sourceReg:scratchReg:needRestoreRcvr: */
+	assert(ReceiverResultReg == ReceiverResultReg);
+	assert(TempReg == TempReg);
+	assert(ClassReg == ClassReg);
 
+	/* We reach this code if the object mutated is immutable. */
+	mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg);
+	/* begin MoveCq:R: */
+	anInstruction1 = genoperandoperand(MoveCqR, ValueIndex, TempReg);
+	/* begin CallRT: */
+	abstractInstruction11 = genoperand(Call, ceCannotAssignToWithIndexTrampoline);
+	(abstractInstruction11->annotation = IsRelativeCall);
+	/* begin annotateBytecode: */
+	abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
+	(abstractInstruction2->annotation = HasBytecodePC);
+	/* begin putSelfInReceiverResultReg */
+	storeToReg((&simSelf), ReceiverResultReg);
+
+	/* begin Jump: */
+	fail = genoperand(Jump, ((sqInt)0));
+	jmpTarget(mutableJump, gLabel());
+	immutabilityFailure = fail;
+
 #  endif /* IMMUTABILITY */
 
 	genStoreSourceRegslotIndexdestRegscratchReginFrameneedsStoreCheck(ClassReg, slotIndex, ReceiverResultReg, TempReg, 1, needStoreCheck);
@@ -26339,11 +26414,15 @@
 {
     AbstractInstruction *abstractInstruction;
     AbstractInstruction *abstractInstruction1;
-    sqInt immutabilityFailure;
+    AbstractInstruction *abstractInstruction11;
+    AbstractInstruction *abstractInstruction2;
+    AbstractInstruction *anInstruction;
+    AbstractInstruction *fail;
+    AbstractInstruction * immutabilityFailure;
+    AbstractInstruction *mutableJump;
     sqInt needStoreCheck;
     sqInt topReg;
 
-	immutabilityFailure = 0;
 	
 #  if IMMUTABILITY
 	assert(needsFrame);
@@ -26362,8 +26441,29 @@
 	topReg = ClassReg;
 	ssStoreAndReplacePoptoReg(popBoolean, ClassReg);
 	ssFlushTo(simStackPtr);
-	immutabilityFailure = genImmutableCheckslotIndexsourceRegscratchRegneedRestoreRcvr(ReceiverResultReg, slotIndex, ClassReg, TempReg, 1);
+	/* begin genImmutableCheck:slotIndex:sourceReg:scratchReg:needRestoreRcvr: */
+	assert(ReceiverResultReg == ReceiverResultReg);
+	assert(TempReg == TempReg);
+	assert(ClassReg == ClassReg);
 
+	/* We reach this code if the object mutated is immutable. */
+	mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg);
+	/* begin MoveCq:R: */
+	anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg);
+	/* begin CallRT: */
+	abstractInstruction11 = genoperand(Call, ceCannotAssignToWithIndexTrampoline);
+	(abstractInstruction11->annotation = IsRelativeCall);
+	/* begin annotateBytecode: */
+	abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
+	(abstractInstruction2->annotation = HasBytecodePC);
+	/* begin putSelfInReceiverResultReg */
+	storeToReg((&simSelf), ReceiverResultReg);
+
+	/* begin Jump: */
+	fail = genoperand(Jump, ((sqInt)0));
+	jmpTarget(mutableJump, gLabel());
+	immutabilityFailure = fail;
+
 #  else /* IMMUTABILITY */
 	topReg = allocateRegForStackEntryAtnotConflictingWith(0, registerMaskFor(ReceiverResultReg));
 	ssStorePoptoReg(popBoolean, topReg);
@@ -27088,12 +27188,8 @@
 	needsFrame = 0;
 	inBlock = 0;
 	prevBCDescriptor = null;
-	
-#  if NewspeakVM
 	numIRCs = 0;
 
-#  endif /* NewspeakVM */
-
 	if ((primitiveIndex > 0)
 	 && (isQuickPrimitiveIndex(primitiveIndex))) {
 		return 0;
@@ -27141,14 +27237,10 @@
 			targetPC = (pc + ((descriptor->numBytes))) + distance;
 			latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation);
 		}
-		
-#    if NewspeakVM
 		if ((descriptor->hasIRC)) {
 			numIRCs += 1;
 		}
 
-#    endif /* NewspeakVM */
-
 		pc += (descriptor->numBytes);
 		if ((descriptor->isExtension)) {
 			nExts += 1;

Modified: branches/Cog/nsspur64src/vm/cointerp.c
===================================================================
--- branches/Cog/nsspur64src/vm/cointerp.c	2016-02-12 19:45:55 UTC (rev 3590)
+++ branches/Cog/nsspur64src/vm/cointerp.c	2016-02-13 03:33:43 UTC (rev 3591)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1670 uuid: 6ba2dd3d-ab44-468e-9184-1c85580f980b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37
    from
-	CoInterpreter VMMaker.oscog-eem.1670 uuid: 6ba2dd3d-ab44-468e-9184-1c85580f980b
+	CoInterpreter VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1670 uuid: 6ba2dd3d-ab44-468e-9184-1c85580f980b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1677 uuid: 7056bb77-6aa0-4cb6-aa6c-cd921c231d37 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -220,7 +220,7 @@
 #define EncounteredUnknownBytecode -6
 #define EndOfRun 0x101
 #if !defined(EnforceAccessControl) /* Allow this to be overridden on the compiler command line */
-#define EnforceAccessControl 1
+# define EnforceAccessControl 1
 #endif
 #define ExcessSignalsIndex 2
 #define ExternalObjectsArray 38
@@ -247,7 +247,7 @@
 #define HeaderIndex 0
 #define IFrameSlots 7
 #if !defined(IMMUTABILITY) /* Allow this to be overridden on the compiler command line */
-#define IMMUTABILITY 0
+# define IMMUTABILITY 0
 #endif
 #define InstanceSpecificationIndex 2
 #define InstructionPointerIndex 1
@@ -355,6 +355,7 @@
 #define ReturnToInterpreter 1
 #define SchedulerAssociation 3
 #define SelectorAboutToReturn 48
+#define SelectorAttemptToAssign 50
 #define SelectorCannotInterpret 34
 #define SelectorCannotReturn 21
 #define SelectorDoesNotUnderstand 20
@@ -404,7 +405,7 @@
 #define V3PrimitiveBitsMask 0x80000FF8ULL
 #define ValueIndex 1
 #if !defined(VMBIGENDIAN) /* Allow this to be overridden on the compiler command line */
-#define VMBIGENDIAN 0
+# define VMBIGENDIAN 0
 #endif
 #define WeaklingStackRootIndex 0x1001
 #define XIndex 0
@@ -457,6 +458,9 @@
 static void NoDbgRegParms callRegisterArgCogMethodatreceiver(CogMethod *cogMethod, sqInt entryOffset, sqInt rcvr);
 extern void ceActivateFailingPrimitiveMethod(sqInt aPrimitiveMethod);
 extern sqInt ceBaseFrameReturn(sqInt returnValue);
+#if IMMUTABILITY
+extern sqInt ceCannotAssignTowithIndexvalueToAssign(sqInt immutableObject, sqInt index, sqInt valueToAssign);
+#endif /* IMMUTABILITY */
 extern sqInt ceCannotResume(void);
 extern sqInt ceCheckForAndFollowForwardedPrimitiveState(void);
 extern void ceCheckForInterrupts(void);
@@ -649,6 +653,9 @@
 static void unmarkAllFrames(void);
 static void NoDbgRegParms initializeStacknumSlotspageSize(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage);
 static sqInt NoDbgRegParms pageIndexFor(void *pointer);
+#if IMMUTABILITY
+static sqInt NoDbgRegParms canBeImmutable(sqInt oop);
+#endif /* IMMUTABILITY */
 extern char * cStringOrNullFor(sqInt oop);
 extern sqInt failed(void);
 static sqInt NoDbgRegParms isNegativeIntegerValueOf(sqInt oop);
@@ -729,6 +736,7 @@
 static void primitiveFormPrint(void);
 static void primitiveFractionalPart(void);
 static void primitiveGetAttribute(void);
+static void primitiveGetImmutability(void);
 EXPORT(sqInt) primitiveGetLogDirectory(void);
 static void primitiveGetNextEvent(void);
 EXPORT(sqInt) primitiveGetWindowLabel(void);
@@ -805,6 +813,7 @@
 static void primitiveSecondsClock(void);
 static void primitiveSetDisplayMode(void);
 static void primitiveSetFullScreen(void);
+static void primitiveSetImmutability(void);
 static void primitiveSetInterruptKey(void);
 EXPORT(sqInt) primitiveSetLogDirectory(void);
 static void primitiveSetOrHasIdentityHash(void);
@@ -1061,6 +1070,9 @@
 static usqLong NoDbgRegParms headerForSlotshashformatclassIndex(sqInt numSlots, sqInt hash, sqInt formatField, sqInt classIndex);
 static sqInt hiddenRootSlots(void);
 static sqInt imageSegmentVersion(void);
+#if IMMUTABILITY
+extern sqInt immutableBitMask(void);
+#endif /* IMMUTABILITY */
 extern void incrementalGC(void);
 static void NoDbgRegParms inFreeTreeReplacewith(sqInt treeNode, sqInt newNode);
 static sqInt NoDbgRegParms initialInstanceOf(sqInt classObj);
@@ -1604,8 +1616,8 @@
 _iss sqInt argumentCount;
 _iss sqInt specialObjectsOop;
 _iss sqInt bytecodeSetSelector;
+_iss sqInt messageSelector;
 _iss usqInt instructionPointer;
-_iss sqInt messageSelector;
 _iss usqInt newMethod;
 _iss usqInt freeStart;
 _iss sqInt markStack;
@@ -1614,8 +1626,8 @@
 _iss usqInt newSpaceLimit;
 _iss char * stackBasePlus1;
 _iss sqInt weaklingStack;
+_iss sqInt trueObj;
 _iss usqInt newSpaceStart;
-_iss sqInt trueObj;
 _iss sqInt falseObj;
 _iss sqInt hiddenRootsObj;
 _iss SpurSegmentInfo * segments;
@@ -1984,8 +1996,8 @@
 	/* 160 */ primitiveAdoptInstance,
 	/* 161 */ primitiveSetOrHasIdentityHash,
 	/* 162 */ (void (*)(void))0,
-	/* 163 */ (void (*)(void))0,
-	/* 164 */ (void (*)(void))0,
+	/* 163 */ primitiveGetImmutability,
+	/* 164 */ primitiveSetImmutability,
 	/* 165 */ primitiveIntegerAt,
 	/* 166 */ primitiveIntegerAtPut,
 	/* 167 */ primitiveYield,
@@ -2407,7 +2419,7 @@
 /*100*/	1, 1, 0, 2,-1, 1,-1,-1,-1,-1, 0, 0,-1,-1,-1, 1, 1,-1, 1, 0,
 /*120*/	-1, 0,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1, 1, 0, 0,-1, 0,-1,-1,-1,
 /*140*/	-1, 1,-1, 1, 0, 0,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/*160*/	0, 0,-1,-1,-1, 1, 1,-1, 1, 0, 0, 1,-1, 1, 1,-1,-1,-1,-1,-1,
+/*160*/	0, 0,-1, 0, 0, 1, 1,-1, 1, 0, 0, 1,-1, 1, 1,-1,-1,-1,-1,-1,
 /*180*/	0,-1,-1, 0, 0, 0, 1, 1, 1, 0,-1,-1,-1,-1,-1, 1, 2,-1,-1,-1,
 /*200*/	-1, 2, 2, 2, 2, 2, 2,-1,-1,-1, 1, 1, 1, 1,-1, 1,-1,-1, 3,-1,
 /*220*/	-1, 2, 2,-1,-1,-1,-1,-1,-1,-1, 0,-1, 2, 0,-1,-1,-1,-1,-1,-1,
@@ -2430,7 +2442,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1670";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1677";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4770,7 +4782,16 @@
 #        if IMMUTABILITY
 				assert(!((isImmediate(rcvr))));
 				if (((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0) {
-					cannotAssigntowithIndex(top, rcvr, instVarIndex);
+					/* begin cannotAssign:to:withIndex: */
+					longAtPointerput((localSP -= BytesPerOop), rcvr);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), top);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), (((instVarIndex + 1) << 3) | 1));
+					GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+					GIV(argumentCount) = 2;
+					goto normalSend;
+					/* return self */
 					goto l1;
 				}
 
@@ -5758,7 +5779,16 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(objOop))));
 					if (((((usqInt) (longAt(objOop))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(value, objOop, variableIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), objOop);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), value);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((variableIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
+						/* return self */
 						goto l4;
 					}
 
@@ -5815,7 +5845,15 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(litVar))));
 					if (((((usqInt) (longAt(litVar))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(value, litVar, ValueIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), litVar);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), value);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((ValueIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
 						goto l5;
 					}
 
@@ -5873,7 +5911,16 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(objOop))));
 					if (((((usqInt) (longAt(objOop))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(value, objOop, variableIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), objOop);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), value);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((variableIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
+						/* return self */
 						goto l7;
 					}
 
@@ -5930,7 +5977,15 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(litVar))));
 					if (((((usqInt) (longAt(litVar))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(value, litVar, ValueIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), litVar);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), value);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((ValueIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
 						goto l8;
 					}
 
@@ -6584,7 +6639,15 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(litVar))));
 					if (((((usqInt) (longAt(litVar))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(top, litVar, ValueIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), litVar);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), top);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((ValueIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
 						goto l14;
 					}
 
@@ -6714,7 +6777,16 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(rcvr1))));
 					if (((((usqInt) (longAt(rcvr1))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(top, rcvr1, byte3);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), rcvr1);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), top);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((byte3 + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
+						/* return self */
 						goto l11;
 					}
 
@@ -11916,7 +11988,16 @@
 #        if IMMUTABILITY
 				assert(!((isImmediate(rcvr))));
 				if (((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0) {
-					cannotAssigntowithIndex(top, rcvr, instVarIndex);
+					/* begin cannotAssign:to:withIndex: */
+					longAtPointerput((localSP -= BytesPerOop), rcvr);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), top);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), (((instVarIndex + 1) << 3) | 1));
+					GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+					GIV(argumentCount) = 2;
+					goto normalSend;
+					/* return self */
 					goto l125;
 				}
 
@@ -12497,7 +12578,16 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(rcvr))));
 					if (((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(anObject, rcvr, variableIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), rcvr);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), anObject);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((variableIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
+						/* return self */
 						goto l132;
 					}
 
@@ -12527,6 +12617,7 @@
 		case 489: /*233*/
 			/* extStoreLiteralVariableBytecode */
 			{
+				sqInt anObject;
 				sqInt litVar;
 				sqInt referent;
 				sqInt variableIndex;
@@ -12535,6 +12626,8 @@
 				variableIndex = (byteAtPointer(++localIP)) + (((long)extA) << 8);
 				extA = 0;
 				/* begin storeLiteralVariable:withValue: */
+				anObject = longAtPointer(localSP);
+				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + BaseHeaderSize) + (((long)(variableIndex + LiteralStart)) << (shiftForWord())));
 				if (((longAt(litVar)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0) {
@@ -12552,7 +12645,15 @@
 #        if IMMUTABILITY
 				assert(!((isImmediate(litVar))));
 				if (((((usqInt) (longAt(litVar))) >> 23) & 1) != 0) {
-					cannotAssigntowithIndex(longAtPointer(localSP), litVar, ValueIndex);
+					/* begin cannotAssign:to:withIndex: */
+					longAtPointerput((localSP -= BytesPerOop), litVar);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), anObject);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), (((ValueIndex + 1) << 3) | 1));
+					GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+					GIV(argumentCount) = 2;
+					goto normalSend;
 					goto l134;
 				}
 
@@ -12563,15 +12664,15 @@
 				if (isOldObject(litVar)) {
 
 					/* most stores into young objects */
-					if ((((longAtPointer(localSP)) & (tagMask())) == 0)
-					 && (oopisLessThan(longAtPointer(localSP), GIV(newSpaceLimit)))) {
+					if (((anObject & (tagMask())) == 0)
+					 && (oopisLessThan(anObject, GIV(newSpaceLimit)))) {
 						/* begin possibleRootStoreInto: */
 						if (!(((((usqInt) (longAt(litVar))) >> (rememberedBitShift())) & 1) != 0)) {
 							remember(litVar);
 						}
 					}
 				}
-				longAtput((litVar + BaseHeaderSize) + (((long)ValueIndex) << (shiftForWord())), longAtPointer(localSP));
+				longAtput((litVar + BaseHeaderSize) + (((long)ValueIndex) << (shiftForWord())), anObject);
 			l134:	/* end storeLiteralVariable:withValue: */;
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
@@ -12715,7 +12816,16 @@
 #          if IMMUTABILITY
 					assert(!((isImmediate(rcvr))));
 					if (((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0) {
-						cannotAssigntowithIndex(value, rcvr, variableIndex);
+						/* begin cannotAssign:to:withIndex: */
+						longAtPointerput((localSP -= BytesPerOop), rcvr);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), value);
+						/* begin internalPush: */
+						longAtPointerput((localSP -= BytesPerOop), (((variableIndex + 1) << 3) | 1));
+						GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+						GIV(argumentCount) = 2;
+						goto normalSend;
+						/* return self */
 						goto l135;
 					}
 
@@ -12774,7 +12884,15 @@
 #        if IMMUTABILITY
 				assert(!((isImmediate(litVar))));
 				if (((((usqInt) (longAt(litVar))) >> 23) & 1) != 0) {
-					cannotAssigntowithIndex(value, litVar, ValueIndex);
+					/* begin cannotAssign:to:withIndex: */
+					longAtPointerput((localSP -= BytesPerOop), litVar);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), value);
+					/* begin internalPush: */
+					longAtPointerput((localSP -= BytesPerOop), (((ValueIndex + 1) << 3) | 1));
+					GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord())));
+					GIV(argumentCount) = 2;
+					goto normalSend;
 					goto l137;
 				}
 
@@ -15882,6 +16000,40 @@
 }
 
 
+/*	index is unboxed. */
+
+	/* CoInterpreter>>#ceCannotAssignTo:withIndex:valueToAssign: */
+#if IMMUTABILITY
+sqInt
+ceCannotAssignTowithIndexvalueToAssign(sqInt immutableObject, sqInt index, sqInt valueToAssign)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    char *sp;
+    char *sp1;
+    char *sp2;
+    char *sp3;
+    sqInt top;
+
+	/* begin popStack */
+	top = longAt(GIV(stackPointer));
+	GIV(stackPointer) += BytesPerWord;
+	GIV(instructionPointer) = top;
+	/* begin push: */
+	longAtput((sp = GIV(stackPointer) - BytesPerWord), immutableObject);
+	GIV(stackPointer) = sp;
+	/* begin push: */
+	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), valueToAssign);
+	GIV(stackPointer) = sp1;
+	/* begin push: */
+	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), ((index << 3) | 1));
+	GIV(stackPointer) = sp2;
+	/* begin push: */
+	longAtput((sp3 = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
+	GIV(stackPointer) = sp3;
+	return ceSendAborttonumArgs(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SelectorAttemptToAssign) << (shiftForWord()))), immutableObject, 2);
+}
+#endif /* IMMUTABILITY */
+
+
 /*	A context that has been returned from, or otherwise has an invalid pc has
 	been reentered.
 	Until we have a cannotResume: selector, simply resend cannotReturn:. */
@@ -18736,15 +18888,8 @@
 		fieldIndex1 = classTag & ((1LL << (classTableMajorIndexShift())) - 1);
 		GIV(lkupClass) = longAt((classTablePage + BaseHeaderSize) + (((long)fieldIndex1) << (shiftForWord())));
 	l1:	/* end classAtIndex: */;
-		
-#    if NewspeakVM
 		lookupOrdinarySend();
 
-#    else /* NewspeakVM */
-		lookupMethodInClass(GIV(lkupClass));
-
-#    endif /* NewspeakVM */
-
 		addNewMethodToCache(GIV(lkupClass));
 	}
 }
@@ -19760,8 +19905,6 @@
 	else {
 		classTag = (longAt(rcvr)) & (classIndexMask());
 	}
-	
-#  if NewspeakVM
 	/* begin inlineLookupInNSMethodCacheSel:classTag:method:lookupRule: */
 	hash = (selector ^ classTag) ^ (0 ^ LookupRuleMNU);
 
@@ -19804,11 +19947,6 @@
 	inCache = 0;
 l1:	/* end inlineLookupInNSMethodCacheSel:classTag:method:lookupRule: */;
 
-#  else /* NewspeakVM */
-	inCache = lookupInMethodCacheSelclassTag(selector, classTag);
-
-#  endif /* NewspeakVM */
-
 	if (!inCache) {
 		GIV(messageSelector) = selector;
 		erridx = lookupMNUInClass(classAtIndex(classTag));
@@ -28587,7 +28725,42 @@
 	return pageIndexForstackBasePlus1bytesPerPage(pointer, GIV(stackBasePlus1), GIV(bytesPerPage));
 }
 
+	/* InterpreterPrimitives>>#canBeImmutable: */
+#if IMMUTABILITY
+static sqInt NoDbgRegParms
+canBeImmutable(sqInt oop)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt processLists;
+    sqInt scheduler;
 
+	assert(isNonImmediate(oop));
+	if (((oop & (tagMask())) == 0)
+	 && (((longAt(oop)) & (classIndexMask())) == ClassMethodContextCompactIndex)) {
+		return 0;
+	}
+	if (((longAt(oop)) & (classIndexMask())) == (rawHashBitsOf(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)ClassSemaphore) << (shiftForWord())))))) {
+		return 0;
+	}
+	/* begin fetchPointer:ofObject: */
+	scheduler = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)SchedulerAssociation) << (shiftForWord())))) + BaseHeaderSize) + (((long)ValueIndex) << (shiftForWord())));
+	processLists = longAt((scheduler + BaseHeaderSize) + (((long)ProcessListsIndex) << (shiftForWord())));
+	if (oop == scheduler) {
+		return 0;
+	}
+	if (oop == processLists) {
+		return 0;
+	}
+	if ((classIndexOf(longAt((processLists + BaseHeaderSize) + (1LL << (shiftForWord()))))) == ((longAt(oop)) & (classIndexMask()))) {
+		return 0;
+	}
+	if ((classIndexOf(longAt((scheduler + BaseHeaderSize) + (((long)ActiveProcessIndex) << (shiftForWord()))))) == ((longAt(oop)) & (classIndexMask()))) {
+		return 0;
+	}
+	return 1;
+}
+#endif /* IMMUTABILITY */
+
+
 /*	Answer either a malloced string with the null-terminated contents of oop
 	if oop is a string,
 	or the null pointer if oop is nil, or fail. It is the client's
@@ -34186,7 +34359,33 @@
 	}
 }
 
+	/* InterpreterPrimitives>>#primitiveGetImmutability */
+static void
+primitiveGetImmutability(void)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt rcvr;
+    char *sp;
+    sqInt trueOrFalse;
 
+	
+#  if IMMUTABILITY
+	rcvr = longAt(GIV(stackPointer) + (0 * BytesPerWord));
+	/* begin pop:thenPushBool: */
+	trueOrFalse = ((rcvr & (tagMask())) != 0)
+	 || (((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0);
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (trueOrFalse
+		? GIV(trueObj)
+		: GIV(falseObj)));
+	GIV(stackPointer) = sp;
+
+#  else /* IMMUTABILITY */
+	GIV(primFailCode) = PrimErrUnsupported;
+
+#  endif /* IMMUTABILITY */
+
+}
+
+
 /*	Primitive. Answer the VM's current log directory */
 
 	/* InterpreterPrimitives>>#primitiveGetLogDirectory */
@@ -38383,7 +38582,60 @@
 	}
 }
 
+	/* InterpreterPrimitives>>#primitiveSetImmutability */
+static void
+primitiveSetImmutability(void)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt rcvr;
+    char *sp;
+    sqInt wasImmutable;
 
+	
+#  if IMMUTABILITY
+	rcvr = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if ((rcvr & (tagMask())) != 0) {
+		(GIV(primFailCode) = PrimErrBadReceiver);
+		return;
+	}
+	wasImmutable = 
+#  if IMMUTABILITY
+		((((usqInt) (longAt(rcvr))) >> 23) & 1) != 0
+#  else /* IMMUTABILITY */
+		0
+#  endif /* IMMUTABILITY */
+		;
+	if ((longAt(GIV(stackPointer))) == GIV(trueObj)) {
+		if (!(canBeImmutable(rcvr))) {
+			(GIV(primFailCode) = PrimErrInappropriate);
+			return;
+		}
+		/* begin setIsImmutableOf:to: */
+		longAtput(rcvr, (longAt(rcvr)) | (1LL << 23));
+	}
+	else {
+		if ((longAt(GIV(stackPointer))) == GIV(falseObj)) {
+			/* begin setIsImmutableOf:to: */
+			longAtput(rcvr, (longAt(rcvr)) & (~(1LL << 23)));
+		}
+		else {
+			(GIV(primFailCode) = PrimErrBadArgument);
+			return;
+		}
+	}
+	/* begin pop:thenPushBool: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (wasImmutable
+		? GIV(trueObj)
+		: GIV(falseObj)));
+	GIV(stackPointer) = sp;
+
+#  else /* IMMUTABILITY */
+	GIV(primFailCode) = PrimErrUnsupported;
+
+#  endif /* IMMUTABILITY */
+
+}
+
+
 /*	Set the user interrupt keycode. The keycode is an integer whose encoding
 	is described in the comment for primitiveKbdNext.
  */
@@ -52154,6 +52406,18 @@
 	return (imageFormatVersion()) | (wholeWord & 0xFF000000ULL);
 }
 
+
+/*	mask the immutable bit in the base header word */
+
+	/* SpurMemoryManager>>#immutableBitMask */
+#if IMMUTABILITY
+sqInt
+immutableBitMask(void)
+{
+	return 1LL << 23;
+}
+#endif /* IMMUTABILITY */
+
 	/* SpurMemoryManager>>#incrementalGC */
 void
 incrementalGC(void)
@@ -61254,7 +61518,7 @@
     usqInt prevFree;
     usqInt prevFreeChunk;

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list