Browse Source

nil is put into 'boolean' fastBucket

Fastbucket 'boolean' is now more the 'well known constants' one,
keeping name from typeof of false and true.
Herbert Vojčík 11 năm trước cách đây
mục cha
commit
c4d60104c7
2 tập tin đã thay đổi với 25 bổ sung15 xóa
  1. 14 9
      js/Kernel-Collections.js
  2. 11 6
      st/Kernel-Collections.st

+ 14 - 9
js/Kernel-Collections.js

@@ -5410,15 +5410,19 @@ return smalltalk.withContext(function($ctx1) {
 
 		var type, bucket, prim = anObject == null ? (anObject = nil) : anObject.valueOf();
 		if ((type = typeof prim) === "object") {
-			bucket = anObject === nil ? nil : self._hashBucketOfElement_(anObject);
-			if (bucket === nil) bucket = self['@defaultBucket'];
-			return [ anObject, null, bucket ];
+			if (anObject !== nil) {
+				return [ anObject, null, self._hashBucketOfElement_(anObject) || self['@defaultBucket'] ];
+			}
+			
+			// include nil to well-knowns under 'boolean' fastBucket
+			prim = null;
+			type = 'boolean';
 		}
 		return [ prim, self['@fastBuckets'][type] ];
 	;
 return self}, function($ctx1) {$ctx1.fill(self,"bucketOfElement:",{anObject:anObject},smalltalk.Set)})},
 args: ["anObject"],
-source: "bucketOfElement: anObject\x0a\x09<\x0a\x09\x09var type, bucket, prim = anObject == null ? (anObject = nil) : anObject.valueOf();\x0a\x09\x09if ((type = typeof prim) === \x22object\x22) {\x0a\x09\x09\x09bucket = anObject === nil ? nil : self._hashBucketOfElement_(anObject);\x0a\x09\x09\x09if (bucket === nil) bucket = self['@defaultBucket'];\x0a\x09\x09\x09return [ anObject, null, bucket ];\x0a\x09\x09}\x0a\x09\x09return [ prim, self['@fastBuckets'][type] ];\x0a\x09>",
+source: "bucketOfElement: anObject\x0a\x09<\x0a\x09\x09var type, bucket, prim = anObject == null ? (anObject = nil) : anObject.valueOf();\x0a\x09\x09if ((type = typeof prim) === \x22object\x22) {\x0a\x09\x09\x09if (anObject !== nil) {\x0a\x09\x09\x09\x09return [ anObject, null, self._hashBucketOfElement_(anObject) || self['@defaultBucket'] ];\x0a\x09\x09\x09}\x0a\x09\x09\x09\x0a\x09\x09\x09// include nil to well-knowns under 'boolean' fastBucket\x0a\x09\x09\x09prim = null;\x0a\x09\x09\x09type = 'boolean';\x0a\x09\x09}\x0a\x09\x09return [ prim, self['@fastBuckets'][type] ];\x0a\x09>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -5514,8 +5518,9 @@ fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 
-		var hash = anObject.constructor ? anObject.constructor.name : nil;
-		if (hash === nil) return nil;
+		var ctr = anObject.constructor,
+			hash = ctr && ctr.name;
+		if (!hash) return null;
 		var el = self['@slowBuckets'],
 			bucket = el[hash];
 		if (!bucket) { bucket = el[hash] = []; }
@@ -5523,7 +5528,7 @@ return smalltalk.withContext(function($ctx1) {
 	;
 return self}, function($ctx1) {$ctx1.fill(self,"hashBucketOfElement:",{anObject:anObject},smalltalk.Set)})},
 args: ["anObject"],
