Selaa lähdekoodia

kernel: Different ivar setting.

Herby Vojčík 5 vuotta sitten
vanhempi
commit
da05485079

+ 1 - 1
cli/src/AmberCli.js

@@ -1739,7 +1739,7 @@ messageSends: ["log:"]
 $globals.FileServer);
 
 
-$globals.FileServer.a$cls.iVarNames = ["mimeTypes"];
+$core.setInstanceVariables($globals.FileServer.a$cls, ["mimeTypes"]);
 $core.addMethod(
 $core.method({
 selector: "commandLineSwitches",

+ 37 - 8
lang/base/kernel-language.js

@@ -310,6 +310,29 @@ define(function () {
             emit.behaviorMethodRemoved(method, this);
         });
 
+        function setInstanceVariables (klass, instanceVariableNames) {
+            instanceVariableNames.forEach(function (name) {
+                if (!name.match(/^[a-zA-Z][a-zA-Z0-9]*$/))
+                    throw new Error("Wrong identifier name: " + name);
+            });
+
+            klass.instanceVariableNames = instanceVariableNames;
+        }
+
+        st.setInstanceVariables = setInstanceVariables;
+
+        // TODO remove, .iVarNames backward compatibility
+        Object.defineProperty(SmalltalkBehavior.prototype, "iVarNames", {
+            enumerable: true,
+            configurable: true,
+            get: function () {
+                return this.instanceVariableNames;
+            },
+            set: function (instanceVariableNames) {
+                setInstanceVariables(this, instanceVariableNames);
+            }
+        });
+
         this.bootstrapHierarchy = function () {
             var nilSubclasses = [globals.ProtoObject];
             nilAsClass.a$cls = globals.Class;
@@ -324,7 +347,7 @@ define(function () {
          should be added to the system, see smalltalk.addClass().
          Superclass linking is *not* handled here, see api.initialize()  */
 
-        function classBuilder (className, superclass, iVarNames, fn) {
+        function classBuilder (className, superclass, fn) {
             var logicalSuperclass = superclass;
             if (superclass == null || superclass.a$nil) {
                 superclass = nilAsClass;
@@ -337,7 +360,7 @@ define(function () {
                 that.superclass = logicalSuperclass;
                 that.fn = fn || inherits(function () {
                     }, superclass.fn);
-                that.iVarNames = iVarNames || [];
+                that.instanceVariableNames = [];
 
                 that.name = className;
                 that.subclasses = [];
@@ -352,7 +375,7 @@ define(function () {
                 that.superclass = superclass.a$cls;
                 that.fn = inherits(function () {
                 }, that.superclass.fn);
-                that.iVarNames = [];
+                that.instanceVariableNames = [];
 
                 that.instanceClass = new that.fn();
 
@@ -365,9 +388,8 @@ define(function () {
                 name: className,
                 make: klass,
                 updateExisting: function (klass) {
-                    if (klass.superclass == logicalSuperclass && (!fn || fn === klass.fn)) {
-                        if (iVarNames) klass.iVarNames = iVarNames;
-                    } else throw new Error("Incompatible change of class: " + klass.name);
+                    if (klass.superclass != logicalSuperclass || fn && fn !== klass.fn)
+                        throw new Error("Incompatible change of class: " + klass.name);
                 }
             };
         }
@@ -384,13 +406,20 @@ define(function () {
         /* Add a class to the system, creating a new one if needed.
          A Package is lazily created if one with given name does not exist. */
 
-        st.addClass = function (className, superclass, iVarNames, category) {
+        st.addClass = function (className, superclass, category) {
+            // TODO remove, backward compatibility
+            if (arguments[3]) {
+                var added = st.addClass(className, superclass, arguments[3]);
+                setInstanceVariables(added, category);
+                return added;
+            }
+
             // While subclassing nil is allowed, it might be an error, so
             // warn about it.
             if (typeof superclass === 'undefined' || superclass && superclass.a$nil) {
                 console.warn('Compiling ' + className + ' as a subclass of `nil`. A dependency might be missing.');
             }
-            return buildTraitOrClass(category, classBuilder(className, superclass, iVarNames, coreFns[className]));
+            return buildTraitOrClass(category, classBuilder(className, superclass, coreFns[className]));
         };
 
         st.removeClass = removeTraitOrClass;

+ 1 - 1
lang/src/Kernel-Announcements.js

@@ -544,7 +544,7 @@ $core.addClass("SystemAnnouncer", $globals.Announcer, [], "Kernel-Announcements"
 $globals.SystemAnnouncer.comment="My unique instance is the global announcer handling all Amber system-related announces.\x0a\x0a## API\x0a\x0aAccess to the unique instance is done via `#current`";
 //>>excludeEnd("ide");
 
-$globals.SystemAnnouncer.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.SystemAnnouncer.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "current",

+ 6 - 6
lang/src/Kernel-Classes.js

@@ -377,7 +377,7 @@ var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-return self.iVarNames;
+return self.instanceVariableNames;
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"instanceVariableNames",{},$globals.Behavior)});
@@ -385,7 +385,7 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "instanceVariableNames\x0a\x09<inlineJS: 'return self.iVarNames'>",
+source: "instanceVariableNames\x0a\x09<inlineJS: 'return self.instanceVariableNames'>",
 referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: []
@@ -1374,7 +1374,7 @@ $1=$recv(aClass)._isMetaclass();
 if(!$core.assert($1)){
 $self._error_($recv($recv(aClass)._name()).__comma(" is not a metaclass"));
 }
-$recv(aClass)._basicAt_put_("iVarNames",aCollection);
+$recv($recv($globals.Smalltalk)._core())._setInstanceVariables_to_(aClass,aCollection);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"basicClass:instanceVariables:",{aClass:aClass,aCollection:aCollection},$globals.ClassBuilder)});
@@ -1382,10 +1382,10 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aClass", "aCollection"],
-source: "basicClass: aClass instanceVariables: aCollection\x0a\x0a\x09aClass isMetaclass ifFalse: [ self error: aClass name, ' is not a metaclass' ].\x0a\x09aClass basicAt: 'iVarNames' put: aCollection",
-referencedClasses: [],
+source: "basicClass: aClass instanceVariables: aCollection\x0a\x0a\x09aClass isMetaclass ifFalse: [ self error: aClass name, ' is not a metaclass' ].\x0a\x09Smalltalk core setInstanceVariables: aClass to: aCollection",
+referencedClasses: ["Smalltalk"],
 //>>excludeEnd("ide");
-messageSends: ["ifFalse:", "isMetaclass", "error:", ",", "name", "basicAt:put:"]
+messageSends: ["ifFalse:", "isMetaclass", "error:", ",", "name", "setInstanceVariables:to:", "core"]
 }),
 $globals.ClassBuilder);
 

+ 2 - 2
lang/src/Kernel-Classes.st

@@ -53,7 +53,7 @@ basicOrganization: aClassOrganizer
 !
 
 instanceVariableNames
-	<inlineJS: 'return self.iVarNames'>
+	<inlineJS: 'return self.instanceVariableNames'>
 !
 
 javascriptConstructor
@@ -489,7 +489,7 @@ basicAddTraitNamed: aString package: anotherString
 basicClass: aClass instanceVariables: aCollection
 
 	aClass isMetaclass ifFalse: [ self error: aClass name, ' is not a metaclass' ].
-	aClass basicAt: 'iVarNames' put: aCollection
+	Smalltalk core setInstanceVariables: aClass to: aCollection
 !
 
 basicRemoveClass: aClass

+ 3 - 3
lang/src/Kernel-Infrastructure.js

@@ -2270,7 +2270,7 @@ messageSends: ["do:", "ifFalse:", "isString", "respondsTo:", "error:", "&", "key
 $globals.Package);
 
 
-$globals.Package.a$cls.iVarNames = ["defaultCommitPathJs", "defaultCommitPathSt"];
+$core.setInstanceVariables($globals.Package.a$cls, ["defaultCommitPathJs", "defaultCommitPathSt"]);
 $core.addMethod(
 $core.method({
 selector: "named:",
@@ -2700,7 +2700,7 @@ messageSends: ["ifNotNil:", "package", "beDirty"]
 $globals.PackageStateObserver);
 
 
-$globals.PackageStateObserver.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.PackageStateObserver.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "current",
@@ -4104,7 +4104,7 @@ messageSends: []
 $globals.SmalltalkImage);
 
 
-$globals.SmalltalkImage.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.SmalltalkImage.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "current",

+ 1 - 1
lang/src/Kernel-Methods.js

@@ -1472,7 +1472,7 @@ messageSends: []
 $globals.ForkPool);
 
 
-$globals.ForkPool.a$cls.iVarNames = ["default"];
+$core.setInstanceVariables($globals.ForkPool.a$cls, ["default"]);
 $core.addMethod(
 $core.method({
 selector: "default",

+ 3 - 3
lang/src/Platform-ImportExport.js

@@ -1220,7 +1220,7 @@ $4=$recv($recv(aClass)._theMetaClass())._asJavaScriptSource();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx2.sendIdx["asJavaScriptSource"]=1;
 //>>excludeEnd("ctx");
-$3=[$4,".iVarNames = ",$recv(classIvars)._asJavaScriptSource(),";"];
+$3=["$core.setInstanceVariables(",$4,", ",$recv(classIvars)._asJavaScriptSource(),");"];
 $recv(aStream)._write_($3);
 return $recv(aStream)._lf();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -1234,7 +1234,7 @@ return self;
 },
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: ["aClass", "aStream"],
-source: "exportMetaDefinitionOf: aClass on: aStream\x0a\x09aStream lf.\x0a\x09aClass theMetaClass instanceVariableNames ifNotEmpty: [ :classIvars | aStream\x0a\x09\x09write: { aClass theMetaClass asJavaScriptSource. '.iVarNames = '. classIvars asJavaScriptSource. ';' };\x0a\x09\x09lf ]",
+source: "exportMetaDefinitionOf: aClass on: aStream\x0a\x09aStream lf.\x0a\x09aClass theMetaClass instanceVariableNames ifNotEmpty: [ :classIvars | aStream\x0a\x09\x09write: { '$core.setInstanceVariables('. aClass theMetaClass asJavaScriptSource. ', '. classIvars asJavaScriptSource. ');' };\x0a\x09\x09lf ]",
 referencedClasses: [],
 //>>excludeEnd("ide");
 messageSends: ["lf", "ifNotEmpty:", "instanceVariableNames", "theMetaClass", "write:", "asJavaScriptSource"]
@@ -3916,7 +3916,7 @@ messageSends: ["type", "class"]
 $globals.PackageTransport);
 
 
-$globals.PackageTransport.a$cls.iVarNames = ["registry"];
+$core.setInstanceVariables($globals.PackageTransport.a$cls, ["registry"]);
 $core.addMethod(
 $core.method({
 selector: "classRegisteredFor:",

+ 1 - 1
lang/src/Platform-ImportExport.st

@@ -329,7 +329,7 @@ exportDefinitionOf: aClass on: aStream
 exportMetaDefinitionOf: aClass on: aStream
 	aStream lf.
 	aClass theMetaClass instanceVariableNames ifNotEmpty: [ :classIvars | aStream
-		write: { aClass theMetaClass asJavaScriptSource. '.iVarNames = '. classIvars asJavaScriptSource. ';' };
+		write: { '$core.setInstanceVariables('. aClass theMetaClass asJavaScriptSource. ', '. classIvars asJavaScriptSource. ');' };
 		lf ]
 !
 

+ 3 - 3
lang/src/Platform-Services.js

@@ -162,7 +162,7 @@ messageSends: ["ifNotNil:", "home", "logContext:"]
 $globals.ConsoleErrorHandler);
 
 
-$globals.ConsoleErrorHandler.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.ConsoleErrorHandler.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "initialize",
@@ -1292,7 +1292,7 @@ messageSends: ["do:"]
 $globals.NullProgressHandler);
 
 
-$globals.NullProgressHandler.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.NullProgressHandler.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "initialize",
@@ -1323,7 +1323,7 @@ $core.addClass("Service", $globals.Object, [], "Platform-Services");
 $globals.Service.comment="I implement the basic behavior for class registration to a service.\x0a\x0aSee the `Transcript` class for a concrete service.\x0a\x0a## API\x0a\x0aUse class-side methods `#register:` and `#registerIfNone:` to register classes to a specific service.";
 //>>excludeEnd("ide");
 
-$globals.Service.a$cls.iVarNames = ["current"];
+$core.setInstanceVariables($globals.Service.a$cls, ["current"]);
 $core.addMethod(
 $core.method({
 selector: "current",