fixed a compiler bug in compile_expression_primary. before the fix, the compiler could treat an undotted identifier as dotted.
changed a few primitive function names in sck.c wrote some methods for ByteStream
This commit is contained in:
		| @ -128,9 +128,9 @@ class HttpSocket(SyncSocket) | ||||
| 'IM RUNNING SERVICE...............' dump. | ||||
| 	 | ||||
| 		(* | ||||
| 		self readBytes: buf. | ||||
| 		self readBytesInto: buf. | ||||
| 		buf dump. | ||||
| 		self readBytes: buf. | ||||
| 		self readBytesInto: buf. | ||||
| 		buf dump. | ||||
| 		*) | ||||
|  | ||||
| @ -317,7 +317,7 @@ class MyObject(Object) | ||||
| 				| nbytes | | ||||
| 				while (true) | ||||
| 				{ | ||||
| 					nbytes := csck readBytes: buf.  | ||||
| 					nbytes := csck readBytesInto: buf.  | ||||
| 					if (nbytes <= 0) | ||||
| 					{ | ||||
| 						if (nbytes == 0) { csck close }. | ||||
| @ -326,11 +326,11 @@ class MyObject(Object) | ||||
| 					}. | ||||
|  | ||||
| 					buf dump. | ||||
| 					csck writeBytes: buf offset: 0 length: nbytes. | ||||
| 					csck writeBytesFrom: buf offset: 0 length: nbytes. | ||||
| 				}. | ||||
| 			]. | ||||
| 			clisck onEvent: #data_out do: [ :csck | | ||||
| 				##csck writeBytes: #[ $a, $b, C'\n' ]. | ||||
| 				##csck writeBytesFrom: #[ $a, $b, C'\n' ]. | ||||
| 			]. | ||||
| 			clisck onEvent: #closed do: [ :csck | | ||||
| 				'Socket CLOSED....' dump. | ||||
| @ -353,8 +353,8 @@ class MyObject(Object) | ||||
| 		s onEvent: #connected do: [ :sck :state | | ||||
| 			if (state) | ||||
| 			{ | ||||
| 				s writeBytes: #[ $a, $b, $c ]. | ||||
| 				s writeBytes: #[ $d, $e, $f ]. | ||||
| 				s writeBytesFrom: #[ $a, $b, $c ]. | ||||
| 				s writeBytesFrom: #[ $d, $e, $f ]. | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| @ -366,7 +366,7 @@ class MyObject(Object) | ||||
| 			| nbytes | | ||||
| 			while (true) | ||||
| 			{ | ||||
| 				nbytes := sck readBytes: buf.  | ||||
| 				nbytes := sck readBytesInto: buf.  | ||||
| 				if (nbytes <= 0)  | ||||
| 				{ | ||||
| 					if (nbytes == 0) { sck close }. | ||||
| @ -377,7 +377,7 @@ class MyObject(Object) | ||||
| 			}. | ||||
| 		]. | ||||
| 		s onEvent: #data_out do: [ :sck | | ||||
| 			if (count < 10) { sck writeBytes: #[ $a, $b, C'\n' ]. count := count + 1. }. | ||||
| 			if (count < 10) { sck writeBytesFrom: #[ $a, $b, C'\n' ]. count := count + 1. }. | ||||
| 		]. | ||||
|  | ||||
| 		s connect: (SocketAddress fromString: '127.0.0.1:9999'). | ||||
|  | ||||
| @ -243,18 +243,18 @@ class Socket(Object) from 'sck' | ||||
| 	method(#primitive) _connect: addr. | ||||
| 	method(#primitive) _socketError. | ||||
|  | ||||
| 	method(#primitive) _readBytes: bytes. | ||||
| 	method(#primitive) _readBytes: bytes offset: offset length: length. | ||||
| 	method(#primitive) _writeBytes: bytes. | ||||
| 	method(#primitive) _writeBytes: bytes offset: offset length: length. | ||||
| 	method(#primitive) _readBytesInto: bytes. | ||||
| 	method(#primitive) _readBytesInto: bytes offset: offset length: length. | ||||
| 	method(#primitive) _writeBytesFrom: bytes. | ||||
| 	method(#primitive) _writeBytesFrom: bytes offset: offset length: length. | ||||
|  | ||||
| 	method(#class) new { self messageProhibited: #new } | ||||
| 	method(#class) new: size { self messageProhibited: #new: } | ||||
|  | ||||
| 	method(#class) __with: handle | ||||
| 	method(#class) __with_handle: handle | ||||
| 	{ | ||||
| 		###self addToBeFinalized. | ||||
| 		^(self basicNew initialize) __open(handle) | ||||
| 		^(super new) __open(handle) | ||||
| 	} | ||||
|  | ||||
| 	method(#class) family: family type: type | ||||
| @ -263,7 +263,7 @@ class Socket(Object) from 'sck' | ||||
|  | ||||
| 		## new is prohibited. so use _basicNew with initialize. | ||||
| 		##^(self new) open(family, type, 0) | ||||
| 		^(self basicNew initialize) open(family, type, 0) | ||||
| 		^(super new) open(family, type, 0) | ||||
| 	} | ||||
|  | ||||
| 	method close | ||||
| @ -305,10 +305,11 @@ class SyncSocket(Socket) | ||||
| 	method(#class) new { self messageProhibited: #new } | ||||
| 	method(#class) new: size { self messageProhibited: #new: } | ||||
|  | ||||
| 	method(#class) __with: handle | ||||
| (* | ||||
| 	method(#class) __with_handle: handle | ||||
| 	{ | ||||
| 		###self addToBeFinalized. | ||||
| 		^(self basicNew initialize) __open(handle) | ||||
| 		^(super new) __open(handle) | ||||
| 	} | ||||
|  | ||||
| 	method(#class) family: family type: type | ||||
| @ -317,8 +318,9 @@ class SyncSocket(Socket) | ||||
|  | ||||
| 		## new is prohibited. so use _basicNew with initialize. | ||||
| 		##^(self new) open(family, type, 0) | ||||
| 		^(self basicNew initialize) open(family, type, 0) | ||||
| 		^(super new) open(family, type, 0) | ||||
| 	} | ||||
| *) | ||||
|  | ||||
| 	method initialize | ||||
| 	{ | ||||
| @ -386,45 +388,45 @@ class SyncSocket(Socket) | ||||
| 		}. | ||||
| 	} | ||||
|  | ||||
| 	method readBytes: bytes | ||||
| 	method readBytesInto: bytes | ||||
| 	{ | ||||
| 		| n | | ||||
| 		while (true) | ||||
| 		{ | ||||
| 			n := super _readBytes: bytes. | ||||
| 			n := super _readBytesInto: bytes. | ||||
| 			if (n >= 0) { ^n }. | ||||
| 			self __wait_for_input. | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	method readBytes: bytes offset: offset length: length | ||||
| 	method readBytesInto: bytes offset: offset length: length | ||||
| 	{ | ||||
| 		| n | | ||||
| 		while (true) | ||||
| 		{ | ||||
| 			n := super _readBytes: bytes offset: offset length: length. | ||||
| 			n := super _readBytesInto: bytes offset: offset length: length. | ||||
| 			if (n >= 0) { ^n }. | ||||
| 			self __wait_for_input. | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	method writeBytes: bytes | ||||
| 	method writeBytesFrom: bytes | ||||
| 	{ | ||||
| 		| n | | ||||
| 		while (true) | ||||
| 		{ | ||||
| 			n := super _writeBytes: bytes. | ||||
| 			n := super _writeBytesFrom: bytes. | ||||
| 			if (n >= 0) { ^n }. | ||||
| 			self __wait_for_output. | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	method writeBytes: bytes offset: offset length: length | ||||
| 	method writeBytesFrom: bytes offset: offset length: length | ||||
| 	{ | ||||
| 		| n | | ||||
| 		while (true) | ||||
| 		{ | ||||
| 			n := super _writeBytes: bytes offset: offset length: length. | ||||
| 			n := super _writeBytesFrom: bytes offset: offset length: length. | ||||
| 			if (n >= 0) { ^n }. | ||||
| 			self __wait_for_output. | ||||
| 		} | ||||
| @ -467,7 +469,7 @@ class AsyncSocket(Socket) | ||||
|  | ||||
| 			while (rem > 0) | ||||
| 			{ | ||||
| 				nbytes := self _writeBytes: self.pending_bytes offset: pos length: rem. | ||||
| 				nbytes := self _writeBytesFrom: self.pending_bytes offset: pos length: rem. | ||||
| 				if (nbytes <= -1) { break }. | ||||
| 				pos := pos + nbytes. | ||||
| 				rem := rem - nbytes. | ||||
| @ -529,17 +531,17 @@ class AsyncSocket(Socket) | ||||
| 		thisProcess addAsyncSemaphore: self.outdonesem. | ||||
| 	} | ||||
|  | ||||
| 	method readBytes: bytes | ||||
| 	method readBytesInto: bytes | ||||
| 	{ | ||||
| 		^super _readBytes: bytes. | ||||
| 		^super _readBytesInto: bytes. | ||||
| 	} | ||||
|  | ||||
| 	method readBytes: bytes offset: offset length: length | ||||
| 	method readBytesInto: bytes offset: offset length: length | ||||
| 	{ | ||||
| 		^super _readBytes: bytes offset: offset length: length. | ||||
| 		^super _readBytesInto: bytes offset: offset length: length. | ||||
| 	} | ||||
|  | ||||
| 	method writeBytes: bytes offset: offset length: length | ||||
| 	method writeBytesFrom: bytes offset: offset length: length | ||||
| 	{ | ||||
| 		| n pos rem | | ||||
|  | ||||
| @ -557,7 +559,7 @@ class AsyncSocket(Socket) | ||||
|  | ||||
| 		while (rem > 0) | ||||
| 		{ | ||||
| 			n := self _writeBytes: bytes offset: pos length: rem. | ||||
| 			n := self _writeBytesFrom: bytes offset: pos length: rem. | ||||
| 			if (n <= -1)  { break }. | ||||
| 			rem := rem - n. | ||||
| 			pos := pos + n. | ||||
| @ -577,9 +579,9 @@ class AsyncSocket(Socket) | ||||
| 		self.outreadysem signalOnOutput: self.handle. | ||||
| 	} | ||||
|  | ||||
| 	method writeBytes: bytes | ||||
| 	method writeBytesFrom: bytes | ||||
| 	{ | ||||
| 		^self writeBytes: bytes offset: 0 length: (bytes size) | ||||
| 		^self writeBytesFrom: bytes offset: 0 length: (bytes size) | ||||
| 	} | ||||
|  | ||||
| 	##method onSocketClosed | ||||
| @ -674,7 +676,7 @@ class AsyncServerSocket(AsyncSocket) | ||||
| 			##if (fd >= 0) | ||||
| 			if (fd notNil) | ||||
| 			{ | ||||
| 				clisck := (self acceptedSocketClass) __with: fd. | ||||
| 				clisck := (self acceptedSocketClass) __with_handle: fd. | ||||
| 				clisck beWatched. | ||||
| 				self onSocketAccepted: clisck from: cliaddr. | ||||
| 			}. | ||||
| @ -743,7 +745,7 @@ class ListenerSocket(Socket) | ||||
| 			##if (fd >= 0) | ||||
| 			if (fd notNil) | ||||
| 			{ | ||||
| 				clisck := (self acceptedSocketClass) __with: fd. | ||||
| 				clisck := (self acceptedSocketClass) __with_handle: fd. | ||||
|  | ||||
| 				sg addSemaphore: self.inreadysem. | ||||
| 				self.inreadysem signalOnInput: self.handle. | ||||
|  | ||||
| @ -129,8 +129,8 @@ class ExternalStream(ReadWriteStream) | ||||
| ## mimic java's interface... | ||||
| interface ByteStreamable | ||||
| { | ||||
| 	readBytes: | ||||
| 	writeBytes: | ||||
| 	readBytesInto: | ||||
| 	writeBytesFrom: | ||||
| } | ||||
| *) | ||||
|  | ||||
| @ -173,7 +173,7 @@ difficulty: how to ensure that the class implements the defined interface? | ||||
| Let me think about it.. | ||||
| *)  | ||||
|  | ||||
| class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| class ByteStreamAdapter(Object) ### [ByteStreamable, ByteXXX] | ||||
| { | ||||
| 	var bsobj. | ||||
| 	var inbuf. | ||||
| @ -181,6 +181,10 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 	var inlen. | ||||
| 	var indown. | ||||
|  | ||||
| 	var outbuf. | ||||
| 	var outlen. | ||||
| 	var outdown. | ||||
|  | ||||
| 	method(#class) new | ||||
| 	{ | ||||
| 		self messageProhibited: #new. | ||||
| @ -195,10 +199,15 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 	{ | ||||
| 		super initialize. | ||||
| 		self.bsobj := nil. | ||||
|  | ||||
| 		self.inbuf := ByteArray new: 1024. | ||||
| 		self.inpos := 0. | ||||
| 		self.inlen := 0. | ||||
| 		self.indown := false. | ||||
|  | ||||
| 		self.outbuf := ByteArray new: 1024. | ||||
| 		self.outlen := 0. | ||||
| 		self.outdown := false. | ||||
| 	} | ||||
|  | ||||
| 	method(#class) on: bsobj | ||||
| @ -214,7 +223,7 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 	method __fill_inbuf | ||||
| 	{ | ||||
| 		| v | | ||||
| 		v := self.bsobj readBytes: self.inbuf. | ||||
| 		v := self.bsobj readBytesInto: self.inbuf. | ||||
| 		## if the streamable object is not blocking, it may return an  | ||||
| 		## error object when data is not ready.  | ||||
| 		if (v isError) { ^v }.  | ||||
| @ -238,7 +247,7 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 		if (self.inpos >= self.inlen) | ||||
| 		{  | ||||
| 			v := self __fill_inbuf. | ||||
| 			if (v isError) { ^v }. | ||||
| 			if (v isError) { ^v }. ## TODO: change error handling | ||||
| 			if (v <= 0) { ^nil }. | ||||
| 			####if (self.inpos >= self.inlen) { ^nil }. | ||||
| 		}. | ||||
| @ -251,7 +260,7 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 	method next: count into: byte_array startingAt: pos | ||||
| 	{ | ||||
| 		## return the count bytes | ||||
| 		| taken avail needed v | | ||||
| 		| taken avail needed v incapa | | ||||
|  | ||||
| 		if (self.indown) { ^0 }. | ||||
|  | ||||
| @ -260,19 +269,33 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 		## if the parameters cannot meet this assumption, you will get | ||||
| 		## into various system exceptions. | ||||
| 		needed := count. | ||||
| 		incapa := self.inbuf size. | ||||
|  | ||||
| 		while (needed > 0) | ||||
| 		{ | ||||
| 			avail := self.inlen - self.inpos. | ||||
| 			if (avail <= 0) | ||||
| 			{ | ||||
| 				if (needed >= incapa) | ||||
| 				{ | ||||
| 					## don't rely on the internal buffer if the number of bytes  | ||||
| 					## needed are equal to or greater than the capacity of the | ||||
| 					## buffer. | ||||
| 					v := self.bsobj readBytesInto: byte_array offset: pos length: needed. | ||||
| 					if (v isError or v <= 0) { break }.  ## <<< TODO: change the error handling | ||||
| 					pos := pos + v. | ||||
| 					needed := needed - v. | ||||
| 					continue. | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					v := self __fill_inbuf. | ||||
| 					if (v isError or v <= 0) { break }. ## <<< TODO: change the error handling | ||||
| 				}. | ||||
| 			}. | ||||
|  | ||||
| 			taken := if (avail <= needed) { avail } else { needed }. | ||||
| 			byte_array replaceFrom: pos count: taken with: self.inbuf startingAt: self.inpos.  | ||||
|  | ||||
| 			self.inpos := self.inpos + taken. | ||||
| 			pos := pos + taken. | ||||
| 			needed := needed - taken. | ||||
| @ -281,5 +304,72 @@ class ByteStream(Object) ### [ByteStreamable, ByteXXX] | ||||
| 		^count - needed. | ||||
| 	} | ||||
|  | ||||
| 	method nextPut: count from: byte_array startingAt: pos | ||||
| 	{ | ||||
| 		| consumed free rem outcapa | | ||||
|  | ||||
| 		if (self.outdown) { ^0 }. | ||||
|  | ||||
| 		rem := count. | ||||
| 		outcapa := self.outbuf size. | ||||
|  | ||||
| 		while (rem > 0) | ||||
| 		{ | ||||
| 			free := outcapa - self.outlen. | ||||
| 			if (free <= 0) | ||||
| 			{ | ||||
| 				self flush. ## TODO: error handling... | ||||
| 			}. | ||||
|  | ||||
| 			if (self.outlen <= 0 and rem >= outcapa) | ||||
| 			{ | ||||
| 				consumed := self.bsobj writeBytesFrom: byte_array offset: pos length: rem. | ||||
| 				if (consumed <= 0) { break }. ## TODO: error handling. also handle exceptions | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				consumed := if (free <= rem) { free } else { rem }. | ||||
| 				self.outbuf replaceFrom: self.outlen count: consumed with: byte_array startingAt: pos. | ||||
| 				self.outlen := self.outlen + consumed. | ||||
| 			}. | ||||
|  | ||||
| 			pos := pos + consumed. | ||||
| 			rem := rem - consumed. | ||||
| 		}. | ||||
|  | ||||
| 		^count - rem. | ||||
| 	} | ||||
|  | ||||
| 	method flush | ||||
| 	{ | ||||
| 		| v pos | | ||||
|  | ||||
| 		pos := 0. | ||||
| 		while (pos < self.outlen) | ||||
| 		{ | ||||
| 			v := self.bsobj writeBytesFrom: self.outbuf offset: pos length: (self.outlen - pos). | ||||
| 			if (v <= 0) { break }. ## TODO: error handling. also handle exceptions | ||||
| 			pos := pos + v. | ||||
| 		}. | ||||
|  | ||||
| 		self.outlen := 0. | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class ByteStream(ByteStreamAdapter) | ||||
| { | ||||
| 	method close | ||||
| 	{ | ||||
| 		if (self.bsobj notNil) | ||||
| 		{ | ||||
| 			self.bsobj close. | ||||
| 			self.bsobj := nil. | ||||
| 		}. | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class TextStream(ByteStream) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -5034,8 +5034,8 @@ static int compile_expression_primary (moo_t* moo, const moo_oocs_t* ident, cons | ||||
| 		switch (TOKEN_TYPE(moo)) | ||||
| 		{ | ||||
| 			case MOO_IOTOK_IDENT_DOTTED: | ||||
| 				ident_dotted = 1; | ||||
| 			case MOO_IOTOK_IDENT: | ||||
| 				ident_dotted = (TOKEN_TYPE(moo) == MOO_IOTOK_IDENT_DOTTED); | ||||
| 				ident = TOKEN_NAME(moo); | ||||
| 				ident_loc = TOKEN_LOC(moo); | ||||
| 				read_next_token = 1; | ||||
|  | ||||
| @ -592,11 +592,11 @@ static moo_pfinfo_t pfinfos[] = | ||||
| 	{ I, { 'c','o','n','n','e','c','t',':','\0' },                0, { pf_connect_socket,   1, 1  }  }, | ||||
| 	{ I, { 'l','i','s','t','e','n',':','\0' },                    0, { pf_listen_socket,    1, 1  }  }, | ||||
| 	{ I, { 'o','p','e','n','\0' },                                0, { pf_open_socket,      1, 3  }  }, | ||||
| 	{ I, { 'r','e','a','d','B','y','t','e','s',':','\0' },        0, { pf_read_socket,      1, 1  }  }, | ||||
| 	{ I, { 'r','e','a','d','B','y','t','e','s',':','o','f','f','s','e','t',':','l','e','n','g','t','h',':','\0' },    0, { pf_read_socket,     3, 3  }  }, | ||||
| 	{ I, { 'r','e','a','d','B','y','t','e','s','I','n','t','o',':','\0' },        0, { pf_read_socket,      1, 1  }  }, | ||||
| 	{ I, { 'r','e','a','d','B','y','t','e','s','I','n','t','o',':','o','f','f','s','e','t',':','l','e','n','g','t','h',':','\0' },    0, { pf_read_socket,     3, 3  }  }, | ||||
| 	{ I, { 's','o','c','k','e','t','E','r','r','o','r','\0' },    0, { pf_get_socket_error, 0, 0  }  }, | ||||
| 	{ I, { 'w','r','i','t','e','B','y','t','e','s',':','\0' },    0, { pf_write_socket,     1, 1  }  }, | ||||
| 	{ I, { 'w','r','i','t','e','B','y','t','e','s',':','o','f','f','s','e','t',':','l','e','n','g','t','h',':','\0' },    0, { pf_write_socket,     3, 3  }  } | ||||
| 	{ I, { 'w','r','i','t','e','B','y','t','e','s','F','r','o','m',':','\0' },    0, { pf_write_socket,     1, 1  }  }, | ||||
| 	{ I, { 'w','r','i','t','e','B','y','t','e','s','F','r','o','m',':','o','f','f','s','e','t',':','l','e','n','g','t','h',':','\0' },    0, { pf_write_socket,     3, 3  }  } | ||||
| }; | ||||
|  | ||||
| /* ------------------------------------------------------------------------ */ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user