[Win32utils-devel] PathIsURL and frozen strings
djberg96 at gmail.com
Sat Jul 19 20:04:49 EDT 2008
Park Heesob wrote:
> ----- Original Message -----
> From: "Daniel Berger" <djberg96 at gmail.com>
> To: "win32utils-devel" <win32utils-devel at rubyforge.org>
> Sent: Sunday, July 13, 2008 9:37 PM
> Subject: [Win32utils-devel] PathIsURL and frozen strings
>> Hi all,
>> I may have brought this up a long time ago, but I've forgotten. Why does
>> PathIsURL(path) fail if 'path' is frozen?
>> require 'windows/path'
>> include Windows::Path
>> path = "file://C:\\Documents and Settings\\djberge"
>> PathIsURL(path) # true
>> PathIsURL(path) # Boom!
>> TypeError: can't modify frozen string
>> from (eval):3:in `call'
>> from (eval):3:in `PathIsURL'
>> from (irb):9
>> Any ideas? I realize I can just dup the string, but I thought I'd ask.
> In the win32-api, the string type('P') denotes both input and output pointer
> Thus the string parameter can be modified and must not be frozen.
> In case of pure input string, you can define another parameter type and skip
> rb_str_modify(v_arg) (line #584 of win32/api.c)
After thinking about it some more I'm going to go ahead and add an 'S'
prototype, which will be for const char* strings. My reasoning is as
It's a bit faster. About 25% in a strcpy benchmark I ran.
It means we don't have to worry about buffers in some cases (or will,
once I redefine the prototypes in windows-pr).
It eliminates the issue I originally mentioned regarding frozen strings.
I think it will simplify certain parts of a port for JRuby or IronRuby.
I'll mark this as a major release, 1.2.0.
More information about the win32utils-devel