Hi,

Again a couple of random question...

* Would it be possible to optimize this kind of enum (two cases, where one case contains a borrowed pointer)
into a simple pointer, where None would be represented as the null pointer?

enum Option<A> {
None,
Some(~A)
}

As the pointer to A can never be null it should be possible. This probably wouldn't affect performance much, but when storing it into an Array that would save a lot of space (basically cut down space usage half).

* match() statements. I think the order in which the matches are performed are important. But when I have
a very simple statement like this:

match io.read_char() as u8 {
0x0c => ...,
0x0d => ...,
0x0f .. 0x1a =>
...
}

will the compiler construct an efficient goto jump table or will it construct sequential if statements instead? ยด My question is if it makes sense to reorder more frequent cases to the top or not.

Also I wonder why I get a "non-exhaustive patterns" error message for this one:

match c as u8 {
0 .. 255 => 1
}

* Using str::as_bytes()

I cannot get str::as_bytes working. The example in the documention is not working for several reasons (wrong syntax...)

I tried this:

fn write(buf: ~[u8]) {
io::println(fmt!("%?", buf));
}

fn main() {
let mystr = ~"Hello World";
do str::as_bytes(&mystr) |bytes| {
write(*bytes);
}
}

But get the compiler error:

t.rs:8:10: 8:16 error: moving out of dereference of immutable & pointer
t.rs:8 write(*bytes);
^~~~~~

* A ~str is internally represented by an ~[u8] vector.
It is basically a heap-allocated

struct rust_vec {
size_t fill;
size_t alloc;
uint8_t data[];
}

When I correctly read the code the string is allocated in-place, i.e. for a string of size 5, you will allocate sizeof(struct rust_vec) + 5 + 1 bytes. So the data pointer points past the data. As a reallocation can change the pointer to the rust_vec, I know understand why I have to pass sometimes a &mut ~[T]into a function. In case the reallocation returns a new
pointer, the passed pointer has to be updated.

I guess slices use the same rust_vec struct, but allocated on the stack, where data points to
another ~vectors data.

What I don't understand is the following comment for struct rust_vec:

size_t fill; // in bytes; if zero, heapified

Please correct me if I am wrong.

* There is a severe performance bug in TcpSocketBuf.read(). I am trying to fix it right now myself, once I am done, I will do another post. This explains why I get very bad network I/O performance. Basically the function copies the internal buffer over and over again, once for each call. This is especially bad when using read_line(), as it calls read() for every byte.

* What exaclty is the semantic of "as"? Is it like a C-cast?

Imagine if I have

let b: u8 = 255;
let s: i8 = b as i8;

This gives -1 for s. But when I do "b as i32", it gives 255.
If I want to keep the sign I have to do "(b as i8) as i32".

* I don't like the way libuv is currently integrated into the system. It works, but performance is quite low and IMHO the blocking interface is not very usable. For example I want to write a process that accepts messages from other processes, and then writes something to the socket or reads from the socket. This will currently not work, as reading from the socket will block the process, and
then no more requests can be sent to the process.
So instead of using the read() / write() API of an io::Reader, I'd prefer to expose the read/write events of libuv via messages (this is already done between the iotask and the read()/write() methods,
but it is not accessible to the "end-user").

So instead of:

io.read(...)

one would simply write:

readport.recv()

The same for writes. EOF results in closing the readport. The question is how these messages
should look like to be usable for the programmer (how to handle errors?).

What do you think?

Actually there would be connecting ports, which receive events whenever a new connection is established. A successfully established connection would then be represented by a readport and writechannel.

* I'd like to know more how the task scheduler and the pipes work together. Is there any info available somewhere? Also, if I would create a native pthread in C, could I simply call an external rust function?

Best,

Michael
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to