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