diff options
178 files changed, 2119 insertions, 1852 deletions
diff --git a/ChangeLog b/ChangeLog index 4f572cf505d..bf710d6e16c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-09-04 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * configure.in: added check for kqueue. Patch from Geoff Norton + in HEAD. + +2004-08-17 Dick Porter <dick@ximian.com> + + * configure.in: Correct intl library for FreeBSD and OpenBSD. + Fixes bug 62884, patch by Tom McLaughlin (tmclaugh@sdf.lonestar.org). + +2004-07-27 John Merryweather Cooper <john_m_cooper@yahoo.com> + * configure.in: Disable __thread test (TLS) for FreeBSD as + it succeeds on FreeBSD 5.x when it should fail. Fix pthread + library detection for FreeBSD 4.x since pthread is embedded + in libc_r on this platform. Fix some typos in my host + regexes for freebsd. + 2004-07-23 Dick Porter <dick@ximian.com> * configure.in: Changes for FreeBSD thread support by John diff --git a/configure.in b/configure.in index 62675cb37cf..53475c3117d 100644 --- a/configure.in +++ b/configure.in @@ -1,7 +1,7 @@ AC_INIT(README) AC_CANONICAL_SYSTEM AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(mono,1.0) +AM_INIT_AUTOMAKE(mono,1.0.2) AM_MAINTAINER_MODE AC_PROG_LN_S @@ -69,7 +69,7 @@ case "$host" in ;; # these flags will work for all versions of -STABLE # - *-*-*freebsd4) + *-*-*freebsd4*) platform_win32=no if test "x$PTHREAD_CFLAGS" = "x"; then CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE -DGC_FREEBSD_THREADS" @@ -91,11 +91,12 @@ case "$host" in libgc_threads=pthreads # TLS isn't implemented at all on -STABLE with_nptl=no + with_tls=pthread ;; # older versions of -CURRENT will break with these flags but testing # indicates these older versions won't run Mono anyway # - *-*-*freebsd5) + *-*-*freebsd5*) platform_win32=no if test "x$PTHREAD_CFLAGS" = "x"; then CPPFLAGS="$CPPFLAGS -DGC_FREEBSD_THREADS" @@ -119,6 +120,7 @@ case "$host" in # but NOT library support) # with_nptl=no + with_tls=pthread ;; *-*-*openbsd*) platform_win32=no @@ -464,6 +466,7 @@ if test x$platform_win32 = xno; then AC_CHECK_FUNCS(getpwuid_r) AC_CHECK_FUNCS(getresuid) AC_CHECK_FUNCS(setresuid) + AC_CHECK_FUNCS(kqueue) dnl ****************************************************************** dnl *** Check for large file support *** @@ -706,7 +709,17 @@ if test x$platform_win32 = xno; then dnl ***************************** dnl *** Checks for libpthread *** dnl ***************************** - AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread") +# on FreeBSD -STABLE, the pthreads functions all reside in libc_r +# and libpthread does not exist +# + case "${host}" in + *-*-*freebsd4*) + AC_CHECK_LIB(pthread, main, LIBS="$LIBS -pthread") + ;; + *) + AC_CHECK_LIB(pthread, main, LIBS="$LIBS -lpthread") + ;; + esac AC_CHECK_HEADERS(pthread.h) AC_CHECK_FUNCS(pthread_mutex_timedlock) AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np) @@ -1254,6 +1267,14 @@ case "$host" in LIBC="libc.so.12" INTL="libintl.so.0" ;; + *-*-*freebsd*) + LIBC="libc.so" + INTL="libintl.so" + ;; + *-*-*openbsd*) + LIBC="libc.so" + INTL="libintl.so" + ;; esac AC_SUBST(libsuffix) diff --git a/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/ChangeLog b/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/ChangeLog index 594c2b007f8..e0aaa445669 100644 --- a/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/ChangeLog +++ b/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/ChangeLog @@ -1,8 +1,3 @@ -2004-07-22 Jambunathan K <kjambunathan@novell.com> - - * Constants.cs: Fixed definitions of vbCr, vbLf, vbCrLf and - vbNewLine - 2004-06-24 Jambunathan K <kjambunathan@novell.com> * RandomVBFile.cs: Fixed FileGet() for Date and Decimal types * FileSystem.cs: Fixed ChDir, FileCopy diff --git a/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/Constants.cs b/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/Constants.cs index 16fc0d5da8f..310051ccf03 100644 --- a/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/Constants.cs +++ b/mcs/class/Microsoft.VisualBasic/Microsoft.VisualBasic/Constants.cs @@ -1,11 +1,11 @@ -// -// Constants.cs -// -// Author: -// Chris J Breisch (cjbreisch@altavista.net) -// -// (C) 2002 Chris J Breisch -// +//
+// Constants.cs
+//
+// Author:
+// Chris J Breisch (cjbreisch@altavista.net)
+//
+// (C) 2002 Chris J Breisch
+//
// // Copyright (c) 2002-2003 Mainsoft Corporation. @@ -30,131 +30,131 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // - -using System; - -namespace Microsoft.VisualBasic { - [Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute] - sealed public class Constants { - // Declarations - public const System.Int32 vbObjectError = (System.Int32)(-2147221504); - public const System.String vbCrLf = "\r\n"; - public const System.String vbNewLine = "\r\n"; - public const System.String vbCr = "\r"; - public const System.String vbLf = "\n"; - public const System.String vbBack = "\b"; - public const System.String vbFormFeed = "\f"; - public const System.String vbTab = "\t"; - public const System.String vbVerticalTab = "\v"; - public const System.String vbNullChar = "\0"; - public const System.String vbNullString = ""; - - public const AppWinStyle vbHide = AppWinStyle.Hide; - public const AppWinStyle vbNormalFocus = AppWinStyle.NormalFocus; - public const AppWinStyle vbMinimizedFocus = AppWinStyle.MinimizedFocus; - public const AppWinStyle vbMaximizedFocus = AppWinStyle.MaximizedFocus; - public const AppWinStyle vbNormalNoFocus = AppWinStyle.NormalNoFocus; - public const AppWinStyle vbMinimizedNoFocus = AppWinStyle.MinimizedNoFocus; - - public const CallType vbMethod = CallType.Method; - public const CallType vbGet = CallType.Get; - public const CallType vbLet = CallType.Let; - public const CallType vbSet = CallType.Set; - - public const CompareMethod vbBinaryCompare = CompareMethod.Binary; - public const CompareMethod vbTextCompare = CompareMethod.Text; - - public const DateFormat vbGeneralDate = DateFormat.GeneralDate; - public const DateFormat vbLongDate = DateFormat.LongDate; - public const DateFormat vbShortDate = DateFormat.ShortDate; - public const DateFormat vbLongTime = DateFormat.LongTime; - public const DateFormat vbShortTime = DateFormat.ShortTime; - - public const FirstDayOfWeek vbUseSystemDayOfWeek = FirstDayOfWeek.System; - public const FirstDayOfWeek vbSunday = FirstDayOfWeek.Sunday; - public const FirstDayOfWeek vbMonday = FirstDayOfWeek.Monday; - public const FirstDayOfWeek vbTuesday = FirstDayOfWeek.Tuesday; - public const FirstDayOfWeek vbWednesday = FirstDayOfWeek.Wednesday; - public const FirstDayOfWeek vbThursday = FirstDayOfWeek.Thursday; - public const FirstDayOfWeek vbFriday = FirstDayOfWeek.Friday; - public const FirstDayOfWeek vbSaturday = FirstDayOfWeek.Saturday; - - public const FileAttribute vbNormal = FileAttribute.Normal; - public const FileAttribute vbReadOnly = FileAttribute.ReadOnly; - public const FileAttribute vbHidden = FileAttribute.Hidden; - public const FileAttribute vbSystem = FileAttribute.System; - public const FileAttribute vbVolume = FileAttribute.Volume; - public const FileAttribute vbDirectory = FileAttribute.Directory; - public const FileAttribute vbArchive = FileAttribute.Archive; - - public const FirstWeekOfYear vbUseSystem = FirstWeekOfYear.System; - public const FirstWeekOfYear vbFirstJan1 = FirstWeekOfYear.Jan1; - public const FirstWeekOfYear vbFirstFourDays = FirstWeekOfYear.FirstFourDays; - public const FirstWeekOfYear vbFirstFullWeek = FirstWeekOfYear.FirstFullWeek; - - public const VbStrConv vbUpperCase = VbStrConv.UpperCase; - public const VbStrConv vbLowerCase = VbStrConv.LowerCase; - public const VbStrConv vbProperCase = VbStrConv.ProperCase; - public const VbStrConv vbWide = VbStrConv.Wide; - public const VbStrConv vbNarrow = VbStrConv.Narrow; - public const VbStrConv vbKatakana = VbStrConv.Katakana; - public const VbStrConv vbHiragana = VbStrConv.Hiragana; - public const VbStrConv vbSimplifiedChinese = VbStrConv.SimplifiedChinese; - public const VbStrConv vbTraditionalChinese = VbStrConv.TraditionalChinese; - public const VbStrConv vbLinguisticCasing = VbStrConv.LinguisticCasing; - - public const TriState vbUseDefault = TriState.UseDefault; - public const TriState vbTrue = TriState.True; - public const TriState vbFalse = TriState.False; - - public const VariantType vbEmpty = VariantType.Empty; - public const VariantType vbNull = VariantType.Null; - public const VariantType vbInteger = VariantType.Integer; - public const VariantType vbLong = VariantType.Long; - public const VariantType vbSingle = VariantType.Single; - public const VariantType vbDouble = VariantType.Double; - public const VariantType vbCurrency = VariantType.Currency; - public const VariantType vbDate = VariantType.Date; - public const VariantType vbString = VariantType.String; - public const VariantType vbObject = VariantType.Object; - public const VariantType vbBoolean = VariantType.Boolean; - public const VariantType vbVariant = VariantType.Variant; - public const VariantType vbDecimal = VariantType.Decimal; - public const VariantType vbByte = VariantType.Byte; - public const VariantType vbUserDefinedType = VariantType.UserDefinedType; - public const VariantType vbArray = VariantType.Array; - - public const MsgBoxResult vbOK = MsgBoxResult.OK; - public const MsgBoxResult vbCancel = MsgBoxResult.Cancel; - public const MsgBoxResult vbAbort = MsgBoxResult.Abort; - public const MsgBoxResult vbRetry = MsgBoxResult.Retry; - public const MsgBoxResult vbIgnore = MsgBoxResult.Ignore; - public const MsgBoxResult vbYes = MsgBoxResult.Yes; - public const MsgBoxResult vbNo = MsgBoxResult.No; - - public const MsgBoxStyle vbOKOnly = MsgBoxStyle.OKOnly; - public const MsgBoxStyle vbOKCancel = MsgBoxStyle.OKCancel; - public const MsgBoxStyle vbAbortRetryIgnore = MsgBoxStyle.AbortRetryIgnore; - public const MsgBoxStyle vbYesNoCancel = MsgBoxStyle.YesNoCancel; - public const MsgBoxStyle vbYesNo = MsgBoxStyle.YesNo; - public const MsgBoxStyle vbRetryCancel = MsgBoxStyle.RetryCancel; - public const MsgBoxStyle vbCritical = MsgBoxStyle.Critical; - public const MsgBoxStyle vbQuestion = MsgBoxStyle.Question; - public const MsgBoxStyle vbExclamation = MsgBoxStyle.Exclamation; - public const MsgBoxStyle vbInformation = MsgBoxStyle.Information; - public const MsgBoxStyle vbDefaultButton1 = MsgBoxStyle.DefaultButton1; - public const MsgBoxStyle vbDefaultButton2 = MsgBoxStyle.DefaultButton2; - public const MsgBoxStyle vbDefaultButton3 = MsgBoxStyle.DefaultButton3; - public const MsgBoxStyle vbApplicationModal = MsgBoxStyle.ApplicationModal; - public const MsgBoxStyle vbSystemModal = MsgBoxStyle.SystemModal; - public const MsgBoxStyle vbMsgBoxHelp = MsgBoxStyle.MsgBoxHelp; - public const MsgBoxStyle vbMsgBoxRight = MsgBoxStyle.MsgBoxRight; - public const MsgBoxStyle vbMsgBoxRtlReading = MsgBoxStyle.MsgBoxRtlReading; - public const MsgBoxStyle vbMsgBoxSetForeground = MsgBoxStyle.MsgBoxSetForeground; - - // Constructors - // Properties - // Methods - // Events - }; -} +
+using System;
+
+namespace Microsoft.VisualBasic {
+ [Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute]
+ sealed public class Constants {
+ // Declarations
+ public const System.Int32 vbObjectError = (System.Int32)(-2147221504);
+ public const System.String vbCrLf = "\n\r";
+ public const System.String vbNewLine = "\n\r";
+ public const System.String vbCr = "\n";
+ public const System.String vbLf = "\r";
+ public const System.String vbBack = "\b";
+ public const System.String vbFormFeed = "\f";
+ public const System.String vbTab = "\t";
+ public const System.String vbVerticalTab = "\v";
+ public const System.String vbNullChar = "\0";
+ public const System.String vbNullString = "";
+
+ public const AppWinStyle vbHide = AppWinStyle.Hide;
+ public const AppWinStyle vbNormalFocus = AppWinStyle.NormalFocus;
+ public const AppWinStyle vbMinimizedFocus = AppWinStyle.MinimizedFocus;
+ public const AppWinStyle vbMaximizedFocus = AppWinStyle.MaximizedFocus;
+ public const AppWinStyle vbNormalNoFocus = AppWinStyle.NormalNoFocus;
+ public const AppWinStyle vbMinimizedNoFocus = AppWinStyle.MinimizedNoFocus;
+
+ public const CallType vbMethod = CallType.Method;
+ public const CallType vbGet = CallType.Get;
+ public const CallType vbLet = CallType.Let;
+ public const CallType vbSet = CallType.Set;
+
+ public const CompareMethod vbBinaryCompare = CompareMethod.Binary;
+ public const CompareMethod vbTextCompare = CompareMethod.Text;
+
+ public const DateFormat vbGeneralDate = DateFormat.GeneralDate;
+ public const DateFormat vbLongDate = DateFormat.LongDate;
+ public const DateFormat vbShortDate = DateFormat.ShortDate;
+ public const DateFormat vbLongTime = DateFormat.LongTime;
+ public const DateFormat vbShortTime = DateFormat.ShortTime;
+
+ public const FirstDayOfWeek vbUseSystemDayOfWeek = FirstDayOfWeek.System;
+ public const FirstDayOfWeek vbSunday = FirstDayOfWeek.Sunday;
+ public const FirstDayOfWeek vbMonday = FirstDayOfWeek.Monday;
+ public const FirstDayOfWeek vbTuesday = FirstDayOfWeek.Tuesday;
+ public const FirstDayOfWeek vbWednesday = FirstDayOfWeek.Wednesday;
+ public const FirstDayOfWeek vbThursday = FirstDayOfWeek.Thursday;
+ public const FirstDayOfWeek vbFriday = FirstDayOfWeek.Friday;
+ public const FirstDayOfWeek vbSaturday = FirstDayOfWeek.Saturday;
+
+ public const FileAttribute vbNormal = FileAttribute.Normal;
+ public const FileAttribute vbReadOnly = FileAttribute.ReadOnly;
+ public const FileAttribute vbHidden = FileAttribute.Hidden;
+ public const FileAttribute vbSystem = FileAttribute.System;
+ public const FileAttribute vbVolume = FileAttribute.Volume;
+ public const FileAttribute vbDirectory = FileAttribute.Directory;
+ public const FileAttribute vbArchive = FileAttribute.Archive;
+
+ public const FirstWeekOfYear vbUseSystem = FirstWeekOfYear.System;
+ public const FirstWeekOfYear vbFirstJan1 = FirstWeekOfYear.Jan1;
+ public const FirstWeekOfYear vbFirstFourDays = FirstWeekOfYear.FirstFourDays;
+ public const FirstWeekOfYear vbFirstFullWeek = FirstWeekOfYear.FirstFullWeek;
+
+ public const VbStrConv vbUpperCase = VbStrConv.UpperCase;
+ public const VbStrConv vbLowerCase = VbStrConv.LowerCase;
+ public const VbStrConv vbProperCase = VbStrConv.ProperCase;
+ public const VbStrConv vbWide = VbStrConv.Wide;
+ public const VbStrConv vbNarrow = VbStrConv.Narrow;
+ public const VbStrConv vbKatakana = VbStrConv.Katakana;
+ public const VbStrConv vbHiragana = VbStrConv.Hiragana;
+ public const VbStrConv vbSimplifiedChinese = VbStrConv.SimplifiedChinese;
+ public const VbStrConv vbTraditionalChinese = VbStrConv.TraditionalChinese;
+ public const VbStrConv vbLinguisticCasing = VbStrConv.LinguisticCasing;
+
+ public const TriState vbUseDefault = TriState.UseDefault;
+ public const TriState vbTrue = TriState.True;
+ public const TriState vbFalse = TriState.False;
+
+ public const VariantType vbEmpty = VariantType.Empty;
+ public const VariantType vbNull = VariantType.Null;
+ public const VariantType vbInteger = VariantType.Integer;
+ public const VariantType vbLong = VariantType.Long;
+ public const VariantType vbSingle = VariantType.Single;
+ public const VariantType vbDouble = VariantType.Double;
+ public const VariantType vbCurrency = VariantType.Currency;
+ public const VariantType vbDate = VariantType.Date;
+ public const VariantType vbString = VariantType.String;
+ public const VariantType vbObject = VariantType.Object;
+ public const VariantType vbBoolean = VariantType.Boolean;
+ public const VariantType vbVariant = VariantType.Variant;
+ public const VariantType vbDecimal = VariantType.Decimal;
+ public const VariantType vbByte = VariantType.Byte;
+ public const VariantType vbUserDefinedType = VariantType.UserDefinedType;
+ public const VariantType vbArray = VariantType.Array;
+
+ public const MsgBoxResult vbOK = MsgBoxResult.OK;
+ public const MsgBoxResult vbCancel = MsgBoxResult.Cancel;
+ public const MsgBoxResult vbAbort = MsgBoxResult.Abort;
+ public const MsgBoxResult vbRetry = MsgBoxResult.Retry;
+ public const MsgBoxResult vbIgnore = MsgBoxResult.Ignore;
+ public const MsgBoxResult vbYes = MsgBoxResult.Yes;
+ public const MsgBoxResult vbNo = MsgBoxResult.No;
+
+ public const MsgBoxStyle vbOKOnly = MsgBoxStyle.OKOnly;
+ public const MsgBoxStyle vbOKCancel = MsgBoxStyle.OKCancel;
+ public const MsgBoxStyle vbAbortRetryIgnore = MsgBoxStyle.AbortRetryIgnore;
+ public const MsgBoxStyle vbYesNoCancel = MsgBoxStyle.YesNoCancel;
+ public const MsgBoxStyle vbYesNo = MsgBoxStyle.YesNo;
+ public const MsgBoxStyle vbRetryCancel = MsgBoxStyle.RetryCancel;
+ public const MsgBoxStyle vbCritical = MsgBoxStyle.Critical;
+ public const MsgBoxStyle vbQuestion = MsgBoxStyle.Question;
+ public const MsgBoxStyle vbExclamation = MsgBoxStyle.Exclamation;
+ public const MsgBoxStyle vbInformation = MsgBoxStyle.Information;
+ public const MsgBoxStyle vbDefaultButton1 = MsgBoxStyle.DefaultButton1;
+ public const MsgBoxStyle vbDefaultButton2 = MsgBoxStyle.DefaultButton2;
+ public const MsgBoxStyle vbDefaultButton3 = MsgBoxStyle.DefaultButton3;
+ public const MsgBoxStyle vbApplicationModal = MsgBoxStyle.ApplicationModal;
+ public const MsgBoxStyle vbSystemModal = MsgBoxStyle.SystemModal;
+ public const MsgBoxStyle vbMsgBoxHelp = MsgBoxStyle.MsgBoxHelp;
+ public const MsgBoxStyle vbMsgBoxRight = MsgBoxStyle.MsgBoxRight;
+ public const MsgBoxStyle vbMsgBoxRtlReading = MsgBoxStyle.MsgBoxRtlReading;
+ public const MsgBoxStyle vbMsgBoxSetForeground = MsgBoxStyle.MsgBoxSetForeground;
+
+ // Constructors
+ // Properties
+ // Methods
+ // Events
+ };
+}
diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog index bcf7dd8b1f8..42df9e1632a 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/ChangeLog @@ -1,3 +1,7 @@ +2004-06-30 Umadevi S <sumadevi@novell.com> + * Tds.cs - In the NextResult method handling TdsPacketSubType. TableName. + + 2004-04-22 Sebastien Pouliot <sebastien@ximian.com> * Tds70.cs: Updated to match changes in Mono.Security.dll. diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs index 1a917399a3f..e1cf4697ee7 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs @@ -293,6 +293,12 @@ namespace Mono.Data.Tds.Protocol { break; case TdsPacketSubType.TableName: + // done = true; + peek = Comm.Peek (); + done = (peek != (byte) TdsPacketSubType.ColumnDetail); + + break; + case TdsPacketSubType.ColumnDetail: done = true; break; default: diff --git a/mcs/class/Mono.Posix/Mono.Posix.dll.sources b/mcs/class/Mono.Posix/Mono.Posix.dll.sources index b426c78e14a..cf4150a2efb 100644 --- a/mcs/class/Mono.Posix/Mono.Posix.dll.sources +++ b/mcs/class/Mono.Posix/Mono.Posix.dll.sources @@ -4,5 +4,4 @@ ./Mono.Posix/Syscall.cs ./Mono.Posix/MapAttribute.cs ./Mono.Posix/IncludeAttribute.cs -./Mono.Posix/Catalog.cs -./Mono.Posix/PeerCred.cs +./Mono.Posix/Catalog.cs
\ No newline at end of file diff --git a/mcs/class/Mono.Posix/Mono.Posix/ChangeLog b/mcs/class/Mono.Posix/Mono.Posix/ChangeLog index c38db5ee850..b6fd766afdc 100644 --- a/mcs/class/Mono.Posix/Mono.Posix/ChangeLog +++ b/mcs/class/Mono.Posix/Mono.Posix/ChangeLog @@ -1,7 +1,3 @@ -2004-07-09 Dick Porter <dick@ximian.com> - - * PeerCred.cs: Get the unix socket peer credentials. - 2004-05-26 Miguel de Icaza <miguel@ximian.com> * Syscall.cs: Do not let the runtime handle strings, as we do not diff --git a/mcs/class/Mono.Posix/Mono.Posix/PeerCred.cs b/mcs/class/Mono.Posix/Mono.Posix/PeerCred.cs deleted file mode 100644 index 76071bcbca5..00000000000 --- a/mcs/class/Mono.Posix/Mono.Posix/PeerCred.cs +++ /dev/null @@ -1,78 +0,0 @@ -// -// Mono.Posix.PeerCred: Peer credentials class for AF_UNIX sockets -// -// Authors: -// Dick Porter (dick@ximian.com) -// -// (C) 2004 Novell, Inc (http://www.novell.com) -// - -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.Net.Sockets; - -namespace Mono.Posix -{ - public class PeerCred - { - private struct PeerCredData { - public int pid; - public int uid; - public int gid; - } - - /* Make sure this doesn't clash with anything in - * SocketOptionName, and keep it synchronised with the - * runtime - */ - private const int so_peercred=10001; - private PeerCredData data; - - public PeerCred (Socket sock) { - if (sock.AddressFamily != AddressFamily.Unix) { - throw new ArgumentException ("Only Unix sockets are supported", "sock"); - } - - data = (PeerCredData)sock.GetSocketOption (SocketOptionLevel.Socket, (SocketOptionName)so_peercred); - } - - public int ProcessID { - get { - return(data.pid); - } - } - - public int UserID { - get { - return(data.uid); - } - } - - public int GroupID { - get { - return(data.gid); - } - } - } -} - diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog index a5a20358101..e55f1f5ecd8 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog @@ -1,15 +1,3 @@ -2004-07-14 Sebastien Pouliot <sebastien@ximian.com> - - * SslClientStream.cs: Changed lock to "new object()" and not - String.Empty (as the read/write locks points becomes the same). - * SslServerStream.cs: Changed lock to "new object()" and not - String.Empty (as the read/write locks points becomes the same). - -2004-07-14 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpsClientStream.cs: get an HttpWebRequest so that we can use the - ServicePoint it has. No need to get the host now. - 2004-05-09 Carlos Guzman Alvarez <carlosga@telefonica.net>
* Mono.Security.Protocol.Tls/Alert.cs:
diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs index 678cf83163c..1da66f06849 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs @@ -40,13 +40,14 @@ namespace Mono.Security.Protocol.Tls { internal class HttpsClientStream : SslClientStream { - private HttpWebRequest _request; + private string _host; + private WebRequest _request; - public HttpsClientStream (Stream stream, X509CertificateCollection clientCertificates, - HttpWebRequest request) - : base (stream, request.RequestUri.Host, false, SecurityProtocolType.Default, clientCertificates) + public HttpsClientStream (Stream stream, string targetHost, X509CertificateCollection clientCertificates, WebRequest request) + : base (stream, targetHost, false, SecurityProtocolType.Default, clientCertificates) { + _host = targetHost; // this constructor permit access to the WebRequest to call // ICertificatePolicy.CheckValidationResult _request = request; @@ -60,7 +61,8 @@ namespace Mono.Security.Protocol.Tls { { bool failed = (certificateErrors.Length > 0); if (ServicePointManager.CertificatePolicy != null) { - ServicePoint sp = _request.ServicePoint; + Uri target = new Uri ("https://" + _host); + ServicePoint sp = ServicePointManager.FindServicePoint (target); // only one problem can be reported by this interface int problem = ((failed) ? certificateErrors [0] : 0); diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs index fccfb9902b3..068a24f68c7 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs @@ -349,8 +349,8 @@ namespace Mono.Security.Protocol.Tls this.inputBuffer = new BufferedStream(new MemoryStream()); this.innerStream = stream; this.ownsStream = ownsStream; - this.read = new object (); - this.write = new object (); + this.read = String.Empty; + this.write = String.Empty; this.protocol = new ClientRecordProtocol(innerStream, context); } @@ -821,4 +821,4 @@ namespace Mono.Security.Protocol.Tls #endregion } -} +}
\ No newline at end of file diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs index f2786f7554b..53b3d095def 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslServerStream.cs @@ -306,8 +306,8 @@ namespace Mono.Security.Protocol.Tls this.inputBuffer = new BufferedStream(new MemoryStream()); this.innerStream = stream; this.ownsStream = ownsStream; - this.read = new object (); - this.write = new object (); + this.read = String.Empty; + this.write = String.Empty; this.protocol = new ServerRecordProtocol(innerStream, context); } diff --git a/mcs/class/Mono.Security/Mono.Security.X509.Extensions/ChangeLog b/mcs/class/Mono.Security/Mono.Security.X509.Extensions/ChangeLog index b8d2dc9942e..f00dcacd041 100644 --- a/mcs/class/Mono.Security/Mono.Security.X509.Extensions/ChangeLog +++ b/mcs/class/Mono.Security/Mono.Security.X509.Extensions/ChangeLog @@ -1,8 +1,3 @@ -2004-07-15 Sebastien Pouliot <sebastien@ximian.com> - - * KeyUsageExtension.cs: Added Encode to extension so it can be used - by makecert. Fix bug # 61240. Patch provided by Ianier Munoz. - 2004-04-28 Sebastien Pouliot <sebastien@ximian.com> * KeyUsageExtension.cs: Added missing INSIDE_CORLIB to enum. diff --git a/mcs/class/Mono.Security/Mono.Security.X509.Extensions/KeyUsageExtension.cs b/mcs/class/Mono.Security/Mono.Security.X509.Extensions/KeyUsageExtension.cs index 0c5d3b0cf38..a8c5553ed58 100644 --- a/mcs/class/Mono.Security/Mono.Security.X509.Extensions/KeyUsageExtension.cs +++ b/mcs/class/Mono.Security/Mono.Security.X509.Extensions/KeyUsageExtension.cs @@ -86,11 +86,6 @@ namespace Mono.Security.X509.Extensions { public KeyUsageExtension (X509Extension extension) : base (extension) {} - public KeyUsageExtension () : base () - { - extnOid = "2.5.29.15"; - } - protected override void Decode () { ASN1 bitString = new ASN1 (extnValue.Value); @@ -101,18 +96,6 @@ namespace Mono.Security.X509.Extensions { kubits = (kubits << 8) + bitString.Value [i++]; } - protected override void Encode () - { - if (extnValue == null) { - extnValue = new ASN1 (0x03, new byte[] { 0x00, (byte)kubits }); - } - } - - public KeyUsages KeyUsage { - get { return (KeyUsages) kubits; } - set { kubits = Convert.ToInt32 (value, CultureInfo.InvariantCulture); } - } - public override string Name { get { return "Key Usage"; } } diff --git a/mcs/class/Mono.Security/Mono.Security.X509/ChangeLog b/mcs/class/Mono.Security/Mono.Security.X509/ChangeLog index 38b3d393aa5..14d6852db71 100644 --- a/mcs/class/Mono.Security/Mono.Security.X509/ChangeLog +++ b/mcs/class/Mono.Security/Mono.Security.X509/ChangeLog @@ -1,9 +1,3 @@ -2004-07-15 Sebastien Pouliot <sebastien@ximian.com> - - * X501Name.cs: Support for E (email) in FromString. - * X520Attributes.cs: Added X520.EmailAddress. - Both patches fix bug #61241 and were contributed by Ianier Munoz. - 2004-05-27 Sebastien Pouliot <sebastien@ximian.com> * X509Certificate.cs: Rethrow original exception when parsing X.509 diff --git a/mcs/class/Mono.Security/Mono.Security.X509/X501Name.cs b/mcs/class/Mono.Security/Mono.Security.X509/X501Name.cs index 22e3ea30169..515e24c0b9b 100644 --- a/mcs/class/Mono.Security/Mono.Security.X509/X501Name.cs +++ b/mcs/class/Mono.Security/Mono.Security.X509/X501Name.cs @@ -162,8 +162,6 @@ namespace Mono.Security.X509 { case "S": // Microsoft case "ST": // RFC2253 return new X520.StateOrProvinceName (); - case "E": // NOTE: Not part of RFC2253 - return new X520.EmailAddress (); case "DC": // return streetAddress; case "UID": diff --git a/mcs/class/Mono.Security/Mono.Security.X509/X520Attributes.cs b/mcs/class/Mono.Security/Mono.Security.X509/X520Attributes.cs index b8feb6a2db6..54a8af9ba23 100644 --- a/mcs/class/Mono.Security/Mono.Security.X509/X520Attributes.cs +++ b/mcs/class/Mono.Security/Mono.Security.X509/X520Attributes.cs @@ -101,10 +101,6 @@ namespace Mono.Security.X509 { // PRINTABLESTRING asn1.Add (new ASN1 (0x13, Encoding.ASCII.GetBytes (attrValue))); break; - case 0x16: - // IA5STRING - asn1.Add (new ASN1 (0x16, Encoding.ASCII.GetBytes (attrValue))); - break; case 0x1E: // BMPSTRING asn1.Add (new ASN1 (0x1E, Encoding.BigEndianUnicode.GetBytes (attrValue))); @@ -180,14 +176,6 @@ namespace Mono.Security.X509 { } } - // NOTE: Not part of RFC2253 - public class EmailAddress : AttributeTypeAndValue - { - public EmailAddress () : base ("1.2.840.113549.1.9.1", 128, 0x16) - { - } - } - /* -- Naming attributes of type X520Title * id-at-title AttributeType ::= { id-at 12 } * diff --git a/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog b/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog index f633f97c624..e4266e2d3cd 100644 --- a/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog +++ b/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog @@ -1,6 +1,3 @@ -2004-07-12 Umadevi S <sumadevi@novell.com> - * Tokenizer.cs - read an Int64 from the text instead of Int32. Resolves bug 61203 - 2004-06-17 Boris Kirzner <borisk@mainsoft.com> * Comparison.cs - use 'as' to avoid NullReferenceExeption in casting. diff --git a/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs b/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs index c3b4eb1faf8..a9b427d1bf0 100644 --- a/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs +++ b/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs @@ -122,7 +122,7 @@ namespace Mono.Data.SqlExpressions { string str = sb.ToString (); if (str.IndexOf(".") == -1) - return Int64.Parse (str); + return int.Parse (str); else return double.Parse (str); } diff --git a/mcs/class/System.Data/System.Data.Common/ChangeLog b/mcs/class/System.Data/System.Data.Common/ChangeLog index 6af8fca9b77..0db883a625e 100755 --- a/mcs/class/System.Data/System.Data.Common/ChangeLog +++ b/mcs/class/System.Data/System.Data.Common/ChangeLog @@ -1,11 +1,5 @@ -2004-07-21 Umadevi S <sumadevi@novell.com> - * DbDataRecord.cs - Fix for bug 58163. Return DBNull instead of null - -2004-07-07 Umadevi S <sumadevi@novell.com> - * DataContainer.cs :CheckedforNull before calling the relavant setmethods in each of the - SetItemForDataRecord method for the DateTimeClass - 2004-06-24 Atsushi Enomoto <atsushi@ximian.com> + * DataColumnMappingCollection.cs : fixed typo. * DbDataAdapter.cs : column mappings were not filled. diff --git a/mcs/class/System.Data/System.Data.Common/DataContainer.cs b/mcs/class/System.Data/System.Data.Common/DataContainer.cs index de0d64bc598..5b627d7d8ba 100644 --- a/mcs/class/System.Data/System.Data.Common/DataContainer.cs +++ b/mcs/class/System.Data/System.Data.Common/DataContainer.cs @@ -1098,8 +1098,8 @@ namespace System.Data.Common { // if exception thrown, it should be caught // in the caller method - if (!CheckAndSetNull(index,record,field)) - base.SetValue(index,record.GetDateTime(field)); + base.SetValue(index,record.GetDateTime(field)); + base.SetItemFromDataRecord(index,record,field); } internal override int CompareValues(int index1, int index2) diff --git a/mcs/class/System.Data/System.Data.Common/DbDataRecord.cs b/mcs/class/System.Data/System.Data.Common/DbDataRecord.cs index 69a2013f64d..0a6fa0e868d 100644 --- a/mcs/class/System.Data/System.Data.Common/DbDataRecord.cs +++ b/mcs/class/System.Data/System.Data.Common/DbDataRecord.cs @@ -340,7 +340,7 @@ namespace System.Data.Common { public bool IsDBNull (int i) { - return GetValue (i) == DBNull.Value; + return GetValue (i) == null; } #if NET_2_0 public virtual bool IsSetAsDefault (int i) diff --git a/mcs/class/System.Data/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/System.Data.Odbc/ChangeLog index df53dbcdd71..d8581c1975b 100644 --- a/mcs/class/System.Data/System.Data.Odbc/ChangeLog +++ b/mcs/class/System.Data/System.Data.Odbc/ChangeLog @@ -1,16 +1,3 @@ -2004-07-28 Umadevi S (sumadevi@novell.com) - * OdbcParameter.cs - fixed bug 61968. String values passed with quotes - -2004-07-07 Umadevi S (sumadevi@novell.com) - * OdbcConnection.cs - Allowed Close to be called multiple times - - Implementation of Dispose method - -2004-07-07 Umadevi S (sumadevi@novell.com) - * OdbcCommand.cs : fixed set method for Transaction - -2004-07-01 Sureshkumar T (tsureshkumar@novell.com) - * OdbcCommand.cs : fixed reader problem with ExecuteScalar - 2004-06-23 Sureshkumar T (tsureshkumar@novell.com) * OdbcConnection.cs: Fix: Moved env allocation to Open method. Disconnection & freeing handles are done in Close diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs index c414b38fee0..fe242f3bf8f 100644 --- a/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs +++ b/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs @@ -223,14 +223,7 @@ namespace System.Data.Odbc return (IDbTransaction) Transaction;
}
set {
- if (value is OdbcTransaction) - { - Transaction = (OdbcTransaction)value; - } - else - { - throw new ArgumentException (); - } + throw new NotImplementedException ();
}
}
@@ -349,12 +342,11 @@ namespace System.Data.Odbc public object ExecuteScalar ()
{
- object val = null;
+ object val;
OdbcDataReader reader=ExecuteReader();
try
{
- if (reader.Read ())
- val=reader[0];
+ val=reader[0];
}
finally
{
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs index 919ee0606d7..e6bd6ff0441 100644 --- a/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs +++ b/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs @@ -46,7 +46,6 @@ namespace System.Data.Odbc int connectionTimeout; internal OdbcTransaction transaction; IntPtr henv=IntPtr.Zero, hdbc=IntPtr.Zero; - bool disposed = false; #endregion @@ -217,6 +216,8 @@ namespace System.Data.Odbc transaction = null; } + else + throw new InvalidOperationException (); } public OdbcCommand CreateCommand () @@ -230,23 +231,10 @@ namespace System.Data.Odbc throw new NotImplementedException (); } + [MonoTODO] protected override void Dispose (bool disposing) - { - if (!this.disposed) { - try - { - // release the native unmananged resources - this.Close(); - this.disposed = true; - } - finally - { - // call Dispose on the base class - base.Dispose(disposing); - } - } - } - + { + } [MonoTODO] object ICloneable.Clone () diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs index 11153197ca7..51df821d86f 100644 --- a/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs +++ b/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs @@ -261,9 +261,6 @@ namespace System.Data.Odbc string paramValueString = ParamValue.ToString();
// Treat everything else as a string
// Init string buffer
- if (ParamValue is String) - paramValueString = "\'"+paramValueString+"\'"; - if (buffer == null || buffer.Length < ((size > 20) ? size : 20))
buffer = new byte[(size > 20) ? size : 20];
else
diff --git a/mcs/class/System.Data/System.Data.SqlClient/ChangeLog b/mcs/class/System.Data/System.Data.SqlClient/ChangeLog index 14efc7d3b1e..5576c7f7c6b 100755 --- a/mcs/class/System.Data/System.Data.SqlClient/ChangeLog +++ b/mcs/class/System.Data/System.Data.SqlClient/ChangeLog @@ -1,3 +1,7 @@ +2004-06-30 Umadevi S <sumadevi@novell.com> + * SqlCommand.cs : In the Execute Method the commandbehavior parameters were ignored correct +these + 2004-06-22 Atsushi Enomoto <atsushi@ximian.com> * SqlCommandBuilder.cs : Avoid cast exception caused by DbNull. diff --git a/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs b/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs index 366b381b54d..21978c14cf2 100644 --- a/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs +++ b/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs @@ -268,8 +268,8 @@ namespace System.Data.SqlClient { { TdsMetaParameterCollection parms = Parameters.MetaParameters; if (preparedStatement == null) { - bool schemaOnly = ((CommandBehavior & CommandBehavior.SchemaOnly) > 0); - bool keyInfo = ((CommandBehavior & CommandBehavior.KeyInfo) > 0); + bool schemaOnly = ((behavior & CommandBehavior.SchemaOnly) > 0); + bool keyInfo = ((behavior & CommandBehavior.KeyInfo) > 0); StringBuilder sql1 = new StringBuilder (); StringBuilder sql2 = new StringBuilder (); diff --git a/mcs/class/System.Data/System.Data/ChangeLog b/mcs/class/System.Data/System.Data/ChangeLog index 19a97068767..5477819e402 100644 --- a/mcs/class/System.Data/System.Data/ChangeLog +++ b/mcs/class/System.Data/System.Data/ChangeLog @@ -1,8 +1,3 @@ -2004-07-27 Atsushi Enomoto <atsushi@ximian.com> - - * DataSet.cs : on serialization to XmlWriter, XmlConvert should be - used. There were also some culture dependency problems to write int. - 2004-06-27 Atsushi Enomoto <atsushi@ximian.com> * XmlDataInferenceLoader.cs : It was not always filling relation diff --git a/mcs/class/System.Data/System.Data/DataSet.cs b/mcs/class/System.Data/System.Data/DataSet.cs index 49ae0f024f9..34f9f8f4c80 100644 --- a/mcs/class/System.Data/System.Data/DataSet.cs +++ b/mcs/class/System.Data/System.Data/DataSet.cs @@ -1270,7 +1270,7 @@ namespace System.Data { private void WriteColumnAsAttribute (XmlWriter writer, XmlWriteMode mode, DataColumn col, DataRow row, DataRowVersion version) { - WriteAttributeString (writer, mode, col.Namespace, col.Prefix, XmlConvert.EncodeLocalName (col.ColumnName), WriteObjectXml (row[col, version])); + WriteAttributeString (writer, mode, col.Namespace, col.Prefix, XmlConvert.EncodeLocalName (col.ColumnName), row[col, version].ToString ()); } private void WriteTableElement (XmlWriter writer, XmlWriteMode mode, DataTable table, DataRow row, DataRowVersion version) @@ -1282,7 +1282,7 @@ namespace System.Data { if (mode == XmlWriteMode.DiffGram) { WriteAttributeString (writer, mode, XmlConstants.DiffgrNamespace, XmlConstants.DiffgrPrefix, "id", table.TableName + (row.XmlRowID + 1)); - WriteAttributeString (writer, mode, XmlConstants.MsdataNamespace, XmlConstants.MsdataPrefix, "rowOrder", XmlConvert.ToString (row.XmlRowID)); + WriteAttributeString (writer, mode, XmlConstants.MsdataNamespace, XmlConstants.MsdataPrefix, "rowOrder", row.XmlRowID.ToString()); string modeName = null; if (row.RowState == DataRowState.Modified) modeName = "modified"; @@ -1618,7 +1618,7 @@ namespace System.Data { // add ordinal attribute xlmAttrs[1] = doc.CreateAttribute (XmlConstants.MsdataPrefix, XmlConstants.Ordinal, XmlConstants.MsdataNamespace); - xlmAttrs[1].Value = XmlConvert.ToString (simple.Ordinal); + xlmAttrs[1].Value = simple.Ordinal.ToString(); simpleContent.UnhandledAttributes = xlmAttrs; @@ -1655,12 +1655,12 @@ namespace System.Data { if (col.AutoIncrementSeed != 0) { xattr = doc.CreateAttribute (XmlConstants.MsdataPrefix, XmlConstants.AutoIncrementSeed, XmlConstants.MsdataNamespace); - xattr.Value = XmlConvert.ToString (col.AutoIncrementSeed); + xattr.Value = col.AutoIncrementSeed.ToString(); xattrs.Add (xattr); } if (col.DefaultValue.ToString () != String.Empty) - colElem.DefaultValue = WriteObjectXml (col.DefaultValue); + colElem.DefaultValue = col.DefaultValue.ToString (); if (col.MaxLength < 0) colElem.SchemaTypeName = MapType (col.DataType); diff --git a/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog index ccaede486d2..bd7b77d4f19 100644 --- a/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog +++ b/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog @@ -1,11 +1,3 @@ -2004-07-28 Umadevi S <sumadevi@novell.com> - * OdbcCommandTest.cs - Added testcase for bug 61968. String values passed with quotes - -2004-07-01 Sureshkumar T <tsureshkumar@novell.com> - * Added test case for OdbcCommand.ExecuteScalar Method - * New files: - OdbcCommandTest.cs - test suite for OdbcCommand class. - 2004-06-23 Sureshkumar T <TSureshkumar@novell.com> * Added test to check whether the OdbcConnection.Close method closes all the handles. diff --git a/mcs/class/System.Data/Test/System.Data.Odbc/OdbcCommandTest.cs b/mcs/class/System.Data/Test/System.Data.Odbc/OdbcCommandTest.cs deleted file mode 100644 index b7b8bdb4130..00000000000 --- a/mcs/class/System.Data/Test/System.Data.Odbc/OdbcCommandTest.cs +++ /dev/null @@ -1,90 +0,0 @@ -//
-// OdbcCommandTest.cs - NUnit Test Cases for testing the
-// OdbcCommand class
-//
-// Author:
-// Sureshkumar T (TSureshkumar@novell.com)
-//
-// Copyright (c) 2004 Novell Inc., and the individuals listed
-// on the ChangeLog entries.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-
-using System;
-using System.Data;
-using System.Data.Odbc;
-
-using NUnit.Framework;
-
-namespace MonoTests.System.Data.Odbc
-{
-
- [TestFixture]
- public class OdbcCommandTest : MySqlOdbcBaseClient
- {
-
- [SetUp]
- public void GetReady () {
- OpenConnection ();
- CreateTestSetup (); // create database & test tables
- }
-
- [TearDown]
- public void Clean () {
- CleanTestSetup (); // clean test database;
- CloseConnection ();
- }
-
- /// <summary>
- /// Test Execute Scalar Method
- /// </summary>
- [Test]
- public void ExecuteScalarTest ()
- {
- OdbcCommand cmd = conn.CreateCommand ();
- string query = "select count(*) from test order by col_int;";
- cmd.CommandText = query;
- object objCount = cmd.ExecuteScalar ();
- Assertion.AssertEquals( "ExecuteScalar does not return int type", 5, Convert.ToInt32(objCount));
- }
-
- /// <summary>
- /// Test String parameters to ODBC Command
- /// </summary>
- [Test]
- public void ExecuteStringParameterTest()
- {
-
- OdbcCommand dbcmd = new OdbcCommand();
- dbcmd.Connection = conn;
- dbcmd.CommandType = CommandType.Text;
- dbcmd.CommandText = "select count(*) from test where col_char=?;";
- string colvalue = "mono test";
- dbcmd.Parameters.Add("@un",colvalue);
- Object obj = dbcmd.ExecuteScalar();
- Assertion.AssertEquals( "String parameter not passed correctly",5, Convert.ToInt32(obj));
-
-
- }
-
- }
-}
diff --git a/mcs/class/System.Drawing/System.Drawing/ChangeLog b/mcs/class/System.Drawing/System.Drawing/ChangeLog index ee4e72e3e57..941f5db4a6c 100644 --- a/mcs/class/System.Drawing/System.Drawing/ChangeLog +++ b/mcs/class/System.Drawing/System.Drawing/ChangeLog @@ -1,7 +1,3 @@ -2004-07-02 Jordi Mas i Hernandez <jordi@ximian.com> - - * gdipFunctions.cs: fixes bug 61050 - 2004-06-24 Sanjay Gupta <gsanjay@novell.com> * ImageAnimator.cs: Rewrote complete implementation. diff --git a/mcs/class/System.Drawing/System.Drawing/gdipFunctions.cs b/mcs/class/System.Drawing/System.Drawing/gdipFunctions.cs index 5244cd50235..8db7223a85c 100644 --- a/mcs/class/System.Drawing/System.Drawing/gdipFunctions.cs +++ b/mcs/class/System.Drawing/System.Drawing/gdipFunctions.cs @@ -1418,11 +1418,7 @@ namespace System.Drawing { public Stream stream; - public GdiPlusStreamHelper (Stream s) - { - stream = s; - stream.Seek(0, SeekOrigin.Begin); - } + public GdiPlusStreamHelper (Stream s) { stream = s; } public int StreamGetBytesImpl (IntPtr buf, int bufsz, bool peek) { diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/ChangeLog b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/ChangeLog index a638962017f..42d69cb17d6 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/ChangeLog +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/ChangeLog @@ -1,8 +1,3 @@ -2004-07-15 Lluis Sanchez Gual <lluis@novell.com> - - * TcpServerChannel.cs: Set channel name from the provided properties. - This fixes bug #61592. - 2004-05-13 Lluis Sanchez Gual <lluis@ximian.com> * TcpChannel.cs: Made Init private. diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs index 6e3aba6f960..945dff1e278 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs @@ -106,9 +106,6 @@ namespace System.Runtime.Remoting.Channels.Tcp {
switch((string)property.Key)
{
- case "name": - name = property.Value.ToString(); - break; case "port":
port = Convert.ToInt32(property.Value); break;
diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/ChangeLog b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/ChangeLog index 47d41efa66e..c2ea35962b2 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/ChangeLog +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/ChangeLog @@ -1,14 +1,3 @@ -2004-07-26 Lluis Sanchez Gual <lluis@ximian.com> - - * SoapMessageFormater.cs: In BuildSoapMessageFromMethodResponse, add the - return value to the SoapMessage even if it is null. This fixes bug #61837. - -2004-07-06 Lluis Sanchez Gual <lluis@ximian.com> - - * SoapMessageFormatter.cs: In BuildMethodCallFromSoapMessage, set get the - parameters from the SoapMessage by position, not by name, since names - may be different. This fixes bug #60427. - 2004-06-16 Lluis Sanchez Gual <lluis@ximian.com> * SoapServerFormatterSink.cs: Removed unneded method. diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/SoapMessageFormatter.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/SoapMessageFormatter.cs index 2de868c9bee..e0508f1cb82 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/SoapMessageFormatter.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels/SoapMessageFormatter.cs @@ -222,21 +222,21 @@ namespace System.Runtime.Remoting.Channels { // have to add them here
_methodCallParameters = _methodCallInfo.GetParameters();
object[] args = new object[_methodCallParameters.Length];
- int sn = 0;
- for (int n=0; n<_methodCallParameters.Length; n++)
+
+ foreach(ParameterInfo paramInfo in _methodCallParameters)
{
- ParameterInfo paramInfo = _methodCallParameters [n];
Type paramType = (paramInfo.ParameterType.IsByRef ? paramInfo.ParameterType.GetElementType() : paramInfo.ParameterType);
if (paramInfo.IsOut && paramInfo.ParameterType.IsByRef) {
- args [n] = GetNullValue (paramType);
+ args [paramInfo.Position] = GetNullValue (paramType);
}
else{
- object val = soapMessage.ParamValues[sn++];
- if(val is IConvertible)
- args [n] = Convert.ChangeType (val, paramType);
- else
- args [n] = val;
+ int index = Array.IndexOf(soapMessage.ParamNames, paramInfo.Name);
+ if(soapMessage.ParamValues[index] is IConvertible)
+ soapMessage.ParamValues[index] = Convert.ChangeType(
+ soapMessage.ParamValues[index],
+ paramType);
+ args [paramInfo.Position] = soapMessage.ParamValues[index];
}
}
@@ -267,16 +267,10 @@ namespace System.Runtime.Remoting.Channels { ArrayList paramValues = new ArrayList();
ArrayList paramTypes = new ArrayList();
soapMessage.MethodName = mrm.MethodName+"Response";
-
- Type retType = ((MethodInfo)mrm.MethodBase).ReturnType;
-
- if(retType != typeof(void)) {
+ if(mrm.ReturnValue != null && mrm.ReturnValue.GetType() != typeof(void)) {
paramNames.Add("return");
paramValues.Add(mrm.ReturnValue);
- if (mrm.ReturnValue != null)
- paramTypes.Add(mrm.ReturnValue.GetType());
- else
- paramTypes.Add(retType);
+ paramTypes.Add(mrm.ReturnValue.GetType());
}
for(int i = 0; i < mrm.OutArgCount; i++){
diff --git a/mcs/class/System.Security/System.Security.Cryptography.Xml/ChangeLog b/mcs/class/System.Security/System.Security.Cryptography.Xml/ChangeLog index 4fbb13a002a..a0b692b21d0 100644 --- a/mcs/class/System.Security/System.Security.Cryptography.Xml/ChangeLog +++ b/mcs/class/System.Security/System.Security.Cryptography.Xml/ChangeLog @@ -1,8 +1,3 @@ -2004-07-20 Atsushi Enomoto <atsushi@ximian.com> - - * Signature.cs : Fixed NextElementPos() that incorrectly examined - node matching. - 2004-06-17 Sebastien Pouliot <sebastien@ximian.com> * KeyInfoX509Data.cs: Removed old internal IssuerSerial for the diff --git a/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs b/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs index 9aab99f8386..72e5088ed38 100644 --- a/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs +++ b/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs @@ -192,14 +192,13 @@ namespace System.Security.Cryptography.Xml { { while (pos < nl.Count) { if (nl [pos].NodeType == XmlNodeType.Element) { - if (nl [pos].LocalName != name || nl [pos].NamespaceURI != ns) { + if (nl [pos].LocalName != name && nl [pos].NamespaceURI != ns) { if (required) throw new CryptographicException ("Malformed element " + name); else return -2; } - else - return pos; + return pos; } else pos++; diff --git a/mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog b/mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog index 3b3ed1be736..01f02c69e94 100644 --- a/mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog +++ b/mcs/class/System.Web.Services/System.Web.Services.Protocols/ChangeLog @@ -1,8 +1,3 @@ -2004-07-20 Lluis Sanchez Gual <lluis@ximian.com> - - * HttpWebClientProtocol.cs: Add received cookies to cookieContainer when - getting the response, do not wait for the next request to do it. - 2004-06-22 Lluis Sanchez Gual <lluis@ximian.com> * XmlReturnReader.cs, XmlReturnWriter.cs: Generate the serializer with diff --git a/mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpWebClientProtocol.cs b/mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpWebClientProtocol.cs index 722f1d2a681..3be915cfbc8 100644 --- a/mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpWebClientProtocol.cs +++ b/mcs/class/System.Web.Services/System.Web.Services.Protocols/HttpWebClientProtocol.cs @@ -45,6 +45,7 @@ namespace System.Web.Services.Protocols { CookieContainer cookieContainer;
IWebProxy proxy;
string userAgent;
+ CookieCollection prevCookies;
#if NET_1_1
bool _unsafeAuthenticated;
@@ -116,25 +117,41 @@ namespace System.Web.Services.Protocols { #region Methods
- internal virtual void CheckForCookies (HttpWebResponse response)
+ internal virtual void AddCookies (Uri uri)
{
- CookieCollection cookies = response.Cookies;
- if (cookieContainer == null || cookies.Count == 0)
+ if (cookieContainer == null)
+ cookieContainer = new CookieContainer ();
+
+ if (prevCookies == null || prevCookies.Count == 0)
return;
CookieCollection coll = cookieContainer.GetCookies (uri);
- foreach (Cookie c in cookies) {
- bool add = true;
- foreach (Cookie prev in coll) {
+ foreach (Cookie prev in prevCookies) {
+ bool dont = false;
+ foreach (Cookie c in coll) {
if (c.Equals (prev)) {
- add = false;
+ dont = true;
break;
}
}
- if (add)
- cookieContainer.Add (c);
+
+ if (dont == false)
+ cookieContainer.Add (prev);
}
}
+
+ internal virtual void CheckForCookies (HttpWebResponse response)
+ {
+ CookieCollection cookies = response.Cookies;
+ if (cookies.Count == 0)
+ return;
+
+ if (prevCookies == null)
+ prevCookies = new CookieCollection ();
+
+ foreach (Cookie c in cookies)
+ prevCookies.Add (c);
+ }
protected override WebRequest GetWebRequest (Uri uri)
{
@@ -147,6 +164,7 @@ namespace System.Web.Services.Protocols { if (clientCertificates != null)
request.ClientCertificates.AddRange (clientCertificates);
+ AddCookies (uri);
request.CookieContainer = cookieContainer;
if (proxy != null)
request.Proxy = proxy;
diff --git a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs index 9e53465f583..4a2cb6502af 100644 --- a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs +++ b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs @@ -319,8 +319,8 @@ namespace System.Web.Compilation if (isvirtual) { file = tparser.MapPath (file); - } else { - file = GetIncludeFilePath (tparser.BaseDir, file); + } else if (!Path.IsPathRooted (file)) { + file = UrlUtils.Combine (tparser.BaseVirtualDir, file); } InitParser (file); @@ -332,14 +332,6 @@ namespace System.Web.Compilation //PrintLocation (location); } - static string GetIncludeFilePath (string basedir, string filename) - { - if (Path.DirectorySeparatorChar == '/') - filename = filename.Replace ("\\", "/"); - - return Path.GetFullPath (Path.Combine (basedir, filename)); - } - void TextParsed (ILocation location, string text) { if (text.IndexOf ("<%") != -1 && !inScript) { diff --git a/mcs/class/System.Web/System.Web.Compilation/AspParser.cs b/mcs/class/System.Web/System.Web.Compilation/AspParser.cs index 28c357ce3c5..8f199c12de8 100644 --- a/mcs/class/System.Web/System.Web.Compilation/AspParser.cs +++ b/mcs/class/System.Web/System.Web.Compilation/AspParser.cs @@ -184,15 +184,12 @@ namespace System.Web.Compilation str = str.Substring (2).Trim (); int len = str.Length; int lastQuote = str.LastIndexOf ('"'); - if (len < 10 || lastQuote != len - 1) - return false; - - if (!str.ToLower ().StartsWith ("#include ")) + if (len < 10 || lastQuote != len - 1 || !str.StartsWith ("#include ")) return false; str = str.Substring (9).Trim (); - bool isfile = (str.ToLower ().StartsWith ("file")); - if (!isfile && !str.ToLower ().StartsWith ("virtual")) + bool isfile = (str.StartsWith ("file")); + if (!isfile && !str.StartsWith ("virtual")) return false; pathType = (isfile) ? "file" : "virtual"; diff --git a/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs index c5f1c410923..5036f5db094 100644 --- a/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs @@ -309,7 +309,7 @@ namespace System.Web.Compilation bool keepFiles = (Environment.GetEnvironmentVariable ("MONO_ASPNET_NODELETE") != null); TempFileCollection tempcoll = new TempFileCollection (config.TempDirectory, keepFiles); compilerParameters.TempFiles = tempcoll; - string dllfilename = Path.GetFileName (tempcoll.AddExtension ("dll", true)); + string dllfilename = tempcoll.AddExtension ("dll", true); if (!Directory.Exists (dynamicBase)) Directory.CreateDirectory (dynamicBase); diff --git a/mcs/class/System.Web/System.Web.Compilation/ChangeLog b/mcs/class/System.Web/System.Web.Compilation/ChangeLog index 80ce8459331..1bd493966e2 100644 --- a/mcs/class/System.Web/System.Web.Compilation/ChangeLog +++ b/mcs/class/System.Web/System.Web.Compilation/ChangeLog @@ -1,18 +1,3 @@ -2004-07-21 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * AspGenerator.cs: the path for file was treated as virtual, but it's - physical. Fixes bug #61524. - -2004-07-16 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * AspParser.cs: fixed case-sensitivity issues with #include and its - attributes. Closes #61429. - -2004-07-07 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * BaseCompiler.cs: - * WebServiceCompiler.cs: really create the dlls under DynamicBase - 2004-06-19 Gonzalo Paniagua Javier <gonzalo@ximian.com> * TemplateControlCompiler.cs: for system colors, use SystemColors class diff --git a/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs index f6884bf428b..20b87415730 100644 --- a/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs @@ -93,7 +93,7 @@ namespace System.Web.Compilation sw.WriteLine (parser.Program); sw.Close (); - string dllfilename = Path.GetFileName (tempcoll.AddExtension ("dll", true)); + string dllfilename = tempcoll.AddExtension ("dll", true); if (!Directory.Exists (dynamicBase)) Directory.CreateDirectory (dynamicBase); diff --git a/mcs/class/System.Web/System.Web.Handlers/ChangeLog b/mcs/class/System.Web/System.Web.Handlers/ChangeLog index 50459bd9024..ebddbc1e4ba 100644 --- a/mcs/class/System.Web/System.Web.Handlers/ChangeLog +++ b/mcs/class/System.Web/System.Web.Handlers/ChangeLog @@ -1,7 +1,3 @@ -2004-07-02 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * TraceHandler.cs: check that trace is enabled or throw. - 2004-06-03 Gonzalo Paniagua Javier <gonzalo@ximian.com> * TraceHandler.cs: Added protected missing members and attributes. diff --git a/mcs/class/System.Web/System.Web.Handlers/TraceHandler.cs b/mcs/class/System.Web/System.Web.Handlers/TraceHandler.cs index 343aa5957a7..33385dbf5fb 100644 --- a/mcs/class/System.Web/System.Web.Handlers/TraceHandler.cs +++ b/mcs/class/System.Web/System.Web.Handlers/TraceHandler.cs @@ -39,27 +39,16 @@ using System.Web.UI.WebControls; namespace System.Web.Handlers { -#if NET_2_0 - [Serializable] -#endif - class TraceNotAvailableException : HttpException - { - public TraceNotAvailableException () : - base ("Trace Error") {} - - internal override string Description { - get { return "Trace.axd is not enabled in the configuration file for this application."; } - } - } - public class TraceHandler : IHttpHandler { void IHttpHandler.ProcessRequest (HttpContext context) { TraceManager manager = HttpRuntime.TraceManager; - if (!manager.Enabled || manager.LocalOnly && !context.Request.IsLocal) { - throw new TraceNotAvailableException (); + if (manager.LocalOnly && !context.Request.IsLocal) { + // Need to figure out the error message that goes here + // but I only have cassini for testing + return; } HtmlTextWriter output = new HtmlTextWriter (context.Response.Output); diff --git a/mcs/class/System.Web/System.Web.SessionState/ChangeLog b/mcs/class/System.Web/System.Web.SessionState/ChangeLog index 3e70b628dc9..58135e9f7d0 100644 --- a/mcs/class/System.Web/System.Web.SessionState/ChangeLog +++ b/mcs/class/System.Web/System.Web.SessionState/ChangeLog @@ -1,8 +1,3 @@ -2004-07-07 Juraj Skripsky <juraj@hotfeet.ch> - - * SessionStateModule.cs: set path in session cookie to application - path. - 2004-06-18 Gert Driesen <drieseng@users.sourceforge.net> * IStateRuntime.cs: added missing marshalling attributes diff --git a/mcs/class/System.Web/System.Web.SessionState/SessionStateModule.cs b/mcs/class/System.Web/System.Web.SessionState/SessionStateModule.cs index cbee9af88f8..70c4a566129 100644 --- a/mcs/class/System.Web/System.Web.SessionState/SessionStateModule.cs +++ b/mcs/class/System.Web/System.Web.SessionState/SessionStateModule.cs @@ -158,7 +158,7 @@ namespace System.Web.SessionState } else if (isNew) { string id = context.Session.SessionID; HttpCookie cookie = new HttpCookie (CookieName, id); - cookie.Path = UrlUtils.GetDirectory (context.Request.ApplicationPath); + cookie.Path = UrlUtils.GetDirectory (context.Request.Path); context.Response.AppendCookie (cookie); } } diff --git a/mcs/class/System.Web/System.Web.UI/ChangeLog b/mcs/class/System.Web/System.Web.UI/ChangeLog index dd08b76969d..07d62fd2c33 100644 --- a/mcs/class/System.Web/System.Web.UI/ChangeLog +++ b/mcs/class/System.Web/System.Web.UI/ChangeLog @@ -1,19 +1,3 @@ -2004-07-16 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * TemplateControl.cs: don't include private methods of base classes when - auto-attaching events. Fixes bug 61569. - -2004-07-08 Pablo Baena <pbaena@gmail.com> - - * Page.cs: added workaround for __doPostBack script on Netscape 4.xx - -2004-07-02 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * Page.cs: added additional checks for saving/displaying trace data. - - * PageParser.cs: removed checks for trace enabled in configuration - files. - 2004-06-29 Gonzalo Paniagua Javier <gonzalo@ximian.com> * ControlCollection.cs: when clearing the control collection, tell the diff --git a/mcs/class/System.Web/System.Web.UI/Page.cs b/mcs/class/System.Web/System.Web.UI/Page.cs index 53b89d28854..3887c9c35e0 100755 --- a/mcs/class/System.Web/System.Web.UI/Page.cs +++ b/mcs/class/System.Web/System.Web.UI/Page.cs @@ -526,12 +526,7 @@ public class Page : TemplateControl, IHttpHandler writer.WriteLine ("<script language=\"javascript\">"); writer.WriteLine ("<!--"); writer.WriteLine ("\tfunction __doPostBack(eventTarget, eventArgument) {"); - - if (Request.Browser.Browser == ("Netscape") && Request.Browser.MajorVersion == 4) - writer.WriteLine ("\t\tvar theform = document.{0};", formUniqueID); - else - writer.WriteLine ("\t\tvar theform = document.getElementById ('{0}');", formUniqueID); - + writer.WriteLine ("\t\tvar theform = document.getElementById ('{0}');", formUniqueID); writer.WriteLine ("\t\ttheform.{0}.value = eventTarget;", postEventSourceID); writer.WriteLine ("\t\ttheform.{0}.value = eventArgument;", postEventArgumentID); writer.WriteLine ("\t\ttheform.submit();"); @@ -774,18 +769,11 @@ public class Page : TemplateControl, IHttpHandler private void RenderTrace (HtmlTextWriter output) { - TraceManager traceManager = HttpRuntime.TraceManager; - - if (Trace.HaveTrace && !Trace.IsEnabled || !Trace.HaveTrace && !traceManager.Enabled) + if (!Trace.IsEnabled) return; Trace.SaveData (); - - if (!Trace.HaveTrace && traceManager.Enabled && !traceManager.PageOutput) - return; - - if (!traceManager.LocalOnly || Context.Request.IsLocal) - Trace.Render (output); + Trace.Render (output); } internal void RaisePostBackEvents () diff --git a/mcs/class/System.Web/System.Web.UI/PageParser.cs b/mcs/class/System.Web/System.Web.UI/PageParser.cs index 571edf2997a..816d83c0bc8 100644 --- a/mcs/class/System.Web/System.Web.UI/PageParser.cs +++ b/mcs/class/System.Web/System.Web.UI/PageParser.cs @@ -199,6 +199,13 @@ namespace System.Web.UI } } + TraceConfig traceConfig = (TraceConfig) Context.GetConfig ("system.web/trace"); + if (traceConfig != null) { + trace = traceConfig.Enabled; + if (trace) + haveTrace = true; + } + string tracestr = GetString (atts, "Trace", null); if (tracestr != null) { haveTrace = true; @@ -220,6 +227,13 @@ namespace System.Web.UI "one of the following values: SortByTime, SortByCategory."); } + if (traceConfig != null) { + if (traceConfig.LocalOnly && !Context.Request.IsLocal) { + haveTrace = false; + trace = false; + } + } + errorPage = GetString (atts, "ErrorPage", null); validateRequest = GetBool (atts, "ValidateRequest", PagesConfig.ValidateRequest); clientTarget = GetString (atts, "ClientTarget", null); diff --git a/mcs/class/System.Web/System.Web.UI/TemplateControl.cs b/mcs/class/System.Web/System.Web.UI/TemplateControl.cs index 1014c3792f9..7b1e85f94fb 100755 --- a/mcs/class/System.Web/System.Web.UI/TemplateControl.cs +++ b/mcs/class/System.Web/System.Web.UI/TemplateControl.cs @@ -106,12 +106,6 @@ namespace System.Web.UI { if (method == null) continue; - if (method.DeclaringType != type) { - if (!method.IsPublic && !method.IsFamilyOrAssembly && - !method.IsFamilyAndAssembly && !method.IsFamily) - continue; - } - if (method.ReturnType != typeof (void)) continue; diff --git a/mcs/class/System.Web/System.Web.Util/ChangeLog b/mcs/class/System.Web/System.Web.Util/ChangeLog index f293a48cb13..4d57c166561 100644 --- a/mcs/class/System.Web/System.Web.Util/ChangeLog +++ b/mcs/class/System.Web/System.Web.Util/ChangeLog @@ -1,8 +1,3 @@ -2004-07-20 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * UrlUtils.cs: don't pass double slash when the path begins with a - tilde. Fixes bug #61654. - 2004-05-26 Gonzalo Paniagua Javier <gonzalo@ximian.com> * UrlUtils.cs: diff --git a/mcs/class/System.Web/System.Web.Util/UrlUtils.cs b/mcs/class/System.Web/System.Web.Util/UrlUtils.cs index a8f60ff3159..955c8d9a17b 100644 --- a/mcs/class/System.Web/System.Web.Util/UrlUtils.cs +++ b/mcs/class/System.Web/System.Web.Util/UrlUtils.cs @@ -154,11 +154,7 @@ namespace System.Web.Util slash = "/"; } - string appvpath = HttpRuntime.AppDomainAppVirtualPath; - if (appvpath.EndsWith ("/")) - slash = ""; - - return Reduce (appvpath + slash + relPath); + return Reduce (HttpRuntime.AppDomainAppVirtualPath + slash + relPath); } return Reduce (basePath + slash + relPath); diff --git a/mcs/class/System.Web/System.Web/ChangeLog b/mcs/class/System.Web/System.Web/ChangeLog index c783b045319..93cc846bb86 100644 --- a/mcs/class/System.Web/System.Web/ChangeLog +++ b/mcs/class/System.Web/System.Web/ChangeLog @@ -1,27 +1,3 @@ -2004-07-21 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpApplication.cs: the file not found might be a dependency. - -2004-07-20 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpCookie.cs: use invariant when formatting expires date. Fixes bug - #61690. - -2004-07-07 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpApplication.cs: don't keep the session around if we got it from - the context. Fixes bug #61232. - -2004-07-06 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpUtility.cs: fixed stupid bug in UrlDecode from bytes. Closes bug - #61181. - -2004-07-02 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * TraceContext.cs: added internal HaveTrace property whose - value is true when the page has a Trace attribute. - 2004-06-15 Gonzalo Paniagua Javier <gonzalo@ximian.com> * TraceData.cs: fixed <br> output. Closes bug #60181. diff --git a/mcs/class/System.Web/System.Web/HttpApplication.cs b/mcs/class/System.Web/System.Web/HttpApplication.cs index 09288727b8f..0f8aaa3759b 100644 --- a/mcs/class/System.Web/System.Web/HttpApplication.cs +++ b/mcs/class/System.Web/System.Web/HttpApplication.cs @@ -805,12 +805,7 @@ namespace System.Web return ret; } catch (DirectoryNotFoundException) { throw new HttpException (404, "Cannot find '" + file + "'."); - } catch (FileNotFoundException fnf) { - string fname = fnf.FileName; - if (fname != null && fname != "") { - file = Path.GetFileName (fname); - } - + } catch (FileNotFoundException) { throw new HttpException (404, "Cannot find '" + file + "'."); } } @@ -1150,8 +1145,10 @@ namespace System.Web if (null != _Session) return _Session; - if (null != _Context && null != _Context.Session) - return _Context.Session; + if (null != _Context && null != _Context.Session) { + _Session = _Context.Session; + return _Session; + } throw new HttpException ("Failed to get session object"); } diff --git a/mcs/class/System.Web/System.Web/HttpCookie.cs b/mcs/class/System.Web/System.Web/HttpCookie.cs index c121772be1b..32fdf84261b 100644 --- a/mcs/class/System.Web/System.Web/HttpCookie.cs +++ b/mcs/class/System.Web/System.Web/HttpCookie.cs @@ -26,7 +26,6 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; -using System.Globalization; using System.Text; using System.Web; using System.Collections.Specialized; @@ -99,9 +98,7 @@ namespace System.Web if (_ExpiresSet && _Expires != DateTime.MinValue) { oSetCookie.Append ("; expires="); - DateTime ut = _Expires.ToUniversalTime (); - oSetCookie.Append (ut.ToString ("ddd, dd-MMM-yyyy HH':'mm':'ss 'GMT'", - DateTimeFormatInfo.InvariantInfo)); + oSetCookie.Append (_Expires.ToUniversalTime ().ToString ("ddd, dd-MMM-yyyy HH':'mm':'ss '+0000'")); } if (_Secure) diff --git a/mcs/class/System.Web/System.Web/HttpUtility.cs b/mcs/class/System.Web/System.Web/HttpUtility.cs index d1a2d0dbb07..d70b32d8f92 100644 --- a/mcs/class/System.Web/System.Web/HttpUtility.cs +++ b/mcs/class/System.Web/System.Web/HttpUtility.cs @@ -444,7 +444,7 @@ namespace System.Web { int value = 0;
int end = length + offset;
for (int i = offset; i < end; i++)
- value = (value << 4) + GetInt (bytes [i]);
+ value = (value << 4) + GetInt (bytes [offset]);
return (char) value;
}
@@ -474,10 +474,10 @@ namespace System.Web { output.Append (GetChars (acc, e));
acc.SetLength (0);
}
- output.Append (GetChar (bytes, i + 2, 4));
+ output.Append (GetChar (bytes, offset + 2, 4));
i += 5;
} else {
- acc.WriteByte ((byte) GetChar (bytes, i + 1, 2));
+ acc.WriteByte ((byte) GetChar (bytes, offset + 1, 2));
i += 2;
}
continue;
diff --git a/mcs/class/System.Web/System.Web/TraceContext.cs b/mcs/class/System.Web/System.Web/TraceContext.cs index f939add498b..6d7a7c68608 100644 --- a/mcs/class/System.Web/System.Web/TraceContext.cs +++ b/mcs/class/System.Web/System.Web/TraceContext.cs @@ -42,19 +42,11 @@ namespace System.Web { private TraceMode _Mode;
private TraceData data;
private bool data_saved;
- private bool _haveTrace = false; public TraceContext(HttpContext Context) {
_Context = Context;
_Enabled = false;
}
- - - internal bool HaveTrace { - get { - return _haveTrace; - } - } public bool IsEnabled {
get {
@@ -64,7 +56,6 @@ namespace System.Web { set {
if (value && data == null)
data = new TraceData ();
- _haveTrace = true; _Enabled = value;
}
}
diff --git a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog index e542d6a843d..f98edd97e7f 100755 --- a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog +++ b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog @@ -1,9 +1,3 @@ -2004-07-15 Lluis Sanchez Gual <lluis@novell.com> - - * TypeTranslator.cs, XmlCustomFormatter.cs: Added support for base64. This - xsd type is not part of the last schema specification, but the google api - uses it and ms.net accepts it. - 2004-06-22 Lluis Sanchez Gual <lluis@ximian.com> * ReflectionHelper.cs: Correctly detect private types. diff --git a/mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs b/mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs index fc71eeea981..cffcb1567a1 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/TypeTranslator.cs @@ -106,7 +106,6 @@ namespace System.Xml.Serialization primitiveTypes.Add ("token", new TypeData (typeof (string), "token", true)); primitiveTypes.Add ("normalizedString", new TypeData (typeof (string), "normalizedString", true)); primitiveTypes.Add ("anyURI", new TypeData (typeof (string), "anyURI", true)); - primitiveTypes.Add ("base64", new TypeData (typeof (byte[]), "base64", true)); } public static TypeData GetTypeData (Type type) diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs index 60b4f282cab..17514268a90 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs @@ -195,7 +195,6 @@ namespace System.Xml.Serialization { case "unsignedInt": return XmlConvert.ToString ((UInt32)value); case "unsignedLong": return XmlConvert.ToString ((UInt64)value); case "guid": return XmlConvert.ToString ((Guid)value); - case "base64": case "base64Binary": return Convert.ToBase64String ((byte[])value); default: return value is IFormattable ? ((IFormattable) value).ToString (null, CultureInfo.InvariantCulture) : value.ToString (); } @@ -224,7 +223,6 @@ namespace System.Xml.Serialization { case "unsignedInt": return XmlConvert.ToUInt32 (value); case "unsignedLong": return XmlConvert.ToUInt64 (value); case "guid": return XmlConvert.ToGuid (value); - case "base64": case "base64Binary": return Convert.FromBase64String (value); default: if (type.Type != null) @@ -255,7 +253,6 @@ namespace System.Xml.Serialization { case "unsignedInt": return value + ".ToString(CultureInfo.InvariantCulture)"; case "unsignedLong": return value + ".ToString(CultureInfo.InvariantCulture)"; case "guid": return "XmlConvert.ToString (" + value + ")"; - case "base64": case "base64Binary": return "Convert.ToBase64String (" + value + ")"; case "NMTOKEN": case "Name": @@ -293,7 +290,6 @@ namespace System.Xml.Serialization { case "unsignedInt": return "UInt32.Parse (" + value + ", CultureInfo.InvariantCulture)"; case "unsignedLong": return "UInt64.Parse (" + value + ", CultureInfo.InvariantCulture)"; case "guid": return "XmlConvert.ToGuid (" + value + ")"; - case "base64:": case "base64Binary": return "Convert.FromBase64String (" + value + ")"; default: return value; } diff --git a/mcs/class/System.XML/System.Xml/ChangeLog b/mcs/class/System.XML/System.Xml/ChangeLog index 21d51c9e061..04516da68e3 100644 --- a/mcs/class/System.XML/System.Xml/ChangeLog +++ b/mcs/class/System.XML/System.Xml/ChangeLog @@ -1,15 +1,3 @@ -2004-07-20 Atsushi Enomoto <atsushi@ximian.com> - - * XmlNode.cs : When the argument node being inserted is the existing - document element, it should not result in an error (since it should - be first removed from document, thus no error should happen). - -2004-07-16 Atsushi Enomoto <atsushi@ximian.com> - - * XmlTextReader.cs : Fixed several problems on ReadBase64(); - Whitespaces should be ignored, and '=' was not skipped correctly. - It caused "unexpected end of document" error at immediate close tag. - 2004-06-18 Atsushi Enomoto <atsushi@ximian.com> * DTDObjectModel.cs, DTDReader.cs, XmlConvert.cs, XmlDocument.cs, diff --git a/mcs/class/System.XML/System.Xml/XmlNode.cs b/mcs/class/System.XML/System.Xml/XmlNode.cs index 7eaa7285c8e..52c6b21c794 100644 --- a/mcs/class/System.XML/System.Xml/XmlNode.cs +++ b/mcs/class/System.XML/System.Xml/XmlNode.cs @@ -524,7 +524,7 @@ namespace System.Xml throw new ArgumentException ("The reference node is not a child of this node."); } - if(this == ownerDoc && ownerDoc.DocumentElement != null && (newChild is XmlElement) && newChild != ownerDoc.DocumentElement) + if(this == ownerDoc && ownerDoc.DocumentElement != null && (newChild is XmlElement)) throw new XmlException ("multiple document element not allowed."); // checking validity finished. then appending... diff --git a/mcs/class/System.XML/System.Xml/XmlTextReader.cs b/mcs/class/System.XML/System.Xml/XmlTextReader.cs index 9da63c2fc0f..ea3b4e9cd51 100644 --- a/mcs/class/System.XML/System.Xml/XmlTextReader.cs +++ b/mcs/class/System.XML/System.Xml/XmlTextReader.cs @@ -531,14 +531,6 @@ namespace System.Xml return false; } - private int SkipIgnorableBase64Chars (char [] chars, int charsLength, int i) - { - while (chars [i] == '=' || XmlChar.IsWhitespace (chars [i])) - if (charsLength == ++i) - break; - return i; - } - public int ReadBase64 (byte [] buffer, int offset, int length) { if (offset < 0) @@ -575,9 +567,7 @@ namespace System.Xml byte b = 0; byte work = 0; - for (int i = 0; i < charsLength - 3; i++) { - if ((i = SkipIgnorableBase64Chars (chars, charsLength, i)) == charsLength) - break; + for (int i = 0; i < charsLength - 3; i += 4) { b = (byte) (GetBase64Byte (chars [i]) << 2); if (bufIndex < bufLast) buffer [bufIndex] = b; @@ -587,11 +577,9 @@ namespace System.Xml base64Cache [0] = b; } // charsLength mod 4 might not equals to 0. - if (++i == charsLength) - break; - if ((i = SkipIgnorableBase64Chars (chars, charsLength, i)) == charsLength) + if (i + 1 == charsLength) break; - b = GetBase64Byte (chars [i]); + b = GetBase64Byte (chars [i + 1]); work = (byte) (b >> 4); if (bufIndex < bufLast) { buffer [bufIndex] += work; @@ -610,11 +598,9 @@ namespace System.Xml base64Cache [1] = work; } - if (++i == charsLength) - break; - if ((i = SkipIgnorableBase64Chars (chars, charsLength, i)) == charsLength) + if (i + 2 == charsLength) break; - b = GetBase64Byte (chars [i]); + b = GetBase64Byte (chars [i + 2]); work = (byte) (b >> 2); if (bufIndex < bufLast) { buffer [bufIndex] += work; @@ -631,11 +617,9 @@ namespace System.Xml base64CacheStartsAt = 2; base64Cache [2] = work; } - if (++i == charsLength) + if (i + 3 == charsLength) break; - if ((i = SkipIgnorableBase64Chars (chars, charsLength, i)) == charsLength) - break; - work = GetBase64Byte (chars [i]); + work = GetBase64Byte (chars [i + 3]); if (bufIndex < bufLast) { buffer [bufIndex] += work; bufIndex++; @@ -2564,8 +2548,6 @@ namespace System.Xml return; } - // Since ReadBase64() is processed for every 4 chars, it does - // not handle '=' here. private byte GetBase64Byte (char ch) { switch (ch) { @@ -2573,6 +2555,8 @@ namespace System.Xml return 62; case '/': return 63; + case '=': + return 0; default: if (ch >= 'A' && ch <= 'Z') return (byte) (ch - 'A'); @@ -2593,6 +2577,8 @@ namespace System.Xml return 0; } + shouldSkipUntilEndTag = true; + if (offset < 0) throw new ArgumentOutOfRangeException ("offset", offset, "Offset must be non-negative integer."); else if (length < 0) @@ -2603,8 +2589,6 @@ namespace System.Xml if (NodeType != XmlNodeType.Element) return 0; - shouldSkipUntilEndTag = true; - int bufIndex = offset; for (int i = 0; i < length; i++) { int c = PeekChar (); @@ -2623,9 +2607,9 @@ namespace System.Xml depth++; depthUp = false; } - ReadEndTag (); + ReadEndTag(); shouldSkipUntilEndTag = false; - Read (); // move to the next node + Read (); return i; default: ReadChar (); diff --git a/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs b/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs index edc8da68872..a09a812bedc 100644 --- a/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs +++ b/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs @@ -97,7 +97,7 @@ namespace Mono.CSharp StringCollection assemblies = options.ReferencedAssemblies; foreach (CodeCompileUnit e in ea) { - fileNames [i] = GetTempFileNameWithExtension (options.TempFiles, i.ToString () + ".cs"); + fileNames [i] = GetTempFileNameWithExtension (options.TempFiles, "cs"); FileStream f=new FileStream(fileNames[i],FileMode.OpenOrCreate); StreamWriter s=new StreamWriter(f, Encoding.UTF8); if (e.ReferencedAssemblies != null) { @@ -183,7 +183,7 @@ namespace Mono.CSharp string[] fileNames=new string[sources.Length]; int i=0; foreach (string source in sources) { - fileNames [i] = GetTempFileNameWithExtension (options.TempFiles, i.ToString () + ".cs"); + fileNames [i] = GetTempFileNameWithExtension (options.TempFiles, "cs"); FileStream f=new FileStream(fileNames[i],FileMode.OpenOrCreate); StreamWriter s=new StreamWriter(f); s.Write(source); diff --git a/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs b/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs index c22c8fc653d..4be6da4cf77 100644 --- a/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs +++ b/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs @@ -503,10 +503,7 @@ namespace Mono.CSharp OutputMemberAccessModifier( attributes ); OutputFieldScopeModifier( attributes ); - if (IsCurrentEnum) - Output.Write(field.Name); - else - OutputTypeNamePair( field.Type, GetSafeName (field.Name) ); + OutputTypeNamePair( field.Type, GetSafeName (field.Name) ); CodeExpression initExpression = field.InitExpression; if ( initExpression != null ) { diff --git a/mcs/class/System/Microsoft.CSharp/ChangeLog b/mcs/class/System/Microsoft.CSharp/ChangeLog index 6fbed3e9cc0..b9e06652430 100644 --- a/mcs/class/System/Microsoft.CSharp/ChangeLog +++ b/mcs/class/System/Microsoft.CSharp/ChangeLog @@ -1,13 +1,3 @@ -2004-07-13 Peter Williams <peter@newton.cx> - - * CSharpCodeCompiler.cs (CompileAssemblyFromDomBatch): Include - counter in the extension so that batch compilations work. - (CompileAssemblyFromSourceBatch): Same. - -2004-07-12 Fawad Halim <fawad@fawad.net> - - * CSharpCodeGenerator.cs : Have GenerateField generate field sans the type for enums. - 2004-06-28 Atsushi Enomoto <atsushi@ximian.com> * CSharpCodeCompiler.cs : (only for windows) First check mcs.bat, then diff --git a/mcs/class/System/System.CodeDom.Compiler/ChangeLog b/mcs/class/System/System.CodeDom.Compiler/ChangeLog index 3968ed4480d..a91f5c6b3f9 100755 --- a/mcs/class/System/System.CodeDom.Compiler/ChangeLog +++ b/mcs/class/System/System.CodeDom.Compiler/ChangeLog @@ -1,9 +1,3 @@ -2004-07-15 Peter Williams <peter@newton.cx> - - * CodeGenerator.cs: Have the basic generator create line pragmas - for NamespaceImports, SnippetCompileUnits, and TypeMembers, all of - which had LinePragma members which were going unused. - 2004-06-17 Jackson Harper <jackson@ximian.com> * CompilerError.cs: diff --git a/mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs b/mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs index d3b0c052fde..7d42931b6d1 100755 --- a/mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs +++ b/mcs/class/System/System.CodeDom.Compiler/CodeGenerator.cs @@ -392,16 +392,9 @@ namespace System.CodeDom.Compiler { GenerateNamespaceStart (ns); - foreach (CodeNamespaceImport import in ns.Imports) { - if (import.LinePragma != null) - GenerateLinePragmaStart (import.LinePragma); - + foreach (CodeNamespaceImport import in ns.Imports) GenerateNamespaceImport (import); - if (import.LinePragma != null) - GenerateLinePragmaEnd (import.LinePragma); - } - output.WriteLine(); foreach (CodeTypeDeclaration type in ns.Types) { @@ -417,15 +410,8 @@ namespace System.CodeDom.Compiler { protected abstract void GenerateNamespaceImport (CodeNamespaceImport i); protected void GenerateNamespaceImports (CodeNamespace e) { - foreach (CodeNamespaceImport import in e.Imports) { - if (import.LinePragma != null) - GenerateLinePragmaStart (import.LinePragma); - + foreach (CodeNamespaceImport import in e.Imports) GenerateNamespaceImport (import); - - if (import.LinePragma != null) - GenerateLinePragmaEnd (import.LinePragma); - } } protected void GenerateNamespaces (CodeCompileUnit e) @@ -486,14 +472,7 @@ namespace System.CodeDom.Compiler { protected virtual void GenerateSnippetCompileUnit (CodeSnippetCompileUnit e) { - if (e.LinePragma != null) - GenerateLinePragmaStart (e.LinePragma); - output.WriteLine (e.Value); - - if (e.LinePragma != null) - GenerateLinePragmaEnd (e.LinePragma); - } protected abstract void GenerateSnippetExpression (CodeSnippetExpression e); @@ -990,17 +969,11 @@ namespace System.CodeDom.Compiler { private void GenerateType (CodeTypeDeclaration type) { - if (type.LinePragma != null) - GenerateLinePragmaStart (type.LinePragma); - CodeTypeDelegate del = type as CodeTypeDelegate; if (del != null) GenerateDelegate (del); else GenerateNonDelegateType (type); - - if (type.LinePragma != null) - GenerateLinePragmaEnd (type.LinePragma); } private void GenerateDelegate (CodeTypeDelegate type) @@ -1051,18 +1024,12 @@ namespace System.CodeDom.Compiler { CodeTypeMember prevMember = this.currentMember; this.currentMember = member; - if (prevMember != null && prevMember.LinePragma != null) - GenerateLinePragmaEnd (prevMember.LinePragma); - if (options.BlankLinesBetweenMembers) output.WriteLine (); foreach (CodeCommentStatement statement in member.Comments) GenerateCommentStatement (statement); - if (member.LinePragma != null) - GenerateLinePragmaStart (member.LinePragma); - CodeMemberEvent eventm = member as CodeMemberEvent; if (eventm != null) { @@ -1120,9 +1087,6 @@ namespace System.CodeDom.Compiler { this.currentMember = prevMember; } - - if (currentMember != null && currentMember.LinePragma != null) - GenerateLinePragmaEnd (currentMember.LinePragma); GenerateTypeEnd (type); this.currentType = prevType; diff --git a/mcs/class/System/System.Net.Sockets/ChangeLog b/mcs/class/System/System.Net.Sockets/ChangeLog index ecedce486d6..3b7aeaf5da9 100644 --- a/mcs/class/System/System.Net.Sockets/ChangeLog +++ b/mcs/class/System/System.Net.Sockets/ChangeLog @@ -1,18 +1,3 @@ -2004-07-15 Dick Porter <dick@ximian.com> - - * Socket.cs: Don't try and dereference a null array in Select() - (possible if a descriptor list of length 0 was passed.) Patch by - Nick Vaughan (dev@6wardlaw.freeserve.co.uk), fixes bug 61595. - -2004-07-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * Socket.cs: if'ed RemoveReferences calls. - -2004-07-09 Dick Porter <dick@ximian.com> - - * Socket.cs: Slight tweak to allow unknown objects to be returned - by GetSocketOption(). - 2004-06-28 Gonzalo Paniagua Javier <gonzalo@ximian.com> * Socket.cs: connect on non-blocking sockets returns EINPROGRESS. Fixes diff --git a/mcs/class/System/System.Net.Sockets/Socket.cs b/mcs/class/System/System.Net.Sockets/Socket.cs index 544597f9545..a7fa184ccae 100644 --- a/mcs/class/System/System.Net.Sockets/Socket.cs +++ b/mcs/class/System/System.Net.Sockets/Socket.cs @@ -424,28 +424,22 @@ namespace System.Net.Sockets if(read_list!=null) { read_list.Clear(); - if (read_arr != null) { - for(i=0; i<read_arr.Length; i++) { - read_list.Add(read_arr[i]); - } + for(i=0; i<read_arr.Length; i++) { + read_list.Add(read_arr[i]); } } if(write_list!=null) { write_list.Clear(); - if (write_arr != null) { - for(i=0; i<write_arr.Length; i++) { - write_list.Add(write_arr[i]); - } + for(i=0; i<write_arr.Length; i++) { + write_list.Add(write_arr[i]); } } if(err_list!=null) { err_list.Clear(); - if (err_arr != null) { - for(i=0; i<err_arr.Length; i++) { - err_list.Add(err_arr[i]); - } + for(i=0; i<err_arr.Length; i++) { + err_list.Add(err_arr[i]); } } } @@ -1026,9 +1020,7 @@ namespace System.Net.Sockets if (req == null) throw new ArgumentException ("Invalid IAsyncResult", "result"); - if (supportsAsync && socket_type == SocketType.Stream) - RemoveReference (req); - + RemoveReference (req); if (!result.IsCompleted) result.AsyncWaitHandle.WaitOne(); @@ -1071,9 +1063,7 @@ namespace System.Net.Sockets if (req == null) throw new ArgumentException ("Invalid IAsyncResult", "result"); - if (supportsAsync && socket_type == SocketType.Stream) - RemoveReference (req); - + RemoveReference (req); if (!result.IsCompleted) result.AsyncWaitHandle.WaitOne(); @@ -1141,10 +1131,8 @@ namespace System.Net.Sockets } else if (name==SocketOptionName.AddMembership || name==SocketOptionName.DropMembership) { return((MulticastOption)obj_val); - } else if (obj_val is int) { - return((int)obj_val); } else { - return(obj_val); + return((int)obj_val); } } diff --git a/mcs/class/System/System.Net/ChangeLog b/mcs/class/System/System.Net/ChangeLog index 3b0d90e1494..2b470e6423b 100644 --- a/mcs/class/System/System.Net/ChangeLog +++ b/mcs/class/System/System.Net/ChangeLog @@ -1,35 +1,3 @@ -2004-07-26 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * WebProxy.cs: fix scheme detection. Patch by Konstantin Triger - (kostat@mainsoft.com). - -2004-07-16 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpWebRequest.cs: detect changes in scheme or port when redirecting. - Fixes las take on bug 61218. - -2004-07-14 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * WebConnection.cs: moved loading of the ssl stream Type to its own - method. Don't create a new ssl stream if we're reusing the connection. - - * WebConnectionStream.cs: ensure the number of bytes copied in ReadAll - is the expected even if the dta from the server has extra bytes. - -2004-07-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * WebConnection.cs: - * WebConnectionStream.cs: when the status code is 1xx, 204 or 304, - "responses MUST NOT include a message-body". We tried to read the - stream even when getting those codes and considered the 0 length - read as a failure. - -2004-07-09 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * HttpWebRequest.cs: removed bogus Monitor.Exit. - * WebConnection.cs: use Address instead of RequestUri when checking for - the scheme in order to select the stream type. Fixes bug #61218. - 2004-06-06 Gonzalo Paniagua Javier <gonzalo@ximian.com> * ChunkStream.cs: added ChunkLeft property. diff --git a/mcs/class/System/System.Net/HttpWebRequest.cs b/mcs/class/System/System.Net/HttpWebRequest.cs index f20a0747a3f..40dfe26a546 100644 --- a/mcs/class/System/System.Net/HttpWebRequest.cs +++ b/mcs/class/System/System.Net/HttpWebRequest.cs @@ -584,6 +584,7 @@ namespace System.Net initialMethod = method; if (haveRequest) { if (writeStream != null) { + Monitor.Exit (this); asyncWrite.SetCompleted (true, writeStream); asyncWrite.DoCallback (); return asyncWrite; @@ -829,7 +830,7 @@ namespace System.Net throw new WebException ("No Location header found for " + (int) code, WebExceptionStatus.ProtocolError); - Uri prev = actualUri; + string host = actualUri.Host; try { actualUri = new Uri (actualUri, uriString); } catch (Exception) { @@ -838,8 +839,7 @@ namespace System.Net WebExceptionStatus.ProtocolError); } - hostChanged = (actualUri.Scheme != prev.Scheme || actualUri.Host != prev.Host || - actualUri.Port != prev.Port); + hostChanged = (actualUri.Host != host); return true; } diff --git a/mcs/class/System/System.Net/WebConnection.cs b/mcs/class/System/System.Net/WebConnection.cs index f3ef1d22076..c4b08a363d1 100644 --- a/mcs/class/System/System.Net/WebConnection.cs +++ b/mcs/class/System/System.Net/WebConnection.cs @@ -71,7 +71,7 @@ namespace System.Net bool ssl; bool certsAvailable; - static object classLock = new object (); + static bool sslCheck; static Type sslStream; static PropertyInfo piClient; static PropertyInfo piServer; @@ -127,48 +127,36 @@ namespace System.Net } } - static void EnsureSSLStreamAvailable () - { - lock (classLock) { - if (sslStream != null) - return; - - // HttpsClientStream is an internal glue class in Mono.Security.dll - sslStream = Type.GetType ("Mono.Security.Protocol.Tls.HttpsClientStream, " + - Consts.AssemblyMono_Security, false); - - if (sslStream == null) { - string msg = "Missing Mono.Security.dll assembly. " + - "Support for SSL/TLS is unavailable."; - - throw new NotSupportedException (msg); - } - piClient = sslStream.GetProperty ("SelectedClientCertificate"); - piServer = sslStream.GetProperty ("ServerCertificate"); - } - } - bool CreateStream (HttpWebRequest request) { try { NetworkStream serverStream = new NetworkStream (socket, false); - if (request.Address.Scheme == Uri.UriSchemeHttps) { + if (request.RequestUri.Scheme == Uri.UriSchemeHttps) { ssl = true; - EnsureSSLStreamAvailable (); - if (!reused || nstream == null || nstream.GetType () != sslStream) { - object[] args = new object [3] { serverStream, - request.ClientCertificates, - request }; - nstream = (Stream) Activator.CreateInstance (sslStream, args); + if (!sslCheck) { + lock (typeof (WebConnection)) { + sslCheck = true; + // HttpsClientStream is an internal glue class in Mono.Security.dll + sslStream = Type.GetType ("Mono.Security.Protocol.Tls.HttpsClientStream, " + Consts.AssemblyMono_Security, false); + if (sslStream != null) { + piClient = sslStream.GetProperty ("SelectedClientCertificate"); + piServer = sslStream.GetProperty ("ServerCertificate"); + } + } } + if (sslStream == null) + throw new NotSupportedException ("Missing Mono.Security.dll assembly. Support for SSL/TLS is unavailable."); + + object[] args = new object [4] { serverStream, request.RequestUri.Host, request.ClientCertificates, request }; + nstream = (Stream) Activator.CreateInstance (sslStream, args); + // we also need to set ServicePoint.Certificate // and ServicePoint.ClientCertificate but this can // only be done later (after handshake - which is // done only after a read operation). - } else { - ssl = false; - nstream = serverStream; } + else + nstream = serverStream; } catch (Exception) { status = WebExceptionStatus.ConnectFailure; return false; @@ -280,9 +268,6 @@ namespace System.Net data.stream = stream; - if (!ExpectContent (data.StatusCode)) - stream.ForceCompletion (); - lock (cnc) { lock (cnc.queue) { if (cnc.queue.Count > 0) { @@ -297,11 +282,6 @@ namespace System.Net data.request.SetResponseData (data); } - static bool ExpectContent (int statusCode) - { - return (statusCode >= 200 && statusCode != 204 && statusCode != 304); - } - internal void GetCertificates () { // here the SSL negotiation have been done diff --git a/mcs/class/System/System.Net/WebConnectionStream.cs b/mcs/class/System/System.Net/WebConnectionStream.cs index c609455f32f..703f35d42b4 100644 --- a/mcs/class/System/System.Net/WebConnectionStream.cs +++ b/mcs/class/System/System.Net/WebConnectionStream.cs @@ -57,7 +57,6 @@ namespace System.Net byte [] headers; bool disposed; bool headersSent; - bool forceCompletion; public WebConnectionStream (WebConnection cnc) { @@ -114,15 +113,9 @@ namespace System.Net get { return (int) writeBuffer.Length; } } - internal void ForceCompletion () - { - forceCompletion = true; - } - internal void CheckComplete () { - bool nrc = nextReadCalled; - if (forceCompletion || (!nrc && readBufferSize - readBufferOffset == contentLength)) { + if (!nextReadCalled && readBufferSize - readBufferOffset == contentLength) { nextReadCalled = true; cnc.NextRead (); } @@ -158,12 +151,8 @@ namespace System.Net } else { new_size = contentLength - totalRead; b = new byte [new_size]; - if (readBuffer != null && diff > 0) { - if (diff > new_size) - diff = new_size; - + if (readBuffer != null && diff > 0) Buffer.BlockCopy (readBuffer, readBufferOffset, b, 0, diff); - } int remaining = new_size - diff; int r = -1; diff --git a/mcs/class/System/System.Net/WebProxy.cs b/mcs/class/System/System.Net/WebProxy.cs index df8976c6966..b0299575f60 100644 --- a/mcs/class/System/System.Net/WebProxy.cs +++ b/mcs/class/System/System.Net/WebProxy.cs @@ -208,7 +208,7 @@ namespace System.Net if (address == null)
return null;
- if (address.IndexOf ("://") == -1)
+ if (address.IndexOf (':') == -1)
address = "http://" + address;
return new Uri (address);
diff --git a/mcs/class/corlib/System.Collections/ChangeLog b/mcs/class/corlib/System.Collections/ChangeLog index f269e646470..8782bc457f8 100644 --- a/mcs/class/corlib/System.Collections/ChangeLog +++ b/mcs/class/corlib/System.Collections/ChangeLog @@ -1,13 +1,3 @@ -2004-07-21 Geoff Norton <gnorton@customerdna.com> - - * Hashtable.cs: lock the SyncRoot when Cloning a Synchronized hashtable to avoid - a snapshot out of sync error. - -2004-07-21 Duncan Mak <duncan@ximian.com> - - * DictionaryBase.cs: Rename the dictionary field to hashtable, - which causes a serialization interop bug. Fixes bug #61721. - 2004-06-18 Ben Maurer <bmaurer@ximian.com> * IKeyComparer.cs: v2 class diff --git a/mcs/class/corlib/System.Collections/DictionaryBase.cs b/mcs/class/corlib/System.Collections/DictionaryBase.cs index 9e814d1fab9..af6b19f2617 100755 --- a/mcs/class/corlib/System.Collections/DictionaryBase.cs +++ b/mcs/class/corlib/System.Collections/DictionaryBase.cs @@ -51,11 +51,11 @@ namespace System.Collections { [Serializable] public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable { - Hashtable hashtable; + Hashtable dictionary; protected DictionaryBase () { - hashtable = new Hashtable (); + dictionary = new Hashtable (); } /// <summary> @@ -64,7 +64,7 @@ namespace System.Collections { public void Clear () { OnClear (); - hashtable.Clear (); + dictionary.Clear (); OnClearComplete (); } @@ -73,7 +73,7 @@ namespace System.Collections { /// </summary> public int Count { get { - return hashtable.Count; + return dictionary.Count; } } @@ -91,7 +91,7 @@ namespace System.Collections { /// </summary> protected Hashtable InnerHashtable { get { - return hashtable; + return dictionary; } } @@ -129,7 +129,7 @@ namespace System.Collections { /// </summary> private void DoCopy (Array array, int index) { - foreach (DictionaryEntry de in hashtable) + foreach (DictionaryEntry de in dictionary) array.SetValue (de, index++); } @@ -138,7 +138,7 @@ namespace System.Collections { /// </summary> public IDictionaryEnumerator GetEnumerator () { - return hashtable.GetEnumerator (); + return dictionary.GetEnumerator (); } /// <summary> @@ -311,20 +311,20 @@ namespace System.Collections { object IDictionary.this [object key] { get { - OnGet (key, hashtable [key]); - object value = hashtable [key]; + OnGet (key, dictionary[key]); + object value = dictionary [key]; return value; } set { OnValidate (key, value); - object current_value = hashtable [key]; + object current_value = dictionary [key]; OnSet (key, current_value, value); - hashtable [key] = value; + dictionary [key] = value; try { OnSetComplete (key, current_value, value); } catch { - hashtable [key] = current_value; + dictionary [key] = current_value; throw; } } @@ -332,13 +332,13 @@ namespace System.Collections { ICollection IDictionary.Keys { get { - return hashtable.Keys; + return dictionary.Keys; } } ICollection IDictionary.Values { get { - return hashtable.Values; + return dictionary.Values; } } @@ -349,11 +349,11 @@ namespace System.Collections { { OnValidate (key, value); OnInsert (key, value); - hashtable.Add (key, value); + dictionary.Add (key, value); try { OnInsertComplete (key, value); } catch { - hashtable.Remove (key); + dictionary.Remove(key); throw; } } @@ -363,10 +363,10 @@ namespace System.Collections { /// </summary> void IDictionary.Remove (object key) { - object value = hashtable [key]; + object value = dictionary [key]; OnValidate (key, value); OnRemove (key, value); - hashtable.Remove (key); + dictionary.Remove (key); OnRemoveComplete (key, value); } @@ -375,24 +375,24 @@ namespace System.Collections { /// </summary> bool IDictionary.Contains (object key) { - return hashtable.Contains (key); + return dictionary.Contains (key); } bool ICollection.IsSynchronized { get { - return hashtable.IsSynchronized; + return dictionary.IsSynchronized; } } object ICollection.SyncRoot { get { - return hashtable.SyncRoot; + return dictionary.SyncRoot; } } IEnumerator IEnumerable.GetEnumerator () { - return hashtable.GetEnumerator (); + return dictionary.GetEnumerator (); } } } diff --git a/mcs/class/corlib/System.Collections/Hashtable.cs b/mcs/class/corlib/System.Collections/Hashtable.cs index 270bbef13ca..36575c8e024 100644 --- a/mcs/class/corlib/System.Collections/Hashtable.cs +++ b/mcs/class/corlib/System.Collections/Hashtable.cs @@ -1114,9 +1114,8 @@ namespace System.Collections { public override object Clone () { - lock(host.SyncRoot) { - return new SyncHashtable( (Hashtable) host.Clone () ); - } + Hashtable ht = (Hashtable) host.Clone (); + return new SyncHashtable (ht); } } // SyncHashtable diff --git a/mcs/class/corlib/System.Globalization/ChangeLog b/mcs/class/corlib/System.Globalization/ChangeLog index 95392d51e96..533cc9d4dc7 100644 --- a/mcs/class/corlib/System.Globalization/ChangeLog +++ b/mcs/class/corlib/System.Globalization/ChangeLog @@ -1,3 +1,8 @@ + +Wed Jun 30 17:06:43 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * NumberFormatInfo.cs: workaround for bug 55978. + 2004-06-17 Atsushi Enomoto <atsushi@ximian.com> * DateTimeFormatInfo.cs : check if pattern array is empty or not. Now diff --git a/mcs/class/corlib/System.Globalization/NumberFormatInfo.cs b/mcs/class/corlib/System.Globalization/NumberFormatInfo.cs index 169ad6c2f9e..e884daad5a7 100644 --- a/mcs/class/corlib/System.Globalization/NumberFormatInfo.cs +++ b/mcs/class/corlib/System.Globalization/NumberFormatInfo.cs @@ -851,7 +851,10 @@ throw new Exception ("HERE the value was modified"); public object GetFormat (Type formatType) { - return (formatType == typeof (NumberFormatInfo)) ? this : null; + // work around http://bugzilla.ximian.com/show_bug.cgi?id=55978 + // the comparison fails because formatType likely comes from another domain + //return (formatType == typeof (NumberFormatInfo)) ? this : null; + return this; } public object Clone () diff --git a/mcs/class/corlib/System.IO.IsolatedStorage/ChangeLog b/mcs/class/corlib/System.IO.IsolatedStorage/ChangeLog index c27c01f582e..2b295ce72fa 100644 --- a/mcs/class/corlib/System.IO.IsolatedStorage/ChangeLog +++ b/mcs/class/corlib/System.IO.IsolatedStorage/ChangeLog @@ -1,7 +1,3 @@ -2004-07-11 Gonzalo Paniagua Javier <gonzalo@ximian.com> - - * IsolatedStorageInfo.cs: useGetFolderPath instead of getting "HOME". - 2004-06-13 Gert Driesen <drieseng@users.sourceforge.net> * IsolatedStorage.cs: really mark the storage_scope field private diff --git a/mcs/class/corlib/System.IO.IsolatedStorage/IsolatedStorageInfo.cs b/mcs/class/corlib/System.IO.IsolatedStorage/IsolatedStorageInfo.cs index d1107269a1b..a3a1ae0e8a3 100644 --- a/mcs/class/corlib/System.IO.IsolatedStorage/IsolatedStorageInfo.cs +++ b/mcs/class/corlib/System.IO.IsolatedStorage/IsolatedStorageInfo.cs @@ -37,7 +37,7 @@ namespace System.IO.IsolatedStorage { [MonoTODO("Unix Specific; generalize for Win32")] internal static string GetIsolatedStorageDirectory () { - string home = Environment.GetFolderPath (Environment.SpecialFolder.Personal); + string home = Environment.GetEnvironmentVariable ("HOME"); if (home == null) home = "~"; diff --git a/mcs/class/corlib/System.IO/ChangeLog b/mcs/class/corlib/System.IO/ChangeLog index 2c281d7651c..6818c37ad82 100644 --- a/mcs/class/corlib/System.IO/ChangeLog +++ b/mcs/class/corlib/System.IO/ChangeLog @@ -1,25 +1,3 @@ -2004-07-06 Dick Porter <dick@ximian.com> - - * MonoIO.cs: Add ERROR_INVALID_PARAMETER to the exception list. - Don't blow away the SetFileTime() error before the caller gets to - see it. Part of the bug fix to 60970. - -2004-07-05 Dick Porter <dick@ximian.com> - - * CheckPermission.cs: - * File.cs: - * FileInfo.cs: - * MonoIO.cs: - * FileStream.cs: Give the filename when throwing - FileNotFoundException. Fixes bug 61120, based on patch from - Carlos Alberto Cesario <carloscesario@gmail.com>. - -2004-07-05 Dick Porter <dick@ximian.com> - - * File.cs: File.Move() should check that the destination doesn't - already exist. Fixes bug 60915, patch based on one from Carlos - Alberto Cesario <carloscesario@gmail.com>. - 2004-06-24 Gonzalo Paniagua Javier <gonzalo@ximian.com> * Directory.cs: implemented GetLogicalDrives. diff --git a/mcs/class/corlib/System.IO/CheckPermission.cs b/mcs/class/corlib/System.IO/CheckPermission.cs index 232b1350af4..2b31cab7e01 100644 --- a/mcs/class/corlib/System.IO/CheckPermission.cs +++ b/mcs/class/corlib/System.IO/CheckPermission.cs @@ -102,7 +102,7 @@ namespace System.IO } else { - throw new FileNotFoundException("File not found", path); + throw new FileNotFoundException(); } #endif } diff --git a/mcs/class/corlib/System.IO/File.cs b/mcs/class/corlib/System.IO/File.cs index 3dcf8213759..c45dea6aecb 100644 --- a/mcs/class/corlib/System.IO/File.cs +++ b/mcs/class/corlib/System.IO/File.cs @@ -70,7 +70,7 @@ namespace System.IO if (dest.Trim () == "" || dest.IndexOfAny (Path.InvalidPathChars) != -1) throw new ArgumentException ("dest"); if (!Exists (src)) - throw new FileNotFoundException (src + " does not exist", src); + throw new FileNotFoundException (src + " does not exist"); if ((GetAttributes(src) & FileAttributes.Directory) == FileAttributes.Directory){ throw new ArgumentException(src + " is a directory"); @@ -261,11 +261,9 @@ namespace System.IO if (dest.Trim () == "" || dest.IndexOfAny (Path.InvalidPathChars) != -1) throw new ArgumentException ("dest"); if (!MonoIO.Exists (src, out error)) - throw new FileNotFoundException (src + " does not exist", src); + throw new FileNotFoundException (src + " does not exist"); if (MonoIO.ExistsDirectory (dest, out error)) throw new IOException (dest + " is a directory"); - if (MonoIO.Exists (dest, out error)) - throw new IOException (dest + " already exists"); string DirName; DirName = Path.GetDirectoryName(src); diff --git a/mcs/class/corlib/System.IO/FileInfo.cs b/mcs/class/corlib/System.IO/FileInfo.cs index 3345f61dc79..c98cf6feaec 100644 --- a/mcs/class/corlib/System.IO/FileInfo.cs +++ b/mcs/class/corlib/System.IO/FileInfo.cs @@ -81,7 +81,7 @@ namespace System.IO { public long Length {
get {
if (!Exists)
- throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".", OriginalPath);
+ throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".");
return stat.Length;
}
diff --git a/mcs/class/corlib/System.IO/FileStream.cs b/mcs/class/corlib/System.IO/FileStream.cs index 01b726a0b92..3024bf35d04 100644 --- a/mcs/class/corlib/System.IO/FileStream.cs +++ b/mcs/class/corlib/System.IO/FileStream.cs @@ -155,7 +155,7 @@ namespace System.IO if (access == FileAccess.Read && mode != FileMode.Create && mode != FileMode.OpenOrCreate && mode != FileMode.CreateNew && !File.Exists (name)) - throw new FileNotFoundException ("Could not find file \"" + name + "\".", name); + throw new FileNotFoundException ("Could not find file \"" + name + "\"."); if (mode == FileMode.CreateNew) { string dname = Path.GetDirectoryName (name); diff --git a/mcs/class/corlib/System.IO/MonoIO.cs b/mcs/class/corlib/System.IO/MonoIO.cs index a32e6ed5408..47fd104fdc3 100644 --- a/mcs/class/corlib/System.IO/MonoIO.cs +++ b/mcs/class/corlib/System.IO/MonoIO.cs @@ -63,8 +63,7 @@ namespace System.IO // FIXME: add more exception mappings here case MonoIOError.ERROR_FILE_NOT_FOUND: message = String.Format ("Could not find file \"{0}\"", path); - return new FileNotFoundException (message, - path); + return new FileNotFoundException (message); case MonoIOError.ERROR_PATH_NOT_FOUND: message = String.Format ("Could not find a part of the path \"{0}\"", path); @@ -82,10 +81,6 @@ namespace System.IO message = String.Format ("Path is too long. Path: {0}", path); return new PathTooLongException (message); - case MonoIOError.ERROR_INVALID_PARAMETER: - message = String.Format ("Invalid parameter"); - return new IOException (message); - default: message = String.Format ("Win32 IO returned {0}. Path: {1}", error, path); return new IOException (message); @@ -309,9 +304,7 @@ namespace System.IO result = SetFileTime (handle, creation_time, last_access_time, last_write_time, out error); - - MonoIOError ignore_error; - Close (handle, out ignore_error); + Close (handle, out error); return result; } diff --git a/mcs/class/corlib/System.Reflection.Emit/ChangeLog b/mcs/class/corlib/System.Reflection.Emit/ChangeLog index 4a3fa12c3b0..5aeec6cdae4 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ChangeLog +++ b/mcs/class/corlib/System.Reflection.Emit/ChangeLog @@ -1,7 +1,3 @@ -2004-07-24 Martin Baulig <martin@ximian.com> - - * TypeBuilder.cs (TypeBuilder.UnspecifiedTypeSize): Set this to 0 - and initialize it to 0 everywhere. Thu Jun 24 15:33:04 CEST 2004 Paolo Molaro <lupus@ximian.com> diff --git a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs index c0059b54286..1f6884bdc12 100644 --- a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs @@ -95,7 +95,7 @@ namespace System.Reflection.Emit { internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr) { this.parent = null; this.attrs = attr; - this.class_size = 0; + this.class_size = -1; fullname = this.tname = "<Module>"; this.nspace = ""; pmodule = mb; diff --git a/mcs/class/corlib/System.Reflection/ChangeLog b/mcs/class/corlib/System.Reflection/ChangeLog index 2ceab253beb..8a7945e688e 100644 --- a/mcs/class/corlib/System.Reflection/ChangeLog +++ b/mcs/class/corlib/System.Reflection/ChangeLog @@ -1,12 +1,3 @@ - -Sat Jul 10 15:48:34 CEST 2004 Paolo Molaro <lupus@ximian.com> - - * Modulec.s: return just name in ToString (bug #61287). - -2004-07-03 Zoltan Varga <vargaz@freemail.hu> - - * Module.cs: Initialize FilterTypeName[IgnoreCase]. Fixes #61048. - 2004-06-17 Gert Driesen <drieseng@users.sourceforge.net> * Pointer.cs: remove serializable attribute to match MS.NET diff --git a/mcs/class/corlib/System.Reflection/Module.cs b/mcs/class/corlib/System.Reflection/Module.cs index 876967a50c0..01dc55f9be6 100644 --- a/mcs/class/corlib/System.Reflection/Module.cs +++ b/mcs/class/corlib/System.Reflection/Module.cs @@ -55,11 +55,6 @@ namespace System.Reflection { const BindingFlags defaultBindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; - static Module () { - FilterTypeName = new TypeFilter (filter_by_type_name); - FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case); - } - internal Module () { } ~Module () { @@ -211,7 +206,7 @@ namespace System.Reflection { public override string ToString () { - return name; + return "Reflection.Module: " + name; } // Mono Extension: returns the GUID of this module @@ -220,22 +215,6 @@ namespace System.Reflection { return new Guid (GetGuidInternal ()); } - private static bool filter_by_type_name (Type m, object filterCriteria) { - string s = (string)filterCriteria; - if (s.EndsWith ("*")) - return m.Name.StartsWith (s.Substring (0, s.Length - 1)); - else - return m.Name == s; - } - - private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) { - string s = (string)filterCriteria; - if (s.EndsWith ("*")) - return m.Name.ToLower ().StartsWith (s.Substring (0, s.Length - 1).ToLower ()); - else - return String.Compare (m.Name, s, true) == 0; - } - [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern string GetGuidInternal (); diff --git a/mcs/class/corlib/System.Reflection/common.src b/mcs/class/corlib/System.Reflection/common.src new file mode 100644 index 00000000000..022b6768fcc --- /dev/null +++ b/mcs/class/corlib/System.Reflection/common.src @@ -0,0 +1,25 @@ +Assembly.cs +AssemblyNameFlags.cs +BindingFlags.cs +CallingConventions.cs +ConstructorInfo.cs +DefaultMemberAttribute.cs +EventAttributes.cs +EventInfo.cs +FieldAttributes.cs +FieldInfo.cs +ICustomAttributeProvider.cs +MemberFilter.cs +MemberInfo.cs +MemberTypes.cs +MethodAttributes.cs +MethodBase.cs +MethodImplAttributes.cs +MethodInfo.cs +Module.cs +ParameterAttributes.cs +PropertyAttributes.cs +PropertyInfo.cs +ResourceAttributes.cs +ResourceLocation.cs +TypeAttributes.cs diff --git a/mcs/class/corlib/System.Runtime.Remoting.Channels/ChangeLog b/mcs/class/corlib/System.Runtime.Remoting.Channels/ChangeLog index 35352b211ea..aafa83f9899 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Channels/ChangeLog +++ b/mcs/class/corlib/System.Runtime.Remoting.Channels/ChangeLog @@ -1,8 +1,3 @@ -2004-07-02 Lluis Sanchez Gual <lluis@novell.com> - - * ChannelServices.cs: In RegisterChannel, ignore name colisions if the - channel name is "". This fixes bug #61592. - 2004-06-15 Gert Driesen <drieseng@users.sourceforge.net> * TransportHeaders.cs: added TODO for serialization diff --git a/mcs/class/corlib/System.Runtime.Remoting.Channels/ChannelServices.cs b/mcs/class/corlib/System.Runtime.Remoting.Channels/ChannelServices.cs index f2f21baf53e..98629c496f4 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Channels/ChannelServices.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Channels/ChannelServices.cs @@ -254,7 +254,7 @@ namespace System.Runtime.Remoting.Channels { IChannel regc = (IChannel) registeredChannels[n]; - if (regc.ChannelName == chnl.ChannelName && chnl.ChannelName != "") + if (regc.ChannelName == chnl.ChannelName) throw new RemotingException ("Channel " + regc.ChannelName + " already registered"); if (regc.ChannelPriority < chnl.ChannelPriority && pos==-1) diff --git a/mcs/class/corlib/System.Runtime.Remoting.Messaging/ChangeLog b/mcs/class/corlib/System.Runtime.Remoting.Messaging/ChangeLog index 31b0acd440c..87e4e0902e6 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Messaging/ChangeLog +++ b/mcs/class/corlib/System.Runtime.Remoting.Messaging/ChangeLog @@ -1,8 +1,3 @@ -2004-07-22 Lluis Sanchez Gual <lluis@novell.com> - - * MethodCall.cs: Use RemotingServices.GetMethodBaseFromName to get the - MethodBase from the method name. This fixes bug #61774. - 2004-06-18 Sebastien Pouliot <sebastien@ximian.com> * ReturnMessage.cs: Added IMessage interface to class definition. diff --git a/mcs/class/corlib/System.Runtime.Remoting.Messaging/MethodCall.cs b/mcs/class/corlib/System.Runtime.Remoting.Messaging/MethodCall.cs index 47dbb9d0beb..9313d3aa0cb 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Messaging/MethodCall.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Messaging/MethodCall.cs @@ -288,8 +288,11 @@ namespace System.Runtime.Remoting.Messaging { Type type = RemotingServices.GetServerTypeForUri (_uri); if (type == null) throw new RemotingException ("Requested service not found. No receiver for uri " + _uri); - if (CanCastTo (_typeName, type)) { - _methodBase = RemotingServices.GetMethodBaseFromName (type, _methodName, _methodSignature); + if (CanCastTo (_typeName, type)) + { + BindingFlags bflags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + if (_methodSignature == null) _methodBase = type.GetMethod (_methodName, bflags); + else _methodBase = type.GetMethod (_methodName, bflags, null, _methodSignature, null); return; } else diff --git a/mcs/class/corlib/System.Runtime.Remoting/ChangeLog b/mcs/class/corlib/System.Runtime.Remoting/ChangeLog index 14aa52173f9..1fc62be042d 100755 --- a/mcs/class/corlib/System.Runtime.Remoting/ChangeLog +++ b/mcs/class/corlib/System.Runtime.Remoting/ChangeLog @@ -1,21 +1,3 @@ -2004-07-22 Lluis Sanchez Gual <lluis@novell.com> - - * ObjRef.cs: Fixed type check in in ObjRef constructor. The requested class - must be the object class or a base class. This fixes bug #61249. - -2004-07-22 Lluis Sanchez Gual <lluis@novell.com> - - * RemotingServices.cs: Changed GetMethodBaseFromMethodMessage so its code - can be reused internally. Also fixed bug when gettting a method from an - interface. - -2004-07-02 Lluis Sanchez Gual <lluis@ximian.com> - - * RemotingConfiguration.cs: Avoid adding "id" and "type" as custom - properties of providers. This fixes bug #60934. - * ServerIdentity.cs, RemotingServices.cs: When disposing an identity, detach - the identity from the object, so it can be safely marshalled again. - 2004-06-15 Gert Driesen <drieseng@users.sourceforge.net> * RemotingTimeoutException.cs: added missing serialization ctor diff --git a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs index 30234367827..90db146c267 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/ObjRef.cs @@ -92,7 +92,7 @@ namespace System.Runtime.Remoting { uri = RemotingServices.GetObjectUri(mbr); typeInfo = new TypeInfo(type); - if (!type.IsAssignableFrom (mbr.GetType())) + if (!typeInfo.CanCastTo(mbr.GetType(), mbr)) throw new RemotingException ("The server object type cannot be cast to the requested type " + type.FullName + "."); UpdateChannelInfo(); diff --git a/mcs/class/corlib/System.Runtime.Remoting/RemotingConfiguration.cs b/mcs/class/corlib/System.Runtime.Remoting/RemotingConfiguration.cs index 2cbe62dff51..204bc6b4368 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/RemotingConfiguration.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/RemotingConfiguration.cs @@ -721,9 +721,9 @@ namespace System.Runtime.Remoting if (at == "id" && isTemplate) prov.Id = val; - else if (at == "type") + if (at == "type") prov.Type = val; - else if (at == "ref" && !isTemplate) + if (at == "ref" && !isTemplate) prov.Ref = val; else prov.CustomProperties.Add (at, val); diff --git a/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs b/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs index 6d4b810ed13..aa694cbb3b6 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs @@ -57,7 +57,6 @@ namespace System.Runtime.Remoting internal static string app_id; static int next_id = 1; - static readonly BindingFlags methodBindings = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; static RemotingServices () { @@ -160,10 +159,8 @@ namespace System.Runtime.Remoting else throw new ArgumentException ("The obj parameter is a proxy."); } - else { + else identity = obj.ObjectIdentity; - obj.ObjectIdentity = null; - } if (identity == null || !identity.IsConnected) return false; @@ -291,49 +288,22 @@ namespace System.Runtime.Remoting Type type = Type.GetType (msg.TypeName); if (type == null) throw new RemotingException ("Type '" + msg.TypeName + "' not found."); - - return GetMethodBaseFromName (type, msg.MethodName, (Type[]) msg.MethodSignature); - } - - internal static MethodBase GetMethodBaseFromName (Type type, string methodName, Type[] signature) - { - if (type.IsInterface) { - return FindInterfaceMethod (type, methodName, signature); - } - else { - MethodBase method = null; - if (signature == null) - method = type.GetMethod (methodName, methodBindings); - else - method = type.GetMethod (methodName, methodBindings, null, (Type[]) signature, null); - - if (method != null) - return method; - - if (signature == null) - return type.GetConstructor (methodBindings, null, Type.EmptyTypes, null); - else - return type.GetConstructor (methodBindings, null, signature, null); - } - } - - static MethodBase FindInterfaceMethod (Type type, string methodName, Type[] signature) - { - MethodBase method = null; + + BindingFlags bflags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - if (signature == null) - method = type.GetMethod (methodName, methodBindings); + MethodBase method; + if (msg.MethodSignature == null) + method = type.GetMethod (msg.MethodName, bflags); else - method = type.GetMethod (methodName, methodBindings, null, signature, null); - - if (method != null) return method; + method = type.GetMethod (msg.MethodName, bflags, null, (Type[]) msg.MethodSignature, null); - foreach (Type t in type.GetInterfaces ()) { - method = FindInterfaceMethod (t, methodName, signature); - if (method != null) return method; - } + if (method != null) + return method; - return null; + if (msg.MethodSignature == null) + return type.GetConstructor (bflags, null, Type.EmptyTypes, null); + else + return type.GetConstructor (bflags, null, (Type[]) msg.MethodSignature, null); } public static void GetObjectData(object obj, SerializationInfo info, StreamingContext context) diff --git a/mcs/class/corlib/System.Runtime.Remoting/ServerIdentity.cs b/mcs/class/corlib/System.Runtime.Remoting/ServerIdentity.cs index 72c025121d0..f5ed96a066b 100644 --- a/mcs/class/corlib/System.Runtime.Remoting/ServerIdentity.cs +++ b/mcs/class/corlib/System.Runtime.Remoting/ServerIdentity.cs @@ -136,13 +136,7 @@ namespace System.Runtime.Remoting protected void DisposeServerObject() { - // Detach identity from server object to avoid problems if the - // object is marshalled again. - - if (_serverObject != null) { - _serverObject.ObjectIdentity = null; - _serverObject = null; - } + _serverObject = null; } } diff --git a/mcs/class/corlib/System.Security.Cryptography/ChangeLog b/mcs/class/corlib/System.Security.Cryptography/ChangeLog index f087b452504..59642bc66bc 100644 --- a/mcs/class/corlib/System.Security.Cryptography/ChangeLog +++ b/mcs/class/corlib/System.Security.Cryptography/ChangeLog @@ -1,9 +1,3 @@ -2004-07-15 Sebastien Pouliot <sebastien@ximian.com> - - * DES.cs: Fixed FeedbackSizeValue to 8. - * RC2.cs: Fixed FeedbackSizeValue to 8. - * TripleDES.cs: Fixed FeedbackSizeValue to 8. - 2004-06-23 Sebastien Pouliot <sebastien@ximian.com> * CryptoStream.cs: Removed the block reduction. This seems to be done diff --git a/mcs/class/corlib/System.Security.Cryptography/DES.cs b/mcs/class/corlib/System.Security.Cryptography/DES.cs index cb678113d6c..a775477b436 100644 --- a/mcs/class/corlib/System.Security.Cryptography/DES.cs +++ b/mcs/class/corlib/System.Security.Cryptography/DES.cs @@ -6,6 +6,10 @@ // Sebastien Pouliot <sebastien@ximian.com> // // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com) +// (C) 2004 Novell (http://www.novell.com) +// + +// // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining @@ -46,7 +50,7 @@ public abstract class DES : SymmetricAlgorithm { { KeySizeValue = 64; BlockSizeValue = 64; - FeedbackSizeValue = 8; + FeedbackSizeValue = 64; LegalKeySizesValue = new KeySizes[1]; LegalKeySizesValue[0] = new KeySizes(64, 64, 0); diff --git a/mcs/class/corlib/System.Security.Cryptography/RC2.cs b/mcs/class/corlib/System.Security.Cryptography/RC2.cs index 70119078722..58566078d5f 100644 --- a/mcs/class/corlib/System.Security.Cryptography/RC2.cs +++ b/mcs/class/corlib/System.Security.Cryptography/RC2.cs @@ -5,6 +5,10 @@ // Andrew Birkett (andy@nobugs.org) // Sebastien Pouliot (sebastien@ximian.com) // +// (C) 2004 Novell (http://www.novell.com) +// + +// // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining @@ -73,7 +77,7 @@ namespace System.Security.Cryptography { { KeySizeValue = 128; BlockSizeValue = 64; - FeedbackSizeValue = 8; + FeedbackSizeValue = 64; // The RFC allows keys of 1 to 128 bytes, but MS impl only supports // 40 to 128 bits, sigh. diff --git a/mcs/class/corlib/System.Security.Cryptography/TripleDES.cs b/mcs/class/corlib/System.Security.Cryptography/TripleDES.cs index add883b6ce8..54969879d16 100644 --- a/mcs/class/corlib/System.Security.Cryptography/TripleDES.cs +++ b/mcs/class/corlib/System.Security.Cryptography/TripleDES.cs @@ -5,6 +5,10 @@ // Sebastien Pouliot <sebastien@ximian.com> // // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com) +// (C) 2004 Novell (http://www.novell.com) +// + +// // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining @@ -47,7 +51,7 @@ public abstract class TripleDES : SymmetricAlgorithm { // from SymmetricAlgorithm KeySizeValue = 192; BlockSizeValue = 64; - FeedbackSizeValue = 8; + FeedbackSizeValue = 64; LegalKeySizesValue = new KeySizes [1]; LegalKeySizesValue [0] = new KeySizes (128, 192, 64); diff --git a/mcs/class/corlib/System.Threading/ChangeLog b/mcs/class/corlib/System.Threading/ChangeLog index 66587ac7c11..ba1a9664f98 100644 --- a/mcs/class/corlib/System.Threading/ChangeLog +++ b/mcs/class/corlib/System.Threading/ChangeLog @@ -1,10 +1,3 @@ -2004-07-15 Dick Porter <dick@ximian.com> - - * Thread.cs: Hold a lock in GetNamedDataSlot. Fixes bug 61582, - based on patch by Sébastien Robitaille - (sebastien.robitaille@croesus.com). Also fix instances of - lock(typeof(Thread)) to lock a private object instead. - 2004-06-24 Dick Porter <dick@ximian.com> * Mutex.cs: Implement the createdNew parameter diff --git a/mcs/class/corlib/System.Threading/Thread.cs b/mcs/class/corlib/System.Threading/Thread.cs index 911fb1dbe12..66826e12d40 100755 --- a/mcs/class/corlib/System.Threading/Thread.cs +++ b/mcs/class/corlib/System.Threading/Thread.cs @@ -157,10 +157,9 @@ namespace System.Threading // Stores a hash keyed by strings of LocalDataStoreSlot objects static Hashtable datastorehash; - private static object datastore_lock = new object (); - + private static void InitDataStoreHash () { - lock (datastore_lock) { + lock (typeof (Thread)) { if (datastorehash == null) { datastorehash = Hashtable.Synchronized(new Hashtable()); } @@ -168,7 +167,7 @@ namespace System.Threading } public static LocalDataStoreSlot AllocateNamedDataSlot(string name) { - lock (datastore_lock) { + lock (typeof (Thread)) { if (datastorehash == null) InitDataStoreHash (); LocalDataStoreSlot slot = (LocalDataStoreSlot)datastorehash[name]; @@ -187,7 +186,7 @@ namespace System.Threading } public static void FreeNamedDataSlot(string name) { - lock (datastore_lock) { + lock (typeof (Thread)) { if (datastorehash == null) InitDataStoreHash (); LocalDataStoreSlot slot=(LocalDataStoreSlot)datastorehash[name]; @@ -211,17 +210,15 @@ namespace System.Threading public extern static int GetDomainID(); public static LocalDataStoreSlot GetNamedDataSlot(string name) { - lock (datastore_lock) { - if (datastorehash == null) - InitDataStoreHash (); - LocalDataStoreSlot slot=(LocalDataStoreSlot)datastorehash[name]; + if (datastorehash == null) + InitDataStoreHash (); + LocalDataStoreSlot slot=(LocalDataStoreSlot)datastorehash[name]; - if(slot==null) { - slot=AllocateNamedDataSlot(name); - } - - return(slot); + if(slot==null) { + slot=AllocateNamedDataSlot(name); } + + return(slot); } [MethodImplAttribute(MethodImplOptions.InternalCall)] diff --git a/mcs/class/corlib/System/ChangeLog b/mcs/class/corlib/System/ChangeLog index 8e4560b1bea..b345b93f069 100644 --- a/mcs/class/corlib/System/ChangeLog +++ b/mcs/class/corlib/System/ChangeLog @@ -1,13 +1,3 @@ -2004-07-07 Geoff Norton <gnorton@customerdna.com> - - * Monotype.cs: Patch for bug #58844. Dont throw exceptions right away; - pass through all the possibly BindingInfo's and keep a bool value as to the type - of exception we might need to throw; - -2004-07-07 Geoff Norton <gnorton@customerdna.com> - - * Patch to fix bug #58973 - 2004-06-25 Ben Maurer <bmaurer@ximian.com> * Environment.cs: GetFolderPath has new behavior. r=miguel diff --git a/mcs/class/corlib/System/Double.cs b/mcs/class/corlib/System/Double.cs index 47f0d406531..a52c482792a 100644 --- a/mcs/class/corlib/System/Double.cs +++ b/mcs/class/corlib/System/Double.cs @@ -207,10 +207,6 @@ namespace System { for (; sidx < len; sidx++){ c = s [sidx]; - if (c == '\0') { - sidx = len; - continue; - } switch (state){ case State_AllowSign: if ((style & NumberStyles.AllowLeadingSign) != 0){ diff --git a/mcs/class/corlib/System/MonoType.cs b/mcs/class/corlib/System/MonoType.cs index 395332cf459..a04eeb93877 100644 --- a/mcs/class/corlib/System/MonoType.cs +++ b/mcs/class/corlib/System/MonoType.cs @@ -340,26 +340,22 @@ namespace System name = attr.MemberName; } bool ignoreCase = (invokeAttr & BindingFlags.IgnoreCase) != 0; - bool throwMissingMethodException = false; - bool throwMissingFieldException = false; if ((invokeAttr & BindingFlags.InvokeMethod) != 0) { MethodInfo[] methods = GetMethodsByName (name, invokeAttr, ignoreCase, this); object state = null; MethodBase m = binder.BindToMethod (invokeAttr, methods, ref args, modifiers, culture, namedParameters, out state); - if (m == null) { - throwMissingMethodException = true; - } else { - object result = m.Invoke (target, invokeAttr, binder, args, culture); - binder.ReorderArgumentArray (ref args, state); - return result; - } + if (m == null) + throw new MissingMethodException (); + object result = m.Invoke (target, invokeAttr, binder, args, culture); + binder.ReorderArgumentArray (ref args, state); + return result; } if ((invokeAttr & BindingFlags.GetField) != 0) { FieldInfo f = GetField (name, invokeAttr); if (f != null) { return f.GetValue (target); } else if ((invokeAttr & BindingFlags.GetProperty) == 0) { - throwMissingFieldException = true; + throw new MissingFieldException (); } /* try GetProperty */ } else if ((invokeAttr & BindingFlags.SetField) != 0) { @@ -368,7 +364,7 @@ namespace System f.SetValue (target, args [0]); return null; } else if ((invokeAttr & BindingFlags.SetProperty) == 0) { - throwMissingFieldException = true; + throw new MissingFieldException (); } /* try SetProperty */ } @@ -388,13 +384,11 @@ namespace System smethods [count++] = mb; } MethodBase m = binder.BindToMethod (invokeAttr, smethods, ref args, modifiers, culture, namedParameters, out state); - if (m == null) { - throwMissingFieldException = true; - } else { - object result = m.Invoke (target, invokeAttr, binder, args, culture); - binder.ReorderArgumentArray (ref args, state); - return result; - } + if (m == null) + throw new MissingFieldException (); + object result = m.Invoke (target, invokeAttr, binder, args, culture); + binder.ReorderArgumentArray (ref args, state); + return result; } else if ((invokeAttr & BindingFlags.SetProperty) != 0) { PropertyInfo[] properties = GetPropertiesByName (name, invokeAttr, ignoreCase, this); object state = null; @@ -411,19 +405,12 @@ namespace System smethods [count++] = mb; } MethodBase m = binder.BindToMethod (invokeAttr, smethods, ref args, modifiers, culture, namedParameters, out state); - if (m == null) { - throwMissingFieldException = true; - } else { - object result = m.Invoke (target, invokeAttr, binder, args, culture); - binder.ReorderArgumentArray (ref args, state); - return result; - } + if (m == null) + throw new MissingFieldException (); + object result = m.Invoke (target, invokeAttr, binder, args, culture); + binder.ReorderArgumentArray (ref args, state); + return result; } - if (throwMissingMethodException) - throw new MissingMethodException(); - if (throwMissingFieldException) - throw new MissingFieldException(); - return null; } diff --git a/mcs/class/corlib/Test/System.Collections/ChangeLog b/mcs/class/corlib/Test/System.Collections/ChangeLog index 885360ab080..5e7760f0fad 100644 --- a/mcs/class/corlib/Test/System.Collections/ChangeLog +++ b/mcs/class/corlib/Test/System.Collections/ChangeLog @@ -1,7 +1,3 @@ -2004-07-28 Dick Porter <dick@ximian.com> - - * ComparerTest.cs: Test for invariant compares (bug 61458.) - 2004-06-14 Sebastien Pouliot <sebastien@ximian.com> * HashtableTest.cs: Added new case to CopyTo(Array,int) an empty diff --git a/mcs/class/corlib/Test/System.Collections/ComparerTest.cs b/mcs/class/corlib/Test/System.Collections/ComparerTest.cs index c1591fc3402..c6353f4ec6a 100644 --- a/mcs/class/corlib/Test/System.Collections/ComparerTest.cs +++ b/mcs/class/corlib/Test/System.Collections/ComparerTest.cs @@ -42,16 +42,7 @@ namespace MonoTests.System.Collections { Assert(c.Compare (3, 2) > 0);
}
- - [Test] - public void Invariant () - { - Comparer c = Comparer.DefaultInvariant; - - Assert (c.Compare ("a", "A") > 0); - } - - +
}
}
diff --git a/mcs/class/corlib/Test/System.Reflection/ChangeLog b/mcs/class/corlib/Test/System.Reflection/ChangeLog index fd367c75537..2c5110a6ee3 100644 --- a/mcs/class/corlib/Test/System.Reflection/ChangeLog +++ b/mcs/class/corlib/Test/System.Reflection/ChangeLog @@ -1,7 +1,3 @@ -2004-07-03 Zoltan Varga <vargaz@freemail.hu> - - * ModuleTest.cs: New tests for FindTypes. - 2004-06-10 Lluis Sanchez <lluis@ximian.com> * AssemblyNameTest.cs: AssertEqualsByteArrays(): don't crash if arrays are diff --git a/mcs/errors/cs0502.cs b/mcs/errors/cs0502.cs index e2232ec0c29..b589cba2f75 100644 --- a/mcs/errors/cs0502.cs +++ b/mcs/errors/cs0502.cs @@ -1,6 +1,5 @@ -// cs0502.cs: The class 'Sample' is abstract and sealed
-// Line: 4
-
-abstract sealed class Sample {
-}
-
+// cs0502.cs: 'Sample' cannot be both abstract and sealed +// Line: 4 + +abstract sealed class Sample { +} diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog index 2404c0bd78b..0e090e70feb 100755 --- a/mcs/mcs/ChangeLog +++ b/mcs/mcs/ChangeLog @@ -1,62 +1,3 @@ -2004-07-19 Miguel de Icaza <miguel@ximian.com> - - * expression.cs: Resolve the constant expression before returning - it. Fixes: 61702 - -2004-07-17 Miguel de Icaza <miguel@ximian.com> - - * cs-tokenizer.cs (handle_preprocessing_directive): Do not return - `true' for preprocessing directives that we parse. The return - value indicates whether we should return to regular tokenizing or - not, not whether it was parsed successfully. - - In the past if we were in: #if false ... #line #endif, we would - resume parsing after `#line'. See bug 61604. - * typemanager.cs: Removed an old hack from Gonzalo to get corlib - building: IsEnumType should return true only for enums, not for - enums or System.Enum itself. This fixes #61593. - - Likely what happened is that corlib was wrong: mcs depended on - this bug in some places. The bug got fixed, we had to add the - hack, which caused bug 61593. - - * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack - that was a workaround for the older conditions. - -2004-07-14 Martin Baulig <martin@ximian.com> - - * iterators.cs: Use real error numbers. - -2004-07-14 Martin Baulig <martin@ximian.com> - - * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly - requires this to be a System.Collection.IEnumerable and not a - class implementing that interface. - (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator. - -2004-07-13 Marek Safar <marek.safar@seznam.cz> - - * class.cs: Fixed previous fix, it broke some error tests. - -2004-07-12 Martin Baulig <martin@ximian.com> - - * enum.cs (Enum.Define): Call Emit() to emit the attributes. - Fixes #61293. - -2004-07-09 Miguel de Icaza <miguel@ximian.com> - - * assign.cs (LocalTemporary): Add new argument: is_address,If - `is_address' is true, then the value that we store is the address - to the real value, and not the value itself. - - * ecore.cs (PropertyExpr): use the new local temporary - stuff to allow us to handle X.Y += z (where X is a struct) - -2004-07-08 Martin Baulig <martin@ximian.com> - - * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do - not always return, just like we're doing in Using.Resolve(). - 2004-06-24 Raja R Harinath <rharinath@novell.com> * expression.cs (BetterConversion): Remove buggy special-case @@ -157,6 +98,12 @@ * cs-parser.jay: Added error CS1669 test for indexers. +2004-06-13 Martin Baulig <martin@ximian.com> + + Merged latest changes into gmcs. Please keep this comment in + here, it makes it easier for me to see what changed in MCS since + the last time I merged. + 2004-06-11 Martin Baulig <martin@ximian.com> * expression.cs (Invocation.IsParamsMethodApplicable): We need to diff --git a/mcs/mcs/assign.cs b/mcs/mcs/assign.cs index 94467b2cabb..ecabbcad461 100755 --- a/mcs/mcs/assign.cs +++ b/mcs/mcs/assign.cs @@ -55,34 +55,24 @@ namespace Mono.CSharp { /// The local temporary is used to alter the normal flow of code generation /// basically it creates a local variable, and its emit instruction generates /// code to access this value, return its address or save its value. - /// - /// If `is_address' is true, then the value that we store is the address to the - /// real value, and not the value itself. - /// - /// This is needed for a value type, because otherwise you just end up making a - /// copy of the value on the stack and modifying it. You really need a pointer - /// to the origional value so that you can modify it in that location. This - /// Does not happen with a class because a class is a pointer -- so you always - /// get the indirection. - /// - /// The `is_address' stuff is really just a hack. We need to come up with a better - /// way to handle it. /// </remarks> public class LocalTemporary : Expression, IMemoryLocation { LocalBuilder builder; - bool is_address; - public LocalTemporary (EmitContext ec, Type t) : this (ec, t, false) {} - - public LocalTemporary (EmitContext ec, Type t, bool is_address) + public LocalTemporary (EmitContext ec, Type t) { type = t; eclass = ExprClass.Value; loc = Location.Null; - builder = ec.GetTemporaryLocal (is_address ? TypeManager.GetReferenceType (t): t); - this.is_address = is_address; + builder = ec.GetTemporaryLocal (t); } + public void Release (EmitContext ec) + { + ec.FreeTemporaryLocal (builder, type); + builder = null; + } + public LocalTemporary (LocalBuilder b, Type t) { type = t; @@ -90,12 +80,6 @@ namespace Mono.CSharp { loc = Location.Null; builder = b; } - - public void Release (EmitContext ec) - { - ec.FreeTemporaryLocal (builder, type); - builder = null; - } public override Expression DoResolve (EmitContext ec) { @@ -104,39 +88,17 @@ namespace Mono.CSharp { public override void Emit (EmitContext ec) { - ILGenerator ig = ec.ig; - - ig.Emit (OpCodes.Ldloc, builder); - // we need to copy from the pointer - if (is_address) - LoadFromPtr (ig, type); + ec.ig.Emit (OpCodes.Ldloc, builder); } - // NB: if you have `is_address' on the stack there must - // be a managed pointer. Otherwise, it is the type from - // the ctor. public void Store (EmitContext ec) { - ILGenerator ig = ec.ig; - ig.Emit (OpCodes.Stloc, builder); + ec.ig.Emit (OpCodes.Stloc, builder); } public void AddressOf (EmitContext ec, AddressOp mode) { - // if is_address, than this is just the address anyways, - // so we just return this. - ILGenerator ig = ec.ig; - - if (is_address) - ig.Emit (OpCodes.Ldloc, builder); - else - ig.Emit (OpCodes.Ldloca, builder); - } - - public bool PointsToAddress { - get { - return is_address; - } + ec.ig.Emit (OpCodes.Ldloca, builder); } } @@ -424,7 +386,7 @@ namespace Mono.CSharp { // just use `dup' to propagate the result // IAssignMethod am = (IAssignMethod) target; - + if (this is CompoundAssign) am.CacheTemporaries (ec); diff --git a/mcs/mcs/class.cs b/mcs/mcs/class.cs index 213b3d671c1..ef925659b3d 100755 --- a/mcs/mcs/class.cs +++ b/mcs/mcs/class.cs @@ -1835,12 +1835,6 @@ namespace Mono.CSharp { } } - if (enums != null) { - foreach (Enum e in enums) { - e.Emit (this); - } - } - if (Pending != null) if (Pending.VerifyPendingMethods ()) return; diff --git a/mcs/mcs/cs-tokenizer.cs b/mcs/mcs/cs-tokenizer.cs index c3a116bc835..5191948f407 100755 --- a/mcs/mcs/cs-tokenizer.cs +++ b/mcs/mcs/cs-tokenizer.cs @@ -1461,7 +1461,7 @@ namespace Mono.CSharp switch (cmd){
case "pragma":
if (RootContext.V2)
- return caller_is_taking;
+ return true;
break;
case "line":
@@ -1469,7 +1469,7 @@ namespace Mono.CSharp Report.Error (
1576, Location,
"Argument to #line directive is missing or invalid");
- return caller_is_taking;
+ return true;
case "region":
region_directive = true;
diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index 6a3e6912602..f9ef75c6fc1 100755 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -3226,40 +3226,21 @@ namespace Mono.CSharp { PropertyInfo.DeclaringType + "." +PropertyInfo.Name); return null; } - - // - // Check that we are not making changes to a temporary memory location - // - if (instance_expr != null && instance_expr.Type.IsValueType && !(instance_expr is IMemoryLocation)) { - // FIXME: Provide better error reporting. - Error (1612, "Cannot modify expression because it is not a variable."); - return null; - } - return this; } public override void CacheTemporaries (EmitContext ec) { - if (!is_static){ - // we need to do indirection on the pointer - bool need_address = instance_expr.Type.IsValueType; - temporary = new LocalTemporary (ec, instance_expr.Type, need_address); - } + if (!is_static) + temporary = new LocalTemporary (ec, instance_expr.Type); } Expression EmitInstance (EmitContext ec) { if (temporary != null){ if (!have_temporary){ - if (temporary.PointsToAddress){ - // must store the managed pointer - IMemoryLocation loc = instance_expr as IMemoryLocation; - loc.AddressOf (ec, AddressOp.LoadStore); - } else - instance_expr.Emit (ec); + instance_expr.Emit (ec); temporary.Store (ec); - have_temporary = true; } return temporary; diff --git a/mcs/mcs/enum.cs b/mcs/mcs/enum.cs index bc84775ad94..ac9ef2b4305 100755 --- a/mcs/mcs/enum.cs +++ b/mcs/mcs/enum.cs @@ -685,7 +685,6 @@ namespace Mono.CSharp { default_value = GetNextDefaultValue (default_value); } - return true; } diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 251c40dbdd5..8d2ff2b3aeb 100755 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -3672,7 +3672,7 @@ namespace Mono.CSharp { if (e != null) { local_info.Used = true; eclass = ExprClass.Value; - return e.Resolve (ec); + return e; } VariableInfo variable_info = local_info.VariableInfo; @@ -7556,7 +7556,7 @@ namespace Mono.CSharp { //Console.WriteLine (new System.Diagnostics.StackTrace ()); is_stobj = false; t = TypeManager.TypeToCoreType (t); - if (TypeManager.IsEnumType (t)) + if (TypeManager.IsEnumType (t) && t != TypeManager.enum_type) t = TypeManager.EnumToUnderlying (t); if (t == TypeManager.byte_type || t == TypeManager.sbyte_type || t == TypeManager.bool_type) diff --git a/mcs/mcs/iterators.cs b/mcs/mcs/iterators.cs index 0b44fd57350..6f2d32ab29e 100644 --- a/mcs/mcs/iterators.cs +++ b/mcs/mcs/iterators.cs @@ -42,18 +42,15 @@ namespace Mono.CSharp { public static bool CheckContext (EmitContext ec, Location loc) { if (ec.CurrentBranching.InFinally (true)){ - Report.Error (1625, loc, "Cannot yield in the body of a " + - "finally clause"); + Report.Error (-208, loc, "yield statement can not appear in finally clause"); return false; } if (ec.CurrentBranching.InCatch ()){ - Report.Error (1631, loc, "Cannot yield in the body of a " + - "catch clause"); + Report.Error (-209, loc, "yield statement can not appear in the catch clause"); return false; } if (ec.InAnonymousMethod){ - Report.Error (1621, loc, "yield statement can not appear " + - "inside an anonymoud method"); + Report.Error (-209, loc, "yield statement can not appear inside an anonymoud method"); return false; } @@ -654,12 +651,12 @@ namespace Mono.CSharp { static bool IsIEnumerable (Type t) { - return t == TypeManager.ienumerable_type; + return t == TypeManager.ienumerable_type || TypeManager.ImplementsInterface (t, TypeManager.ienumerable_type); } static bool IsIEnumerator (Type t) { - return t == TypeManager.ienumerator_type; + return t == TypeManager.ienumerator_type || TypeManager.ImplementsInterface (t, TypeManager.ienumerator_type); } // @@ -669,17 +666,18 @@ namespace Mono.CSharp { { if (!(IsIEnumerator (return_type) || IsIEnumerable (return_type))){ Report.Error ( - 1624, loc, "The body of `{0}' cannot be an iterator " + - "block because '{1}' is not an iterator interface type", - name, TypeManager.CSharpName (return_type)); + -205, loc, String.Format ( + "The method `{0}' contains a yield statement, but has an invalid return type for an iterator `{1}'", + name, TypeManager.CSharpName (return_type))); return null; } for (int i = 0; i < parameters.Count; i++){ Parameter.Modifier mod = parameters.ParameterModifier (i); if ((mod & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) != 0){ - Report.Error (1623, loc, "Iterators cannot have ref " + - "or out parameters"); + Report.Error (-207, loc, String.Format ( + "Parameter {0} of `{1}' is {2} and not allowed for an iterator method", + i+1, name, parameters.ParameterDesc (i))); return null; } } diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 8b0db129f82..7b0bcca47ea 100755 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -2734,22 +2734,9 @@ namespace Mono.CSharp { ec.StartFlowBranching (FlowBranching.BranchingType.Exception, loc); bool ok = Statement.Resolve (ec); - if (!ok) { - ec.KillFlowBranching (); - return false; - } - - FlowBranching.Reachability reachability = ec.EndFlowBranching (); - if (reachability.Returns != FlowBranching.FlowReturns.Always) { - // Unfortunately, System.Reflection.Emit automatically emits - // a leave to the end of the finally block. - // This is a problem if `returns' is true since we may jump - // to a point after the end of the method. - // As a workaround, emit an explicit ret here. - ec.NeedReturnLabel (); - } + ec.EndFlowBranching (); - return true; + return ok; } protected override void DoEmit (EmitContext ec) diff --git a/mcs/mcs/typemanager.cs b/mcs/mcs/typemanager.cs index d488979601f..2c2cb05b669 100755 --- a/mcs/mcs/typemanager.cs +++ b/mcs/mcs/typemanager.cs @@ -1495,7 +1495,7 @@ public class TypeManager { public static bool IsEnumType (Type t) { - if (t.IsSubclassOf (TypeManager.enum_type)) + if (t == TypeManager.enum_type || t.IsSubclassOf (TypeManager.enum_type)) return true; else return false; diff --git a/mcs/tests/Makefile b/mcs/tests/Makefile index eda4d87e639..2ccfb9d1614 100644 --- a/mcs/tests/Makefile +++ b/mcs/tests/Makefile @@ -43,7 +43,7 @@ TEST_SOURCES = \ test-241 test-242 test-243 test-244 test-245 test-246 test-247 test-248 test-249 test-250 \ test-251 test-252 test-253 test-254 test-255 test-256 test-257 test-258 test-259 test-260 \ test-261 test-262 test-263 test-264 test-265 test-266 test-267 test-268 test-269 test-270 \ - test-271 test-272 test-273 test-274 test-275 test-276 test-277 test-280 \ + test-271 test-272 test-273 test-274 test-275 test-276 test-277 \ cls-test-0 cls-test-1 cls-test-2 cls-test-3 cls-test-5 cls-test-6 cls-test-7 cls-test-10 \ cls-test-11 cls-test-14 cls-test-15 cls-test-16 diff --git a/mcs/tests/test-280.cs b/mcs/tests/test-280.cs deleted file mode 100644 index 8713c078ae2..00000000000 --- a/mcs/tests/test-280.cs +++ /dev/null @@ -1,23 +0,0 @@ -// -// Thisis just a compilation test for bug 61593 -using System; -namespace AppFramework.Util -{ - public class Logic - { - static public bool EnumInSet(Enum anEnum, Enum[] checkSet) - { - foreach(Enum aVal in checkSet) - { - if (aVal == anEnum) - { - return true; - } - } - return false; - } - } - - static void Main () {} -} - diff --git a/mono/dis/get.c b/mono/dis/get.c index 43845cd6c19..22dea4fa32a 100644 --- a/mono/dis/get.c +++ b/mono/dis/get.c @@ -197,6 +197,7 @@ get_typespec (MonoImage *m, guint32 idx) if (s) g_string_append (res, s); } + g_string_append (res, "*"); break; case MONO_TYPE_FNPTR: diff --git a/mono/io-layer/ChangeLog b/mono/io-layer/ChangeLog index fec9ca9fbe0..884514fe184 100644 --- a/mono/io-layer/ChangeLog +++ b/mono/io-layer/ChangeLog @@ -1,3 +1,65 @@ +2004-09-09 Dick Porter <dick@ximian.com> + + * error.c: + * io.c: Set error codes everywhere. + +2004-09-06 Dick Porter <dick@ximian.com> + + * handles.c (_wapi_handle_unref): Reset the private record's type + (_wapi_handle_process_fork): Fix long-standing bug in checking + handle return values. Also do the required bookkeeping with the + new process's handles. + + * daemon.c: When creating a new process's handles, check whether + the shared space needs to be increased + +2004-08-19 Dick Porter <dick@ximian.com> + + * handles.c (_wapi_handle_count_signalled_handles): Fix thinko + introduced with the fd offset stuff: unlock handles properly when + backing off. Fixes the monologue hang at exit. + +2004-08-18 Dick Porter <dick@ximian.com> + + * sockets.c: + * io.c: Check that new fds fit in the table, return error if not + + * daemon.c (_wapi_daemon_main): + * handles.c (shared_init): Have all processes agree on a size for + the fd table. + +2004-08-17 Dick Porter <dick@ximian.com> + + * daemon.c (process_new): + * handles.c (_wapi_handle_new_internal): Cope when the space + reserved for file descriptors is larger than the shared segment + size. Fixes the crash reported when running mono under gdb on + macosx. + +2004-08-16 Dick Porter <dick@ximian.com> + + * sockets.c: + * io.c: + * handles-private.h (_wapi_handle_fd_offset_to_handle): Improve + error checking with passed-in file descriptors. + +2004-08-11 Dick Porter <dick@ximian.com> + + * sockets.c: + * io.c: Returned handle values are the file descriptor the handle + encapsulates + + * handles.c: + * handles-private.h: + * daemon.c: Reserve the range of handles that can have the same + values as file descriptors. These won't be used, but the values + will be used as file, console, pipe or socket handles. The fd to + handle mapping is done internally and is invisible to users. + Fixes bug 61828. + + * wapi-private.h (_WAPI_HANDLE_VERSION): Increment, because we now + reserve a chunk of handle space. + 2004-07-22 Dick Porter <dick@ximian.com> * timed-thread.c: diff --git a/mono/io-layer/daemon.c b/mono/io-layer/daemon.c index 62aa75ce1f3..e2eca91b3eb 100644 --- a/mono/io-layer/daemon.c +++ b/mono/io-layer/daemon.c @@ -830,23 +830,11 @@ static void send_reply (GIOChannel *channel, WapiHandleResponse *resp) _wapi_daemon_response (g_io_channel_unix_get_fd (channel), resp); } -/* - * process_new: - * @channel: The client making the request - * @channel_data: Our data for this channel - * @type: type to init handle to - * - * Find a free handle and initialize it to 'type', increase refcnt and - * send back a reply to the client. - */ -static void process_new (GIOChannel *channel, ChannelData *channel_data, - WapiHandleType type) +static guint32 new_handle_with_shared_check (WapiHandleType type) { - guint32 handle; - WapiHandleResponse resp={0}; - - handle=_wapi_handle_new_internal (type); - if(handle==0) { + guint32 handle = 0; + + while ((handle = _wapi_handle_new_internal (type)) == 0) { /* Try and allocate a new shared segment, and have * another go */ @@ -871,15 +859,34 @@ static void process_new (GIOChannel *channel, ChannelData *channel_data, channels[i].open_handles=_wapi_g_renew0 (channels[i].open_handles, old_len, new_len); } } - - handle=_wapi_handle_new_internal (type); } else { /* Map failed. Just return 0 meaning "out of * handles" */ + break; } } + return(handle); +} + +/* + * process_new: + * @channel: The client making the request + * @channel_data: Our data for this channel + * @type: type to init handle to + * + * Find a free handle and initialize it to 'type', increase refcnt and + * send back a reply to the client. + */ +static void process_new (GIOChannel *channel, ChannelData *channel_data, + WapiHandleType type) +{ + guint32 handle; + WapiHandleResponse resp={0}; + + handle = new_handle_with_shared_check (type); + /* handle might still be set to 0. This is handled at the * client end */ @@ -1064,11 +1071,11 @@ static void process_process_fork (GIOChannel *channel, ChannelData *channel_data * client must check if either handle is 0 and take * appropriate error handling action. */ - process_handle=_wapi_handle_new_internal (WAPI_HANDLE_PROCESS); + process_handle = new_handle_with_shared_check (WAPI_HANDLE_PROCESS); ref_handle (daemon_channel_data, process_handle); ref_handle (channel_data, process_handle); - thread_handle=_wapi_handle_new_internal (WAPI_HANDLE_THREAD); + thread_handle = new_handle_with_shared_check (WAPI_HANDLE_THREAD); ref_handle (daemon_channel_data, thread_handle); ref_handle (channel_data, thread_handle); @@ -1246,7 +1253,7 @@ static void process_process_fork (GIOChannel *channel, ChannelData *channel_data resp.u.process_fork.pid=pid; } - + resp.u.process_fork.process_handle=process_handle; resp.u.process_fork.thread_handle=thread_handle; @@ -1491,6 +1498,9 @@ void _wapi_daemon_main(gpointer data, gpointer scratch) /* Note that we've got the starting segment already */ _wapi_shared_data[0]->num_segments=1; _wapi_shm_mapped_segments=1; + + _wapi_fd_offset_table_size=getdtablesize (); + _wapi_shared_data[0]->fd_offset_table_size = _wapi_fd_offset_table_size; startup (); diff --git a/mono/io-layer/error.c b/mono/io-layer/error.c index ee6dd56c96e..b167c1e9999 100644 --- a/mono/io-layer/error.c +++ b/mono/io-layer/error.c @@ -194,6 +194,14 @@ _wapi_get_win32_file_error (gint err) ret = ERROR_NOT_SUPPORTED; break; + case EBADF: + ret = ERROR_INVALID_HANDLE; + break; + + case EIO: + ret = ERROR_INVALID_HANDLE; + break; + default: g_message ("Unknown errno: %s\n", strerror (err)); ret = ERROR_GEN_FAILURE; diff --git a/mono/io-layer/handles-private.h b/mono/io-layer/handles-private.h index 674e01384b9..36890a97160 100644 --- a/mono/io-layer/handles-private.h +++ b/mono/io-layer/handles-private.h @@ -28,6 +28,9 @@ extern struct _WapiHandlePrivate_list **_wapi_private_data; extern pthread_mutex_t _wapi_shared_mutex; extern guint32 _wapi_shm_mapped_segments; +extern guint32 _wapi_fd_offset_table_size; +extern gpointer *_wapi_fd_offset_table; + extern guint32 _wapi_handle_new_internal (WapiHandleType type); extern gpointer _wapi_handle_new (WapiHandleType type); extern gboolean _wapi_lookup_handle (gpointer handle, WapiHandleType type, @@ -93,6 +96,43 @@ extern gboolean _wapi_handle_get_or_set_share (dev_t device, ino_t inode, extern void _wapi_handle_set_share (dev_t device, ino_t inode, guint32 sharemode, guint32 access); +static inline void _wapi_handle_fd_offset_store (int fd, gpointer handle) +{ + g_assert (fd < _wapi_fd_offset_table_size); + g_assert (_wapi_fd_offset_table[fd]==NULL || handle==NULL); + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size || handle==NULL); + +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": Assigning fd offset %d to %p", fd, + handle); +#endif + + _wapi_fd_offset_table[fd]=handle; +} + +static inline gpointer _wapi_handle_fd_offset_to_handle (gpointer fd_handle) +{ + int fd = GPOINTER_TO_INT (fd_handle); + gpointer handle; + + if (fd >= _wapi_fd_offset_table_size) { + return(NULL); + } + + handle = _wapi_fd_offset_table[fd]; + + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + return(NULL); + } + +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": Returning fd offset %d of %p", fd, + handle); +#endif + + return(handle); +} + static inline struct _WapiHandleShared_list *_wapi_handle_get_shared_segment (guint32 segment) { struct _WapiHandleShared_list *shared; @@ -225,6 +265,10 @@ static inline WapiHandleType _wapi_handle_type (gpointer handle) guint32 idx; guint32 segment; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); if(segment>=_wapi_shm_mapped_segments) @@ -242,6 +286,8 @@ static inline void _wapi_handle_set_signal_state (gpointer handle, struct _WapiHandleShared *shared_handle; int thr_ret; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + _wapi_handle_segment (handle, &segment, &idx); shared_handle=&_wapi_handle_get_shared_segment (segment)->handles[idx]; @@ -317,6 +363,8 @@ static inline gboolean _wapi_handle_issignalled (gpointer handle) guint32 idx; guint32 segment; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + _wapi_handle_segment (handle, &segment, &idx); return(_wapi_handle_get_shared_segment (segment)->handles[idx].signalled); @@ -352,6 +400,8 @@ static inline int _wapi_handle_lock_handle (gpointer handle) guint32 idx; guint32 segment; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": locking handle %p", handle); #endif @@ -369,6 +419,8 @@ static inline int _wapi_handle_unlock_handle (gpointer handle) guint32 segment; int ret; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": unlocking handle %p", handle); #endif diff --git a/mono/io-layer/handles.c b/mono/io-layer/handles.c index 769235fe76d..a1c3dde13ef 100644 --- a/mono/io-layer/handles.c +++ b/mono/io-layer/handles.c @@ -77,6 +77,9 @@ pthread_mutex_t _wapi_shared_mutex=PTHREAD_MUTEX_INITIALIZER; */ guint32 _wapi_shm_mapped_segments; +guint32 _wapi_fd_offset_table_size; +gpointer *_wapi_fd_offset_table=NULL; + static void shared_init (void) { struct sockaddr_un shared_socket_address; @@ -86,7 +89,7 @@ static void shared_init (void) _wapi_shared_data=g_new0 (struct _WapiHandleShared_list *, 1); _wapi_private_data=g_new0 (struct _WapiHandlePrivate_list *, 1); - + attach_again: #ifndef DISABLE_SHARED_HANDLES @@ -146,6 +149,9 @@ attach_again: goto attach_again; } + } else { + _wapi_fd_offset_table_size = _wapi_shared_data[0]->fd_offset_table_size; + _wapi_fd_offset_table=g_new0 (gpointer, _wapi_fd_offset_table_size); } } @@ -158,6 +164,10 @@ attach_again: _wapi_shared_data[0]->num_segments=1; _wapi_shared_scratch=g_new0 (struct _WapiHandleScratch, 1); + + _wapi_fd_offset_table_size=getdtablesize (); + _wapi_fd_offset_table=g_new0 (gpointer, + _wapi_fd_offset_table_size); } _wapi_private_data[0]=g_new0 (struct _WapiHandlePrivate_list, 1); _wapi_shm_mapped_segments=1; @@ -240,6 +250,7 @@ guint32 _wapi_handle_new_internal (WapiHandleType type) guint32 i, j; static guint32 last=1; int thr_ret; + guint32 num_segments = _wapi_handle_get_shared_segment (0)->num_segments; /* A linear scan should be fast enough. Start from the last * allocation, assuming that handles are allocated more often @@ -250,8 +261,7 @@ guint32 _wapi_handle_new_internal (WapiHandleType type) #endif again: _wapi_handle_segment (GUINT_TO_POINTER (last), &segment, &idx); - for(i=segment; i<_wapi_handle_get_shared_segment (0)->num_segments; - i++) { + for(i=segment; i < num_segments; i++) { if(i!=segment) { idx=0; } @@ -259,8 +269,20 @@ again: for(j=idx; j<_WAPI_HANDLES_PER_SEGMENT; j++) { struct _WapiHandleShared *shared; - /* Make sure we dont try and assign handle 0 */ - if (i==0 && j==0) { + /* Make sure we dont try and assign the + * handles that would clash with fds + */ + if ((i * _WAPI_HANDLES_PER_SEGMENT + j) < _wapi_fd_offset_table_size) { + i = _wapi_fd_offset_table_size / _WAPI_HANDLES_PER_SEGMENT; + j = _wapi_fd_offset_table_size - (i * _WAPI_HANDLES_PER_SEGMENT); + + if (i >= num_segments) { + /* Need to get the caller to + * add more shared segments + */ + return(0); + } + continue; } @@ -314,7 +336,7 @@ gpointer _wapi_handle_new (WapiHandleType type) int thr_ret; mono_once (&shared_init_once, shared_init); - + again: if(shared==TRUE) { new.type=WapiHandleRequestType_New; @@ -336,8 +358,7 @@ again: thr_ret = pthread_mutex_lock (&scan_mutex); g_assert (thr_ret == 0); - handle_idx=_wapi_handle_new_internal (type); - if(handle_idx==0) { + while ((handle_idx = _wapi_handle_new_internal (type)) == 0) { /* Try and get a new segment, and have another go */ segment=_wapi_handle_get_shared_segment (0)->num_segments; _wapi_handle_ensure_mapped (segment); @@ -345,7 +366,6 @@ again: if(_wapi_handle_get_shared_segment (segment)!=NULL) { /* Got a new segment */ _wapi_handle_get_shared_segment (0)->num_segments++; - handle_idx=_wapi_handle_new_internal (type); } else { /* Map failed. Just return 0 meaning * "out of handles" @@ -361,6 +381,9 @@ again: pthread_cleanup_pop (0); } + /* Make sure we left the space for fd mappings */ + g_assert (handle_idx >= _wapi_fd_offset_table_size); + if(handle_idx==0) { g_warning (G_GNUC_PRETTY_FUNCTION ": Ran out of handles!"); @@ -414,6 +437,8 @@ gboolean _wapi_lookup_handle (gpointer handle, WapiHandleType type, guint32 idx; guint32 segment; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + _wapi_handle_segment (handle, &segment, &idx); _wapi_handle_ensure_mapped (segment); @@ -592,6 +617,8 @@ gpointer _wapi_search_handle_namespace (WapiHandleType type, void _wapi_handle_ref (gpointer handle) { + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + if(shared==TRUE) { WapiHandleRequest req={0}; WapiHandleResponse resp={0}; @@ -628,6 +655,8 @@ void _wapi_handle_unref (gpointer handle) gboolean destroy = FALSE; int thr_ret; + g_assert (GPOINTER_TO_UINT (handle) >= _wapi_fd_offset_table_size); + _wapi_handle_segment (handle, &segment, &idx); if(shared==TRUE) { @@ -676,6 +705,7 @@ void _wapi_handle_unref (gpointer handle) _wapi_handle_ops_close_private (handle); _wapi_handle_get_shared_segment (segment)->handles[idx].type=WAPI_HANDLE_UNUSED; + _wapi_handle_get_private_segment (segment)->handles[idx].type=WAPI_HANDLE_UNUSED; /* Destroy the mutex and cond var. We hope nobody * tried to grab them between the handle unlock and @@ -1180,6 +1210,10 @@ gboolean _wapi_handle_test_capabilities (gpointer handle, guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1197,6 +1231,10 @@ void _wapi_handle_ops_close_shared (gpointer handle) guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1211,6 +1249,10 @@ void _wapi_handle_ops_close_private (gpointer handle) guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1232,6 +1274,10 @@ void _wapi_handle_ops_signal (gpointer handle) guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1246,6 +1292,10 @@ void _wapi_handle_ops_own (gpointer handle) guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1260,6 +1310,10 @@ gboolean _wapi_handle_ops_isowned (gpointer handle) guint32 idx, segment; WapiHandleType type; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); type=_wapi_handle_get_shared_segment (segment)->handles[idx].type; @@ -1284,6 +1338,14 @@ gboolean _wapi_handle_ops_isowned (gpointer handle) */ gboolean CloseHandle(gpointer handle) { + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + + if (handle == NULL) { + return(FALSE); + } + _wapi_handle_unref (handle); return(TRUE); @@ -1303,12 +1365,17 @@ gboolean _wapi_handle_count_signalled_handles (guint32 numhandles, again: for(i=0; i<numhandles; i++) { guint32 idx, segment; + gpointer handle = handles[i]; + + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } - _wapi_handle_segment (handles[i], &segment, &idx); + _wapi_handle_segment (handle, &segment, &idx); #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": attempting to lock %p", - handles[i]); + handle); #endif ret=mono_mutex_trylock (&_wapi_handle_get_shared_segment (segment)->handles[idx].signal_mutex); @@ -1317,11 +1384,17 @@ again: struct timespec sleepytime; #ifdef DEBUG - g_message (G_GNUC_PRETTY_FUNCTION ": attempt failed for %p", handles[i]); + g_message (G_GNUC_PRETTY_FUNCTION ": attempt failed for %p: %s", handle, strerror (ret)); #endif while(i--) { - _wapi_handle_segment (handles[i], &segment, &idx); + handle = handles[i]; + + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + + _wapi_handle_segment (handle, &segment, &idx); thr_ret = mono_mutex_unlock (&_wapi_handle_get_shared_segment (segment)->handles[idx].signal_mutex); g_assert (thr_ret == 0); } @@ -1359,24 +1432,29 @@ again: for(i=0; i<numhandles; i++) { guint32 idx, segment; - - _wapi_handle_ref (handles[i]); + gpointer handle = handles[i]; + + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + + _wapi_handle_ref (handle); - _wapi_handle_segment (handles[i], &segment, &idx); + _wapi_handle_segment (handle, &segment, &idx); #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": Checking handle %p", - handles[i]); + handle); #endif - if(((_wapi_handle_test_capabilities (handles[i], WAPI_HANDLE_CAP_OWN)==TRUE) && - (_wapi_handle_ops_isowned (handles[i])==TRUE)) || + if(((_wapi_handle_test_capabilities (handle, WAPI_HANDLE_CAP_OWN)==TRUE) && + (_wapi_handle_ops_isowned (handle)==TRUE)) || (_wapi_handle_get_shared_segment (segment)->handles[idx].signalled==TRUE)) { count++; #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION - ": Handle %p signalled", handles[i]); + ": Handle %p signalled", handle); #endif if(*lowest>i) { *lowest=i; @@ -1412,18 +1490,23 @@ void _wapi_handle_unlock_handles (guint32 numhandles, gpointer *handles) for(i=0; i<numhandles; i++) { guint32 idx, segment; - - _wapi_handle_segment (handles[i], &segment, &idx); + gpointer handle = handles[i]; + + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + + _wapi_handle_segment (handle, &segment, &idx); #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": unlocking handle %p", - handles[i]); + handle); #endif thr_ret = mono_mutex_unlock (&_wapi_handle_get_shared_segment (segment)->handles[idx].signal_mutex); g_assert (thr_ret == 0); - _wapi_handle_unref (handles[i]); + _wapi_handle_unref (handle); } } @@ -1495,6 +1578,10 @@ int _wapi_handle_wait_signal_handle (gpointer handle) #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1 guint32 idx, segment; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); return(mono_cond_wait (&_wapi_handle_get_shared_segment (segment)->handles[idx].signal_cond, @@ -1504,6 +1591,10 @@ int _wapi_handle_wait_signal_handle (gpointer handle) struct timespec fake_timeout; int ret; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); _wapi_calc_timeout (&fake_timeout, 100); @@ -1524,6 +1615,10 @@ int _wapi_handle_timedwait_signal_handle (gpointer handle, #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1 guint32 idx, segment; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); return(mono_cond_timedwait (&_wapi_handle_get_shared_segment (segment)->handles[idx].signal_cond, @@ -1534,6 +1629,10 @@ int _wapi_handle_timedwait_signal_handle (gpointer handle, struct timespec fake_timeout; int ret; + if (GPOINTER_TO_UINT (handle) < _wapi_fd_offset_table_size) { + handle = _wapi_handle_fd_offset_to_handle (handle); + } + _wapi_handle_segment (handle, &segment, &idx); _wapi_calc_timeout (&fake_timeout, 100); @@ -1609,9 +1708,26 @@ gboolean _wapi_handle_process_fork (guint32 cmd, guint32 env, guint32 dir, * exec_errno will be set, and the handle will be * signalled immediately. */ - if(process_handle==0 || thread_handle==0) { + if(*process_handle==0 || *thread_handle==0) { return(FALSE); } else { + /* This call returns new handles, so we need to do + * a little bookkeeping + */ + if (_wapi_private_data != NULL) { + guint32 segment, idx; + + _wapi_handle_segment (*process_handle, + &segment, &idx); + _wapi_handle_ensure_mapped (segment); + _wapi_handle_get_private_segment (segment)->handles[idx].type = WAPI_HANDLE_PROCESS; + + _wapi_handle_segment (*thread_handle, + &segment, &idx); + _wapi_handle_ensure_mapped (segment); + _wapi_handle_get_private_segment (segment)->handles[idx].type = WAPI_HANDLE_THREAD; + } + return(TRUE); } } else { diff --git a/mono/io-layer/io.c b/mono/io-layer/io.c index cdc616743fa..6a326e51763 100644 --- a/mono/io-layer/io.c +++ b/mono/io-layer/io.c @@ -236,6 +236,7 @@ static void file_close_shared (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -263,6 +264,7 @@ static void file_close_private (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -271,6 +273,9 @@ static void file_close_private (gpointer handle) handle, file_private_handle->fd); #endif + /* Blank out the mapping, to make catching errors easier */ + _wapi_handle_fd_offset_store (file_private_handle->fd, NULL); + close(file_private_handle->fd); } @@ -326,6 +331,7 @@ static gboolean file_read(gpointer handle, gpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -339,6 +345,7 @@ static gboolean file_read(gpointer handle, gpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION": handle %p fd %d doesn't have GENERIC_READ access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -441,6 +448,7 @@ static gboolean file_write(gpointer handle, gconstpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -454,6 +462,7 @@ static gboolean file_write(gpointer handle, gconstpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -495,6 +504,7 @@ static gboolean file_write(gpointer handle, gconstpointer buffer, file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } if(byteswritten!=NULL) { @@ -575,6 +585,7 @@ static gboolean file_flush(gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -584,6 +595,7 @@ static gboolean file_flush(gpointer handle) g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -591,10 +603,11 @@ static gboolean file_flush(gpointer handle) if (ret==-1) { #ifdef DEBUG g_message(G_GNUC_PRETTY_FUNCTION - ": write of handle %p fd %d error: %s", handle, + ": fsync of handle %p fd %d error: %s", handle, file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -741,6 +754,7 @@ static gboolean file_setendoffile(gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -750,6 +764,7 @@ static gboolean file_setendoffile(gpointer handle) g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -767,6 +782,7 @@ static gboolean file_setendoffile(gpointer handle) file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } size=statbuf.st_size; @@ -779,6 +795,7 @@ static gboolean file_setendoffile(gpointer handle) file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -797,6 +814,7 @@ static gboolean file_setendoffile(gpointer handle) strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } } @@ -816,6 +834,7 @@ static gboolean file_setendoffile(gpointer handle) file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -837,6 +856,7 @@ static guint32 file_getfilesize(gpointer handle, guint32 *highsize) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(INVALID_FILE_SIZE); } @@ -847,6 +867,7 @@ static guint32 file_getfilesize(gpointer handle, guint32 *highsize) g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_READ or GENERIC_WRITE access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(INVALID_FILE_SIZE); } @@ -858,6 +879,7 @@ static guint32 file_getfilesize(gpointer handle, guint32 *highsize) file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(INVALID_FILE_SIZE); } @@ -899,6 +921,7 @@ static gboolean file_getfiletime(gpointer handle, WapiFileTime *create_time, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -908,6 +931,7 @@ static gboolean file_getfiletime(gpointer handle, WapiFileTime *create_time, g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_READ access: %u", handle, file_private_handle->fd, file_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -919,6 +943,7 @@ static gboolean file_getfiletime(gpointer handle, WapiFileTime *create_time, file_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -1106,6 +1131,7 @@ static void console_close_shared (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up console handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -1133,6 +1159,7 @@ static void console_close_private (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up console handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -1142,6 +1169,9 @@ static void console_close_private (gpointer handle) console_private_handle->fd); #endif + /* Blank out the mapping, to make catching errors easier */ + _wapi_handle_fd_offset_store (console_private_handle->fd, NULL); + close(console_private_handle->fd); } @@ -1165,6 +1195,7 @@ static gboolean console_read(gpointer handle, gpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up console handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -1178,6 +1209,7 @@ static gboolean console_read(gpointer handle, gpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION": handle %p fd %d doesn't have GENERIC_READ access: %u", handle, console_private_handle->fd, console_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -1193,6 +1225,7 @@ static gboolean console_read(gpointer handle, gpointer buffer, console_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -1218,6 +1251,7 @@ static gboolean console_write(gpointer handle, gconstpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up console handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -1231,6 +1265,7 @@ static gboolean console_write(gpointer handle, gconstpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, console_private_handle->fd, console_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -1246,6 +1281,7 @@ static gboolean console_write(gpointer handle, gconstpointer buffer, console_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } if(byteswritten!=NULL) { @@ -1265,6 +1301,7 @@ static void pipe_close_shared (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up pipe handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -1292,6 +1329,7 @@ static void pipe_close_private (gpointer handle) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up pipe handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return; } @@ -1301,6 +1339,9 @@ static void pipe_close_private (gpointer handle) pipe_private_handle->fd); #endif + /* Blank out the mapping, to make catching errors easier */ + _wapi_handle_fd_offset_store (pipe_private_handle->fd, NULL); + close(pipe_private_handle->fd); } @@ -1324,6 +1365,7 @@ static gboolean pipe_read (gpointer handle, gpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up pipe handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -1337,6 +1379,7 @@ static gboolean pipe_read (gpointer handle, gpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION": handle %p fd %d doesn't have GENERIC_READ access: %u", handle, pipe_private_handle->fd, pipe_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -1358,6 +1401,7 @@ static gboolean pipe_read (gpointer handle, gpointer buffer, pipe_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } @@ -1387,6 +1431,7 @@ static gboolean pipe_write(gpointer handle, gconstpointer buffer, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up pipe handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -1400,6 +1445,7 @@ static gboolean pipe_write(gpointer handle, gconstpointer buffer, g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, pipe_private_handle->fd, pipe_handle->fileaccess); #endif + SetLastError (ERROR_ACCESS_DENIED); return(FALSE); } @@ -1421,6 +1467,7 @@ static gboolean pipe_write(gpointer handle, gconstpointer buffer, pipe_private_handle->fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(FALSE); } if(byteswritten!=NULL) { @@ -1575,6 +1622,7 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess, g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return(INVALID_HANDLE_VALUE); } @@ -1585,6 +1633,7 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess, ": unicode conversion returned NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return(INVALID_HANDLE_VALUE); } @@ -1619,6 +1668,19 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess, return(INVALID_HANDLE_VALUE); } + if (fd >= _wapi_fd_offset_table_size) { +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": File descriptor is too big"); +#endif + + SetLastError (ERROR_TOO_MANY_OPEN_FILES); + + close (fd); + g_free (filename); + + return(INVALID_HANDLE_VALUE); + } + ret = fstat (fd, &statbuf); if (ret == -1) { #ifdef DEBUG @@ -1688,6 +1750,7 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess, g_free (filename); close (fd); + SetLastError (ERROR_GEN_FAILURE); return(INVALID_HANDLE_VALUE); } @@ -1702,10 +1765,13 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess, if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up file handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); close (fd); goto cleanup; } - cf_ret = handle; + + _wapi_handle_fd_offset_store (fd, handle); + cf_ret = GINT_TO_POINTER (fd); file_private_handle->fd=fd; file_private_handle->assigned=TRUE; @@ -1758,6 +1824,7 @@ gboolean DeleteFile(const gunichar2 *name) g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return(FALSE); } @@ -1768,6 +1835,7 @@ gboolean DeleteFile(const gunichar2 *name) ": unicode conversion returned NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return(FALSE); } @@ -1798,6 +1866,15 @@ gboolean MoveFile (const gunichar2 *name, const gunichar2 *dest_name) { gchar *utf8_name, *utf8_dest_name; int result; + + if(name==NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } utf8_name = mono_unicode_to_external (name); if (utf8_name == NULL) { @@ -1805,8 +1882,19 @@ gboolean MoveFile (const gunichar2 *name, const gunichar2 *dest_name) g_message (G_GNUC_PRETTY_FUNCTION ": unicode conversion returned NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return FALSE; } + + if(dest_name==NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + g_free (utf8_name); + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } utf8_dest_name = mono_unicode_to_external (dest_name); if (utf8_dest_name == NULL) { @@ -1815,6 +1903,7 @@ gboolean MoveFile (const gunichar2 *name, const gunichar2 *dest_name) #endif g_free (utf8_name); + SetLastError (ERROR_INVALID_NAME); return FALSE; } @@ -1825,6 +1914,7 @@ gboolean MoveFile (const gunichar2 *name, const gunichar2 *dest_name) if (result != 0 && errno == EXDEV) { /* Try a copy to the new location, and delete the source */ if (CopyFile (name, dest_name, TRUE)==FALSE) { + /* CopyFile will set the error */ return(FALSE); } @@ -1870,6 +1960,15 @@ gboolean CopyFile (const gunichar2 *name, const gunichar2 *dest_name, int remain, n; struct stat st; + if(name==NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } + utf8_src = mono_unicode_to_external (name); if (utf8_src == NULL) { #ifdef DEBUG @@ -1880,6 +1979,16 @@ gboolean CopyFile (const gunichar2 *name, const gunichar2 *dest_name, return(FALSE); } + if(dest_name==NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + g_free (utf8_src); + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } + utf8_dest = mono_unicode_to_external (dest_name); if (utf8_dest == NULL) { #ifdef DEBUG @@ -1991,16 +2100,16 @@ gboolean CopyFile (const gunichar2 *name, const gunichar2 *dest_name, } static mono_once_t stdhandle_once=MONO_ONCE_INIT; -static gpointer stdin_handle=NULL; -static gpointer stdout_handle=NULL; -static gpointer stderr_handle=NULL; +static gpointer stdin_handle=INVALID_HANDLE_VALUE; +static gpointer stdout_handle=INVALID_HANDLE_VALUE; +static gpointer stderr_handle=INVALID_HANDLE_VALUE; static gpointer stdhandle_create (int fd, const guchar *name) { struct _WapiHandle_file *file_handle; struct _WapiHandlePrivate_file *file_private_handle; gboolean ok; - gpointer handle, ret = NULL; + gpointer handle, ret = INVALID_HANDLE_VALUE; int flags; int thr_ret; @@ -2024,6 +2133,7 @@ static gpointer stdhandle_create (int fd, const guchar *name) fd, strerror(errno)); #endif + _wapi_set_last_error_from_errno (); return(INVALID_HANDLE_VALUE); } @@ -2031,7 +2141,8 @@ static gpointer stdhandle_create (int fd, const guchar *name) if(handle==_WAPI_HANDLE_INVALID) { g_warning (G_GNUC_PRETTY_FUNCTION ": error creating file handle"); - return(NULL); + SetLastError (ERROR_GEN_FAILURE); + return(INVALID_HANDLE_VALUE); } pthread_cleanup_push ((void(*)(void *))_wapi_handle_unlock_handle, @@ -2045,9 +2156,13 @@ static gpointer stdhandle_create (int fd, const guchar *name) if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up console handle %p", handle); + SetLastError (ERROR_INVALID_HANDLE); goto cleanup; } - ret = handle; + + /* We know this is fd 0, 1 or 2 */ + _wapi_handle_fd_offset_store (fd, handle); + ret = GINT_TO_POINTER (fd); file_private_handle->fd=fd; file_private_handle->assigned=TRUE; @@ -2114,11 +2229,17 @@ gpointer GetStdHandle(WapiStdHandle stdhandle) ": unknown standard handle type"); #endif + SetLastError (ERROR_INVALID_PARAMETER); return(INVALID_HANDLE_VALUE); } + if (handle == INVALID_HANDLE_VALUE) { + SetLastError (ERROR_NO_MORE_FILES); + return(INVALID_HANDLE_VALUE); + } + /* Add a reference to this handle */ - _wapi_handle_ref (handle); + _wapi_handle_ref (_wapi_handle_fd_offset_to_handle (handle)); return(handle); } @@ -2150,12 +2271,21 @@ gpointer GetStdHandle(WapiStdHandle stdhandle) * read due to an attempt to read past the end of the file), %FALSE on * error. */ -gboolean ReadFile(gpointer handle, gpointer buffer, guint32 numbytes, +gboolean ReadFile(gpointer fd_handle, gpointer buffer, guint32 numbytes, guint32 *bytesread, WapiOverlapped *overlapped) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].readfile==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2188,12 +2318,21 @@ gboolean ReadFile(gpointer handle, gpointer buffer, guint32 numbytes, * * Return value: %TRUE if the write succeeds, %FALSE on error. */ -gboolean WriteFile(gpointer handle, gconstpointer buffer, guint32 numbytes, +gboolean WriteFile(gpointer fd_handle, gconstpointer buffer, guint32 numbytes, guint32 *byteswritten, WapiOverlapped *overlapped) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].writefile==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2211,11 +2350,20 @@ gboolean WriteFile(gpointer handle, gconstpointer buffer, guint32 numbytes, * * Return value: %TRUE on success, %FALSE otherwise. */ -gboolean FlushFileBuffers(gpointer handle) +gboolean FlushFileBuffers(gpointer fd_handle) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].flushfile==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2232,11 +2380,20 @@ gboolean FlushFileBuffers(gpointer handle) * * Return value: %TRUE on success, %FALSE otherwise. */ -gboolean SetEndOfFile(gpointer handle) +gboolean SetEndOfFile(gpointer fd_handle) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].setendoffile==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2272,13 +2429,22 @@ gboolean SetEndOfFile(gpointer handle) * If @highmovedistance is not %NULL, the high 32 bits of the new file * pointer are stored there. On failure, %INVALID_SET_FILE_POINTER. */ -guint32 SetFilePointer(gpointer handle, gint32 movedistance, +guint32 SetFilePointer(gpointer fd_handle, gint32 movedistance, gint32 *highmovedistance, WapiSeekMethod method) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(INVALID_SET_FILE_POINTER); + } + + type = _wapi_handle_type (handle); if(io_ops[type].seek==NULL) { - return(FALSE); + SetLastError (ERROR_INVALID_HANDLE); + return(INVALID_SET_FILE_POINTER); } return(io_ops[type].seek (handle, movedistance, highmovedistance, @@ -2296,11 +2462,20 @@ guint32 SetFilePointer(gpointer handle, gint32 movedistance, * %FILE_TYPE_CHAR - @handle is a character device, such as a console. * %FILE_TYPE_PIPE - @handle is a named or anonymous pipe. */ -WapiFileType GetFileType(gpointer handle) +WapiFileType GetFileType(gpointer fd_handle) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FILE_TYPE_UNKNOWN); + } + + type = _wapi_handle_type (handle); if(io_ops[type].getfiletype==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FILE_TYPE_UNKNOWN); } @@ -2323,12 +2498,21 @@ WapiFileType GetFileType(gpointer handle) * @highsize is non-%NULL then the high 32 bits of the file size are * stored here. On failure %INVALID_FILE_SIZE is returned. */ -guint32 GetFileSize(gpointer handle, guint32 *highsize) +guint32 GetFileSize(gpointer fd_handle, guint32 *highsize) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(INVALID_FILE_SIZE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].getfilesize==NULL) { - return(FALSE); + SetLastError (ERROR_INVALID_HANDLE); + return(INVALID_FILE_SIZE); } return(io_ops[type].getfilesize (handle, highsize)); @@ -2359,12 +2543,21 @@ guint32 GetFileSize(gpointer handle, guint32 *highsize) * * Return value: %TRUE on success, %FALSE otherwise. */ -gboolean GetFileTime(gpointer handle, WapiFileTime *create_time, +gboolean GetFileTime(gpointer fd_handle, WapiFileTime *create_time, WapiFileTime *last_access, WapiFileTime *last_write) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].getfiletime==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2395,13 +2588,22 @@ gboolean GetFileTime(gpointer handle, WapiFileTime *create_time, * * Return value: %TRUE on success, %FALSE otherwise. */ -gboolean SetFileTime(gpointer handle, const WapiFileTime *create_time, +gboolean SetFileTime(gpointer fd_handle, const WapiFileTime *create_time, const WapiFileTime *last_access, const WapiFileTime *last_write) { - WapiHandleType type=_wapi_handle_type (handle); + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + WapiHandleType type; + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } + + type = _wapi_handle_type (handle); if(io_ops[type].setfiletime==NULL) { + SetLastError (ERROR_INVALID_HANDLE); return(FALSE); } @@ -2448,6 +2650,7 @@ gboolean FileTimeToSystemTime(const WapiFileTime *file_time, g_message(G_GNUC_PRETTY_FUNCTION ": system_time NULL"); #endif + SetLastError (ERROR_INVALID_PARAMETER); return(FALSE); } @@ -2463,6 +2666,7 @@ gboolean FileTimeToSystemTime(const WapiFileTime *file_time, g_message(G_GNUC_PRETTY_FUNCTION ": file_time too big"); #endif + SetLastError (ERROR_INVALID_PARAMETER); return(FALSE); } @@ -2799,6 +3003,7 @@ gpointer FindFirstFile (const gunichar2 *pattern, WapiFindData *find_data) g_free (dir_part); g_free (entry_part); g_free (utf8_pattern); + SetLastError (ERROR_GEN_FAILURE); return(INVALID_HANDLE_VALUE); } @@ -2819,6 +3024,7 @@ gpointer FindFirstFile (const gunichar2 *pattern, WapiFindData *find_data) entry_part = NULL; g_free (utf8_pattern); utf8_pattern = NULL; + SetLastError (ERROR_INVALID_HANDLE); goto cleanup; } @@ -3087,12 +3293,22 @@ gboolean CreateDirectory (const gunichar2 *name, WapiSecurityAttributes *securit struct stat buf; guint32 attrs; + if (name == NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } + utf8_name = mono_unicode_to_external (name); if (utf8_name == NULL) { #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": unicode conversion returned NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return FALSE; } @@ -3139,6 +3355,15 @@ gboolean RemoveDirectory (const gunichar2 *name) { gchar *utf8_name; int result; + + if (name == NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } utf8_name = mono_unicode_to_external (name); if (utf8_name == NULL) { @@ -3146,6 +3371,7 @@ gboolean RemoveDirectory (const gunichar2 *name) g_message (G_GNUC_PRETTY_FUNCTION ": unicode conversion returned NULL"); #endif + SetLastError (ERROR_INVALID_NAME); return FALSE; } @@ -3173,6 +3399,15 @@ guint32 GetFileAttributes (const gunichar2 *name) struct stat buf; int result; + if (name == NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } + utf8_name = mono_unicode_to_external (name); if (utf8_name == NULL) { #ifdef DEBUG @@ -3219,8 +3454,18 @@ gboolean GetFileAttributesEx (const gunichar2 *name, WapiGetFileExInfoLevels lev g_message (G_GNUC_PRETTY_FUNCTION ": info level %d not supported.", level); #endif + SetLastError (ERROR_INVALID_PARAMETER); return FALSE; } + + if (name == NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } utf8_name = mono_unicode_to_external (name); if (utf8_name == NULL) { @@ -3287,8 +3532,26 @@ extern gboolean SetFileAttributes (const gunichar2 *name, guint32 attrs) * Currently we only handle one *internal* case, with a value that is * not standard: 0x80000000, which means `set executable bit' */ + + if (name == NULL) { +#ifdef DEBUG + g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return(FALSE); + } utf8_name = mono_unicode_to_external (name); + if (utf8_name == NULL) { +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": unicode conversion returned NULL"); +#endif + + SetLastError (ERROR_INVALID_NAME); + return FALSE; + } + result = stat (utf8_name, &buf); if (result != 0) { g_free (utf8_name); @@ -3400,10 +3663,14 @@ extern gboolean SetCurrentDirectory (const gunichar2 *path) return result; } -int _wapi_file_handle_to_fd (gpointer handle) +/* When we're confident there are no more bugs in the fd->handle + * mapping, this can be replaced as a no-op: GPOINTER_TO_INT(fd_handle) == fd + */ +int _wapi_file_handle_to_fd (gpointer fd_handle) { struct _WapiHandlePrivate_file *file_private_handle; gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); #ifdef DEBUG g_message (G_GNUC_PRETTY_FUNCTION ": looking up fd for %p", handle); @@ -3422,6 +3689,7 @@ int _wapi_file_handle_to_fd (gpointer handle) g_message (G_GNUC_PRETTY_FUNCTION ": returning -1"); #endif + SetLastError (ERROR_INVALID_HANDLE); return(-1); } } @@ -3432,6 +3700,8 @@ int _wapi_file_handle_to_fd (gpointer handle) file_private_handle->fd); #endif + g_assert (file_private_handle->fd == GPOINTER_TO_INT (fd_handle)); + return(file_private_handle->fd); } @@ -3467,6 +3737,20 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, _wapi_set_last_error_from_errno (); return(FALSE); } + + if (filedes[0] >= _wapi_fd_offset_table_size || + filedes[1] >= _wapi_fd_offset_table_size) { +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": File descriptor is too big"); +#endif + + SetLastError (ERROR_TOO_MANY_OPEN_FILES); + + close (filedes[0]); + close (filedes[1]); + + return(FALSE); + } /* filedes[0] is open for reading, filedes[1] for writing */ @@ -3476,6 +3760,8 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, ": error creating pipe read handle"); close (filedes[0]); close (filedes[1]); + SetLastError (ERROR_GEN_FAILURE); + return(FALSE); } @@ -3491,6 +3777,7 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, g_warning (G_GNUC_PRETTY_FUNCTION ": error looking up pipe handle %p", read_handle); close (filedes[0]); close (filedes[1]); + SetLastError (ERROR_INVALID_HANDLE); goto cleanup; } @@ -3502,6 +3789,8 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, close (filedes[0]); close (filedes[1]); + SetLastError (ERROR_GEN_FAILURE); + goto cleanup; } @@ -3520,6 +3809,7 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, close (filedes[0]); close (filedes[1]); + SetLastError (ERROR_INVALID_HANDLE); goto write_cleanup; } cp_ret = TRUE; @@ -3528,18 +3818,18 @@ gboolean CreatePipe (gpointer *readpipe, gpointer *writepipe, pipe_read_private_handle->assigned=TRUE; pipe_read_handle->fileaccess=GENERIC_READ; - *readpipe=read_handle; + _wapi_handle_fd_offset_store (filedes[0], read_handle); + *readpipe=GINT_TO_POINTER (filedes[0]); pipe_write_private_handle->fd=filedes[1]; pipe_write_private_handle->assigned=TRUE; pipe_write_handle->fileaccess=GENERIC_WRITE; - *writepipe=write_handle; + _wapi_handle_fd_offset_store (filedes[1], write_handle); + *writepipe=GINT_TO_POINTER (filedes[1]); #ifdef DEBUG - g_message (G_GNUC_PRETTY_FUNCTION - ": Returning pipe: read handle %p, write handle %p", - read_handle, write_handle); + g_message (G_GNUC_PRETTY_FUNCTION ": Returning pipe: read handle %p (fd %d), write handle %p (fd %d)", read_handle, filedes[0], write_handle, filedes[1]); #endif write_cleanup: @@ -3612,7 +3902,7 @@ guint32 GetTempPath (guint32 len, gunichar2 *buf) } gboolean -_wapi_io_add_callback (gpointer handle, +_wapi_io_add_callback (gpointer fd_handle, WapiOverlappedCB callback, guint64 flags G_GNUC_UNUSED) { @@ -3621,6 +3911,12 @@ _wapi_io_add_callback (gpointer handle, gboolean ok; int thr_ret; gboolean ret = FALSE; + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } ok = _wapi_lookup_handle (handle, WAPI_HANDLE_FILE, (gpointer *) &file_handle, @@ -3794,13 +4090,19 @@ static gboolean _wapi_unlock_file_region (int fd, off_t offset, off_t length) return(TRUE); } -gboolean LockFile (gpointer handle, guint32 offset_low, guint32 offset_high, +gboolean LockFile (gpointer fd_handle, guint32 offset_low, guint32 offset_high, guint32 length_low, guint32 length_high) { struct _WapiHandle_file *file_handle; struct _WapiHandlePrivate_file *file_private_handle; gboolean ok; off_t offset, length; + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } ok = _wapi_lookup_handle (handle, WAPI_HANDLE_FILE, (gpointer *)&file_handle, @@ -3846,13 +4148,20 @@ gboolean LockFile (gpointer handle, guint32 offset_low, guint32 offset_high, length)); } -gboolean UnlockFile (gpointer handle, guint32 offset_low, guint32 offset_high, - guint32 length_low, guint32 length_high) +gboolean UnlockFile (gpointer fd_handle, guint32 offset_low, + guint32 offset_high, guint32 length_low, + guint32 length_high) { struct _WapiHandle_file *file_handle; struct _WapiHandlePrivate_file *file_private_handle; gboolean ok; off_t offset, length; + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + + if (handle == NULL) { + SetLastError (ERROR_INVALID_HANDLE); + return(FALSE); + } ok = _wapi_lookup_handle (handle, WAPI_HANDLE_FILE, (gpointer *)&file_handle, diff --git a/mono/io-layer/sockets.c b/mono/io-layer/sockets.c index 3f48f02af8e..25f165763ea 100644 --- a/mono/io-layer/sockets.c +++ b/mono/io-layer/sockets.c @@ -97,6 +97,9 @@ static void socket_close_private (gpointer handle) g_ptr_array_remove_fast(sockets, GUINT_TO_POINTER (handle)); + /* Blank out the mapping, to make catching errors easier */ + _wapi_handle_fd_offset_store (socket_private_handle->fd, NULL); + do { ret=close(socket_private_handle->fd); } @@ -205,20 +208,27 @@ int WSAGetLastError(void) return(err); } -int closesocket(guint32 handle) +int closesocket(guint32 fd_handle) { - _wapi_handle_unref (GUINT_TO_POINTER (handle)); + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd_handle)); + + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { + WSASetLastError (WSAENOTSOCK); + return(0); + } + + _wapi_handle_unref (handle); return(0); } -guint32 _wapi_accept(guint32 handle, struct sockaddr *addr, - socklen_t *addrlen) +guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) { - struct _WapiHandlePrivate_socket *socket_private_handle; struct _WapiHandlePrivate_socket *new_socket_private_handle; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); gpointer new_handle; gboolean ok; - int fd; + int new_fd; int thr_ret; guint32 ret = INVALID_SOCKET; @@ -227,21 +237,18 @@ guint32 _wapi_accept(guint32 handle, struct sockaddr *addr, return(INVALID_SOCKET); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(INVALID_SOCKET); } do { - fd=accept(socket_private_handle->fd, addr, addrlen); + new_fd=accept(fd, addr, addrlen); } - while (fd==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); + while (new_fd==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); - if(fd==-1) { + if(new_fd==-1) { gint errnum = errno; #ifdef DEBUG g_message(G_GNUC_PRETTY_FUNCTION ": accept error: %s", @@ -254,10 +261,23 @@ guint32 _wapi_accept(guint32 handle, struct sockaddr *addr, return(INVALID_SOCKET); } + if (new_fd >= _wapi_fd_offset_table_size) { +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": File descriptor is too big"); +#endif + + WSASetLastError (WSASYSCALLFAILURE); + + close (new_fd); + + return(INVALID_SOCKET); + } + new_handle=_wapi_handle_new (WAPI_HANDLE_SOCKET); if(new_handle==_WAPI_HANDLE_INVALID) { g_warning (G_GNUC_PRETTY_FUNCTION ": error creating socket handle"); + WSASetLastError (ERROR_GEN_FAILURE); return(INVALID_SOCKET); } @@ -270,12 +290,15 @@ guint32 _wapi_accept(guint32 handle, struct sockaddr *addr, (gpointer *)&new_socket_private_handle); if(ok==FALSE) { g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + ": error looking up new socket handle %p", + new_handle); goto cleanup; } - ret = GPOINTER_TO_UINT (new_handle); + + _wapi_handle_fd_offset_store (new_fd, new_handle); + ret = new_fd; - new_socket_private_handle->fd=fd; + new_socket_private_handle->fd=new_fd; #ifdef DEBUG g_message(G_GNUC_PRETTY_FUNCTION @@ -291,27 +314,23 @@ cleanup: return(ret); } -int _wapi_bind(guint32 handle, struct sockaddr *my_addr, socklen_t addrlen) +int _wapi_bind(guint32 fd, struct sockaddr *my_addr, socklen_t addrlen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { WSASetLastError(WSANOTINITIALISED); return(SOCKET_ERROR); } - - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=bind(socket_private_handle->fd, my_addr, addrlen); + ret=bind(fd, my_addr, addrlen); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -326,11 +345,10 @@ int _wapi_bind(guint32 handle, struct sockaddr *my_addr, socklen_t addrlen) return(ret); } -int _wapi_connect(guint32 handle, const struct sockaddr *serv_addr, +int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, socklen_t addrlen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; gint errnum; @@ -339,17 +357,14 @@ int _wapi_connect(guint32 handle, const struct sockaddr *serv_addr, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } do { - ret=connect(socket_private_handle->fd, serv_addr, addrlen); + ret=connect(fd, serv_addr, addrlen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); @@ -361,11 +376,11 @@ int _wapi_connect(guint32 handle, const struct sockaddr *serv_addr, errnum = errno; - ret=setsockopt (socket_private_handle->fd, SOL_SOCKET, - SO_BROADCAST, &true, sizeof(true)); + ret=setsockopt (fd, SOL_SOCKET, SO_BROADCAST, &true, + sizeof(true)); if(ret==0) { do { - ret=connect (socket_private_handle->fd, serv_addr, addrlen); + ret=connect (fd, serv_addr, addrlen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); } @@ -386,11 +401,9 @@ int _wapi_connect(guint32 handle, const struct sockaddr *serv_addr, return(ret); } -int _wapi_getpeername(guint32 handle, struct sockaddr *name, - socklen_t *namelen) +int _wapi_getpeername(guint32 fd, struct sockaddr *name, socklen_t *namelen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -398,16 +411,13 @@ int _wapi_getpeername(guint32 handle, struct sockaddr *name, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=getpeername(socket_private_handle->fd, name, namelen); + ret=getpeername(fd, name, namelen); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -424,11 +434,9 @@ int _wapi_getpeername(guint32 handle, struct sockaddr *name, return(ret); } -int _wapi_getsockname(guint32 handle, struct sockaddr *name, - socklen_t *namelen) +int _wapi_getsockname(guint32 fd, struct sockaddr *name, socklen_t *namelen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -436,16 +444,13 @@ int _wapi_getsockname(guint32 handle, struct sockaddr *name, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=getsockname(socket_private_handle->fd, name, namelen); + ret=getsockname(fd, name, namelen); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -462,11 +467,10 @@ int _wapi_getsockname(guint32 handle, struct sockaddr *name, return(ret); } -int _wapi_getsockopt(guint32 handle, int level, int optname, void *optval, +int _wapi_getsockopt(guint32 fd, int level, int optname, void *optval, socklen_t *optlen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -474,17 +478,13 @@ int _wapi_getsockopt(guint32 handle, int level, int optname, void *optval, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=getsockopt(socket_private_handle->fd, level, optname, optval, - optlen); + ret=getsockopt(fd, level, optname, optval, optlen); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -501,10 +501,9 @@ int _wapi_getsockopt(guint32 handle, int level, int optname, void *optval, return(ret); } -int _wapi_listen(guint32 handle, int backlog) +int _wapi_listen(guint32 fd, int backlog) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -512,16 +511,13 @@ int _wapi_listen(guint32 handle, int backlog) return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=listen(socket_private_handle->fd, backlog); + ret=listen(fd, backlog); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -538,19 +534,18 @@ int _wapi_listen(guint32 handle, int backlog) return(0); } -int _wapi_recv(guint32 handle, void *buf, size_t len, int recv_flags) +int _wapi_recv(guint32 fd, void *buf, size_t len, int recv_flags) { - return(_wapi_recvfrom(handle, buf, len, recv_flags, NULL, 0)); + return(_wapi_recvfrom(fd, buf, len, recv_flags, NULL, 0)); } -int _wapi_recvfrom(guint32 handle, void *buf, size_t len, int recv_flags, +int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, struct sockaddr *from, socklen_t *fromlen) { #ifndef HAVE_MSG_NOSIGNAL void (*old_sigpipe)(int); // old SIGPIPE handler #endif - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -558,26 +553,22 @@ int _wapi_recvfrom(guint32 handle, void *buf, size_t len, int recv_flags, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } #ifdef HAVE_MSG_NOSIGNAL do { - ret=recvfrom(socket_private_handle->fd, buf, len, recv_flags | MSG_NOSIGNAL, from, + ret=recvfrom(fd, buf, len, recv_flags | MSG_NOSIGNAL, from, fromlen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); #else old_sigpipe = signal(SIGPIPE, SIG_IGN); do { - ret=recvfrom(socket_private_handle->fd, buf, len, recv_flags, from, - fromlen); + ret=recvfrom(fd, buf, len, recv_flags, from, fromlen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); signal(SIGPIPE, old_sigpipe); @@ -598,13 +589,12 @@ int _wapi_recvfrom(guint32 handle, void *buf, size_t len, int recv_flags, return(ret); } -int _wapi_send(guint32 handle, const void *msg, size_t len, int send_flags) +int _wapi_send(guint32 fd, const void *msg, size_t len, int send_flags) { #ifndef HAVE_MSG_NOSIGNAL void (*old_sigpipe)(int); // old SIGPIPE handler #endif - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -612,24 +602,21 @@ int _wapi_send(guint32 handle, const void *msg, size_t len, int send_flags) return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } #ifdef HAVE_MSG_NOSIGNAL do { - ret=send(socket_private_handle->fd, msg, len, send_flags | MSG_NOSIGNAL); + ret=send(fd, msg, len, send_flags | MSG_NOSIGNAL); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); #else old_sigpipe = signal(SIGPIPE, SIG_IGN); do { - ret=send(socket_private_handle->fd, msg, len, send_flags); + ret=send(fd, msg, len, send_flags); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); signal(SIGPIPE, old_sigpipe); @@ -649,14 +636,13 @@ int _wapi_send(guint32 handle, const void *msg, size_t len, int send_flags) return(ret); } -int _wapi_sendto(guint32 handle, const void *msg, size_t len, int send_flags, +int _wapi_sendto(guint32 fd, const void *msg, size_t len, int send_flags, const struct sockaddr *to, socklen_t tolen) { #ifndef HAVE_MSG_NOSIGNAL void (*old_sigpipe)(int); // old SIGPIPE handler #endif - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -664,24 +650,21 @@ int _wapi_sendto(guint32 handle, const void *msg, size_t len, int send_flags, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } #ifdef HAVE_MSG_NOSIGNAL do { - ret=sendto(socket_private_handle->fd, msg, len, send_flags | MSG_NOSIGNAL, to, tolen); + ret=sendto(fd, msg, len, send_flags | MSG_NOSIGNAL, to, tolen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); #else old_sigpipe = signal(SIGPIPE, SIG_IGN); do { - ret=sendto(socket_private_handle->fd, msg, len, send_flags, to, tolen); + ret=sendto(fd, msg, len, send_flags, to, tolen); } while (ret==-1 && errno==EINTR && !_wapi_thread_cur_apc_pending()); signal(SIGPIPE, old_sigpipe); @@ -701,11 +684,10 @@ int _wapi_sendto(guint32 handle, const void *msg, size_t len, int send_flags, return(ret); } -int _wapi_setsockopt(guint32 handle, int level, int optname, +int _wapi_setsockopt(guint32 fd, int level, int optname, const void *optval, socklen_t optlen) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -713,17 +695,13 @@ int _wapi_setsockopt(guint32 handle, int level, int optname, return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=setsockopt(socket_private_handle->fd, level, optname, optval, - optlen); + ret=setsockopt(fd, level, optname, optval, optlen); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -740,10 +718,9 @@ int _wapi_setsockopt(guint32 handle, int level, int optname, return(ret); } -int _wapi_shutdown(guint32 handle, int how) +int _wapi_shutdown(guint32 fd, int how) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -751,16 +728,13 @@ int _wapi_shutdown(guint32 handle, int how) return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } - ret=shutdown(socket_private_handle->fd, how); + ret=shutdown(fd, how); if(ret==-1) { gint errnum = errno; #ifdef DEBUG @@ -802,6 +776,18 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, guint32 u return(INVALID_SOCKET); } + + if (fd >= _wapi_fd_offset_table_size) { +#ifdef DEBUG + g_message (G_GNUC_PRETTY_FUNCTION ": File descriptor is too big"); +#endif + + WSASetLastError (WSASYSCALLFAILURE); + close (fd); + + return(INVALID_SOCKET); + } + mono_once (&socket_ops_once, socket_ops_init); @@ -824,7 +810,9 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, guint32 u ": error looking up socket handle %p", handle); goto cleanup; } - ret = GPOINTER_TO_UINT (handle); + + _wapi_handle_fd_offset_store (fd, handle); + ret = fd; socket_private_handle->fd=fd; @@ -884,13 +872,12 @@ struct hostent *_wapi_gethostbyname(const char *hostname) } int -WSAIoctl (guint32 handle, gint32 command, - gchar *input, gint i_len, - gchar *output, gint o_len, glong *written, - void *unused1, void *unused2) +WSAIoctl (guint32 fd, gint32 command, + gchar *input, gint i_len, + gchar *output, gint o_len, glong *written, + void *unused1, void *unused2) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; gchar *buffer = NULL; @@ -899,12 +886,8 @@ WSAIoctl (guint32 handle, gint32 command, return(SOCKET_ERROR); } - ok = _wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - - if (ok == FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return SOCKET_ERROR; } @@ -912,7 +895,7 @@ WSAIoctl (guint32 handle, gint32 command, if (i_len > 0) buffer = g_memdup (input, i_len); - ret = ioctl (socket_private_handle->fd, command, buffer); + ret = ioctl (fd, command, buffer); if (ret == -1) { gint errnum = errno; #ifdef DEBUG @@ -941,10 +924,9 @@ WSAIoctl (guint32 handle, gint32 command, return 0; } -int ioctlsocket(guint32 handle, gint32 command, gpointer arg) +int ioctlsocket(guint32 fd, gint32 command, gpointer arg) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); int ret; if(startup_count==0) { @@ -952,11 +934,8 @@ int ioctlsocket(guint32 handle, gint32 command, gpointer arg) return(SOCKET_ERROR); } - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(SOCKET_ERROR); } @@ -976,19 +955,19 @@ int ioctlsocket(guint32 handle, gint32 command, gpointer arg) * connect to return EINPROGRESS, but the ioctl doesn't seem to) */ if(command==FIONBIO) { - ret=fcntl(socket_private_handle->fd, F_GETFL, 0); + ret=fcntl(fd, F_GETFL, 0); if(ret!=-1) { if(*(gboolean *)arg) { ret &= ~O_NONBLOCK; } else { ret |= O_NONBLOCK; } - ret=fcntl(socket_private_handle->fd, F_SETFL, ret); + ret=fcntl(fd, F_SETFL, ret); } } else #endif /* O_NONBLOCK */ { - ret=ioctl(socket_private_handle->fd, command, arg); + ret=ioctl(fd, command, arg); } if(ret==-1) { gint errnum = errno; @@ -1036,55 +1015,43 @@ int _wapi_select(int nfds G_GNUC_UNUSED, fd_set *readfds, fd_set *writefds, return(ret); } -void _wapi_FD_CLR(guint32 handle, fd_set *set) +void _wapi_FD_CLR(guint32 fd, fd_set *set) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return; } - FD_CLR(socket_private_handle->fd, set); + FD_CLR(fd, set); } -int _wapi_FD_ISSET(guint32 handle, fd_set *set) +int _wapi_FD_ISSET(guint32 fd, fd_set *set) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return(0); } - return(FD_ISSET(socket_private_handle->fd, set)); + return(FD_ISSET(fd, set)); } -void _wapi_FD_SET(guint32 handle, fd_set *set) +void _wapi_FD_SET(guint32 fd, fd_set *set) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; + gpointer handle = _wapi_handle_fd_offset_to_handle (GUINT_TO_POINTER (fd)); - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if(ok==FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError(WSAENOTSOCK); return; } - FD_SET(socket_private_handle->fd, set); + FD_SET(fd, set); } #ifdef USE_AIO @@ -1119,29 +1086,23 @@ async_notifier (union sigval sig) } static gboolean -do_aio_call (gboolean is_read, gpointer handle, gpointer buffer, +do_aio_call (gboolean is_read, gpointer fd_handle, gpointer buffer, guint32 numbytes, guint32 *out_bytes, gpointer ares, SocketAsyncCB callback) { - struct _WapiHandlePrivate_socket *socket_private_handle; - gboolean ok; - int fd; + gpointer handle = _wapi_handle_fd_offset_to_handle (fd_handle); + int fd = GPOINTER_TO_UINT (fd_handle); struct aiocb *aio; int result; notifier_data_t *ndata; - ok=_wapi_lookup_handle (GUINT_TO_POINTER (handle), WAPI_HANDLE_SOCKET, - NULL, (gpointer *)&socket_private_handle); - if (ok == FALSE) { - g_warning (G_GNUC_PRETTY_FUNCTION - ": error looking up socket handle 0x%x", (guint) handle); + if (handle == NULL || + _wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return FALSE; } - fd = socket_private_handle->fd; - ndata = g_new0 (notifier_data_t, 1); aio = g_new0 (struct aiocb, 1); ndata->ares = ares; diff --git a/mono/io-layer/wapi-private.h b/mono/io-layer/wapi-private.h index 59ec8defe30..92e0682288a 100644 --- a/mono/io-layer/wapi-private.h +++ b/mono/io-layer/wapi-private.h @@ -35,7 +35,7 @@ /* Increment this whenever an incompatible change is made to the * shared handle structure. */ -#define _WAPI_HANDLE_VERSION 1 +#define _WAPI_HANDLE_VERSION 3 typedef enum { WAPI_HANDLE_UNUSED=0, @@ -152,6 +152,7 @@ struct _WapiHandleShared_list { guchar daemon[MONO_SIZEOF_SUNPATH]; _wapi_daemon_status daemon_running; + guint32 fd_offset_table_size; #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1 mono_mutex_t signal_mutex; diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 48f6cd2c8c2..01280d3fe0a 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,120 @@ +2004-09-18 Martin Baulig <martin@ximian.com> + + * mono-debug.c, debug-mono-symfile.c: Merged my locking changes + from HEAD. + +2004-09-17 Zoltan Varga <vargaz@freemail.hu> + + * loader.c (mono_lookup_pinvoke_call): Add support for stdcall name + mangling. + +2004-09-16 Lluis Sanchez Gual <lluis@novell.com> + + * locales.c: nullify the ICU_collator member of CompareInfo when it is + finalized. There where random SIGSEVs at program termination, when + an object being finalized was trying to do a string comparison and + the current culture was already finalized. + +2004-09-16 Zoltan Varga <vargaz@freemail.hu> + + * appdomain.c (ves_icall_System_AppDomain_createDomain): Load all + assemblies from the parent. Fixes #65665. + +2004-09-14 Lluis Sanchez Gual <lluis@novell.com> + + * object.c: Added a "done" flag to TypeInitializationLock. This avoids + false deadlock checks in class initialization. + +2004-09-09 Zoltan Varga <vargaz@freemail.hu> + + * reflection.h reflection.c loader.c: Allow dynamic construction of + pinvoke methods. Fixes #65571. + +2004-09-08 Lluis Sanchez Gual <lluis@novell.com> + + * object.c: In mono_message_invoke, fill the output parameter array after + calling the managed method (it was done before the call). This fixes + bug #59299. + +2004-09-08 Zoltan Varga <vargaz@freemail.hu> + + * image.c (mono_image_close): Applied patch from + vasantha.paulraj@honeywell.com (Vasantha selvi). Fix crash when an + assembly is loaded multiple times from data. + + * image.c (mono_image_open): Fix warning. + +2004-09-07 Zoltan Varga <vargaz@freemail.hu> + + * reflection.c (mono_reflection_create_runtime_class): Initialize + klass->nested_classes. Fixes #61224. + +2004-09-06 Zoltan Varga <vargaz@freemail.hu> + + * reflection.c (mono_param_get_objects): Initialize the default value + with DBNull.Value, not null. Fixes #62123. + +2004-09-01 Miguel de Icaza <miguel@ximian.com> + + * marshal.c (mono_marshal_get_managed_wrapper): Remove FIXME and + throw an exception with a cute explanation. + +2004-09-06 Dick Porter <dick@ximian.com> + + * process.c (ves_icall_System_Diagnostics_Process_Start_internal): + Close the new process's thread handle, as we don't use it. The + handle stays around forever otherwise. + +2004-09-05 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * assembly.c: provide more information when loading an assembly fails. + +2004-09-04 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * filewatcher.c: don't expect the development fam package to be + installed. If HAVE_KQUEUE return mode 3 to use the new kqueue + watcher. Patch by Geoff Norton. + +2004-09-02 Zoltan Varga <vargaz@freemail.hu> + + * marshal.c (mono_marshal_alloc): Return a valid pointer on size 0 + as well. + +2004-08-28 Ben Maurer <bmaurer@users.sourceforge.net> + + * gc.c: actually enable paolo's patch to make GC warnings + use the trace api. + +2004-08-23 Zoltan Varga <vargaz@freemail.hu> + + * metadata.c (mono_metadata_parse_type): Alloc pinned, byref and + custom modifiers to be in any order. Fixes #61990. + +Thu Aug 5 17:11:44 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * reflection.c: fix to deal with object[] arrays in custom ctors + (bug #62550). + +Tue Aug 3 17:54:17 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * gc.c: make GC warning messages use the trace API, they are just + noise to most of the users. + +Tue Aug 3 16:40:17 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * gc.c, object.h: mono_gc_handle_*() interface and + AddrOfPinnedObject fixes. GC handle support even without GC. + +Fri Jul 30 16:49:05 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * object.c: always create an object if null is passed + to Invoke() where a valuetype is expected. + +2004-07-29 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * appdomain.c: hack to build correctly the private bin path on windows. + Fixes bug #61991. + 2004-07-28 Dick Porter <dick@ximian.com> * socket-io.c @@ -10975,4 +11092,3 @@ Tue Jul 3 18:33:32 CEST 2001 Paolo Molaro <lupus@ximian.com> Beta2. * mono/metadata/assembly.c (load_metadata_ptrs): Fix for Beta2 - diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index a917a9ecd19..688265a1eec 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -44,6 +44,9 @@ mono_domain_assembly_preload (MonoAssemblyName *aname, static void mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data); +static void +add_assemblies_to_domain (MonoDomain *domain, MonoAssembly *ass); + static MonoMethod * look_for_method_by_name (MonoClass *klass, const gchar *name); @@ -357,10 +360,16 @@ ves_icall_System_AppDomain_getCurDomain () return add->domain; } +static void +add_assembly_to_domain (gpointer key, gpointer value, gpointer user_data) +{ + add_assemblies_to_domain ((MonoDomain*)user_data, (MonoAssembly*)value); +} + MonoAppDomain * ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomainSetup *setup) { - /*MonoDomain *domain = mono_domain_get (); */ + MonoDomain *domain = mono_domain_get (); MonoClass *adclass; MonoAppDomain *ad; MonoDomain *data; @@ -381,7 +390,10 @@ ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomai mono_context_init (data); - /* FIXME: what to do next ? */ + /* The new appdomain should have all assemblies loaded */ + mono_domain_lock (domain); + g_hash_table_foreach (domain->assemblies, add_assembly_to_domain, data); + mono_domain_unlock (domain); return ad; } @@ -547,9 +559,17 @@ reduce_path (const gchar *dirname) for (tmp = list; tmp; tmp = tmp->next) { gchar *data = (gchar *) tmp->data; - if (data && *data) - g_string_append_printf (result, "%c%s", G_DIR_SEPARATOR, - (char *) tmp->data); + if (data && *data) { +#ifdef PLATFORM_WIN32 + if (result->len == 0) + g_string_append_printf (result, "%s\\", data); + else if (result->str [result->len - 1] == '\\') + g_string_append_printf (result, "%s", data); + else +#endif + g_string_append_printf (result, "%c%s", + G_DIR_SEPARATOR, data); + } } res = result->str; diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index 2ae0d0eef7b..a0ec7467f38 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -388,6 +388,15 @@ mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status) image->name, aname.name); } else { + char *extra_msg = g_strdup (""); + + if (*status == MONO_IMAGE_ERROR_ERRNO) { + extra_msg = g_strdup_printf ("System error: %s\n", strerror (errno)); + } else if (*status == MONO_IMAGE_MISSING_ASSEMBLYREF) { + extra_msg = g_strdup ("Cannot find an assembly referenced from this one.\n"); + } else if (*status == MONO_IMAGE_IMAGE_INVALID) { + extra_msg = g_strdup ("The file exists but is not a valid assembly.\n"); + } for (j = 0; j < i; j++) mono_assembly_close (references [j]); @@ -396,11 +405,12 @@ mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status) g_warning ("Could not find assembly %s, references from %s (assemblyref_index=%d)\n" " Major/Minor: %d,%d\n" " Build: %d,%d\n" - " Token: %s\n", + " Token: %s\n%s", aname.name, image->name, i, aname.major, aname.minor, aname.build, aname.revision, - aname.public_key_token); + aname.public_key_token, extra_msg); *status = MONO_IMAGE_MISSING_ASSEMBLYREF; + g_free (extra_msg); return; } } diff --git a/mono/metadata/debug-mono-symfile.c b/mono/metadata/debug-mono-symfile.c index 612eb39babf..a44c2748e18 100644 --- a/mono/metadata/debug-mono-symfile.c +++ b/mono/metadata/debug-mono-symfile.c @@ -107,17 +107,21 @@ mono_debug_open_mono_symbol_file (MonoDebugHandle *handle, gboolean create_symfi { MonoSymbolFile *symfile; + mono_loader_lock (); symfile = g_new0 (MonoSymbolFile, 1); symfile->raw_contents = open_symfile (handle->image, &symfile->raw_contents_size); - if (load_symfile (handle, symfile)) + if (load_symfile (handle, symfile)) { + mono_loader_unlock (); return symfile; - else if (!create_symfile) { + } else if (!create_symfile) { mono_debug_close_mono_symbol_file (symfile); + mono_loader_unlock (); return NULL; } + mono_loader_unlock (); return symfile; } @@ -127,10 +131,12 @@ mono_debug_close_mono_symbol_file (MonoSymbolFile *symfile) if (!symfile) return; + mono_loader_lock (); if (symfile->method_hash) g_hash_table_destroy (symfile->method_hash); g_free (symfile); + mono_loader_unlock (); } static gchar * @@ -151,12 +157,17 @@ mono_debug_find_source_location (MonoSymbolFile *symfile, MonoMethod *method, gu const char *ptr; int i; - if (!symfile->method_hash) + mono_loader_lock (); + if (!symfile->method_hash) { + mono_loader_unlock (); return NULL; + } minfo = g_hash_table_lookup (symfile->method_hash, method); - if (!minfo) + if (!minfo) { + mono_loader_unlock (); return NULL; + } if (read32(&(minfo->entry->_source_index))) { int offset = read32(&(symfile->offset_table->_source_table_offset)) + @@ -176,6 +187,7 @@ mono_debug_find_source_location (MonoSymbolFile *symfile, MonoMethod *method, gu if (line_number) { *line_number = read32(&(lne->_row)); + mono_loader_unlock (); if (source_file) return source_file; else @@ -183,11 +195,16 @@ mono_debug_find_source_location (MonoSymbolFile *symfile, MonoMethod *method, gu } else if (source_file) { gchar *retval = g_strdup_printf ("%s:%d", source_file, read32(&(lne->_row))); g_free (source_file); + mono_loader_unlock (); return retval; - } else - return g_strdup_printf ("%d", read32(&(lne->_row))); + } else { + gchar* retval = g_strdup_printf ("%d", read32(&(lne->_row))); + mono_loader_unlock (); + return retval; + } } + mono_loader_unlock (); return NULL; } @@ -233,6 +250,7 @@ mono_debug_find_method (MonoDebugHandle *handle, MonoMethod *method) if (handle->image != mono_class_get_image (mono_method_get_class (method))) return NULL; + mono_loader_lock (); first_ie = (MonoSymbolFileMethodIndexEntry *) (symfile->raw_contents + read32(&(symfile->offset_table->_method_table_offset))); @@ -240,8 +258,10 @@ mono_debug_find_method (MonoDebugHandle *handle, MonoMethod *method) read32(&(symfile->offset_table->_method_count)), sizeof (MonoSymbolFileMethodIndexEntry), compare_method); - if (!ie) + if (!ie) { + mono_loader_unlock (); return NULL; + } me = (MonoSymbolFileMethodEntry *) (symfile->raw_contents + read32(&(ie->_file_offset))); @@ -256,5 +276,6 @@ mono_debug_find_method (MonoDebugHandle *handle, MonoMethod *method) g_hash_table_insert (symfile->method_hash, method, minfo); + mono_loader_unlock (); return minfo; } diff --git a/mono/metadata/filewatcher.c b/mono/metadata/filewatcher.c index 6210dc6b1f8..731eb3a1ad2 100644 --- a/mono/metadata/filewatcher.c +++ b/mono/metadata/filewatcher.c @@ -89,21 +89,26 @@ static int (*FAMNextEvent) (gpointer, gpointer); gint ves_icall_System_IO_FSW_SupportsFSW (void) { +#if HAVE_KQUEUE + return 3; +#else GModule *fam_module; + gchar *filename; MONO_ARCH_SAVE_REGS; - fam_module = g_module_open ("libfam", G_MODULE_BIND_LAZY); - if (fam_module == NULL) { + filename = g_module_build_path (NULL, "libfam.so.0"); + fam_module = g_module_open (filename, G_MODULE_BIND_LAZY); + g_free (filename); + if (fam_module == NULL) return 0; - } - g_module_symbol (fam_module, "FAMNextEvent", (gpointer *) &FAMNextEvent); if (FAMNextEvent == NULL) return 0; return 2; +#endif } gpointer diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index 4695c8c1a2a..3a9db3a1c62 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -16,6 +16,7 @@ #include <mono/metadata/exception.h> #include <mono/metadata/domain-internals.h> #include <mono/metadata/class-internals.h> +#include <mono/utils/mono-logger.h> #define GC_I_HIDE_POINTERS #include <mono/os/gc_wrapper.h> @@ -347,13 +348,17 @@ ves_icall_System_GCHandle_GetTargetHandle (MonoObject *obj, guint32 handle, gint /* Indexes start from 1 since 0 means the handle is not allocated */ idx = ++next_handle; if (idx >= array_size) { -#if HAVE_BOEHM_GC gpointer *new_array; guint8 *new_type_array; if (!array_size) array_size = 16; +#if HAVE_BOEHM_GC new_array = GC_MALLOC (sizeof (gpointer) * (array_size * 2)); new_type_array = GC_MALLOC (sizeof (guint8) * (array_size * 2)); +#else + new_array = g_malloc0 (sizeof (gpointer) * (array_size * 2)); + new_type_array = g_malloc0 (sizeof (guint8) * (array_size * 2)); +#endif if (gc_handles) { int i; memcpy (new_array, gc_handles, sizeof (gpointer) * array_size); @@ -370,20 +375,22 @@ ves_icall_System_GCHandle_GetTargetHandle (MonoObject *obj, guint32 handle, gint #else if (((gulong)new_array [i]) & 0x1) { #endif +#if HAVE_BOEHM_GC if (gc_handles [i] != (gpointer)-1) GC_unregister_disappearing_link (&(gc_handles [i])); if (new_array [i] != (gpointer)-1) GC_GENERAL_REGISTER_DISAPPEARING_LINK (&(new_array [i]), REVEAL_POINTER (new_array [i])); +#endif } } } array_size *= 2; +#ifndef HAVE_BOEHM_GC + g_free (gc_handles); + g_free (gc_handle_types); +#endif gc_handles = new_array; gc_handle_types = new_type_array; -#else - LeaveCriticalSection (&handle_section); - mono_raise_exception (mono_get_exception_execution_engine ("No GCHandle support built-in")); -#endif } /* resuse the type from the old target */ @@ -399,9 +406,6 @@ ves_icall_System_GCHandle_GetTargetHandle (MonoObject *obj, guint32 handle, gint #if HAVE_BOEHM_GC if (gc_handles [idx] != (gpointer)-1) GC_GENERAL_REGISTER_DISAPPEARING_LINK (&(gc_handles [idx]), obj); -#else - LeaveCriticalSection (&handle_section); - mono_raise_exception (mono_get_exception_execution_engine ("No weakref support")); #endif break; default: @@ -429,9 +433,6 @@ ves_icall_System_GCHandle_FreeHandle (guint32 handle) if (gc_handles [idx] != (gpointer)-1) GC_unregister_disappearing_link (&(gc_handles [idx])); } -#else - LeaveCriticalSection (&handle_section); - mono_raise_exception (mono_get_exception_execution_engine ("No GCHandle support")); #endif gc_handles [idx] = (gpointer)-1; @@ -457,11 +458,50 @@ ves_icall_System_GCHandle_GetAddrOfPinnedObject (guint32 handle) if (obj == (MonoObject *) -1) return NULL; } - return obj; + if (obj) { + MonoClass *klass = mono_object_class (obj); + if (klass == mono_defaults.string_class) { + return mono_string_chars ((MonoString*)obj); + } else if (klass->rank) { + return mono_array_addr ((MonoArray*)obj, char, 0); + } else { + /* the C# code will check and throw the exception */ + /* FIXME: missing !klass->blittable test, see bug #61134, + * disabled in 1.0 untill the blittable-using code is audited. + if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_AUTO_LAYOUT) + return (gpointer)-1; */ + return (char*)obj + sizeof (MonoObject); + } + } } return NULL; } +guint32 +mono_gchandle_new (MonoObject *obj, gboolean pinned) +{ + return ves_icall_System_GCHandle_GetTargetHandle (obj, 0, pinned? HANDLE_PINNED: HANDLE_NORMAL); +} + +guint32 +mono_gchandle_new_weakref (MonoObject *obj, gboolean track_resurrection) +{ + return ves_icall_System_GCHandle_GetTargetHandle (obj, 0, track_resurrection? HANDLE_WEAK_TRACK: HANDLE_WEAK); +} + +/* This will return NULL for a collected object if using a weakref handle */ +MonoObject* +mono_gchandle_get_target (guint32 gchandle) +{ + return ves_icall_System_GCHandle_GetTarget (gchandle); +} + +void +mono_gchandle_free (guint32 gchandle) +{ + ves_icall_System_GCHandle_FreeHandle (gchandle); +} + #if HAVE_BOEHM_GC static HANDLE finalizer_event; @@ -606,6 +646,12 @@ static GCThreadFunctions mono_gc_thread_vtable = { }; #endif /* WITH_INCLUDED_LIBGC */ +static void +mono_gc_warning (char *msg, GC_word arg) +{ + mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_GC, msg, (unsigned long)arg); +} + void mono_gc_init (void) { InitializeCriticalSection (&handle_section); @@ -617,6 +663,8 @@ void mono_gc_init (void) gc_thread_vtable = &mono_gc_thread_vtable; #endif + GC_set_warn_proc (mono_gc_warning); + #ifdef ENABLE_FINALIZER_THREAD if (g_getenv ("GC_DONT_GC")) { diff --git a/mono/metadata/image.c b/mono/metadata/image.c index 8b0473429ed..01c9644be34 100644 --- a/mono/metadata/image.c +++ b/mono/metadata/image.c @@ -849,12 +849,12 @@ MonoImage * mono_image_open (const char *fname, MonoImageOpenStatus *status) { MonoImage *image, *image2; - const char *absfname; + char *absfname; g_return_val_if_fail (fname != NULL, NULL); if (g_path_is_absolute (fname)) - absfname = fname; + absfname = (char*)fname; else { gchar *path = g_get_current_dir (); absfname = g_build_filename (path, fname, NULL); @@ -960,9 +960,22 @@ mono_image_close (MonoImage *image) if (image->f) fclose (image->f); - if (image->raw_data_allocated) - g_free (image->raw_data); + if (image->raw_data_allocated) { + /* image->raw_metadata and cli_sections might lie inside image->raw_data */ + MonoCLIImageInfo *ii = image->image_info; + int i; + + if ((image->raw_metadata > image->raw_data) && + (image->raw_metadata <= (image->raw_data + image->raw_data_len))) + image->raw_metadata = NULL; + for (i = 0; i < ii->cli_section_count; i++) + if (((char*)(ii->cli_sections [i]) > image->raw_data) && + ((char*)(ii->cli_sections [i]) <= ((char*)image->raw_data + image->raw_data_len))) + ii->cli_sections [i] = NULL; + + g_free (image->raw_data); + } g_free (image->name); g_free (image->files); diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c index 81f2af3fa7c..8e278e6feff 100644 --- a/mono/metadata/loader.c +++ b/mono/metadata/loader.c @@ -580,28 +580,41 @@ mono_lookup_pinvoke_call (MonoMethod *method, const char **exc_class, const char g_assert (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL); - if (exc_class) { - *exc_class = NULL; - *exc_arg = NULL; - } - if (method->addr) return method->addr; - if (!piinfo->implmap_idx) - return NULL; - - mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE); - piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS]; - import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]); - scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME); - orig_scope = mono_metadata_string_heap (image, scope_token); + if (method->klass->image->dynamic) { + MonoReflectionMethodAux *method_aux = + mono_g_hash_table_lookup ( + ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method); + if (!method_aux) + return NULL; + + import = method_aux->dllentry; + orig_scope = method_aux->dll; + } + else { + if (!piinfo->implmap_idx) + return NULL; + + mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE); + + piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS]; + import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]); + scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME); + orig_scope = mono_metadata_string_heap (image, scope_token); + } mono_dllmap_lookup (image, orig_scope, import, &new_scope, &import); mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_DLLIMPORT, "DllImport attempting to load: '%s'.", new_scope); + if (exc_class) { + *exc_class = NULL; + *exc_arg = NULL; + } + #ifndef PLATFORM_WIN32 /* * If we are P/Invoking a library from System.Windows.Forms, load Wine @@ -712,6 +725,21 @@ mono_lookup_pinvoke_call (MonoMethod *method, const char **exc_class, const char break; } + +#ifdef PLATFORM_WIN32 + /* Try the stdcall mangled name */ + if (!method->addr) { + /* FIX: Compute this correctly */ + mangled_name = g_strdup_printf ("%s@%d", import, method->signature->param_count * sizeof (gpointer)); + g_module_symbol (gmodule, mangled_name, &method->addr); + g_free (mangled_name); + } + if (!method->addr) { + mangled_name = g_strdup_printf ("_%s@%d", import, method->signature->param_count * sizeof (gpointer)); + g_module_symbol (gmodule, mangled_name, &method->addr); + g_free (mangled_name); + } +#endif } if (!method->addr) { diff --git a/mono/metadata/locales.c b/mono/metadata/locales.c index 1210965a70a..256598e14c0 100644 --- a/mono/metadata/locales.c +++ b/mono/metadata/locales.c @@ -1041,6 +1041,7 @@ void ves_icall_System_Globalization_CompareInfo_free_internal_collator (MonoComp coll=this->ICU_collator; if(coll!=NULL) { + this->ICU_collator = NULL; ucol_close (coll); } } diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 2892d81e88b..97a71e3a56a 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -2198,6 +2198,19 @@ handle_enum: return res; } +static void +raise_auto_layout_exception (MonoClass *klass) +{ + char *msg = g_strdup_printf ("The type `%s.%s' layout needs to be Sequential or Explicit", + klass->name_space, klass->name, NULL); + + MonoException *e = mono_exception_from_name_msg ( + mono_get_corlib (), "System.Runtime.InteropServices", + "MarshalDirectiveException", msg); + g_free (msg); + mono_raise_exception (e); +} + /* * generates IL code to call managed methods from unmanaged code */ @@ -2359,8 +2372,9 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this, MonoMars break; } - /* FIXME: Raise a MarshalDirectiveException here */ - g_assert ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT); + /* The class can not have an automatic layout */ + if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_AUTO_LAYOUT) + raise_auto_layout_exception (klass); if (t->attrs & PARAM_ATTRIBUTE_OUT) { mono_mb_emit_byte (mb, CEE_LDNULL); @@ -2630,8 +2644,9 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this, MonoMars break; } - /* FIXME: Raise a MarshalDirectiveException here */ - g_assert ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT); + /* The class can not have an automatic layout */ + if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_AUTO_LAYOUT) + raise_auto_layout_exception (klass); mono_mb_emit_byte (mb, CEE_STLOC_0); /* Check for null */ @@ -4845,6 +4860,8 @@ mono_marshal_alloc (gpointer size) { MONO_ARCH_SAVE_REGS; + if (size == NULL) + size = (gpointer)4; return g_try_malloc ((gulong)size); } diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 88699f3e890..3d44463cde9 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -1203,6 +1203,10 @@ mono_metadata_parse_type (MonoImage *m, MonoParseTypeMode mode, short opt_attrs, { MonoType *type, *cached; gboolean byref = FALSE; + gboolean pinned = FALSE; + const char *tmp_ptr; + int count = 0; + gboolean found; /* * According to the spec, custom modifiers should come before the byref @@ -1212,70 +1216,70 @@ mono_metadata_parse_type (MonoImage *m, MonoParseTypeMode mode, short opt_attrs, * Also, this type seems to be different from 'object & modopt(...)'. Maybe * it would be better to treat byref as real type constructor instead of * a modifier... + * Also, pinned should come before anything else, but some MSV++ produced + * assemblies violate this (#bug 61990). */ - if (*ptr == MONO_TYPE_BYREF) { - byref = TRUE; - ++ptr; - } - switch (mode) { - case MONO_PARSE_MOD_TYPE: - case MONO_PARSE_PARAM: - case MONO_PARSE_RET: - case MONO_PARSE_LOCAL: /* should not have modifiers according to the spec, but ms tools disagree */ - case MONO_PARSE_FIELD: { - /* count the modifiers */ - const char *tmp_ptr = ptr; - int count = 0; - while (mono_metadata_parse_custom_mod (m, NULL, tmp_ptr, &tmp_ptr)) - count++; - if (count) { - type = g_malloc0 (sizeof (MonoType) + ((gint32)count - MONO_ZERO_LEN_ARRAY) * sizeof (MonoCustomMod)); - type->num_mods = count; - if (count > 64) - g_warning ("got more than 64 modifiers in type"); - /* save them this time */ - count = 0; - while (mono_metadata_parse_custom_mod (m, &(type->modifiers [count]), ptr, &ptr)) - count++; + /* Count the modifiers first */ + tmp_ptr = ptr; + found = TRUE; + while (found) { + switch (*tmp_ptr) { + case MONO_TYPE_PINNED: + case MONO_TYPE_BYREF: + ++tmp_ptr; + break; + case MONO_TYPE_CMOD_REQD: + case MONO_TYPE_CMOD_OPT: + count ++; + mono_metadata_parse_custom_mod (m, NULL, tmp_ptr, &tmp_ptr); break; - } /* fall through */ + default: + found = FALSE; + } + } + + if (count) { + type = g_malloc0 (sizeof (MonoType) + ((gint32)count - MONO_ZERO_LEN_ARRAY) * sizeof (MonoCustomMod)); + type->num_mods = count; + if (count > 64) + g_warning ("got more than 64 modifiers in type"); } - case MONO_PARSE_TYPE: + else /* * Later we can avoid doing this allocation. */ type = g_new0 (MonoType, 1); - break; - default: - g_assert_not_reached (); + + /* Parse pinned, byref and custom modifiers */ + found = TRUE; + count = 0; + while (found) { + switch (*ptr) { + case MONO_TYPE_PINNED: + pinned = TRUE; + ++ptr; + break; + case MONO_TYPE_BYREF: + byref = TRUE; + ++ptr; + break; + case MONO_TYPE_CMOD_REQD: + case MONO_TYPE_CMOD_OPT: + count ++; + mono_metadata_parse_custom_mod (m, &(type->modifiers [count]), ptr, &ptr); + break; + default: + found = FALSE; + } } type->attrs = opt_attrs; type->byref = byref; - if (mode == MONO_PARSE_LOCAL) { - /* - * check for pinned flag - */ - if (*ptr == MONO_TYPE_PINNED) { - type->pinned = 1; - ++ptr; - } - } + type->pinned = pinned ? 1 : 0; + + do_mono_metadata_parse_type (type, m, ptr, &ptr); - switch (*ptr) { - case MONO_TYPE_BYREF: - if (mode == MONO_PARSE_FIELD) - g_warning ("A field type cannot be byref"); - type->byref = 1; - ptr++; - /* follow through */ - default: - /*if (*ptr == MONO_TYPE_VOID && mode != MONO_PARSE_RET) - g_error ("void not allowed in param");*/ - do_mono_metadata_parse_type (type, m, ptr, &ptr); - break; - } if (rptr) *rptr = ptr; diff --git a/mono/metadata/mono-debug.c b/mono/metadata/mono-debug.c index b8503ecbc4b..b977ec0546d 100644 --- a/mono/metadata/mono-debug.c +++ b/mono/metadata/mono-debug.c @@ -45,8 +45,6 @@ extern void (*mono_debugger_class_init_func) (MonoClass *klass); void mono_debug_init (MonoDomain *domain, MonoDebugFormat format) { - MonoAssembly **ass; - g_assert (!mono_debug_initialized); mono_debug_initialized = TRUE; @@ -346,25 +344,35 @@ gchar * mono_debug_source_location_from_address (MonoMethod *method, guint32 address, guint32 *line_number, MonoDomain *domain) { - MonoDebugMethodInfo *minfo = _mono_debug_lookup_method (method); + char *res; + MonoDebugMethodInfo *minfo; MonoDebugDomainData *domain_data; - if (!minfo) + mono_loader_lock (); + minfo = _mono_debug_lookup_method (method); + if (!minfo || !minfo->handle || !minfo->handle->symfile || + !minfo->handle->symfile->offset_table) { + mono_loader_unlock (); return NULL; + } domain_data = mono_debug_get_domain_data (minfo->handle, domain); - if (!domain_data->jit [minfo->index]) + if (!domain_data->jit [minfo->index]) { + mono_loader_unlock (); return NULL; + } - if (minfo->handle) { + if (minfo->handle && minfo->handle->symfile) { gint32 offset = il_offset_from_address (domain_data->jit [minfo->index], address); + char *res = NULL; - if (offset < 0) - return NULL; - - return mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number); + if (offset >= 0) + res = mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number); + mono_loader_unlock (); + return res; } + mono_loader_unlock (); return NULL; } @@ -381,12 +389,19 @@ mono_debug_source_location_from_address (MonoMethod *method, guint32 address, gu gchar * mono_debug_source_location_from_il_offset (MonoMethod *method, guint32 offset, guint32 *line_number) { - MonoDebugMethodInfo *minfo = _mono_debug_lookup_method (method); + char *res; + MonoDebugMethodInfo *minfo; - if (!minfo || !minfo->handle) + mono_loader_lock (); + minfo = _mono_debug_lookup_method (method); + if (!minfo || !minfo->handle || !minfo->handle->symfile) { + mono_loader_unlock (); return NULL; + } - return mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number); + res = mono_debug_find_source_location (minfo->handle->symfile, method, offset, line_number); + mono_loader_unlock (); + return res; } /* @@ -398,17 +413,24 @@ mono_debug_il_offset_from_address (MonoMethod *method, gint32 address, MonoDomai { MonoDebugMethodInfo *minfo; MonoDebugDomainData *domain_data; + gint32 res; if (address < 0) return -1; + mono_loader_lock (); minfo = _mono_debug_lookup_method (method); - if (!minfo || !minfo->il_offsets) + if (!minfo || !minfo->il_offsets || !minfo->handle || !minfo->handle->symfile || + !minfo->handle->symfile->offset_table) { + mono_loader_unlock (); return -1; + } domain_data = mono_debug_get_domain_data (minfo->handle, domain); - return il_offset_from_address (domain_data->jit [minfo->index], address); + res = il_offset_from_address (domain_data->jit [minfo->index], address); + mono_loader_unlock (); + return res; } /* @@ -420,17 +442,24 @@ mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset, MonoDom { MonoDebugMethodInfo *minfo; MonoDebugDomainData *domain_data; + gint32 res; if (il_offset < 0) return -1; + mono_loader_lock (); minfo = _mono_debug_lookup_method (method); - if (!minfo || !minfo->il_offsets) + if (!minfo || !minfo->il_offsets || !minfo->handle || !minfo->handle->symfile || + !minfo->handle->symfile->offset_table) { + mono_loader_unlock (); return -1; + } domain_data = mono_debug_get_domain_data (minfo->handle, domain); - return _mono_debug_address_from_il_offset (domain_data->jit [minfo->index], il_offset); + res = _mono_debug_address_from_il_offset (domain_data->jit [minfo->index], il_offset); + mono_loader_unlock (); + return res; } MonoDebugDomainData * @@ -439,6 +468,9 @@ mono_debug_get_domain_data (MonoDebugHandle *handle, MonoDomain *domain) MonoDebugDomainData *data; int domain_id = mono_domain_get_id (domain); + /* We checked this earlier. */ + g_assert (handle->symfile); + for (data = handle->_priv->domain_table; data; data = data->_priv->next) if (data->domain_id == domain_id) return data; diff --git a/mono/metadata/object.c b/mono/metadata/object.c index bdf832baa6d..904bd25c868 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -90,6 +90,7 @@ typedef struct { guint32 initializing_tid; guint32 waiting_count; + gboolean done; CRITICAL_SECTION initialization_section; } TypeInitializationLock; @@ -177,28 +178,38 @@ mono_runtime_class_init (MonoVTable *vtable) InitializeCriticalSection (&lock->initialization_section); lock->initializing_tid = tid; lock->waiting_count = 1; + lock->done = FALSE; /* grab the vtable lock while this thread still owns type_initialization_section */ EnterCriticalSection (&lock->initialization_section); g_hash_table_insert (type_initialization_hash, vtable, lock); do_initialization = 1; } else { gpointer blocked; + TypeInitializationLock *pending_lock; - if (lock->initializing_tid == tid) { + if (lock->initializing_tid == tid || lock->done) { LeaveCriticalSection (&type_initialization_section); return; } /* see if the thread doing the initialization is already blocked on this thread */ blocked = GUINT_TO_POINTER (lock->initializing_tid); - while ((blocked = g_hash_table_lookup (blocked_thread_hash, blocked))) { - if (blocked == GUINT_TO_POINTER (tid)) { - LeaveCriticalSection (&type_initialization_section); - return; + while ((pending_lock = (TypeInitializationLock*) g_hash_table_lookup (blocked_thread_hash, blocked))) { + if (pending_lock->initializing_tid == tid) { + if (!pending_lock->done) { + LeaveCriticalSection (&type_initialization_section); + return; + } else { + /* the thread doing the initialization is blocked on this thread, + but on a lock that has already been freed. It just hasn't got + time to awake */ + break; + } } + blocked = GUINT_TO_POINTER (pending_lock->initializing_tid); } ++lock->waiting_count; /* record the fact that we are waiting on the initializing thread */ - g_hash_table_insert (blocked_thread_hash, GUINT_TO_POINTER (tid), GUINT_TO_POINTER (lock->initializing_tid)); + g_hash_table_insert (blocked_thread_hash, GUINT_TO_POINTER (tid), lock); } LeaveCriticalSection (&type_initialization_section); @@ -206,6 +217,7 @@ mono_runtime_class_init (MonoVTable *vtable) mono_runtime_invoke (method, NULL, NULL, (MonoObject **) &exc); if (last_domain) mono_domain_set (last_domain, TRUE); + lock->done = TRUE; LeaveCriticalSection (&lock->initialization_section); } else { /* this just blocks until the initializing thread is done */ @@ -1586,13 +1598,9 @@ mono_runtime_invoke_array (MonoMethod *method, void *obj, MonoArray *params, case MONO_TYPE_R4: case MONO_TYPE_R8: case MONO_TYPE_VALUETYPE: - if (sig->params [i]->byref) { - /* MS seems to create the objects if a null is passed in */ - if (! ((gpointer *)params->vector)[i]) - ((gpointer*)params->vector)[i] = mono_object_new (mono_domain_get (), mono_class_from_mono_type (sig->params [i])); - } - else - g_assert (((gpointer*)params->vector) [i]); + /* MS seems to create the objects if a null is passed in */ + if (! ((gpointer *)params->vector)[i]) + ((gpointer*)params->vector)[i] = mono_object_new (mono_domain_get (), mono_class_from_mono_type (sig->params [i])); pa [i] = (char *)(((gpointer *)params->vector)[i]) + sizeof (MonoObject); break; case MONO_TYPE_STRING: @@ -2715,6 +2723,7 @@ mono_message_invoke (MonoObject *target, MonoMethodMessage *msg, MonoDomain *domain; MonoMethod *method; MonoMethodSignature *sig; + MonoObject *ret; int i, j, outarg_count = 0; if (target && target->vtable->klass == mono_defaults.transparent_proxy_class) { @@ -2739,6 +2748,8 @@ mono_message_invoke (MonoObject *target, MonoMethodMessage *msg, *out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count); *exc = NULL; + ret = mono_runtime_invoke_array (method, method->klass->valuetype? mono_object_unbox (target): target, msg->args, exc); + for (i = 0, j = 0; i < sig->param_count; i++) { if (sig->params [i]->byref) { gpointer arg; @@ -2748,7 +2759,7 @@ mono_message_invoke (MonoObject *target, MonoMethodMessage *msg, } } - return mono_runtime_invoke_array (method, method->klass->valuetype? mono_object_unbox (target): target, msg->args, exc); + return ret; } void diff --git a/mono/metadata/object.h b/mono/metadata/object.h index c1ffc3c4c2d..2413cc7a346 100644 --- a/mono/metadata/object.h +++ b/mono/metadata/object.h @@ -252,5 +252,11 @@ mono_property_set_value (MonoProperty *prop, void *obj, void **params, MonoObjec MonoObject* mono_property_get_value (MonoProperty *prop, void *obj, void **params, MonoObject **exc); +/* GC handles support */ +guint32 mono_gchandle_new (MonoObject *obj, gboolean pinned); +guint32 mono_gchandle_new_weakref (MonoObject *obj, gboolean track_resurrection); +MonoObject* mono_gchandle_get_target (guint32 gchandle); +void mono_gchandle_free (guint32 gchandle); + #endif diff --git a/mono/metadata/process.c b/mono/metadata/process.c index 90edc4023e5..5fa57bcf0ed 100644 --- a/mono/metadata/process.c +++ b/mono/metadata/process.c @@ -875,7 +875,9 @@ MonoBoolean ves_icall_System_Diagnostics_Process_Start_internal (MonoString *app if(ret) { process_info->process_handle=procinfo.hProcess; - process_info->thread_handle=procinfo.hThread; + /*process_info->thread_handle=procinfo.hThread;*/ + process_info->thread_handle=NULL; + CloseHandle(procinfo.hThread); process_info->pid=procinfo.dwProcessId; process_info->tid=procinfo.dwThreadId; } else { diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index f47150bd1ef..d8335dbdf2f 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -61,6 +61,9 @@ typedef struct { MonoMethod *mhandle; guint32 nrefs; gpointer *refs; + /* for PInvoke */ + int charset, lasterr, native_cc; + MonoString *dll, *dllentry; } ReflectionMethodBuilder; const unsigned char table_sizes [64] = { @@ -1260,6 +1263,14 @@ reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb, rmb->mhandle = mb->mhandle; rmb->nrefs = 0; rmb->refs = NULL; + + if (mb->dll) { + rmb->charset = rmb->charset & 0xf; + rmb->lasterr = rmb->charset & 0x40; + rmb->native_cc = rmb->native_cc; + rmb->dllentry = mb->dllentry; + rmb->dll = mb->dll; + } } static void @@ -5257,12 +5268,21 @@ MonoArray* mono_param_get_objects (MonoDomain *domain, MonoMethod *method) { static MonoClass *System_Reflection_ParameterInfo; + static MonoClassField *dbnull_value_field; + MonoClass *klass; MonoArray *res = NULL; MonoReflectionMethod *member = NULL; MonoReflectionParameter *param = NULL; char **names; int i; + if (!dbnull_value_field) { + klass = mono_class_from_name (mono_defaults.corlib, "System", "DBNull"); + mono_class_init (klass); + dbnull_value_field = mono_class_get_field_from_name (klass, "Value"); + g_assert (dbnull_value_field); + } + if (!System_Reflection_ParameterInfo) System_Reflection_ParameterInfo = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "ParameterInfo"); @@ -5284,7 +5304,7 @@ mono_param_get_objects (MonoDomain *domain, MonoMethod *method) param = (MonoReflectionParameter *)mono_object_new (domain, System_Reflection_ParameterInfo); param->ClassImpl = mono_type_get_object (domain, method->signature->params [i]); - param->DefaultValueImpl = NULL; /* FIXME */ + param->DefaultValueImpl = mono_field_get_value_object (domain, dbnull_value_field, NULL); /* FIXME */ param->MemberImpl = (MonoObject*)member; param->NameImpl = mono_string_new (domain, names [i]); param->PositionImpl = i; @@ -5869,6 +5889,7 @@ handle_type: } break; case MONO_TYPE_CLASS: + case MONO_TYPE_OBJECT: case MONO_TYPE_STRING: for (i = 0; i < alen; i++) { MonoObject *item = load_cattr_value (image, &t->data.klass->byval_arg, p, &p); @@ -7006,6 +7027,17 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass, } else if (m->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) { /* TODO */ m->signature->pinvoke = 1; + + method_aux = g_new0 (MonoReflectionMethodAux, 1); + + method_aux->dllentry = g_strdup (mono_string_to_utf8 (rmb->dllentry)); + method_aux->dll = g_strdup (mono_string_to_utf8 (rmb->dll)); + + ((MonoMethodPInvoke*)m)->piflags = (rmb->native_cc << 8) | (rmb->charset ? (rmb->charset - 1) * 2 : 1) | rmb->lasterr; + + if (klass->image->dynamic) + mono_g_hash_table_insert (((MonoDynamicImage*)klass->image)->method_aux_hash, m, method_aux); + return m; } else if (!m->klass->dummy && !(m->flags & METHOD_ATTRIBUTE_ABSTRACT) && @@ -7819,6 +7851,7 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) { MonoClass *klass; MonoReflectionType* res; + int i; MONO_ARCH_SAVE_REGS; @@ -7829,7 +7862,6 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) /* * Fields to set in klass: * the various flags: delegate/unicode/contextbound etc. - * nested_classes */ klass->flags = tb->attrs; @@ -7841,6 +7873,13 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) if (!klass->enumtype) ensure_runtime_vtable (klass); + if (tb->subtypes) { + for (i = 0; i < mono_array_length (tb->subtypes); ++i) { + MonoReflectionTypeBuilder *subtb = mono_array_get (tb->subtypes, MonoReflectionTypeBuilder*, i); + klass->nested_classes = g_list_prepend (klass->nested_classes, my_mono_class_from_mono_type (subtb->type.type)); + } + } + /* fields and object layout */ if (klass->parent) { if (!klass->parent->size_inited) diff --git a/mono/metadata/reflection.h b/mono/metadata/reflection.h index e44243f3d66..f365047c3b6 100644 --- a/mono/metadata/reflection.h +++ b/mono/metadata/reflection.h @@ -34,6 +34,7 @@ typedef struct { char **param_names; MonoMarshalSpec **param_marshall; MonoCustomAttrInfo **param_cattr; + char *dllentry, *dll; } MonoReflectionMethodAux; int mono_reflection_parse_type (char *name, MonoTypeNameParse *info); diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 0898c23df87..8e09b509dbc 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,45 @@ +2004-09-17 Zoltan Varga <vargaz@freemail.hu> + + * mini.c (mono_method_to_ir): Fix LDSTR in dynamic methods. Fixes #66132. + +2004-09-11 Ben Maurer <bmaurer@users.sourceforge.net> + + * inssel.brg: make ldelema check aot friendly. + +Thu Sep 9 20:57:53 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * mini-*.c, mini-ops.h, inssel-long32.brg: introduced + OP_ADDCC_IMM and OP_SUBCC_IMM (add/sub immediate that will + set the carry/borrow flag). The sparc and s390 implementations + can now use optimized versions (and simplify the code). ppc bugfixes. + +2004-09-02 Zoltan Varga <vargaz@freemail.hu> + + * inssel-long32.brg: Fix OP_LCONV_TO_OVF_I1 rule. Fixes #64578. + +2004-08-23 Zoltan Varga <vargaz@freemail.hu> + + * inssel-x86.brg inssel-amd64: Add yet another missing tree->dreg assignment. + + * mini-x86.c (mono_arch_local_regalloc): Fix bug in long register + allocation. Fixes #63085. + +2004-08-09 Zoltan Varga <vargaz@freemail.hu> + + * inssel-x86.brg: Set dreg of LOCALLOC correctly. + +Tue Aug 3 11:20:09 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * mini-ppc.c: mul.ovf.un exception name fix. + +Tue Aug 3 11:19:07 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * mini-ppc.c: reg allocator fix. + +Tue Aug 3 11:17:07 CEST 2004 Paolo Molaro <lupus@ximian.com> + + * mini-ppc.c: make sure temp regs are not used for global reg + allocation. Tue Jul 27 16:05:19 CEST 2004 Paolo Molaro <lupus@ximian.com> diff --git a/mono/mini/basic-long.cs b/mono/mini/basic-long.cs index f16f9f5dcb1..4b321017ce7 100644 --- a/mono/mini/basic-long.cs +++ b/mono/mini/basic-long.cs @@ -263,6 +263,12 @@ class Tests { return 1; } + static int test_4_addcc_imm () { + long a = 3; + long b = 0; + return (int)(a - b + 1); + } + static int test_5_sub () { long a = 8; long b = 3; diff --git a/mono/mini/cpu-g4.md b/mono/mini/cpu-g4.md index 7d76db87792..638fb2828bc 100644 --- a/mono/mini/cpu-g4.md +++ b/mono/mini/cpu-g4.md @@ -545,6 +545,8 @@ adc: dest:i src1:i src2:i len:4 addcc: dest:i src1:i src2:i len:4 subcc: dest:i src1:i src2:i len:4 adc_imm: dest:i src1:i len:12 +addcc_imm: dest:i src1:i len:12 +subcc_imm: dest:i src1:i len:12 sbb: dest:i src1:i src2:i len:4 sbb_imm: dest:i src1:i len:12 br_reg: src1:i len:8 diff --git a/mono/mini/cpu-pentium.md b/mono/mini/cpu-pentium.md index 2568eac81f6..e48ba96540e 100644 --- a/mono/mini/cpu-pentium.md +++ b/mono/mini/cpu-pentium.md @@ -354,7 +354,9 @@ loadr8_membase: dest:f src1:b len:6 loadr8_spill_membase: src1:b len:8 loadu4_mem: dest:i len:9 move: dest:i src1:i len:2 +addcc_imm: dest:i src1:i len:6 clob:1 add_imm: dest:i src1:i len:6 clob:1 +subcc_imm: dest:i src1:i len:6 clob:1 sub_imm: dest:i src1:i len:6 clob:1 mul_imm: dest:i src1:i len:6 # there is no actual support for division or reminder by immediate diff --git a/mono/mini/cpu-s390.md b/mono/mini/cpu-s390.md index 256bf4aa609..3cc63d770d1 100644 --- a/mono/mini/cpu-s390.md +++ b/mono/mini/cpu-s390.md @@ -349,7 +349,9 @@ loadu4_mem: dest:i len:8 move: dest:i src1:i len:4 fmove: dest:f src1:f len:4 add_imm: dest:i src1:i len:18 +addcc_imm: dest:i src1:i len:18 sub_imm: dest:i src1:i len:18 +subcc_imm: dest:i src1:i len:18 mul_imm: dest:i src1:i len:18 # there is no actual support for division or reminder by immediate # we simulate them, though (but we need to change the burg rules diff --git a/mono/mini/cpu-sparc.md b/mono/mini/cpu-sparc.md index 8f9280a222b..6fef70d713d 100644 --- a/mono/mini/cpu-sparc.md +++ b/mono/mini/cpu-sparc.md @@ -356,7 +356,9 @@ loadr8_membase: dest:f src1:b len:20 loadu4_mem: dest:i len:8 move: dest:i src1:i len:4 add_imm: dest:i src1:i len:12 +addcc_imm: dest:i src1:i len:64 sub_imm: dest:i src1:i len:12 +subcc_imm: dest:i src1:i len:64 mul_imm: dest:i src1:i len:12 div_imm: dest:a src1:i src2:i len:28 div_un_imm: dest:a src1:i src2:i len:12 diff --git a/mono/mini/inssel-long32.brg b/mono/mini/inssel-long32.brg index 0d1cf077f2d..2ebeb3c27b7 100644 --- a/mono/mini/inssel-long32.brg +++ b/mono/mini/inssel-long32.brg @@ -108,7 +108,7 @@ lreg: OP_LADD_OVF_UN (lreg, lreg) { } lreg: OP_LADD (lreg, i8con) { - MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word); + MONO_EMIT_NEW_BIALU_IMM (s, OP_ADDCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word); MONO_EMIT_BIALU_IMM (s, tree, OP_ADC_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word); } @@ -118,7 +118,7 @@ lreg: OP_LSUB (lreg, lreg) { } lreg: OP_LSUB (lreg, i8con) { - MONO_EMIT_NEW_BIALU_IMM (s, OP_SUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word); + MONO_EMIT_NEW_BIALU_IMM (s, OP_SUBCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word); MONO_EMIT_BIALU_IMM (s, tree, OP_SBB_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word); } @@ -575,15 +575,30 @@ reg: OP_LCONV_TO_OVF_I1_UN (lreg) { } reg: OP_LCONV_TO_OVF_I1 (lreg) { + MonoInst *is_negative, *end_label; + + MONO_NEW_LABEL (s, is_negative); + MONO_NEW_LABEL (s, end_label); + MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0); MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, -1); MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0); + MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BLT, is_negative); + + /* Positive */ MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); + MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); + MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BR, end_label); + + /* Negative */ + mono_bblock_add_inst (s->cbb, is_negative); MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_COND_EXC (s, LT_UN, "OverflowException"); + mono_bblock_add_inst (s->cbb, end_label); + MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1); } diff --git a/mono/mini/inssel-x86.brg b/mono/mini/inssel-x86.brg index b1f1cf67c77..b80affe25ab 100644 --- a/mono/mini/inssel-x86.brg +++ b/mono/mini/inssel-x86.brg @@ -151,6 +151,7 @@ reg: OP_LOCALLOC (OP_ICONST) { if (tree->flags & MONO_INST_INIT) { /* microcoded in mini-x86.c */ tree->sreg1 = mono_regstate_next_int (s->rs); + tree->dreg = state->reg1; MONO_EMIT_NEW_ICONST (s, tree->sreg1, state->left->tree->inst_c0); mono_bblock_add_inst (s->cbb, tree); } else { @@ -161,6 +162,7 @@ reg: OP_LOCALLOC (OP_ICONST) { reg: OP_LOCALLOC (reg) { tree->sreg1 = state->left->tree->dreg; + tree->dreg = state->reg1; mono_bblock_add_inst (s->cbb, tree); } diff --git a/mono/mini/inssel.brg b/mono/mini/inssel.brg index e0bc1f0254b..0cb8129cca0 100644 --- a/mono/mini/inssel.brg +++ b/mono/mini/inssel.brg @@ -1736,7 +1736,14 @@ reg: OP_CHECK_ARRAY_TYPE (reg) { vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass)); MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOAD_MEMBASE, elclass_reg, class_reg, G_STRUCT_OFFSET (MonoClass, element_class)); - MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, elclass_reg, tree->klass); + if (mono_compile_aot) { + int klass_reg = mono_regstate_next_int (s->rs); + MONO_EMIT_NEW_CLASSCONST (s, klass_reg, tree->klass); + MONO_EMIT_NEW_BIALU (s, OP_COMPARE, -1, elclass_reg, klass_reg); + } else { + MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, elclass_reg, tree->klass); + } + MONO_EMIT_NEW_COND_EXC (s, NE_UN, "ArrayTypeMismatchException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } diff --git a/mono/mini/mini-ops.h b/mono/mini/mini-ops.h index 32b6eb5f35e..98da133d3fa 100644 --- a/mono/mini/mini-ops.h +++ b/mono/mini/mini-ops.h @@ -297,7 +297,9 @@ MINI_OP(OP_ADC_IMM, "adc_imm") MINI_OP(OP_SBB, "sbb") MINI_OP(OP_SBB_IMM, "sbb_imm") MINI_OP(OP_ADDCC, "addcc") +MINI_OP(OP_ADDCC_IMM, "addcc_imm") MINI_OP(OP_SUBCC, "subcc") +MINI_OP(OP_SUBCC_IMM, "subcc_imm") MINI_OP(OP_BR_REG, "br_reg") MINI_OP(OP_SEXT_I1, "sext_i1") MINI_OP(OP_SEXT_I2, "sext_i2") diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c index 1e8d877b3c9..92bef163894 100644 --- a/mono/mini/mini-ppc.c +++ b/mono/mini/mini-ppc.c @@ -209,7 +209,7 @@ mono_arch_get_global_int_regs (MonoCompile *cfg) if (cfg->frame_reg != ppc_sp) top = 31; #if USE_EXTRA_TEMPS - top -= 2; + top = 29; #endif for (i = 13; i < top; ++i) regs = g_list_prepend (regs, GUINT_TO_POINTER (i)); @@ -1296,7 +1296,11 @@ mono_spillvar_offset_float (MonoCompile *cfg, int spillvar) #undef DEBUG #define DEBUG(a) if (cfg->verbose_level > 1) a //#define DEBUG(a) -#define reg_is_freeable(r) ((r) >= 3 && (r) <= 10) +/* use ppc_r3-ppc_10,ppc_r12 as temp registers, f1-f13 for FP registers */ +#define PPC_CALLER_REGS ((0xff<<3) | (1<<12) | USE_EXTRA_TEMPS) +#define PPC_CALLER_FREGS (0x3ffe) + +#define reg_is_freeable(r) (PPC_CALLER_REGS & 1 << (r)) #define freg_is_freeable(r) ((r) >= 1 && (r) <= 13) typedef struct { @@ -1631,10 +1635,6 @@ alloc_int_reg (MonoCompile *cfg, InstList *curinst, MonoInst *ins, int sym_reg, return val; } -/* use ppc_r3-ppc_10,ppc_r12 as temp registers, f1-f13 for FP registers */ -#define PPC_CALLER_REGS ((0xff<<3) | (1<<12) | USE_EXTRA_TEMPS) -#define PPC_CALLER_FREGS (0x3ffe) - /* * Local register allocation. * We first scan the list of instructions and we save the liveness info of @@ -2443,6 +2443,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_ADC: ppc_adde (code, ins->dreg, ins->sreg1, ins->sreg2); break; + case OP_ADDCC_IMM: + if (ppc_is_imm16 (ins->inst_imm)) { + ppc_addic (code, ins->dreg, ins->sreg1, ins->inst_imm); + } else { + ppc_load (code, ppc_r11, ins->inst_imm); + ppc_addc (code, ins->dreg, ins->sreg1, ppc_r11); + } + break; case OP_ADD_IMM: if (ppc_is_imm16 (ins->inst_imm)) { ppc_addi (code, ins->dreg, ins->sreg1, ins->inst_imm); @@ -2522,6 +2530,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_SUBCC: ppc_subfc (code, ins->dreg, ins->sreg2, ins->sreg1); break; + case OP_SUBCC_IMM: + ppc_load (code, ppc_r11, ins->inst_imm); + ppc_subfc (code, ins->dreg, ppc_r11, ins->sreg1); + break; case CEE_SUB: ppc_subf (code, ins->dreg, ins->sreg2, ins->sreg1); break; @@ -2539,7 +2551,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_SBB_IMM: ppc_load (code, ppc_r11, ins->inst_imm); - ppc_subfe (code, ins->dreg, ins->sreg2, ppc_r11); + ppc_subfe (code, ins->dreg, ppc_r11, ins->sreg1); break; case OP_PPC_SUBFIC: g_assert (ppc_is_imm16 (ins->inst_imm)); @@ -2687,7 +2699,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) */ ppc_mulhwu (code, ppc_r0, ins->sreg1, ins->sreg2); ppc_cmpi (code, 0, 0, ppc_r0, 0); - EMIT_COND_SYSTEM_EXCEPTION (CEE_BNE_UN - CEE_BEQ, ins->inst_p1); + EMIT_COND_SYSTEM_EXCEPTION (CEE_BNE_UN - CEE_BEQ, "OverflowException"); ppc_mullw (code, ins->dreg, ins->sreg1, ins->sreg2); break; case OP_ICONST: @@ -3410,6 +3422,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) ArgInfo *ainfo = cinfo->args + i; inst = cfg->varinfo [pos]; + if (cfg->verbose_level > 2) + g_print ("Saving argument %d (type: %d)\n", i, ainfo->regtype); if (inst->opcode == OP_REGVAR) { if (ainfo->regtype == RegTypeGeneral) ppc_mr (code, inst->dreg, ainfo->reg); diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index 0a7db247fa2..6d7f7ce718b 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -3228,6 +3228,7 @@ guint8 cond; s390_alcr (code, ins->dreg, ins->sreg2); } break; + case OP_ADDCC_IMM: case OP_ADD_IMM: { if ((ins->next) && (ins->next->opcode == OP_ADC_IMM)) { @@ -3293,6 +3294,7 @@ guint8 cond; s390_slbr (code, ins->dreg, ins->sreg2); } break; + case OP_SUBCC_IMM: case OP_SUB_IMM: { if (s390_is_imm16 (-ins->inst_imm)) { if (ins->dreg != ins->sreg1) { diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c index d0f58dc84cf..1552e50c16e 100644 --- a/mono/mini/mini-sparc.c +++ b/mono/mini/mini-sparc.c @@ -2652,6 +2652,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case CEE_ADD: sparc_add (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg); break; + case OP_ADDCC_IMM: case OP_ADD_IMM: /* according to inssel-long32.brg, this should set cc */ EMIT_ALU_IMM (ins, add, TRUE); @@ -2669,6 +2670,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case CEE_SUB: sparc_sub (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg); break; + case OP_SUBCC_IMM: case OP_SUB_IMM: /* according to inssel-long32.brg, this should set cc */ EMIT_ALU_IMM (ins, sub, TRUE); diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 14710b31792..dc098a1c26b 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -1866,6 +1866,8 @@ mono_arch_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) /* force source to be same as dest */ rs->iassign [ins->sreg1] = ins->dreg; rs->iassign [ins->sreg1 + 1] = ins->unused; + rs->isymbolic [ins->dreg] = ins->sreg1; + rs->isymbolic [ins->unused] = ins->sreg1 + 1; DEBUG (g_print ("\tassigned sreg1 (long) %s to sreg1 R%d\n", mono_arch_regname (ins->dreg), ins->sreg1)); DEBUG (g_print ("\tassigned sreg1 (long-high) %s to sreg1 R%d\n", mono_arch_regname (ins->unused), ins->sreg1 + 1)); @@ -2324,6 +2326,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_ADC: x86_alu_reg_reg (code, X86_ADC, ins->sreg1, ins->sreg2); break; + case OP_ADDCC_IMM: case OP_ADD_IMM: x86_alu_reg_imm (code, X86_ADD, ins->dreg, ins->inst_imm); break; @@ -2337,6 +2340,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_SBB: x86_alu_reg_reg (code, X86_SBB, ins->sreg1, ins->sreg2); break; + case OP_SUBCC_IMM: case OP_SUB_IMM: x86_alu_reg_imm (code, X86_SUB, ins->dreg, ins->inst_imm); break; diff --git a/mono/mini/mini.c b/mono/mini/mini.c index 14a32f6dd6c..28f70d463c3 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -3893,7 +3893,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b CHECK_OPSIZE (5); n = read32 (ip + 1); - if (method->wrapper_type != MONO_WRAPPER_NONE) { + if (method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD) { + NEW_PCONST (cfg, ins, mono_method_get_wrapper_data (method, n)); + ins->cil_code = ip; + ins->type = STACK_OBJ; + *sp = ins; + } + else if (method->wrapper_type != MONO_WRAPPER_NONE) { int temp; MonoInst *iargs [1]; diff --git a/mono/tests/ChangeLog b/mono/tests/ChangeLog index e73b632c1c1..041938869bd 100644 --- a/mono/tests/ChangeLog +++ b/mono/tests/ChangeLog @@ -1,3 +1,9 @@ +2004-09-07 Duncan Mak <duncan@ximian.com> + + * typeof-ptr.cs: Add unsafe sections to the code that's using + pointers directly. This was breaking the test stage on the build + boxes. + 2004-05-29 Zoltan Varga <vargaz@freemail.hu> * invoke.cs: Add an Invoke test. diff --git a/mono/tests/typeof-ptr.cs b/mono/tests/typeof-ptr.cs index eea3d1072db..69e75ca1745 100644 --- a/mono/tests/typeof-ptr.cs +++ b/mono/tests/typeof-ptr.cs @@ -8,13 +8,19 @@ class T { ParameterInfo[] args = typeof (T).GetMethod ("meth").GetParameters (); if (args[0].ParameterType == args[1].ParameterType) return 1; - - if (typeof(int) == typeof (int*)) - return 2; + + unsafe { + if (typeof(int) == typeof (int*)) + return 2; + } if (args[0].ParameterType != typeof(int)) return 3; - if (args[1].ParameterType != typeof(int*)) - return 4; + + unsafe { + if (args[1].ParameterType != typeof(int*)) + return 4; + } + return 0; } } diff --git a/web/download b/web/download index 6a9789d3744..3992312f61f 100644 --- a/web/download +++ b/web/download @@ -14,21 +14,123 @@ Online API documentation for Mono is available in the `monodoc' package. - Gtk-sharp is package to build GUI applications with the Gtk toolkit. - + Gtk# is package to build GUI applications with the Gtk+ toolkit. The software is also available on the `Mono' channel in <a href="http://www.ximian.com/products/redcarpet/">Red Carpet</a>. - Some useful links: the <a - href="http://www.go-mono.org/faq.html">FAQ</a>. - - Packages can find RPM Spec files and other resources in the <a + Packagers can find RPM Spec files and other resources in the <a href="http://www.go-mono.com/packagers/">packagers page</a>. <table> <tbody> <tr bgcolor="#DDDDDD"> <td> + <b>Mono 1.0</b><br> + <a href="archive/1.0/index.html">Release notes</a><br> + June 30th, 2004 + </td> + <td> + <table cellspacing="1" cellpadding="3"> + <tr bgcolor="#BBBBBB"> + <td> + <b>Source Code</b> + </td> + <td> + <ul> + <li><a href="archive/1.0/mono-1.0.tar.gz">Mono Runtime 1.0</a> + <li><a href="archive/1.0/mcs-1.0.tar.gz">Mono Class Libraries and C# Compiler 1.0</a> + <li><a href="archive/1.0/libgdiplus-1.0.tar.gz">libgdiplus 1.0</a> + <p> + <li><a href="archive/1.0/monodoc-1.0.tar.gz">MonoDoc 1.0</a> + <li><a href="archive/1.0/xsp-1.0.tar.gz">XSP web server 1.0</a> + <li><a href="archive/1.0/mod_mono-1.0.tar.gz">Apache Mono module 1.0</a> + <p> + <li><a href="archive/1.0/winelib-0.3.tar.gz">Winelib 0.3</a> + <p> + <li><a href="archive/1.0/gtk-sharp-1.0.tar.gz">Gtk# 1.0</a> + <li><a href="archive/1.0/gecko-sharp-0.5.tar.gz">Gecko# 0.5</a> + <li><a href="archive/1.0/gtksourceview-sharp-0.5.tar.gz">Gtk SourceView# 0.5</a> + <li><a href="archive/1.0/monodevelop-0.5.tar.gz">MonoDevelop IDE 0.5</a> + </ul> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/redhat-36.gif"><b>Red Hat 9.0/x86</b><br> + </td> + <td> + <a href="archive/1.0/redhat-9-i386">Packages</a> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/redhat-36.gif"><b>Fedora Core 1/x86</b><br> + </td> + <td> + <a href="archive/1.0/fedora-1-i386">Packages</a> + <p><a href="http://www.go-mono.com/archive/yum-repository/fedora-1-i386">YUM Repository</a> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/redhat-36.gif"><b>Fedora Core 2/x86</b><br> + </td> + <td> + <a href="archive/1.0/fedora-2-i386">Packages</a> + <p><a href="http://www.go-mono.com/archive/yum-repository/fedora-2-i386">YUM Repository</a> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/suse-36.gif"><b>SLES 8/x86</b><br> + </td> + <td> + <a href="archive/1.0/sles-8-i386/">Packages</a> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/suse-36.gif"><b>SUSE 9/x86</b><br> + </td> + <td> + <a href="archive/1.0/suse-90-i586/">Packages</a> + </td> + </tr> + <tr bgcolor="#bbbbbb"> + <td bgcolor="#999999"> + <img src="images/suse-36.gif"><b>SUSE 9.1/x86</b><br> + </td> + <td> + <a href="archive/1.0/suse-91-i586/">Packages</a> + </td> + </tr> + <tr> + <td bgcolor="#999999"> + <div align="left"><img src="images/windows-36.gif"></div> + <div align="right"><b>Windows installer</b><br><small>Win2k and above</small></div> + </td> + <td> + <a href="archive/1.0/windows/mono-1.0-win32-1.exe">Mono Setup</a> + </td> + </tr> + <tr> + <td bgcolor="#999999"> + <img src="images/macos-36.gif"><b>Mac OS X package</b> + </td> + <td> + <a href="archive/1.0/macos/MonoFramework-1.0.dmg">MonoFramework-1.0.dmg</a> in /Library/Framework + </td> + </tr> + </table> + </td> + </table> + + <hr> + + <table> + <tbody> + <tr bgcolor="#DDDDDD"> + <td> <b>Release Candidate</b><br> <!-- <a href="archive/beta3/beta3.html">Release notes</a><br> --> June 25th, 2004 diff --git a/web/index b/web/index index d701c09c4d5..52a8ced8b09 100644 --- a/web/index +++ b/web/index @@ -1,3 +1,4 @@ +<meta http-equiv="Refresh" content="0"; URL=http://www.mono-project.com/"> <link rel="alternate" type="application/rss+xml" title="RSS" href="index.rss"/> @@ -174,6 +175,26 @@ </a> Wikis. </p> +@item Jun 30th, 2004: Mono 1.0 + + <table> + <tr> + <td> + <img + src="http://www.go-mono.com/archive/1.0/mono1.gif"></td> + <td> + <b>Mono 1.0 has been released!</b><br/> + + <p>Be the first kid in your block to install the + <i>it-took-us-three-years-but-we-did-it</i> development platform. + + <p>Read the <a + href="http://www.go-mono.com/archive/1.0/index.html">release notes</a> + or <a href="http://www.go-mono.com/download.html">download it</a></p> + </td> + </tr> + </table> + @item Jun 23rd, 2004: The Mono Hackers Hall of Fame welcomes John Luke, Dan Morgan and Tim Coleman. The <a href="http://www.go-mono.com/hackers.html">Mono Hackers Hall Of Fame</a> |