[Ironruby-core] RubyForge bug fixes
John Lam (IRONRUBY)
jflam at microsoft.com
Sat May 10 16:25:16 EDT 2008
Unnikrishnan Nair:
> Quick question, are these following assertions are correct?
>
> should_raise(TypeError){ File.basename(1) }
> should_raise(TypeError){ File.basename("bar.txt", 1) }
> should_raise(TypeError){ File.basename(true) }
Yes they are. You can easily verify this in MRI yourself.
In first and third cases, it hits the overload that accepts a nullable object as the first parameter. The TypeError is raised via Protocols.CastToString().
In the second case, it also hits an overload that accepts a nullable object as its second parameter, which raises TypeError via Protocols.CastToString().
FYI, this is the implementation of #basename that I have in my shelveset. It passes all of the (valid) specs - there are some legitimate bugs in our old copy of the specs (I haven't checked with the latest version of the rubinius specs - I'll do that next week). I'm a bit worried about how I'm handling the special cases for Windows.
[RubyMethod("basename", RubyMethodAttributes.PublicSingleton)]
public static MutableString/*!*/ Basename(CodeContext/*!*/ context, object/*!*/ self, [NotNull]MutableString/*!*/ path, [NotNull]MutableString/*!*/ extensionFilter) {
if (path.Length == 0)
return path;
MutableString trimmedPath = TrimTrailingSlashes(path);
// Special cases of drive letters C:\\ or C:/
if (trimmedPath.Length == 2)
if (Char.IsLetter(trimmedPath.GetChar(0)) && trimmedPath.GetChar(1) == ':')
return Kernel.FlowTaint(context, path, (path.Length > 2 ? MutableString.Create(path.GetChar(2).ToString()) : MutableString.Create(String.Empty)));
string trimmedPathAsString = trimmedPath.ConvertToString();
if (trimmedPathAsString == "/")
return trimmedPath;
string filename = System.IO.Path.GetFileName(trimmedPath.ConvertToString());
// Handle UNC host names correctly
string root = System.IO.Path.GetPathRoot(trimmedPath.ConvertToString());
if (extensionFilter.Length == 0)
return trimmedPathAsString == root ? MutableString.Create(root) : MutableString.Create(filename);
string fileExtension = System.IO.Path.GetExtension(filename);
string basename = System.IO.Path.GetFileNameWithoutExtension(filename);
string result = WildcardExtensionMatch(fileExtension, extensionFilter.ConvertToString()) ? basename : filename;
return Kernel.FlowTaint(context, self, (result.Equals(root) ? MutableString.Create(root) : MutableString.Create(result)));
}
[RubyMethod("basename", RubyMethodAttributes.PublicSingleton)]
public static MutableString/*!*/ Basename(CodeContext/*!*/ context, object/*!*/ self, [NotNull]MutableString/*!*/ path) {
return Basename(context, self, path, MutableString.Empty);
}
[RubyMethod("basename", RubyMethodAttributes.PublicSingleton)]
public static MutableString/*!*/ Basename(CodeContext/*!*/ context, object/*!*/ self, object path, object extension) {
return Basename(context, self, Protocols.CastToString(context, path), Protocols.CastToString(context, extension));
}
[RubyMethod("basename", RubyMethodAttributes.PublicSingleton)]
public static MutableString/*!*/ Basename(CodeContext/*!*/ context, object/*!*/ self, object path) {
return Basename(context, self, Protocols.CastToString(context, path));
}
> Also, in the basename_spec the test setup has wrong parameter on
> File.open(@name, 'w+'), if I change it to 'w', the test runs fine
> otherwise none of the test works.
This is correct. There is a bug in how we map the semantics of 'w+' to .NET IO. It's fixed in my shelveset.
Thanks,
-John
More information about the Ironruby-core
mailing list