-source: "hashBucketOfElement: anObject\x0a\x09<\x0a\x09\x09var hash = anObject.constructor ? anObject.constructor.name : nil;\x0a\x09\x09if (hash === nil) return nil;\x0a\x09\x09var el = self['@slowBuckets'],\x0a\x09\x09\x09bucket = el[hash];\x0a\x09\x09if (!bucket) { bucket = el[hash] = []; }\x0a\x09\x09return bucket;\x0a\x09>",
+source: "hashBucketOfElement: anObject\x0a\x09<\x0a\x09\x09var ctr = anObject.constructor,\x0a\x09\x09\x09hash = ctr && ctr.name;\x0a\x09\x09if (!hash) return null;\x0a\x09\x09var el = self['@slowBuckets'],\x0a\x09\x09\x09bucket = el[hash];\x0a\x09\x09if (!bucket) { bucket = el[hash] = []; }\x0a\x09\x09return bucket;\x0a\x09>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -5687,7 +5692,7 @@ return smalltalk.withContext(function($ctx1) {
 
 		self['@slowBuckets'] = Object.create(null);
 		self['@fastBuckets'] = {
-			'boolean': { store: Object.create(null), fn: function (x) { return x === 'true'; } },
+			'boolean': { store: Object.create(null), fn: function (x) { return {'true': true, 'false': false, 'null': null}[x]; } },
 			'number': { store: Object.create(null), fn: Number },
 			'string': { store: Object.create(null) }
 		};
@@ -5696,7 +5701,7 @@ return smalltalk.withContext(function($ctx1) {
 	;
 return self}, function($ctx1) {$ctx1.fill(self,"removeAll",{},smalltalk.Set)})},
 args: [],
-source: "removeAll\x0a\x09<\x0a\x09\x09self['@slowBuckets'] = Object.create(null);\x0a\x09\x09self['@fastBuckets'] = {\x0a\x09\x09\x09'boolean': { store: Object.create(null), fn: function (x) { return x === 'true'; } },\x0a\x09\x09\x09'number': { store: Object.create(null), fn: Number },\x0a\x09\x09\x09'string': { store: Object.create(null) }\x0a\x09\x09};\x0a\x09\x09self['@defaultBucket']._removeAll();\x0a\x09\x09self['@size'] = 0;\x0a\x09>",
+source: "removeAll\x0a\x09<\x0a\x09\x09self['@slowBuckets'] = Object.create(null);\x0a\x09\x09self['@fastBuckets'] = {\x0a\x09\x09\x09'boolean': { store: Object.create(null), fn: function (x) { return {'true': true, 'false': false, 'null': null}[x]; } },\x0a\x09\x09\x09'number': { store: Object.create(null), fn: Number },\x0a\x09\x09\x09'string': { store: Object.create(null) }\x0a\x09\x09};\x0a\x09\x09self['@defaultBucket']._removeAll();\x0a\x09\x09self['@size'] = 0;\x0a\x09>",
 messageSends: [],
 referencedClasses: []
 }),

+ 11 - 6
st/Kernel-Collections.st

@@ -1770,7 +1770,7 @@ removeAll
 	<
 		self['@slowBuckets'] = Object.create(null);
 		self['@fastBuckets'] = {
-			'boolean': { store: Object.create(null), fn: function (x) { return x === 'true'; } },
+			'boolean': { store: Object.create(null), fn: function (x) { return {'true': true, 'false': false, 'null': null}[x]; } },
 			'number': { store: Object.create(null), fn: Number },
 			'string': { store: Object.create(null) }
 		};
@@ -1862,9 +1862,13 @@ bucketOfElement: anObject
 	<
 		var type, bucket, prim = anObject == null ? (anObject = nil) : anObject.valueOf();
 		if ((type = typeof prim) === "object") {
-			bucket = anObject === nil ? nil : self._hashBucketOfElement_(anObject);
-			if (bucket === nil) bucket = self['@defaultBucket'];
-			return [ anObject, null, bucket ];
+			if (anObject !!== nil) {
+				return [ anObject, null, self._hashBucketOfElement_(anObject) || self['@defaultBucket'] ];
+			}
+			
+			// include nil to well-knowns under 'boolean' fastBucket
+			prim = null;
+			type = 'boolean';
 		}
 		return [ prim, self['@fastBuckets'][type] ];
 	>
@@ -1872,8 +1876,9 @@ bucketOfElement: anObject
 
 hashBucketOfElement: anObject
 	<
-		var hash = anObject.constructor ? anObject.constructor.name : nil;
-		if (hash === nil) return nil;
+		var ctr = anObject.constructor,
+			hash = ctr && ctr.name;
+		if (!!hash) return null;
 		var el = self['@slowBuckets'],
 			bucket = el[hash];
 		if (!!bucket) { bucket = el[hash] = []; }