Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Replace C types with Rust types in std, closes #7313 - #10943

Merged
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types
Jan 22, 2014
Merged

Replace C types with Rust types in std, closes #7313#10943
bors merged 1 commit into
rust-lang:masterfrom
fhahn:issue-7313-replace-c-types

Conversation

@fhahn

Copy link
Copy Markdown
Contributor

I've started working on a patch for #7313 . So far I tried to replace C types in src/libstd/unstable/* and related files.

So far, I have two questions. Is there a convention for passing pointers around in std as Rust types? Sometimes pointers are passed around as *c_char (which seems to be an *i8), *c_void or *u8, which leads to a lot of casts. E.g: exchange_malloc used to return a *c_char but the function in turn only calls malloc_raw which returns a *c_void.
Is there a specific reason for this?

The second question is about CString and related functions like with_c_str. At the moment these functions use *c_char*. Should I replace it with *u8 or keep it, because it's an wrapper around classical C strings?

@brson

Copy link
Copy Markdown
Contributor

Thanks for working on this cleanup.

There's no specific reason for all the runtime functions returning weird combinations of pointer types, it's just the legacy of refactoring in various ways. Ideally, they all agree on the types and there are no casts.

CString should probably keep using c_char.

I think it's debatable whether the various logging and other runtime functions that deal in c strings should use *c_char or *u8 or some other typedef. This is all internal details so it doesn't matter too much. Ultimately we're probably going to want to be able to compile out std::libc in environments that don't have it, so the less we depend on it the better.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

So should various functions pass C strings around as u8? *c_str functions are used in a lot of places.

When working on this issue, another idea came to my mind. There probably are a couple of unnecessary type casts in the rust source code and while working on this issue, I accidentally introduced another. Would a lint for unnecessary type casts be useful in generel?

@brson

Copy link
Copy Markdown
Contributor

@fhahn Public API's that deal with C strings should definitely use *c_char. The compiler interface (lang items like start and probably the failure stuff) should definitely not use *c_char. Other functions I'm less sure of but can probably be inferred from whether they are called form other functions that use *c_char.

@brson

Copy link
Copy Markdown
Contributor

A lint for unnecessary type casts sounds useful, but I guess we won't know until we try.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

Bors failed to test this PR, because it could not be merged. I've rebased pull request to the current master.

@emberian

Copy link
Copy Markdown
Contributor

@fhahn an "unneeded cast" lint sounds great.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@cmr not sure if you already saw #11135, my first version of a lint for unnecessary casts. The main problem atm is handling macros which use casts.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

There was a missing type cast on Windows, which failed the build bot. It should be fixed now, but unfortunately I won't have a Windows (or OS X) installation handy over the next couple of days, to test the patch on other platforms than Linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@brson no worries, I didn't have much time to work on this patch the last couple of days. Before this patch gets merged, I'd like to clear up a few points:

  • at the moment I'm not really sure if I should use *u8 or *Void instead of *c_void. I'd like to keep my patch consistent with the other parts (in the existing source sometimes *Void is used and sometimes *u8).
  • I think I made good progress with pushing libc types down, expect for pipes and processes. The problem with pipes is, that they store 2 file descriptors internally and are used in combination with the pre defined fds in libc, like stdout. If file descriptors of pipes are stored as a Rust type, then comparing with this predefined fds would require more additional typecasts or file descriptors as a Rust type.

Comment threadsrc/libstd/os.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That should probably be uint, since 32-bit wants u32.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed the type to uint and added a cast to size_t at the cast.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit. It compiles on 64- and 32-bit linux.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've updated the commit again, it should compile on win32 now.

@sfackler

Copy link
Copy Markdown
Member

@fhahn needs a rebase.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

@sfackler I'll look into it tomorrow. I managed to compile this patch on windows (win7 32 bit) without errors today, but 2 run-pass tests fail at the moment.

Following code compiles on Windows, but fails when building libstd in stage 1:

let nArgs: uint = 0;
let lpCmdLine = unsafe { GetCommandLineW() };
let szArgList = unsafe { CommandLineToArgvW(lpCmdLine, (&mut (nArgs as c_int)) as *mut c_int) };

I've reverted this change and I'm using the old code (with two c_int variables): https://github.com/mozilla/rust/blob/master/src/libstd/os.rs#L740

@adrientetar

Copy link
Copy Markdown
Contributor

Needs a snapshot?

Comment threadsrc/libstd/rt/borrowck.rs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file came back from the dead!

@alexcrichton

Copy link
Copy Markdown
Member

With the extra file removed, we can give this another go-through with bors.

@fhahn

Copy link
Copy Markdown
ContributorAuthor

I've removed the file again and squashed everything in one commit. I think another try with bors would be good.

bors added a commit that referenced this pull request Jan 22, 2014
…richton
I've started working on a patch for #7313 . So far I tried to replace C types in `src/libstd/unstable/*` and related files.
So far, I have two questions. Is there a convention for passing pointers around in `std` as Rust types? Sometimes pointers are passed around as `*c_char` (which seems to be an `*i8`), `*c_void` or `*u8`, which leads to a lot of casts. E.g: [`exchange_malloc`](https://github.com/fhahn/rust/compare/issue-7313-replace-c-types?expand=1#diff-39f44b8c3f4496abab854b3425ac1617R60) used to return a `*c_char` but the function in turn only calls `malloc_raw` which returns a `*c_void`.
Is there a specific reason for this?
The second question is about `CString` and related functions like `with_c_str`. At the moment these functions use `*c_char*`. Should I replace it with `*u8` or keep it, because it's an wrapper around classical C strings?
@bors
bors merged commit 2eb4f05 into rust-lang:masterJan 22, 2014
@fhahn
fhahn deleted the issue-7313-replace-c-types branch January 23, 2014 10:34
flip1995 pushed a commit to flip1995/rust that referenced this pull request Nov 2, 2023
[`map_identity`]: recognize tuple identity function
Fixesrust-lang#7189
This lint now recognizes `.map(|(a, b)| (a, b))` as a useless `map` call.
changelog: [`map_identity`]: recognize tuple identity function
U007D pushed a commit to U007D/rust-mos that referenced this pull request Aug 21, 2026
10943: feat: Enable completions for attributes r=Veykril a=Veykril
Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@fhahn@brson@emberian@sfackler@adrientetar@alexcrichton@bors