rewrote a few methods to use if/while instead of ifTrue:/whileTrue: in Collect.moo
This commit is contained in:
		| @ -80,11 +80,17 @@ class(#character) Symbol(String) | ||||
| 		(* TODO: make this a primitive for performance *) | ||||
|  | ||||
| 		(* convert a symbol to a string *) | ||||
| 		| size str | | ||||
| 		| size str i | | ||||
| 		size := self basicSize. | ||||
| 		str := String basicNew: size. | ||||
| 		 | ||||
| 		0 priorTo: size do: [:i | str at: i put: (self at: i) ]. | ||||
|  | ||||
| 		##0 priorTo: size do: [:i | str at: i put: (self at: i) ]. | ||||
| 		i := 0. | ||||
| 		while (i < size)  | ||||
| 		{  | ||||
| 			str at: i put: (self at: i). | ||||
| 			i := i + 1 | ||||
| 		}. | ||||
| 		^str. | ||||
| 	} | ||||
|  | ||||
| @ -136,7 +142,7 @@ class Set(Collection) | ||||
|  | ||||
| 	method initialize: size | ||||
| 	{ | ||||
| 		(size <= 0) ifTrue: [size := 2]. | ||||
| 		if (size <= 0) { size := 2 }. | ||||
| 		self.tally := 0. | ||||
| 		self.bucket := Array new: size. | ||||
| 	} | ||||
| @ -155,11 +161,12 @@ class Set(Collection) | ||||
| 		newbuc := Array new: newsz. | ||||
| 		0 priorTo: bs do: [:i | | ||||
| 			ass := self.bucket at: i. | ||||
| 			(ass notNil) ifTrue: [ | ||||
| 			if (ass notNil)  | ||||
| 			{ | ||||
| 				index := (ass key hash) rem: newsz. | ||||
| 				[(newbuc at: index) notNil] whileTrue: [index := (index + 1) rem: newsz]. | ||||
| 				while ((newbuc at: index) notNil)  { index := (index + 1) rem: newsz }. | ||||
| 				newbuc at: index put: ass | ||||
| 			] | ||||
| 			}. | ||||
| 		]. | ||||
|  | ||||
| 		^newbuc. | ||||
| @ -174,15 +181,16 @@ class Set(Collection) | ||||
| 		hv := key hash. | ||||
| 		index := hv rem: bs. | ||||
|  | ||||
| 		[(ass := self.bucket at: index) notNil]  | ||||
| 			whileTrue: [ | ||||
| 				(key = ass key) ifTrue: [ | ||||
| 					(* found *) | ||||
| 					upsert ifTrue: [ass value: value]. | ||||
| 					^ass | ||||
| 				]. | ||||
| 				index := (index + 1) rem: bs. | ||||
| 			]. | ||||
| 		while ((ass := self.bucket at: index) notNil) | ||||
| 		{ | ||||
| 			if (key = ass key) | ||||
| 			{ | ||||
| 				(* found *) | ||||
| 				if (upsert) { ass value: value }. | ||||
| 				^ass | ||||
| 			}. | ||||
| 			index := (index + 1) rem: bs. | ||||
| 		}. | ||||
|  | ||||
| 		##upsert ifFalse: [^ErrorCode.NOENT]. | ||||
| 		if (upsert) {} else { ^ErrorCode.NOENT }. | ||||
| @ -193,7 +201,7 @@ class Set(Collection) | ||||
| 			self.bucket := self __make_expanded_bucket: bs. | ||||
| 			bs := self.bucket size. | ||||
| 			index := hv rem: bs. | ||||
| 			[(self.bucket at: index) notNil] whileTrue: [index := (index + 1) rem: bs ]. | ||||
| 			while ((self.bucket at: index) notNil) { index := (index + 1) rem: bs }. | ||||
| 		}. | ||||
| 		 | ||||
| 		ass := Association key: key value: value. | ||||
| @ -215,16 +223,16 @@ class Set(Collection) | ||||
| 		hv := key hash. | ||||
| 		index := hv rem: bs. | ||||
|  | ||||
| 		[(ass := self.bucket at: index) notNil]  | ||||
| 			whileTrue: [ | ||||
| 				(key = ass key) ifTrue: [ | ||||
| 					(* found *) | ||||
| 					self.bucket at: index put: assoc. | ||||
| 					##^assoc. | ||||
| 					^self. | ||||
| 				]. | ||||
| 				index := (index + 1) rem: bs. | ||||
| 			]. | ||||
| 		while ((ass := self.bucket at: index) notNil) | ||||
| 		{ | ||||
| 			if (key = ass key)  | ||||
| 			{ | ||||
| 				(* found *) | ||||
| 				self.bucket at: index put: assoc. | ||||
| 				^self. ## it must return self for the instructions generated by the compiler. | ||||
| 			}. | ||||
| 			index := (index + 1) rem: bs. | ||||
| 		}. | ||||
|  | ||||
| 		(* not found *) | ||||
| 		ntally := self.tally + 1. | ||||
| @ -233,21 +241,20 @@ class Set(Collection) | ||||
| 			self.bucket := self __make_expanded_bucket: bs. | ||||
| 			bs := self.bucket size. | ||||
| 			index := hv rem: bs. | ||||
| 			[(self.bucket at: index) notNil] whileTrue: [index := (index + 1) rem: bs ]. | ||||
| 			while ((self.bucket at: index) notNil) { index := (index + 1) rem: bs }. | ||||
| 		}. | ||||
|  | ||||
| 		self.tally := ntally. | ||||
| 		self.bucket at: index put: assoc. | ||||
| 		 | ||||
| 		##^assoc. | ||||
| 		^self. | ||||
|  | ||||
| 		^self. ## it must return self for the instructions generated by the compiler. | ||||
| 	} | ||||
| 	 | ||||
| 	method at: key | ||||
| 	{ | ||||
| 		| ass | | ||||
| 		ass := self __find: key or_upsert: false with: nil. | ||||
| 		(ass isError) ifTrue: [^ass]. | ||||
| 		if (ass isError) { ^ass }. | ||||
| 		^ass value | ||||
| 	} | ||||
|  | ||||
| @ -255,7 +262,7 @@ class Set(Collection) | ||||
| 	{ | ||||
| 		| ass | | ||||
| 		ass := self __find: key or_upsert: false with: nil. | ||||
| 		(ass isError) ifTrue: [^error_block value]. | ||||
| 		if (ass isError)  { ^error_block value }. | ||||
| 		^ass value | ||||
| 	} | ||||
|  | ||||
| @ -268,7 +275,7 @@ class Set(Collection) | ||||
| 	{ | ||||
| 		| ass | | ||||
| 		ass := self __find: (assoc key) or_upsert: false with: nil. | ||||
| 		(ass isError) ifTrue: [^error_block value]. | ||||
| 		if (ass isError) { ^error_block value }. | ||||
| 		^ass | ||||
| 	} | ||||
|  | ||||
| @ -306,11 +313,11 @@ class Set(Collection) | ||||
| 		bs := self.bucket size. | ||||
| 		index := (key hash) rem: bs. | ||||
| 		 | ||||
| 		[(ass := self.bucket at: index) notNil]  | ||||
| 			whileTrue: [  | ||||
| 				(key = ass key) ifTrue: [^index]. | ||||
| 				index := (index + 1) rem: bs. | ||||
| 			]. | ||||
| 		while ((ass := self.bucket at: index) notNil) | ||||
| 		{ | ||||
| 			if (key = ass key) { ^index }. | ||||
| 			index := (index + 1) rem: bs. | ||||
| 		}. | ||||
|  | ||||
| 		^ErrorCode.NOENT. | ||||
| 	} | ||||
| @ -331,24 +338,25 @@ class Set(Collection) | ||||
| 			y := (y + 1) rem: bs. | ||||
|  | ||||
| 			ass := self.bucket at: i. | ||||
| 			(ass isNil) | ||||
| 				ifTrue: [  | ||||
| 					(* done. the slot at the current index is nil *) | ||||
| 					i := self.tally  | ||||
| 				] | ||||
| 				ifFalse: [ | ||||
| 					(* get the natural hash index *) | ||||
| 					z := (ass key hash) rem: bs. | ||||
| 			if (ass isNil) | ||||
| 			{ | ||||
| 				(* done. the slot at the current index is nil *) | ||||
| 				i := self.tally  | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				(* get the natural hash index *) | ||||
| 				z := (ass key hash) rem: bs. | ||||
|  | ||||
| 					(* move an element if necessary *) | ||||
| 					((y > x and: [(z <= x) or: [z > y]]) or:  | ||||
| 					[(y < x) and: [(z <= x) and: [z > y]]]) ifTrue: [ | ||||
| 						self.bucket at: x put: (self.bucket at: y). | ||||
| 						x := y. | ||||
| 					]. | ||||
| 				(* move an element if necessary *) | ||||
| 				if ((y > x and: [(z <= x) or: [z > y]]) or: [(y < x) and: [(z <= x) and: [z > y]]]) | ||||
| 				{ | ||||
| 					self.bucket at: x put: (self.bucket at: y). | ||||
| 					x := y. | ||||
| 				}. | ||||
|  | ||||
| 					i := i + 1 | ||||
| 				]. | ||||
| 				i := i + 1 | ||||
| 			}. | ||||
| 		]. | ||||
| 		 | ||||
| 		self.bucket at: x put: nil. | ||||
| @ -362,7 +370,7 @@ class Set(Collection) | ||||
| 	{ | ||||
| 		| index | | ||||
| 		index := self __find_index: key. | ||||
| 		(index isError) ifTrue: [ ^index ]. | ||||
| 		if (index isError) { ^index }. | ||||
| 		^self __remove_at: index. | ||||
| 	} | ||||
|  | ||||
| @ -370,11 +378,10 @@ class Set(Collection) | ||||
| 	{ | ||||
| 		| index | | ||||
| 		index := self __find_index: key. | ||||
| 		(index isError) ifTrue: [ ^error_block value ]. | ||||
| 		if (index isError) { ^error_block value }. | ||||
| 		^self __remove_at: index. | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	method removeAllKeys | ||||
| 	{ | ||||
| 		(* remove all items from a dictionary *) | ||||
| @ -408,7 +415,7 @@ class Set(Collection) | ||||
| 		bs := self.bucket size. | ||||
| 		0 priorTo: bs by: 1 do: [:i | | ||||
| 			| ass | | ||||
| 			(ass := self.bucket at: i) notNil ifTrue: [block value: ass value] | ||||
| 			if ((ass := self.bucket at: i) notNil) { block value: ass value }. | ||||
| 		]. | ||||
| 	} | ||||
| 	 | ||||
| @ -418,7 +425,7 @@ class Set(Collection) | ||||
| 		bs := self.bucket size. | ||||
| 		0 priorTo: bs by: 1 do: [:i | | ||||
| 			| ass | | ||||
| 			(ass := self.bucket at: i) notNil ifTrue: [block value: ass key] | ||||
| 			if ((ass := self.bucket at: i) notNil) { block value: ass key }. | ||||
| 		]. | ||||
| 	} | ||||
|  | ||||
| @ -428,7 +435,7 @@ class Set(Collection) | ||||
| 		bs := self.bucket size. | ||||
| 		0 priorTo: bs by: 1 do: [:i | | ||||
| 			| ass | | ||||
| 			(ass := self.bucket at: i) notNil ifTrue: [block value: ass key value: ass value] | ||||
| 			if ((ass := self.bucket at: i) notNil)  { block value: ass key value: ass value }. | ||||
| 		].	 | ||||
| 	} | ||||
| } | ||||
| @ -523,13 +530,13 @@ class SystemDictionary(Dictionary) | ||||
|  | ||||
| 	method at: key | ||||
| 	{ | ||||
| 		(key class ~= Symbol) ifTrue: [InvalidArgumentException signal: 'key is not a symbol']. | ||||
| 		if (key class ~= Symbol) { InvalidArgumentException signal: 'key is not a symbol' }. | ||||
| 		^super at: key. | ||||
| 	} | ||||
| 	 | ||||
| 	method at: key put: value | ||||
| 	{ | ||||
| 		(key class ~= Symbol) ifTrue: [InvalidArgumentException signal: 'key is not a symbol']. | ||||
| 		if (key class ~= Symbol) { InvalidArgumentException signal: 'key is not a symbol' }. | ||||
| 		^super at: key put: value | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -308,6 +308,7 @@ class MyObject(Object) | ||||
| 		(*a removeKey: 'bbb'. | ||||
| 		a remove: :(#bbb).*) | ||||
| 		 | ||||
| 		1 to: 100 do: [ :i | a at: i put: (i * 2) ]. | ||||
| 		a keysAndValuesDo: [:k :v | | ||||
| 			k dump. | ||||
| 			v dump. | ||||
|  | ||||
| @ -4141,7 +4141,10 @@ static int compile_dictionary_expression (moo_t* moo) | ||||
|  | ||||
| 				x.ptr = msg; | ||||
| 				x.len = 11; | ||||
| 			/* if the method returns self, i don't need DUP_STACKTOP and POP_STACKTOP  | ||||
| 				/* [ATTENTION]  | ||||
| 				 *  if the method returns self, i don't need DUP_STACKTOP and POP_STACKTOP. | ||||
| 				 *  if the method retruns something else, DUP_STACKTOP and POP_STACKTOP is needed | ||||
| 				 *  to emulate message cascading. | ||||
| 				if (emit_byte_instruction (moo, BCODE_DUP_STACKTOP) <= -1 || | ||||
| 				    compile_association_expression(moo) <= -1 || | ||||
| 				    add_symbol_literal(moo, &x, 0, &si) <= -1 || | ||||
|  | ||||
		Reference in New Issue
	
	Block a user