From cc9de0b9049ffb6fb1a35604f28e117145bcba4a Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Thu, 28 Mar 2013 18:29:20 +0100 Subject: [PATCH 1/7] #291: create Ruby singleton classes for Ruby singleton classes. --- src/kernel/bootstrap/Class.rb | 2 +- .../instance/_rubyInspect..st | 21 ++++----- .../instance/_rubyInspectSingletonClass.st | 7 +++ .../instance/destClass..st | 4 ++ .../methodProperties.json | 2 + .../instance/moduleMethodsModuleOrNil.st | 5 +-- .../Object.extension/instance/_rubyInspect.st | 45 ++++++++++--------- .../instance/_singletonClass..st | 9 ++-- .../instance/addRubySingletonClass..st | 29 ++++++------ .../instance/rubySingletonSuperclass.st | 12 +++++ .../Object.extension/methodProperties.json | 3 +- src/smalltalk/ruby/Object_ruby.gs | 10 ++--- 12 files changed, 90 insertions(+), 59 deletions(-) create mode 100644 src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st create mode 100644 src/packages/Maglev.package/Metaclass3.extension/instance/destClass..st create mode 100644 src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st diff --git a/src/kernel/bootstrap/Class.rb b/src/kernel/bootstrap/Class.rb index dfe8695cc..b2354b533 100644 --- a/src/kernel/bootstrap/Class.rb +++ b/src/kernel/bootstrap/Class.rb @@ -6,7 +6,7 @@ class Class primitive_nobridge 'ancestors' , 'rubyAncestors' - primitive_nobridge 'superclass', 'superClass' + primitive_nobridge 'superclass', '_superclass' primitive_nobridge '__ruby_methods', 'rubyMethods:protection:' diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st index 2a94607cd..e8aba5f00 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st @@ -1,17 +1,12 @@ *maglev-runtime _rubyInspect: envId "called from smalltalk code" - self isMeta ifTrue:[ | res | - res := '# . - ^ res - ] ifFalse:[ | name | - name := self rubyFullName: envId . + (self isMeta or: [self isRubySingletonClass]) + ifTrue: [^ self _rubyInspectSingletonClass] + ifFalse:[ |name| + name := self rubyFullName: envId . + (name isNil or: [name size == 0]) ifTrue: [ + self isMeta ifTrue: [ ^ (destClass rubyFullName: envId), ':Class' ]. + ^ '#' ]. + ^ name] - (name isNil or: [name size == 0]) ifTrue: [ - self isMeta ifTrue: [ ^ (destClass rubyFullName: envId), ':Class' ]. - ^ '#' ]. - - ^ name - ] diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st new file mode 100644 index 000000000..e71392ec8 --- /dev/null +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st @@ -0,0 +1,7 @@ +*maglev-runtime +_rubyInspectSingletonClass + |str| + str := '#'. + ^ str diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/destClass..st b/src/packages/Maglev.package/Metaclass3.extension/instance/destClass..st new file mode 100644 index 000000000..863ce958b --- /dev/null +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/destClass..st @@ -0,0 +1,4 @@ +*maglev-runtime +destClass: aClass + "Called after Ruby singleton class creation." + destClass := aClass diff --git a/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json b/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json index 9f4be8811..6b6b63a7c 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json +++ b/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json @@ -8,10 +8,12 @@ "_includeRubyModule:" : "DataCurator 10/02/2012 14:30", "_rubyInspect" : "DataCurator 10/02/2012 14:30", "_rubyInspect:" : "DataCurator 10/02/2012 14:30", + "_rubyInspectSingletonClass" : "DataCurator 03/28/2013 18:11", "addModuleMethodIfEnabled:env:" : "DataCurator 10/02/2012 14:30", "allModuleMethodsEnabled:" : "DataCurator 10/02/2012 14:30", "classForConstantLookup:forModuleEval:" : "DataCurator 10/02/2012 14:30", "clsMethodDefnTarget" : "DataCurator 10/02/2012 14:30", + "destClass:" : "DataCurator 03/28/2013 18:09", "is_aModule" : "DataCurator 10/02/2012 14:30", "methodDefined:rubyEnv:" : "DataCurator 10/02/2012 14:30", "moduleIncludeSelf:" : "DataCurator 10/02/2012 14:30", diff --git a/src/packages/Maglev.package/Module.extension/instance/moduleMethodsModuleOrNil.st b/src/packages/Maglev.package/Module.extension/instance/moduleMethodsModuleOrNil.st index ec2cc30eb..2db8d9b29 100644 --- a/src/packages/Maglev.package/Module.extension/instance/moduleMethodsModuleOrNil.st +++ b/src/packages/Maglev.package/Module.extension/instance/moduleMethodsModuleOrNil.st @@ -4,7 +4,6 @@ moduleMethodsModuleOrNil for a Module " | meta | meta := self virtualClass . - meta == Module ifTrue: [ ^ meta ]. - meta isRubyModuleFunctions ifTrue:[ ^ meta ]. + meta == Module ifTrue: [meta := self _singletonClassFor: 1. ^ meta]. + meta isRubyModuleFunctions ifTrue: [^ meta]. ^ nil - diff --git a/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st b/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st index 998ce9b9f..39c96675d 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st +++ b/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st @@ -4,25 +4,30 @@ _rubyInspect | str names ts envId | envId := 1"__callerEnvId" . str := '#<' copy . - str addAll: (self class rubyFullName: envId) . - ts := GsProcess _recursionGuardSet . - (ts _addIfAbsent: self) ifFalse:[ "already in ts" - str addAll: '...>' . - ^ str - ]. - [ | s | - s := str . - s addAll: ':0x'. - s addAll: self asOop hex. - names := self rubyInstvarNames . - 1 to: names size do:[:n | | nam | - s add: $ . - s addAll: (nam := names at: n) ; add: $= . - s addAll: ((self rubyInstvarAt: nam asSymbol ) @ruby1:inspect ). - ]. - s add: $> . - ] ensure:[ - ts remove: self - ]. + (self isClass and: [self isRubySingletonClass or: [self isMeta]]) + ifTrue: [ + str addAll: self _rubyInspectSingletonClass. + str addAll: $>] + ifFalse: [ + str addAll: (self class rubyFullName: envId) . + ts := GsProcess _recursionGuardSet . + (ts _addIfAbsent: self) ifFalse:[ "already in ts" + str addAll: '...>' . + ^ str + ]. + [ | s | + s := str . + s addAll: ':0x'. + s addAll: self asOop hex. + names := self rubyInstvarNames . + 1 to: names size do:[:n | | nam | + s add: $ . + s addAll: (nam := names at: n) ; add: $= . + s addAll: ((self rubyInstvarAt: nam asSymbol ) @ruby1:inspect ). + ]. + s add: $> . + ] ensure:[ + ts remove: self + ]]. ^ str diff --git a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st index a88ca13b3..fbea30e7d 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st @@ -6,9 +6,12 @@ _singletonClass: envId cls := self _rubyModuleIncludeSelfEnv: envId ]. ] ifFalse:[ - self isBehavior ifTrue:[ - cls := self virtualClass . "extending metaclass" + (self isBehavior and: [self isMeta not and: [self isRubySingletonClass not]]) ifTrue:[ + "It's neither a meta class nor a Ruby singleton class, so it must be a class. + Smalltalk meta classes (=first level Ruby singleton class) are automatically + created by GemStone." + cls := self virtualClass. ] ifFalse:[ cls := self _singletonClassFor: envId ]. ]. - ^ cls + ^ cls diff --git a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st index 6e85fd2e4..2304befe5 100644 --- a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st @@ -5,17 +5,20 @@ addRubySingletonClass: envId Returns receiver, or signals an error. The new class is persistable. " -| vCls prevCls | -prevCls := self virtualClass . -vCls := self _addRubySingletonClass: true envId: envId . -vCls _isOneByteString ifTrue:[ - ArgumentTypeError signal: 'add singleton class disallowed, ', vCls . -]. -"env 1 method dicts left as nil" -"name spaces left as nil." -vCls persistentRubySuperclass: envId put: prevCls . -vCls transientRubySuperclass: envId put: prevCls . - "new singleton class has empty method dicts, so no need to clear - lookup caches yet" -^ self + |vCls prevCls singletonClass| + prevCls := self virtualClass. + singletonClass := Metaclass3 _subclass: #Singleton instVarNames: {} format: 0 constraints: {} classVars: SymbolDictionary new poolDictionaries: {}. + "Why did we need envId here?" + vCls := self _addRubySingletonClass: singletonClass forSuperClass: self rubySingletonSuperclass. + vCls destClass: self. + vCls _isOneByteString ifTrue: [ + ArgumentTypeError signal: 'add singleton class disallowed, ', vCls. + ]. + + "env 1 method dicts left as nil" + "name spaces left as nil." + vCls persistentRubySuperclass: 1 put: prevCls . + vCls transientRubySuperclass: 1 put: prevCls . + "new singleton class has empty method dicts, so no need to clear lookup caches yet" + ^ self diff --git a/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st b/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st new file mode 100644 index 000000000..389172bc9 --- /dev/null +++ b/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st @@ -0,0 +1,12 @@ +*maglev-runtime +rubySingletonSuperclass + "Returns the superclass of self's singleton class. Creates + all singleton classes in the singleton class's hierarchy, + if necessary." + + self isClass ifTrue: [ + self == Object + ifTrue: [^ Metaclass3] + ifFalse: [^ self _superclass rubySingletonClass]] + ifFalse: [^ self class]. + diff --git a/src/packages/Maglev.package/Object.extension/methodProperties.json b/src/packages/Maglev.package/Object.extension/methodProperties.json index f4c45bf2d..2ffb5560c 100644 --- a/src/packages/Maglev.package/Object.extension/methodProperties.json +++ b/src/packages/Maglev.package/Object.extension/methodProperties.json @@ -48,4 +48,5 @@ "rubySingletonClass" : "DataCurator 10/02/2012 14:30", "rubySingletonClassForExtend" : "DataCurator 10/02/2012 14:30", "rubySingletonMethods:protection:" : "DataCurator 10/02/2012 14:30", - "rubySingletonMethods:protection:env:" : "DataCurator 10/02/2012 14:30" } } + "rubySingletonMethods:protection:env:" : "DataCurator 10/02/2012 14:30", + "rubySingletonSuperclass" : "DataCurator 03/28/2013 18:06" } } diff --git a/src/smalltalk/ruby/Object_ruby.gs b/src/smalltalk/ruby/Object_ruby.gs index cf287391e..df198a3f8 100644 --- a/src/smalltalk/ruby/Object_ruby.gs +++ b/src/smalltalk/ruby/Object_ruby.gs @@ -251,17 +251,17 @@ _rubyNilQ category: 'Ruby private' method: -_addRubySingletonClass: committedOk envId: envId +_addRubySingletonClass: singleton forSuperClass: singletonSuperclass -"Insert a new singleton class in the receiver's class hierarchy. +"Insert the singleton class in the receiver's class hierarchy. Returns the new class, or a String giving reason for failure " -committedOk _validateClass: Boolean . +"committedOk _validateClass: Boolean . envId _validateClass: SmallInteger . -(envId < 1 or:[ envId > 255]) ifTrue:[ OutOfRange signal:'invalid envId']. +(envId < 1 or:[ envId > 255]) ifTrue:[ OutOfRange signal:'invalid envId']." self _primitiveFailed: #_addRubySingletonClass:envId: - args: { committedOk . envId } + args: { singleton . singletonSuperclass } % From f82f0c05d0aad9f8dbece591e584ab154f8f8283 Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Sat, 30 Mar 2013 17:00:41 +0100 Subject: [PATCH 2/7] Don't allow creating 2nd/higher order singleton classes of Behavior. --- .../Object.extension/instance/addRubySingletonClass..st | 4 ++++ .../Object.extension/instance/rubySingletonSuperclass.st | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st index 2304befe5..70bf2e9c0 100644 --- a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st @@ -6,6 +6,10 @@ addRubySingletonClass: envId The new class is persistable. " |vCls prevCls singletonClass| + self == Behavior class ifTrue: [ + ArgumentTypeError signal: 'add singleton class disallowed for Behavior class'. + ^ self]. + prevCls := self virtualClass. singletonClass := Metaclass3 _subclass: #Singleton instVarNames: {} format: 0 constraints: {} classVars: SymbolDictionary new poolDictionaries: {}. diff --git a/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st b/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st index 389172bc9..a84ef631c 100644 --- a/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st +++ b/src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st @@ -7,6 +7,12 @@ rubySingletonSuperclass self isClass ifTrue: [ self == Object ifTrue: [^ Metaclass3] - ifFalse: [^ self _superclass rubySingletonClass]] + ifFalse: [ + self == Module class + ifTrue: [ + "We don't want to create 2nd/higher order singleton + classes of Behavior." + ^ Object class] + ifFalse: [^ self _superclass rubySingletonClass]]] ifFalse: [^ self class]. From 1fe45d021f40ac8a400e68abc2c3716cb34d748c Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Tue, 2 Apr 2013 14:47:26 +0200 Subject: [PATCH 3/7] #291: fixed inspect for meta modules, Object.methods and Object.instance_methods --- .../instance/_rubyInspect..st | 3 +- .../instance/_rubyInspectSingletonClass.st | 4 +- .../instance/rubyMethods.protection..st | 4 +- .../Module.extension/instance/_rubyInspect.st | 2 +- .../instance/_rubyInspectSingletonClass.st | 7 +++ .../Module.extension/instance/primaryCopy.st | 3 ++ .../Module.extension/methodProperties.json | 2 + .../Object.extension/instance/_rubyInspect.st | 45 +++++++++---------- .../instance/addRubySingletonClass..st | 12 ++++- 9 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 src/packages/Maglev.package/Module.extension/instance/_rubyInspectSingletonClass.st create mode 100644 src/packages/Maglev.package/Module.extension/instance/primaryCopy.st diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st index e8aba5f00..ee4ccf582 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspect..st @@ -1,12 +1,11 @@ *maglev-runtime _rubyInspect: envId "called from smalltalk code" - (self isMeta or: [self isRubySingletonClass]) + (self isMeta or: [self isRubySingletonClass or: [self isMetaModule]]) ifTrue: [^ self _rubyInspectSingletonClass] ifFalse:[ |name| name := self rubyFullName: envId . (name isNil or: [name size == 0]) ifTrue: [ - self isMeta ifTrue: [ ^ (destClass rubyFullName: envId), ':Class' ]. ^ '#' ]. ^ name] diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st index e71392ec8..a62496bd1 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/_rubyInspectSingletonClass.st @@ -2,6 +2,8 @@ _rubyInspectSingletonClass |str| str := '#'. ^ str diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/rubyMethods.protection..st b/src/packages/Maglev.package/Metaclass3.extension/instance/rubyMethods.protection..st index 5df59d344..2e7090f2d 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/instance/rubyMethods.protection..st +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/rubyMethods.protection..st @@ -1,6 +1,4 @@ *maglev-runtime rubyMethods: includeSuper protection: protInt "a ruby primitive" - self isMeta ifTrue:[ ^ IdentitySet new ]. - ^ self class rubyMethods: includeSuper protection: protInt env: 1"__callerEnvId" - + ^ self virtualClass rubyMethods: includeSuper protection: protInt env: 1"__callerEnvId" diff --git a/src/packages/Maglev.package/Module.extension/instance/_rubyInspect.st b/src/packages/Maglev.package/Module.extension/instance/_rubyInspect.st index 4a61686fe..53a897013 100644 --- a/src/packages/Maglev.package/Module.extension/instance/_rubyInspect.st +++ b/src/packages/Maglev.package/Module.extension/instance/_rubyInspect.st @@ -2,10 +2,10 @@ _rubyInspect "a ruby primitive" | str | + self isMetaModule ifTrue: [^ self _rubyInspectSingletonClass]. str := self rubyFullName: 1"__callerEnvId" . str size ~~ 0 ifTrue:[ ^ str ]. str := '# . ^ str - diff --git a/src/packages/Maglev.package/Module.extension/instance/_rubyInspectSingletonClass.st b/src/packages/Maglev.package/Module.extension/instance/_rubyInspectSingletonClass.st new file mode 100644 index 000000000..8a3a8bf7e --- /dev/null +++ b/src/packages/Maglev.package/Module.extension/instance/_rubyInspectSingletonClass.st @@ -0,0 +1,7 @@ +*maglev-runtime +_rubyInspectSingletonClass + |str| + str := '#'. + ^ str diff --git a/src/packages/Maglev.package/Module.extension/instance/primaryCopy.st b/src/packages/Maglev.package/Module.extension/instance/primaryCopy.st new file mode 100644 index 000000000..52d29bcb9 --- /dev/null +++ b/src/packages/Maglev.package/Module.extension/instance/primaryCopy.st @@ -0,0 +1,3 @@ +*maglev-runtime +primaryCopy + ^ primaryCopy diff --git a/src/packages/Maglev.package/Module.extension/methodProperties.json b/src/packages/Maglev.package/Module.extension/methodProperties.json index 5ab3eeb79..fa874829f 100644 --- a/src/packages/Maglev.package/Module.extension/methodProperties.json +++ b/src/packages/Maglev.package/Module.extension/methodProperties.json @@ -24,6 +24,7 @@ "_rubyIncludeModule:envId:" : "DataCurator 10/02/2012 14:30", "_rubyInspect" : "DataCurator 10/02/2012 14:30", "_rubyInspect:" : "DataCurator 10/02/2012 14:30", + "_rubyInspectSingletonClass" : "DataCurator 04/02/2013 14:19", "_rubyModuleIncludeSelfEnv:" : "", "_setPersistable" : "DataCurator 10/02/2012 14:30", "_setTopNameSpace:persistent:env:" : "DataCurator 10/02/2012 14:30", @@ -64,6 +65,7 @@ "persistentNameSpace:put:" : "DataCurator 10/02/2012 14:30", "persistentRubySuperclass:" : "DataCurator 10/02/2012 14:30", "persistentRubySuperclass:put:" : "DataCurator 10/02/2012 14:30", + "primaryCopy" : "DataCurator 04/02/2013 14:20", "removeConst:env:" : "DataCurator 10/02/2012 14:30", "removeRubySelector:env:" : "DataCurator 10/02/2012 14:30", "rubyAncestors" : "DataCurator 10/02/2012 14:30", diff --git a/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st b/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st index 39c96675d..998ce9b9f 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st +++ b/src/packages/Maglev.package/Object.extension/instance/_rubyInspect.st @@ -4,30 +4,25 @@ _rubyInspect | str names ts envId | envId := 1"__callerEnvId" . str := '#<' copy . - (self isClass and: [self isRubySingletonClass or: [self isMeta]]) - ifTrue: [ - str addAll: self _rubyInspectSingletonClass. - str addAll: $>] - ifFalse: [ - str addAll: (self class rubyFullName: envId) . - ts := GsProcess _recursionGuardSet . - (ts _addIfAbsent: self) ifFalse:[ "already in ts" - str addAll: '...>' . - ^ str - ]. - [ | s | - s := str . - s addAll: ':0x'. - s addAll: self asOop hex. - names := self rubyInstvarNames . - 1 to: names size do:[:n | | nam | - s add: $ . - s addAll: (nam := names at: n) ; add: $= . - s addAll: ((self rubyInstvarAt: nam asSymbol ) @ruby1:inspect ). - ]. - s add: $> . - ] ensure:[ - ts remove: self - ]]. + str addAll: (self class rubyFullName: envId) . + ts := GsProcess _recursionGuardSet . + (ts _addIfAbsent: self) ifFalse:[ "already in ts" + str addAll: '...>' . + ^ str + ]. + [ | s | + s := str . + s addAll: ':0x'. + s addAll: self asOop hex. + names := self rubyInstvarNames . + 1 to: names size do:[:n | | nam | + s add: $ . + s addAll: (nam := names at: n) ; add: $= . + s addAll: ((self rubyInstvarAt: nam asSymbol ) @ruby1:inspect ). + ]. + s add: $> . + ] ensure:[ + ts remove: self + ]. ^ str diff --git a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st index 70bf2e9c0..00794f0a1 100644 --- a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st @@ -7,8 +7,16 @@ addRubySingletonClass: envId |vCls prevCls singletonClass| self == Behavior class ifTrue: [ - ArgumentTypeError signal: 'add singleton class disallowed for Behavior class'. - ^ self]. + ArgumentTypeError signal: 'add singleton class disallowed for Behavior class'. + ^ self]. + + self isSpecial ifTrue: [ + ArgumentTypeError signal: 'add singleton class disallowed for special objects'. + ^ self]. + + self isCommitted ifTrue: [ + "The new class pointer for this class will not be committed!" + Kernel @ruby1:warn: 'warning: adding singleton class to committed object']. prevCls := self virtualClass. singletonClass := Metaclass3 _subclass: #Singleton instVarNames: {} format: 0 constraints: {} classVars: SymbolDictionary new poolDictionaries: {}. From c737e55efacb3f6ff587d0c6ffb95a757f068d07 Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Tue, 2 Apr 2013 18:54:19 +0200 Subject: [PATCH 4/7] #291: don't overwrite Ruby superclass for singleton classes. --- src/kernel/bootstrap/Class.rb | 2 +- .../Object.extension/instance/addRubySingletonClass..st | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/kernel/bootstrap/Class.rb b/src/kernel/bootstrap/Class.rb index b2354b533..f48234f2e 100644 --- a/src/kernel/bootstrap/Class.rb +++ b/src/kernel/bootstrap/Class.rb @@ -6,7 +6,7 @@ class Class primitive_nobridge 'ancestors' , 'rubyAncestors' - primitive_nobridge 'superclass', '_superclass' + primitive_nobridge 'superclass', '_rubySuperclass' primitive_nobridge '__ruby_methods', 'rubyMethods:protection:' diff --git a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st index 00794f0a1..1c0fb5953 100644 --- a/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/addRubySingletonClass..st @@ -28,9 +28,4 @@ addRubySingletonClass: envId ArgumentTypeError signal: 'add singleton class disallowed, ', vCls. ]. - "env 1 method dicts left as nil" - "name spaces left as nil." - vCls persistentRubySuperclass: 1 put: prevCls . - vCls transientRubySuperclass: 1 put: prevCls . - "new singleton class has empty method dicts, so no need to clear lookup caches yet" ^ self From 4ced02deeae2a702127921957583839306e5b844 Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Wed, 3 Apr 2013 10:54:42 +0200 Subject: [PATCH 5/7] Singleton classes are instances of former superclass. --- .../instance/_singletonClass..st | 18 ++++---------- .../instance/_singletonClassFor..st | 24 +++++++++++++------ ...etonClass..st => addRubySingletonClass.st} | 10 ++++---- .../Object.extension/methodProperties.json | 2 +- 4 files changed, 28 insertions(+), 26 deletions(-) rename src/packages/Maglev.package/Object.extension/instance/{addRubySingletonClass..st => addRubySingletonClass.st} (84%) diff --git a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st index fbea30e7d..ea5bde5e1 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st @@ -1,17 +1,9 @@ *maglev-runtime _singletonClass: envId | cls | - self class == Module ifTrue:[ "a class< Date: Wed, 3 Apr 2013 18:32:27 +0200 Subject: [PATCH 6/7] #291: Singleton class generation in GemStone again, generate 2 levels of singleton classes ahead. --- src/kernel/bootstrap/Class.rb | 2 +- .../instance/destClass.st | 4 ++ .../methodProperties.json | 1 + .../instance/_singletonClass..st | 2 +- .../instance/_singletonClassAllowedFor..st | 6 +++ .../instance/_singletonClassFor..st | 51 ++++++++++++------- .../instance/addRubySingletonClass.st | 29 +---------- .../addRubySingletonClassSecondLevel..st | 31 +++++++++++ .../instance/rubySingletonSuperclass.st | 18 ------- .../rubySingletonSuperclassSecondLevel..st | 22 ++++++++ .../Object.extension/methodProperties.json | 4 +- 11 files changed, 104 insertions(+), 66 deletions(-) create mode 100644 src/packages/Maglev.package/Metaclass3.extension/instance/destClass.st create mode 100644 src/packages/Maglev.package/Object.extension/instance/_singletonClassAllowedFor..st create mode 100644 src/packages/Maglev.package/Object.extension/instance/addRubySingletonClassSecondLevel..st delete mode 100644 src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclass.st create mode 100644 src/packages/Maglev.package/Object.extension/instance/rubySingletonSuperclassSecondLevel..st diff --git a/src/kernel/bootstrap/Class.rb b/src/kernel/bootstrap/Class.rb index f48234f2e..dfe8695cc 100644 --- a/src/kernel/bootstrap/Class.rb +++ b/src/kernel/bootstrap/Class.rb @@ -6,7 +6,7 @@ class Class primitive_nobridge 'ancestors' , 'rubyAncestors' - primitive_nobridge 'superclass', '_rubySuperclass' + primitive_nobridge 'superclass', 'superClass' primitive_nobridge '__ruby_methods', 'rubyMethods:protection:' diff --git a/src/packages/Maglev.package/Metaclass3.extension/instance/destClass.st b/src/packages/Maglev.package/Metaclass3.extension/instance/destClass.st new file mode 100644 index 000000000..10f253315 --- /dev/null +++ b/src/packages/Maglev.package/Metaclass3.extension/instance/destClass.st @@ -0,0 +1,4 @@ +*maglev-runtime +destClass + ^ destClass + diff --git a/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json b/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json index 6b6b63a7c..53e5b7d37 100644 --- a/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json +++ b/src/packages/Maglev.package/Metaclass3.extension/methodProperties.json @@ -13,6 +13,7 @@ "allModuleMethodsEnabled:" : "DataCurator 10/02/2012 14:30", "classForConstantLookup:forModuleEval:" : "DataCurator 10/02/2012 14:30", "clsMethodDefnTarget" : "DataCurator 10/02/2012 14:30", + "destClass" : "DataCurator 04/03/2013 18:28", "destClass:" : "DataCurator 03/28/2013 18:09", "is_aModule" : "DataCurator 10/02/2012 14:30", "methodDefined:rubyEnv:" : "DataCurator 10/02/2012 14:30", diff --git a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st index ea5bde5e1..2d01e68b9 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st @@ -1,5 +1,4 @@ *maglev-runtime -_singletonClass: envId | cls | self class == Module ifTrue: ["a class< Date: Wed, 3 Apr 2013 19:59:20 +0200 Subject: [PATCH 7/7] #291: some bootstrap fixes. --- .../Object.extension/instance/_singletonClass..st | 1 + .../Object.extension/instance/_singletonClassAllowedFor..st | 2 +- .../Object.extension/instance/_singletonClassFor..st | 3 ++- .../instance/addRubySingletonClassSecondLevel..st | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st index 2d01e68b9..595d8bc93 100644 --- a/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st +++ b/src/packages/Maglev.package/Object.extension/instance/_singletonClass..st @@ -1,4 +1,5 @@ *maglev-runtime +_singletonClass: envId | cls | self class == Module ifTrue: ["a class<