configure.host crlf=input
mkinstalldirs crlf=input
*.sh crlf=input
+*.sources crlf=input
+.gitattributes crlf=input
+*akefile* crlf=input
# ensure native line endings on checkout
*.c crlf
*.cs crlf
*.il crlf
-.gitattributes crlf
-*akefile* crlf
-*.sources crlf
-
# don't do anything to line-endings. Let CRLFs go into the repo, and CRLF on checkout
*.bat -crlf
*.sln -crlf
{
"name": "ms-test-suite",
"url": "git@github.com:xamarin/ms-test-suite.git",
- "rev": "55b6637eb1de61c743323ec82db1e0cadfee5b32",
+ "rev": "73c155f76b55839f26ba707d6d40091060e4f5d8",
"remote-branch": "origin/master",
"branch": "master",
"directory": "ms-test-suite"
with_testing_aot_hybrid_default=yes
TEST_PROFILE=testing_aot_hybrid
- mono_feature_disable_com='yes'
- mono_feature_disable_remoting='yes'
- mono_feature_disable_appdomains='yes'
-
AOT_BUILD_FLAGS="--aot=hybrid,$INVARIANT_AOT_OPTIONS"
AOT_RUN_FLAGS="--hybrid-aot"
elif test x$with_runtime_preset = xaot; then
BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=$BTLS_ROOT/util/android-cmake/android.toolchain.cmake"
if test "x$with_btls_android_ndk" != "x"; then
BTLS_CMAKE_ARGS="$BTLS_CMAKE_ARGS -DANDROID_NDK=\"$with_btls_android_ndk\""
+ else
+ AC_MSG_ERROR([Need to pass the --with-btls-android-ndk argument when building with BTLS support on Android.])
fi
fi
Simple locks:
Can be acquired at any point regardless of which locks are taken or not.
No other locks can be acquired or released while holding a simple lock.
- Reentrancy is not recomended. (warning)
+ Reentrancy is not recommended. (warning)
Simple locks are leaf locks on the lock lattice.
Complex locks:
WARNING: tried to acquire lock ImageDataLock at mono_image_init_name_cache while holding ImageDataLock at mono_class_from_name
WARNING: tried to acquire lock ImageDataLock at mono_image_init_name_cache while holding ImageDataLock at mono_image_add_to_name_cache
Both of those happen when filling up the name_cache, as it needs to alloc image memory.
- This one is fixable by spliting mono_image_init_name_cache into a locked and an unlocked variants and calling them appropriatedly.
+ This one is fixable by splitting mono_image_init_name_cache into a locked and an unlocked variants and calling them appropriately.
*/
--- /dev/null
+check-coverage crlf=input
+check-exports crlf=input
+produce-lists crlf=input
To be clearer, and give an idea of what the algorithm can and
cannot do without describing it in detail... keep in mind that
- only "redunant" checks cannot be removed. By "redundant", I
+ only "redundant" checks cannot be removed. By "redundant", I
mean "already explicitly checked" in the method code.
Unfortunately, analyzing complex expressions is not so easy
In the first case, the BB has exactly two exit BBs, and their
execution conditions are easy to get from the condition of the
branch (see the "get_relation_from_branch_instruction"
- function, and expecially the end of "analyze_block" in
+ function, and especially the end of "analyze_block" in
abcremoval.c.
If there is a switch, the jump condition of every exit BB is
each BB tried to examine all possible conditions between all
variables, filling a sort of "evaluation matrix". The problem
was that the complexity of this evaluation was quadratic (or
- worse) on the number of variables, and that many wariables
+ worse) on the number of variables, and that many variables
were examined even if they were not involved in any array
access.
[1b] Prepare the evaluation graph (empty)
- [1b] Summarize each varible definition, and put
+ [1b] Summarize each variable definition, and put
the resulting relations in the evaluation
graph
-Subproject commit 7d446abd40b5331b5900cc280dfe8c6d1a1eee4c
+Subproject commit e8abd2e5568b32bd985befca308016d4526158ed
-Subproject commit f7733aca6228f21cb06a0e4ebd58ca973643c4a6
+Subproject commit f41352fa7dce0162d3172004617121fe28f06a88
-Subproject commit 7668f9bab6c688eef882bfd0b74dd5e86a9ddc11
+Subproject commit c00dde208d25f180d881c37d465410ed2edd6939
-Subproject commit 367864ef810859ae3ce652864233b35f2dd5fdbe
+Subproject commit 7c1e61bec8c069b2cc9e214c3094b147d76bbf82
* See the definition of page_hash_table in gc_private.h.
* False hits from the stack(s) are much more dangerous than false hits
* from elsewhere, since the former can pin a large object that spans the
- * block, eventhough it does not start on the dangerous block.
+ * block, even though it does not start on the dangerous block.
*/
/*
- Fixed Makefile.direct for DARWIN. (Thanks to Manuel Serrano.)
- There was a race between GC_pthread_detach and thread exit that could
result in a thread structure being deallocated by GC_pthread_detach
- eventhough it was still needed by the thread exit code. (Thanks to
+ even though it was still needed by the thread exit code. (Thanks to
Dick Porter for the small test case that allowed this to be debugged.)
- Fixed version parsing for non-alpha versions in acinclude.m4 and
version checking in version.h.
macros. Currently these macros generally identify platforms instead of
features. In many cases, this is a mistake.
-3) The code currently avoids #elif, eventhough that would make it more
+3) The code currently avoids #elif, even though that would make it more
readable. This was done since #elif would need to be understood by ALL
compilers used to build the collector, and that hasn't always been the case.
It makes sense to reconsider this decision at some point, since #elif has been
/* Try to share the load, since the main stack is empty, */
/* and helper threads are waiting for a refill. */
/* The entries near the bottom of the stack are likely */
- /* to require more work. Thus we return those, eventhough */
+ /* to require more work. Thus we return those, even though */
/* it's harder. */
mse * p;
mse * new_bottom = local_mark_stack
.if t .sp .5v
.if n .sp
..
-.TH gacutil "Mono 1.0"
+.TH Mono "gacutil"
.SH NAME
gacutil \- Global Assembly Cache management utility.
.SH SYNOPSIS
.if t .sp .5v
.if n .sp
..
-.TH lc "Mono 2.6"
+.TH Mono "lc"
.SH NAME
lc \- Mono License Compiler
.SH SYNOPSIS
.if t .sp .5v
.if n .sp
..
-.TH macpack "Mono 1.0"
+.TH Mono "macpack"
.SH NAME
macpack \- Macintosh OS X Packager for managed gui assemblies
.SH SYNOPSIS
.\"
-.\" mono manual page.
+.\" mdb2ppdb manual page.
.\" Copyright 2017 Microsoft
.\"
-.TH Mono "Mono 4.8.0"
+.TH Mono "mdb2ppdb"
.SH NAME
mdb2ppdb \- Convert Mono's debug file format (MDB) to Portable Program
Database (PPDB) file formatn
.I "P:"
Refers to a property. If the property is an indexer or takes parameters,
the parameter types are appended to the property name and enclosed with
-paranthesis:
+parenthesis:
\fIP:System.String.Length\fR,
\fIP:System.String.Chars(System.Int32)\fR.
.TP
.if t .sp .5v
.if n .sp
..
-.TH mkbundle "mkbundle 1.0"
+.TH Mono "mkbundle"
.SH NAME
mkbundle, mkbundle2 \- Creates a bundled executable.
.SH SYNOPSIS
.\" Miguel de Icaza (miguel@gnu.org)
.\" Paolo Molaro (lupus@ximian.com)
.\"
-.TH Mono "Mono 1.0"
+.TH Mono "mono-config"
.SH NAME
mono-config \- Mono runtime file format configuration
.SH DESCRIPTION
.if t .sp .5v
.if n .sp
..
-.TH Mono "Mono 1.0"
+.TH Mono "mono-service"
.SH NAME
mono-service, mono-service2 \- Mono ServiceProcess host
.SH SYNOPSIS
.if t .sp .5v
.if n .sp
..
-.TH mono-xmltool "Mono 1.0"
+.TH Mono "mono-xmltool"
.SH NAME
mono-xmltool \- Mono XML validation and transformation tool.
.SH SYNOPSIS
.\" Author:
.\" Miguel de Icaza (miguel@gnu.org)
.\"
-.TH Mono "Mono 4.7.0"
+.TH Mono "mono"
.SH NAME
mono \- Mono's ECMA-CLI native code generator (Just-in-Time and Ahead-of-Time)
.SH SYNOPSIS
Don't align stack frames on the x86 architecture. By default, Mono
aligns stack frames to 16 bytes on x86, so that local floating point
and SIMD variables can be properly aligned. This option turns off the
-alignment, which usually saves one intruction per call, but might
+alignment, which usually saves one instruction per call, but might
result in significantly lower floating point and SIMD performance.
.TP
\fB--jitmap\fR
of the number of generic parameters).
.Sp
If the constructor or method take arguments, these are listed within
-paranthesis after the constructor/method name:
+parenthesis after the constructor/method name:
.Sp
.I M:System.Object..ctor
,
.I "P:"
Refers to a property. If the property is an indexer or takes parameters,
the parameter types are appended to the property name and enclosed with
-paranthesis:
+parenthesis:
.I P:System.String.Length
,
.I P:System.String.Chars(System.Int32)
.if t .sp .5v
.if n .sp
..
-.TH resgen "resgen 1.0"
+.TH Mono "resgen"
.SH NAME
resgen, resgen2 \- Mono/CLI Resource Generator
.SH SYNOPSIS
NOTES:
Ngsql is the .Net Data Provider for PosgreSQL. The
-latest verison can be downloaded from
+latest version can be downloaded from
http://npgsql.projects.postgresql.org/
MySql.Data is the MySQL Connector/Net for connecting to MySql databases.
/LICENSE.MSPL -crlf
/ScalableMonoIcon.svg -crlf
+/winexe.in crlf=input
code ();
}
- * Avoid using unecessary open/close braces, vertical space
+ * Avoid using unnecessary open/close braces, vertical space
is usually limited:
good:
MyHelperClass.cli.cs
MyHelperClass.jvm.cs
- By using partial classes.
\ No newline at end of file
+ By using partial classes.
-d:MOBILE_DYNAMIC \
-d:MONODROID \
-d:ANDROID \
- -d:NETSTANDARD \
-nowarn:1699 \
-nostdlib \
$(DEFAULT_REFERENCES) \
-d:DISABLE_REMOTING \
-d:DISABLE_COM \
-d:FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK \
- -d:NETSTANDARD \
-nowarn:1699 \
-nostdlib \
$(DEFAULT_REFERENCES) \
-d:NET_4_0 \
-d:NET_4_5 \
-d:MONO \
- -d:NETSTANDARD \
-d:MOBILE,MOBILE_LEGACY \
-d:FULL_AOT_DESKTOP \
-d:FULL_AOT_RUNTIME \
-d:NET_4_0 \
-d:NET_4_5 \
-d:MONO \
- -d:NETSTANDARD \
-d:MOBILE,MOBILE_LEGACY \
-d:FULL_AOT_DESKTOP \
-d:FULL_AOT_RUNTIME \
-d:NET_4_0 \
-d:NET_4_5 \
-d:MONO \
- -d:NETSTANDARD \
-nowarn:1699 \
-nostdlib \
$(DEFAULT_REFERENCES) \
-d:NET_4_0 \
-d:NET_4_5 \
-d:MONO \
- -d:NETSTANDARD \
-d:MOBILE,MOBILE_LEGACY \
-d:FULL_AOT_DESKTOP \
-d:FULL_AOT_RUNTIME \
-d:XAMMAC \
-d:FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK \
-d:XAMARIN_MODERN \
- -d:NETSTANDARD \
-nowarn:1699 \
-nostdlib \
$(DEFAULT_REFERENCES) \
</PropertyGroup>\r
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
<ItemGroup>\r
- <Compile Include="..\..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbColumn.cs" />\r
<Compile Include="..\..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataReaderExtensions.Facade.cs" />\r
- <Compile Include="..\..\..\..\external\corefx\src\System.Data.Common\src\System\Data\IColumnMappingCollection.cs" />\r
<Compile Include="AssemblyInfo.cs" />\r
<Compile Include="TypeForwarders.cs" />\r </ItemGroup>\r
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
TypeForwarders.cs
AssemblyInfo.cs
-../../../../external/corefx/src/System.Data.Common/src/System/Data/IColumnMappingCollection.cs
-../../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbColumn.cs
../../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataReaderExtensions.Facade.cs
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.DBNull))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.CommandBehavior))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.CommandType))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.Common.DbColumn))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.Common.DbCommand))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.Common.DbConnection))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.Common.DbConnectionStringBuilder))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.DataRowVersion))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.DataTable))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.DbType))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.IColumnMappingCollection))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.IDataParameter))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.IDataParameterCollection))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Data.IDataReader))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventChannel))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventCommand))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventCommandEventArgs))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventCounter))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventDataAttribute))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventFieldAttribute))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventFieldFormat))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventTask))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventWrittenEventArgs))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.NonEventAttribute))]
-
-#if NETSTANDARD
-[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Diagnostics.Tracing.EventCounter))]
-#endif
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketInformationOptions))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketOptionLevel))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketOptionName))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketReceiveFromResult))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketReceiveMessageFromResult))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketShutdown))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketTaskExtensions))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketType))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.TcpClient))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.TcpListener))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.TransmitFileOptions))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.UdpClient))]
[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.UdpReceiveResult))]
-
-#if NETSTANDARD
-[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketReceiveFromResult))]
-[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketReceiveMessageFromResult))]
-[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Net.Sockets.SocketTaskExtensions))]
-#endif
KEY_FILE = ../../msfinal.pub
SIGN_FLAGS = /delaysign /keyfile:$(KEY_FILE) /nowarn:1616,1699 /nowarn:618
-LIB_REFS = System System.Xml System.Xml.Linq System.Runtime.Serialization System.Core System.Numerics System.Net.Http System.Transactions \
+LIB_REFS = System System.Xml System.Xml.Linq System.Runtime.Serialization System.Core System.Numerics System.Numerics.Vectors System.Net.Http System.Transactions \
System.IO.Compression System.Data System.ComponentModel.Composition System.IO.Compression.FileSystem \
-Facades/System.Security.Cryptography.Algorithms
+Facades/System.Security.Cryptography.Algorithms Facades/System.Globalization.Extensions Facades/System.Data.Common \
+Facades/System.Diagnostics.StackTrace Facades/System.Runtime.Serialization.Xml Facades/System.Runtime.Serialization.Primitives \
+Facades/System.Security.SecureString Facades/System.Threading.Overlapped Facades/System.Xml.XPath.XDocument
ifeq (2.1, $(FRAMEWORK_VERSION))
LIB_REFS += System.Web.Services
pcl_facade_dirs := Facades
+-include ../build/config.make
+
+ifdef MCS_MODE
+MCS_MODE_dirs := Mono.Cecil.Mdb
+endif
+
# The minimal set of csc dependencies
basic_SUBDIRS := \
corlib \
System.Xml.Linq \
System.Runtime.InteropServices.RuntimeInformation \
Mono.Cecil \
+ $(MCS_MODE_dirs) \
../tools/cil-stringreplacer
# resgen is corlib specific so we need to wait until corlib is build
System.Runtime.InteropServices.RuntimeInformation \
System.IO.Compression \
Mono.Cecil \
+ $(MCS_MODE_dirs) \
Mono.CompilerServices.SymbolWriter \
PEAPI \
../tools/cil-stringreplacer
--include ../build/config.make
-
ifdef MCS_MODE
basic_PARALLEL_SUBDIRS := ../mcs
build_PARALLEL_SUBDIRS := ../mcs
LIBRARY = Microsoft.CSharp.dll
-LIB_REFS = System.Core Mono.CSharp
+LIB_REFS = System.Core System
LIB_MCS_FLAGS =
+RESX_RESOURCE_STRING = ../../../external/corefx/src/Microsoft.CSharp/src/Resources/Strings.resx
+
include ../../build/library.make
</PropertyGroup>\r
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
<ItemGroup>\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Binder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\BinderHelper.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpArgumentInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpArgumentInfoFlags.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpBinaryOperationBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpBinaryOperationFlags.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpBinderFlags.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpCallFlags.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpConversionKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpConvertBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpGetIndexBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpGetMemberBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpInvokeBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpInvokeConstructorBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpInvokeMemberBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpIsEventBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpSetIndexBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpSetMemberBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\CSharpUnaryOperationBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Error.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\CController.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\CError.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\CErrorFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\CParameterizedError.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\ErrorCode.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\ErrorFacts.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\ErrorFmt.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\ErrorHandling.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\IErrorSink.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\MessageID.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Errors\UserStringBuilder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\ExpressionTreeCallRewriter.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\ICSharpInvokeOrInvokeMemberBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\ResetBindException.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\RuntimeBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\RuntimeBinderController.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\RuntimeBinderException.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\RuntimeBinderExtensions.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\RuntimeBinderInternalCompilerException.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Binding\Better.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Binding\ErrorReporting.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BindingContextBase.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BindingContexts.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BindingFlag.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BinOpArgInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BinOpKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\BinOpSig.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\CandidateFunctionMember.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ConstVal.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ConstValFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Conversion.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Conversions.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\COperators.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Declarations\AggregateDeclaration.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Declarations\Declaration.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Declarations\GlobalAttributeDeclaration.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Declarations\NamespaceDeclaration.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ExplicitConversion.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ExpressionBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ExpressionKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\EXPRExtensions.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ExprFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\EXPRFLAG.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\FileRecord.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\FundamentalTypes.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\GlobalSymbolContext.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\GroupToArgsBinder.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\GroupToArgsBinderResult.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ImplicitConversion.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\InputFile.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\ITypeOrNamespace.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\LangCompiler.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MemberLookup.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MemberLookupResults.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MetadataToken.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MethodIterator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MethodKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\MethodTypeInferrer.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\NameGenerator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Nullable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\NullableLift.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Operators.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\OriginalExpressions.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\PredefinedAttributes.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\PredefinedMembers.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\SemanticChecker.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\SubstitutionContext.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\AggregateSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\AssemblyQualifiedNamespaceSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\EventSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\FieldSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\IndexerSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\LabelSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\LocalVariableSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\MethodOrPropertySymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\MethodSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\MiscSymFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\NamespaceOrAggregateSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\NamespaceSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\ParentSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\PropertySymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\Scope.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\Symbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymbolKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymbolLoader.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymbolManagerBase.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymbolMask.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymbolTable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\SymFactoryBase.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\TransparentIdentifierMemberSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\TypeParameterSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\UnresolvedAggregateSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Symbols\VariableSymbol.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ArrayIndex.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ArrayInitialization.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ArrayLength.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Assignment.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\BinaryOperator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Block.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\BoundAnonymousFunction.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Call.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Cast.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Class.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\CompoundOperator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Concatenate.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ConditionalOperator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Constant.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Event.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\EXPR.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ExpressionIterator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Field.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\FieldInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\HoistedLocal.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\List.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\LocalVariable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\MemberGroup.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\MethodInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\MethodReference.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\NamedArgumentSpecification.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Property.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\PropertyInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Return.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Statement.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Temporary.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\This.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\TypeArguments.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\TypeOf.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\TypeOrNamespace.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\UnaryOperator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\UnboundAnonymousFunction.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\UserDefinedConversion.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\UserDefinedLogicalOperator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Visitors\ExpressionTreeRewriter.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\Visitors\ExprVisitorBase.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Tree\ZeroInitialize.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\TypeBind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\AggregateType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\ArgumentListType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\ArrayType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\BoundLambdaType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\ErrorType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\MethodGroupType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\NullableType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\NullType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\OpenTypePlaceholderType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\ParameterModifierType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\PointerType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\PredefinedTypes.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\Type.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeArray.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeFactory.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeKind.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeManager.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeParameterType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeTable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\Types\VoidType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\UnaOpSig.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\UtilityTypeExtensions.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Semantics\WithType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\SpecialNames.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\SymbolTable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\KnownName.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\NameManager.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\Names.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\NameTable.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\Operators.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\PredefinedName.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\PredefinedType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\TokenFacts.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\Microsoft.CSharp\src\Microsoft\CSharp\RuntimeBinder\Syntax\TokenKind.cs" />\r
+ <Compile Include="..\..\build\common\Consts.cs" />\r
+ <Compile Include="..\..\build\common\SR.cs" />\r
<Compile Include="Assembly\AssemblyInfo.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\Binder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpArgumentInfo.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpArgumentInfoFlags.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpBinaryOperationBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpBinderFlags.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpConvertBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpGetIndexBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpGetMemberBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpInvokeBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpInvokeConstructorBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpInvokeMemberBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpIsEventBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpSetIndexBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpSetMemberBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\CSharpUnaryOperationBinder.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\DynamicContext.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\ErrorPrinter.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\Extensions.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\RuntimeBinderContext.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\RuntimeBinderException.cs" />\r
- <Compile Include="Microsoft.CSharp.RuntimeBinder\RuntimeBinderInternalCompilerException.cs" />\r </ItemGroup>\r
+ <Compile Include="corefx\SR.cs" />\r </ItemGroup>\r
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
Other similar extension points exist, see Microsoft.Common.targets.\r
<Target Name="BeforeBuild">\r
<Project>{359142A1-D80F-401E-AA64-7167C9317649}</Project>\r
<Name>System.Core-net_4_x</Name>\r
</ProjectReference>\r
- <ProjectReference Include="../Mono.CSharp/Mono.CSharp-net_4_x.csproj">\r
- <Project>{BEFCA993-98B4-48E9-8D68-1ACCB1FA7200}</Project>\r
- <Name>Mono.CSharp-net_4_x</Name>\r
+ <ProjectReference Include="../System/System-net_4_x.csproj">\r
+ <Project>{2762E921-91A8-4C87-91E9-BA628013F753}</Project>\r
+ <Name>System-net_4_x</Name>\r
</ProjectReference>\r
</ItemGroup>\r
<ItemGroup>\r
+++ /dev/null
-//
-// Binder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-using System.Linq.Expressions;
-using System.Reflection;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- public static class Binder
- {
- public static CallSiteBinder BinaryOperation (CSharpBinderFlags flags, ExpressionType operation, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpBinaryOperationBinder (operation, flags, context, argumentInfo);
- }
-
- public static CallSiteBinder Convert (CSharpBinderFlags flags, Type type, Type context)
- {
- return new CSharpConvertBinder (type, context, flags);
- }
-
- public static CallSiteBinder GetIndex (CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpGetIndexBinder (context, argumentInfo);
- }
-
- public static CallSiteBinder GetMember (CSharpBinderFlags flags, string name, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpGetMemberBinder (name, context, argumentInfo);
- }
-
- public static CallSiteBinder Invoke (CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpInvokeBinder (flags, context, argumentInfo);
- }
-
- public static CallSiteBinder InvokeConstructor (CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- // What are flags for here
- return new CSharpInvokeConstructorBinder (context, argumentInfo);
- }
-
- public static CallSiteBinder InvokeMember (CSharpBinderFlags flags, string name, IEnumerable<Type> typeArguments, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpInvokeMemberBinder (flags, name, context, typeArguments, argumentInfo);
- }
-
- public static CallSiteBinder IsEvent (CSharpBinderFlags flags, string name, Type context)
- {
- return new CSharpIsEventBinder (name, context);
- }
-
- public static CallSiteBinder SetIndex (CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpSetIndexBinder (flags, context, argumentInfo);
- }
-
- public static CallSiteBinder SetMember (CSharpBinderFlags flags, string name, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpSetMemberBinder (flags, name, context, argumentInfo);
- }
-
- public static CallSiteBinder UnaryOperation (CSharpBinderFlags flags, ExpressionType operation, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- return new CSharpUnaryOperationBinder (operation, flags, context, argumentInfo);
- }
- }
-}
+++ /dev/null
-//
-// CSharpArgumentInfo.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- public sealed class CSharpArgumentInfo
- {
- readonly CSharpArgumentInfoFlags flags;
- readonly string name;
-
- CSharpArgumentInfo (CSharpArgumentInfoFlags flags, string name)
- {
- this.flags = flags;
- this.name = name;
- }
-
- public static CSharpArgumentInfo Create (CSharpArgumentInfoFlags flags, string name)
- {
- return new CSharpArgumentInfo (flags, name);
- }
-
- internal Compiler.Argument.AType ArgumentModifier {
- get {
- if ((flags & CSharpArgumentInfoFlags.IsRef) != 0)
- return Compiler.Argument.AType.Ref;
-
- if ((flags & CSharpArgumentInfoFlags.IsOut) != 0)
- return Compiler.Argument.AType.Out;
-
- return Compiler.Argument.AType.None;
- }
- }
-
- internal static CallInfo CreateCallInfo (IEnumerable<CSharpArgumentInfo> argumentInfo, int skipCount)
- {
- var named = from arg in argumentInfo.Skip (skipCount) where arg.IsNamed select arg.name;
- return new CallInfo (Math.Max (0, argumentInfo.Count () - skipCount), named);
- }
-
- internal CSharpArgumentInfoFlags Flags {
- get { return flags; }
- }
-
- internal bool IsNamed {
- get { return (flags & CSharpArgumentInfoFlags.NamedArgument) != 0; }
- }
-
- internal string Name {
- get { return name; }
- }
- }
-}
+++ /dev/null
-//
-// CSharpArgumentInfoFlags.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- [Flags]
- public enum CSharpArgumentInfoFlags
- {
- None = 0,
- UseCompileTimeType = 1,
- Constant = 2,
- NamedArgument = 4,
- IsRef = 8,
- IsOut = 16,
- IsStaticType = 32
- }
-}
+++ /dev/null
-//
-// CSharpBinaryOperationBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Runtime.CompilerServices;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpBinaryOperationBinder : BinaryOperationBinder
- {
- IList<CSharpArgumentInfo> argumentInfo;
- readonly CSharpBinderFlags flags;
- readonly Type context;
-
- public CSharpBinaryOperationBinder (ExpressionType operation, CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (operation)
- {
- this.argumentInfo = new ReadOnlyCollectionBuilder<CSharpArgumentInfo> (argumentInfo);
- if (this.argumentInfo.Count != 2)
- throw new ArgumentException ("Binary operation requires 2 arguments");
-
- this.flags = flags;
- this.context = context;
- }
-
- Compiler.Binary.Operator GetOperator (out bool isCompound)
- {
- isCompound = false;
- switch (Operation) {
- case ExpressionType.Add:
- return Compiler.Binary.Operator.Addition;
- case ExpressionType.AddAssign:
- isCompound = true;
- return Compiler.Binary.Operator.Addition;
- case ExpressionType.And:
- return (flags & CSharpBinderFlags.BinaryOperationLogical) != 0 ?
- Compiler.Binary.Operator.LogicalAnd : Compiler.Binary.Operator.BitwiseAnd;
- case ExpressionType.AndAssign:
- isCompound = true;
- return Compiler.Binary.Operator.BitwiseAnd;
- case ExpressionType.Divide:
- return Compiler.Binary.Operator.Division;
- case ExpressionType.DivideAssign:
- isCompound = true;
- return Compiler.Binary.Operator.Division;
- case ExpressionType.Equal:
- return Compiler.Binary.Operator.Equality;
- case ExpressionType.ExclusiveOr:
- return Compiler.Binary.Operator.ExclusiveOr;
- case ExpressionType.ExclusiveOrAssign:
- isCompound = true;
- return Compiler.Binary.Operator.ExclusiveOr;
- case ExpressionType.GreaterThan:
- return Compiler.Binary.Operator.GreaterThan;
- case ExpressionType.GreaterThanOrEqual:
- return Compiler.Binary.Operator.GreaterThanOrEqual;
- case ExpressionType.LeftShift:
- return Compiler.Binary.Operator.LeftShift;
- case ExpressionType.LeftShiftAssign:
- isCompound = true;
- return Compiler.Binary.Operator.LeftShift;
- case ExpressionType.LessThan:
- return Compiler.Binary.Operator.LessThan;
- case ExpressionType.LessThanOrEqual:
- return Compiler.Binary.Operator.LessThanOrEqual;
- case ExpressionType.Modulo:
- return Compiler.Binary.Operator.Modulus;
- case ExpressionType.ModuloAssign:
- isCompound = true;
- return Compiler.Binary.Operator.Modulus;
- case ExpressionType.Multiply:
- return Compiler.Binary.Operator.Multiply;
- case ExpressionType.MultiplyAssign:
- isCompound = true;
- return Compiler.Binary.Operator.Multiply;
- case ExpressionType.NotEqual:
- return Compiler.Binary.Operator.Inequality;
- case ExpressionType.Or:
- return (flags & CSharpBinderFlags.BinaryOperationLogical) != 0 ?
- Compiler.Binary.Operator.LogicalOr : Compiler.Binary.Operator.BitwiseOr;
- case ExpressionType.OrAssign:
- isCompound = true;
- return Compiler.Binary.Operator.BitwiseOr;
- case ExpressionType.OrElse:
- return Compiler.Binary.Operator.LogicalOr;
- case ExpressionType.RightShift:
- return Compiler.Binary.Operator.RightShift;
- case ExpressionType.RightShiftAssign:
- isCompound = true;
- return Compiler.Binary.Operator.RightShift;
- case ExpressionType.Subtract:
- return Compiler.Binary.Operator.Subtraction;
- case ExpressionType.SubtractAssign:
- isCompound = true;
- return Compiler.Binary.Operator.Subtraction;
- default:
- throw new NotImplementedException (Operation.ToString ());
- }
- }
-
- public override DynamicMetaObject FallbackBinaryOperation (DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var left = ctx.CreateCompilerExpression (argumentInfo [0], target);
- var right = ctx.CreateCompilerExpression (argumentInfo [1], arg);
-
- bool is_compound;
- var oper = GetOperator (out is_compound);
- Compiler.Expression expr;
-
- if (is_compound) {
- var target_expr = new Compiler.RuntimeValueExpression (target, ctx.ImportType (target.LimitType));
- expr = new Compiler.CompoundAssign (oper, target_expr, right, left);
- } else {
- expr = new Compiler.Binary (oper, left, right);
- }
-
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- if ((flags & CSharpBinderFlags.CheckedContext) != 0)
- expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (arg);
-
- return binder.Bind (ctx, context);
- }
- }
-}
+++ /dev/null
-//
-// CSharpBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Linq.Expressions;
-using Compiler = Mono.CSharp;
-using System.Reflection;
-using System.Collections.Generic;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpBinder
- {
- static ConstructorInfo binder_exception_ctor;
- static object resolver = new object ();
-
- DynamicMetaObjectBinder binder;
- Compiler.Expression expr;
- BindingRestrictions restrictions;
- DynamicMetaObject errorSuggestion;
-
- public CSharpBinder (DynamicMetaObjectBinder binder, Compiler.Expression expr, DynamicMetaObject errorSuggestion)
- {
- this.binder = binder;
- this.expr = expr;
- this.restrictions = BindingRestrictions.Empty;
- this.errorSuggestion = errorSuggestion;
- }
-
- public Compiler.ResolveContext.Options ResolveOptions { get; set; }
-
- public void AddRestrictions (DynamicMetaObject arg)
- {
- restrictions = restrictions.Merge (CreateRestrictionsOnTarget (arg));
- }
-
- public void AddRestrictions (DynamicMetaObject[] args)
- {
- restrictions = restrictions.Merge (CreateRestrictionsOnTarget (args));
- }
-
- public DynamicMetaObject Bind (DynamicContext ctx, Type callingType)
- {
- Expression res;
- try {
- var rc = new Compiler.ResolveContext (new RuntimeBinderContext (ctx, callingType), ResolveOptions);
-
- // Static typemanager and internal caches are not thread-safe
- lock (resolver) {
- expr = expr.Resolve (rc, Compiler.ResolveFlags.VariableOrValue);
- }
-
- if (expr == null)
- throw new RuntimeBinderInternalCompilerException ("Expression resolved to null");
-
- res = expr.MakeExpression (new Compiler.BuilderContext ());
- } catch (RuntimeBinderException e) {
- if (errorSuggestion != null)
- return errorSuggestion;
-
- res = CreateBinderException (e.Message);
- } catch (Exception) {
- if (errorSuggestion != null)
- return errorSuggestion;
-
- throw;
- }
-
- return new DynamicMetaObject (res, restrictions);
- }
-
- Expression CreateBinderException (string message)
- {
- if (binder_exception_ctor == null)
- binder_exception_ctor = typeof (RuntimeBinderException).GetConstructor (new[] { typeof (string) });
-
- //
- // Uses target type to keep expressions composition working
- //
- return Expression.Throw (Expression.New (binder_exception_ctor, Expression.Constant (message)), binder.ReturnType);
- }
-
- static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject arg)
- {
- return arg.HasValue && arg.Value == null ?
- BindingRestrictions.GetInstanceRestriction (arg.Expression, null) :
- BindingRestrictions.GetTypeRestriction (arg.Expression, arg.LimitType);
- }
-
- public static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject[] args)
- {
- if (args.Length == 0)
- return BindingRestrictions.Empty;
-
- var res = CreateRestrictionsOnTarget (args[0]);
- for (int i = 1; i < args.Length; ++i)
- res = res.Merge (CreateRestrictionsOnTarget (args[i]));
-
- return res;
- }
- }
-}
+++ /dev/null
-//
-// CSharpBinderFlags.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- [Flags]
- public enum CSharpBinderFlags
- {
- None = 0,
- CheckedContext = 1,
- InvokeSimpleName = 1 << 1,
- InvokeSpecialName = 1 << 2,
- BinaryOperationLogical = 1 << 3,
- ConvertExplicit = 1 << 4,
- ConvertArrayIndex = 1 << 5,
- ResultIndexed = 1 << 6,
- ValueFromCompoundAssignment = 1 << 7,
- ResultDiscarded = 1 << 8
- }
-}
+++ /dev/null
-//
-// CSharpConvertBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpConvertBinder : ConvertBinder
- {
- readonly CSharpBinderFlags flags;
- readonly Type context;
-
- public CSharpConvertBinder (Type type, Type context, CSharpBinderFlags flags)
- : base (type, (flags & CSharpBinderFlags.ConvertExplicit) != 0)
- {
- this.flags = flags;
- this.context = context;
- }
-
- public override DynamicMetaObject FallbackConvert (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var expr = ctx.CreateCompilerExpression (null, target);
-
- if (Explicit)
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (Type), Compiler.Location.Null), expr, Compiler.Location.Null);
- else
- expr = new Compiler.ImplicitCast (expr, ctx.ImportType (Type), (flags & CSharpBinderFlags.ConvertArrayIndex) != 0);
-
- if ((flags & CSharpBinderFlags.CheckedContext) != 0)
- expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
-
- return binder.Bind (ctx, context);
- }
- }
-}
+++ /dev/null
-//
-// CSharpGetIndexBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpGetIndexBinder : GetIndexBinder
- {
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
-
- public CSharpGetIndexBinder (Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (CSharpArgumentInfo.CreateCallInfo (argumentInfo, 1))
- {
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackGetIndex (DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion)
- {
- if (argumentInfo.Count != indexes.Length + 1) {
- if (errorSuggestion == null)
- throw new NotImplementedException ();
-
- return errorSuggestion;
- }
-
- var ctx = DynamicContext.Create ();
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
- var args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
- expr = new Compiler.ElementAccess (expr, args, Compiler.Location.Null);
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (indexes);
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpGetMemberBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpGetMemberBinder : GetMemberBinder
- {
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
-
- public CSharpGetMemberBinder (string name, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (name, false)
- {
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackGetMember (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
-
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
- expr = new Compiler.MemberAccess (expr, Name);
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpInvokeBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpInvokeBinder : InvokeBinder
- {
- readonly CSharpBinderFlags flags;
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
-
- public CSharpInvokeBinder (CSharpBinderFlags flags, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (CSharpArgumentInfo.CreateCallInfo (argumentInfo, 1))
- {
- this.flags = flags;
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackInvoke (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
- var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
- expr = new Compiler.Invocation (expr, c_args);
-
- if ((flags & CSharpBinderFlags.ResultDiscarded) == 0)
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
- else
- expr = new Compiler.DynamicResultCast (ctx.ImportType (ReturnType), expr);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (args);
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpInvokeConstructorBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpInvokeConstructorBinder : DynamicMetaObjectBinder
- {
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
- Type target_return_type;
-
- public CSharpInvokeConstructorBinder (Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- {
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject Bind (DynamicMetaObject target, DynamicMetaObject[] args)
- {
- var ctx = DynamicContext.Create ();
-
- var type = ctx.CreateCompilerExpression (argumentInfo [0], target);
- target_return_type = type.Type.GetMetaInfo ();
-
- var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
-
- var binder = new CSharpBinder (
- this, new Compiler.New (type, c_args, Compiler.Location.Null), null);
-
- binder.AddRestrictions (target);
- binder.AddRestrictions (args);
-
- return binder.Bind (ctx, callingContext);
- }
-
- public override Type ReturnType {
- get {
- return target_return_type;
- }
- }
- }
-}
+++ /dev/null
-//
-// CSharpInvokeMemberBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-using SLE = System.Linq.Expressions;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpInvokeMemberBinder : InvokeMemberBinder
- {
- //
- // A custom runtime invocation is needed to deal with member invocation which
- // is not real member invocation but invocation on invocalble member.
- //
- // An example:
- // class C {
- // dynamic f;
- // void Foo ()
- // {
- // dynamic d = new C ();
- // d.f.M ();
- // }
- //
- // The runtime value of `f' can be a delegate in which case we are invoking result
- // of member invocation, this is already handled by DoResolveDynamic but we need
- // more runtime dependencies which require Microsoft.CSharp assembly reference or
- // a lot of reflection calls
- //
- class Invocation : Compiler.Invocation
- {
- sealed class RuntimeDynamicInvocation : Compiler.ShimExpression
- {
- Invocation invoke;
-
- public RuntimeDynamicInvocation (Invocation invoke, Compiler.Expression memberExpr)
- : base (memberExpr)
- {
- this.invoke = invoke;
- }
-
- protected override Compiler.Expression DoResolve (Compiler.ResolveContext rc)
- {
- type = expr.Type;
- eclass = Compiler.ExprClass.Value;
- return this;
- }
-
- //
- // Creates an invoke call on invocable expression
- //
- public override System.Linq.Expressions.Expression MakeExpression (Compiler.BuilderContext ctx)
- {
- var invokeBinder = invoke.invokeBinder;
- var binder = Binder.Invoke (invokeBinder.flags, invokeBinder.callingContext, invokeBinder.argumentInfo);
-
- var args = invoke.Arguments;
- var args_expr = new SLE.Expression[invokeBinder.argumentInfo.Count];
-
- var types = new Type [args_expr.Length + 2];
-
- // Required by MakeDynamic
- types[0] = typeof (System.Runtime.CompilerServices.CallSite);
- types[1] = expr.Type.GetMetaInfo ();
-
- args_expr[0] = expr.MakeExpression (ctx);
-
- for (int i = 0; i < args.Count; ++i) {
- args_expr[i + 1] = args[i].Expr.MakeExpression (ctx);
-
- int type_index = i + 2;
- types[type_index] = args[i].Type.GetMetaInfo ();
- if (args[i].IsByRef)
- types[type_index] = types[type_index].MakeByRefType ();
- }
-
- // Return type goes last
- bool void_result = (invokeBinder.flags & CSharpBinderFlags.ResultDiscarded) != 0;
- types[types.Length - 1] = void_result ? typeof (void) : invokeBinder.ReturnType;
-
- //
- // Much easier to use Expression.Dynamic cannot be used because it ignores ByRef arguments
- // and it always generates either Func or Action and any value type argument is lost
- //
- Type delegateType = SLE.Expression.GetDelegateType (types);
- return SLE.Expression.MakeDynamic (delegateType, binder, args_expr);
- }
- }
-
- readonly CSharpInvokeMemberBinder invokeBinder;
-
- public Invocation (Compiler.Expression expr, Compiler.Arguments arguments, CSharpInvokeMemberBinder invokeBinder)
- : base (expr, arguments)
- {
- this.invokeBinder = invokeBinder;
- }
-
- protected override Compiler.Expression DoResolveDynamic (Compiler.ResolveContext ec, Compiler.Expression memberExpr)
- {
- return new RuntimeDynamicInvocation (this, memberExpr).Resolve (ec);
- }
- }
-
- readonly CSharpBinderFlags flags;
- IList<CSharpArgumentInfo> argumentInfo;
- IList<Type> typeArguments;
- Type callingContext;
-
- public CSharpInvokeMemberBinder (CSharpBinderFlags flags, string name, Type callingContext, IEnumerable<Type> typeArguments, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (name, false, CSharpArgumentInfo.CreateCallInfo (argumentInfo, 1))
- {
- this.flags = flags;
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- this.typeArguments = typeArguments.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackInvoke (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
- {
- var b = new CSharpInvokeBinder (flags, callingContext, argumentInfo);
-
- // TODO: Is errorSuggestion ever used?
- return b.Defer (target, args);
- }
-
- public override DynamicMetaObject FallbackInvokeMember (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
- var t_args = typeArguments == null ?
- null :
- new Compiler.TypeArguments (typeArguments.Select (l => new Compiler.TypeExpression (ctx.ImportType (l), Compiler.Location.Null)).ToArray ());
-
- var expr = ctx.CreateCompilerExpression (argumentInfo[0], target);
-
- //
- // Simple name invocation is actually member access invocation
- // to capture original this argument. This brings problem when
- // simple name is resolved as a static invocation and member access
- // has to be reduced back to simple name without reporting an error
- //
- if ((flags & CSharpBinderFlags.InvokeSimpleName) != 0) {
- var value = expr as Compiler.RuntimeValueExpression;
- if (value != null)
- value.IsSuggestionOnly = true;
- }
-
- expr = new Compiler.MemberAccess (expr, Name, t_args, Compiler.Location.Null);
- expr = new Invocation (expr, c_args, this);
-
- if ((flags & CSharpBinderFlags.ResultDiscarded) == 0)
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
- else
- expr = new Compiler.DynamicResultCast (ctx.ImportType (ReturnType), expr);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (args);
-
- if ((flags & CSharpBinderFlags.InvokeSpecialName) != 0)
- binder.ResolveOptions |= Compiler.ResolveContext.Options.InvokeSpecialName;
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpIsEventBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpIsEventBinder : DynamicMetaObjectBinder
- {
- Type callingContext;
- string name;
-
- public CSharpIsEventBinder (string name, Type callingContext)
- {
- this.name = name;
- this.callingContext = callingContext;
- }
-
- public override DynamicMetaObject Bind (DynamicMetaObject target, DynamicMetaObject[] args)
- {
- var ctx = DynamicContext.Create ();
- var context_type = ctx.ImportType (callingContext);
- var queried_type = ctx.ImportType (target.LimitType);
- var rc = new Compiler.ResolveContext (new RuntimeBinderContext (ctx, context_type), 0);
-
- var expr = Compiler.Expression.MemberLookup (rc, false, queried_type,
- name, 0, Compiler.Expression.MemberLookupRestrictions.ExactArity, Compiler.Location.Null);
-
- var binder = new CSharpBinder (
- this, new Compiler.BoolConstant (ctx.CompilerContext.BuiltinTypes, expr is Compiler.EventExpr, Compiler.Location.Null), null);
-
- binder.AddRestrictions (target);
- return binder.Bind (ctx, callingContext);
- }
-
- public override Type ReturnType {
- get {
- return typeof (bool);
- }
- }
- }
-}
+++ /dev/null
-//
-// CSharpSetIndexBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpSetIndexBinder : SetIndexBinder
- {
- readonly CSharpBinderFlags flags;
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
-
- public CSharpSetIndexBinder (CSharpBinderFlags flags, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (CSharpArgumentInfo.CreateCallInfo (argumentInfo, 2))
- {
- this.flags = flags;
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackSetIndex (DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
- {
- if (argumentInfo.Count != indexes.Length + 2) {
- if (errorSuggestion == null)
- throw new NotImplementedException ();
-
- return errorSuggestion;
- }
-
- var ctx = DynamicContext.Create ();
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
- var args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
- expr = new Compiler.ElementAccess (expr, args, Compiler.Location.Null);
-
- var source = ctx.CreateCompilerExpression (argumentInfo [indexes.Length + 1], value);
-
- // Same conversion as in SetMemberBinder
- if ((flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0) {
- expr = new Compiler.RuntimeExplicitAssign (expr, source);
- } else {
- expr = new Compiler.SimpleAssign (expr, source);
- }
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- if ((flags & CSharpBinderFlags.CheckedContext) != 0)
- expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (value);
- binder.AddRestrictions (indexes);
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpSetMemberBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpSetMemberBinder : SetMemberBinder
- {
- readonly CSharpBinderFlags flags;
- IList<CSharpArgumentInfo> argumentInfo;
- Type callingContext;
-
- public CSharpSetMemberBinder (CSharpBinderFlags flags, string name, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (name, false)
- {
- this.flags = flags;
- this.callingContext = callingContext;
- this.argumentInfo = argumentInfo.ToReadOnly ();
- }
-
- public override DynamicMetaObject FallbackSetMember (DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var source = ctx.CreateCompilerExpression (argumentInfo [1], value);
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
-
- // Field assignment
- expr = new Compiler.MemberAccess (expr, Name);
-
- // Compound assignment under dynamic context does not convert result
- // expression but when setting member type we need to do explicit
- // conversion to ensure type match between member type and dynamic
- // expression type
- if ((flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0) {
- expr = new Compiler.RuntimeExplicitAssign (expr, source);
- } else {
- expr = new Compiler.SimpleAssign (expr, source);
- }
-
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- if ((flags & CSharpBinderFlags.CheckedContext) != 0)
- expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
- binder.AddRestrictions (value);
-
- return binder.Bind (ctx, callingContext);
- }
- }
-}
+++ /dev/null
-//
-// CSharpUnaryOperationBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class CSharpUnaryOperationBinder : UnaryOperationBinder
- {
- IList<CSharpArgumentInfo> argumentInfo;
- readonly CSharpBinderFlags flags;
- readonly Type context;
-
- public CSharpUnaryOperationBinder (ExpressionType operation, CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
- : base (operation)
- {
- this.argumentInfo = argumentInfo.ToReadOnly ();
- if (this.argumentInfo.Count != 1)
- throw new ArgumentException ("Unary operation requires 1 argument");
-
- this.flags = flags;
- this.context = context;
- }
-
-
- Compiler.Unary.Operator GetOperator ()
- {
- switch (Operation) {
- case ExpressionType.Negate:
- return Compiler.Unary.Operator.UnaryNegation;
- case ExpressionType.Not:
- return Compiler.Unary.Operator.LogicalNot;
- case ExpressionType.OnesComplement:
- return Compiler.Unary.Operator.OnesComplement;
- case ExpressionType.UnaryPlus:
- return Compiler.Unary.Operator.UnaryPlus;
- default:
- throw new NotImplementedException (Operation.ToString ());
- }
- }
-
- public override DynamicMetaObject FallbackUnaryOperation (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
- {
- var ctx = DynamicContext.Create ();
- var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
-
- if (Operation == ExpressionType.IsTrue) {
- expr = new Compiler.BooleanExpression (expr);
- } else if (Operation == ExpressionType.IsFalse) {
- expr = new Compiler.BooleanExpressionFalse (expr);
- } else {
- if (Operation == ExpressionType.Increment)
- expr = new Compiler.UnaryMutator (Compiler.UnaryMutator.Mode.PreIncrement, expr, Compiler.Location.Null);
- else if (Operation == ExpressionType.Decrement)
- expr = new Compiler.UnaryMutator (Compiler.UnaryMutator.Mode.PreDecrement, expr, Compiler.Location.Null);
- else
- expr = new Compiler.Unary (GetOperator (), expr, Compiler.Location.Null);
-
- expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
-
- if ((flags & CSharpBinderFlags.CheckedContext) != 0)
- expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
- }
-
- var binder = new CSharpBinder (this, expr, errorSuggestion);
- binder.AddRestrictions (target);
-
- return binder.Bind (ctx, context);
- }
- }
-}
+++ /dev/null
-//
-// DynamicContext.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using Compiler = Mono.CSharp;
-using System.Reflection;
-using System.Collections.Generic;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class DynamicContext
- {
- static DynamicContext dc;
- static object compiler_initializer = new object ();
- static object lock_object = new object ();
-
- readonly Compiler.ModuleContainer module;
- readonly Compiler.ReflectionImporter importer;
-
- private DynamicContext (Compiler.ModuleContainer module, Compiler.ReflectionImporter importer)
- {
- this.module = module;
- this.importer = importer;
- }
-
- public Compiler.CompilerContext CompilerContext {
- get {
- return module.Compiler;
- }
- }
-
- public Compiler.ModuleContainer Module {
- get {
- return module;
- }
- }
-
- public static DynamicContext Create ()
- {
- if (dc != null)
- return dc;
-
- lock (compiler_initializer) {
- if (dc != null)
- return dc;
-
- var settings = new Compiler.CompilerSettings () {
- WarningLevel = 0
- };
-
- var cc = new Compiler.CompilerContext (settings, ErrorPrinter.Instance) {
- IsRuntimeBinder = true
- };
-
- //
- // Any later loaded assemblies are handled internally by GetAssemblyDefinition
- // domain.AssemblyLoad cannot be used as that would be too destructive as we
- // would hold all loaded assemblies even if they can be never visited
- //
- // TODO: Remove this code and rely on GetAssemblyDefinition only
- //
- var module = new Compiler.ModuleContainer (cc);
- module.HasTypesFullyDefined = true;
-
- // Setup fake assembly, it's used mostly to simplify checks like friend-access
- var temp = new Compiler.AssemblyDefinitionDynamic (module, "dynamic");
- module.SetDeclaringAssembly (temp);
-
- var importer = new Compiler.ReflectionImporter (module, cc.BuiltinTypes) {
- IgnorePrivateMembers = false
- };
-
- // Import all currently loaded assemblies
- // TODO: Rewrite this to populate type cache on-demand, that should greatly
- // reduce our start-up cost
- var domain = AppDomain.CurrentDomain;
- foreach (var a in AppDomain.CurrentDomain.GetAssemblies ()) {
- importer.ImportAssembly (a, module.GlobalRootNamespace);
- }
-
- cc.BuiltinTypes.CheckDefinitions (module);
- module.InitializePredefinedTypes ();
-
- dc = new DynamicContext (module, importer);
- }
-
- return dc;
- }
-
- //
- // Creates mcs expression from dynamic object
- //
- public Compiler.Expression CreateCompilerExpression (CSharpArgumentInfo info, DynamicMetaObject value)
- {
- //
- // No type details provider, go with runtime type
- //
- if (info == null) {
- if (value.LimitType == typeof (object))
- return new Compiler.NullLiteral (Compiler.Location.Null);
-
- return new Compiler.RuntimeValueExpression (value, ImportType (value.RuntimeType));
- }
-
- //
- // Value is known to be a type
- //
- if ((info.Flags & CSharpArgumentInfoFlags.IsStaticType) != 0)
- return new Compiler.TypeExpression (ImportType ((Type) value.Value), Compiler.Location.Null);
-
- if (value.Value == null &&
- (info.Flags & (CSharpArgumentInfoFlags.IsOut | CSharpArgumentInfoFlags.IsRef | CSharpArgumentInfoFlags.UseCompileTimeType)) == 0 &&
- value.LimitType == typeof (object)) {
- return new Compiler.NullLiteral (Compiler.Location.Null);
- }
-
- //
- // Use compilation time type when type was known not to be dynamic during compilation
- //
- Type value_type = (info.Flags & CSharpArgumentInfoFlags.UseCompileTimeType) != 0 ? value.Expression.Type : value.LimitType;
- var type = ImportType (value_type);
-
- if ((info.Flags & CSharpArgumentInfoFlags.Constant) != 0) {
- var c = Compiler.Constant.CreateConstantFromValue (type, value.Value, Compiler.Location.Null);
- //
- // It can be null for misused Constant flag
- //
- if (c != null)
- return c;
- }
-
- return new Compiler.RuntimeValueExpression (value, type);
- }
-
- //
- // Creates mcs arguments from dynamic argument info
- //
- public Compiler.Arguments CreateCompilerArguments (IEnumerable<CSharpArgumentInfo> info, DynamicMetaObject[] args)
- {
- var res = new Compiler.Arguments (args.Length);
- int pos = 0;
-
- // enumerates over args
- foreach (var item in info) {
- var expr = CreateCompilerExpression (item, args[pos++]);
- if (item.IsNamed) {
- res.Add (new Compiler.NamedArgument (item.Name, Compiler.Location.Null, expr, item.ArgumentModifier));
- } else {
- res.Add (new Compiler.Argument (expr, item.ArgumentModifier));
- }
-
- if (pos == args.Length)
- break;
- }
-
- return res;
- }
-
- public Compiler.TypeSpec ImportType (Type type)
- {
- lock (lock_object) {
- return importer.ImportType (type);
- }
- }
- }
-}
+++ /dev/null
-//
-// ErrorPrinter.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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 Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- class ErrorPrinter : Compiler.ReportPrinter
- {
- public static readonly ErrorPrinter Instance = new ErrorPrinter ();
-
- private ErrorPrinter ()
- {
- }
-
- public override bool HasRelatedSymbolSupport {
- get {
- return false;
- }
- }
-
- public override void Print (Compiler.AbstractMessage msg, bool showFullPath)
- {
- string text;
- if (msg.Code == 214) {
- text = "Pointers and fixed size buffers cannot be used in a dynamic context";
- } else {
- text = msg.Text;
- }
-
- throw new RuntimeBinderException (text);
- }
- }
-}
+++ /dev/null
-//
-// CSharpInvokeMemberBinder.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Dynamic;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.CompilerServices;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- static class Extensions
- {
- public static IList<T> ToReadOnly<T> (this IEnumerable<T> col)
- {
- return col == null ?
- null : new ReadOnlyCollectionBuilder<T> (col);
- }
- }
-}
+++ /dev/null
-//
-// RuntimeBinderContext.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Collections.Generic;
-using Compiler = Mono.CSharp;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- sealed class RuntimeBinderContext : Compiler.IMemberContext
- {
- readonly Compiler.ModuleContainer module;
- readonly Type callingType;
- readonly DynamicContext ctx;
- Compiler.TypeSpec callingTypeImported;
-
- public RuntimeBinderContext (DynamicContext ctx, Compiler.TypeSpec callingType)
- {
- this.ctx = ctx;
- this.module = ctx.Module;
- this.callingTypeImported = callingType;
- }
-
- public RuntimeBinderContext (DynamicContext ctx, Type callingType)
- {
- this.ctx = ctx;
- this.module = ctx.Module;
- this.callingType = callingType;
- }
-
- #region IMemberContext Members
-
- public Compiler.TypeSpec CurrentType {
- get {
- //
- // Delay importing of calling type to be compatible with .net
- // Some libraries are setting it to null which is invalid
- // but the NullReferenceException is thrown only when the context
- // is used and not during initialization
- //
- if (callingTypeImported == null && callingType != null)
- callingTypeImported = ctx.ImportType (callingType);
-
- return callingTypeImported;
- }
- }
-
- public Compiler.TypeParameters CurrentTypeParameters {
- get { throw new NotImplementedException (); }
- }
-
- public Compiler.MemberCore CurrentMemberDefinition {
- get {
- return null;
- }
- }
-
- public bool IsObsolete {
- get {
- // Always true to ignore obsolete attribute checks
- return true;
- }
- }
-
- public bool IsUnsafe {
- get {
- // Dynamic cannot be used with pointers
- return false;
- }
- }
-
- public bool IsStatic {
- get {
- throw new NotImplementedException ();
- }
- }
-
- public Compiler.ModuleContainer Module {
- get {
- return module;
- }
- }
-
- public string GetSignatureForError ()
- {
- throw new NotImplementedException ();
- }
-
- public Compiler.ExtensionMethodCandidates LookupExtensionMethod (string name, int arity)
- {
- // No extension method lookup in this context
- return null;
- }
-
- public Compiler.FullNamedExpression LookupNamespaceOrType (string name, int arity, Mono.CSharp.LookupMode mode, Mono.CSharp.Location loc)
- {
- throw new NotImplementedException ();
- }
-
- public Compiler.FullNamedExpression LookupNamespaceAlias (string name)
- {
- // No namespace aliases in this context
- return null;
- }
-
- #endregion
- }
-}
+++ /dev/null
-//
-// RuntimeBinderException.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Runtime.Serialization;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- [Serializable]
- public class RuntimeBinderException : Exception
- {
- public RuntimeBinderException ()
- {
- }
-
- public RuntimeBinderException (string message)
- : base (message)
- {
- }
-
- public RuntimeBinderException (string message, Exception innerException)
- : base (message, innerException)
- {
- }
-
- protected RuntimeBinderException (SerializationInfo info, StreamingContext context)
- : base (info, context)
- {
- }
- }
-}
+++ /dev/null
-//
-// RuntimeBinderInternalCompilerException.cs
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2009 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.Runtime.Serialization;
-
-namespace Microsoft.CSharp.RuntimeBinder
-{
- [Serializable]
- public class RuntimeBinderInternalCompilerException : Exception
- {
- public RuntimeBinderInternalCompilerException ()
- {
- }
-
- public RuntimeBinderInternalCompilerException (string message)
- : base (message)
- {
- }
-
- public RuntimeBinderInternalCompilerException (string message, Exception innerException)
- : base (message, innerException)
- {
- }
-
- protected RuntimeBinderInternalCompilerException (SerializationInfo info, StreamingContext context)
- : base (info, context)
- {
- }
- }
-}
Assembly/AssemblyInfo.cs
-Microsoft.CSharp.RuntimeBinder/Binder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfo.cs
-Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfoFlags.cs
-Microsoft.CSharp.RuntimeBinder/CSharpBinaryOperationBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpBinderFlags.cs
-Microsoft.CSharp.RuntimeBinder/CSharpConvertBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpGetIndexBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpGetMemberBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpInvokeBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpInvokeConstructorBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpIsEventBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpSetIndexBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpSetMemberBinder.cs
-Microsoft.CSharp.RuntimeBinder/CSharpUnaryOperationBinder.cs
-Microsoft.CSharp.RuntimeBinder/DynamicContext.cs
-Microsoft.CSharp.RuntimeBinder/Extensions.cs
-Microsoft.CSharp.RuntimeBinder/RuntimeBinderContext.cs
-Microsoft.CSharp.RuntimeBinder/RuntimeBinderException.cs
-Microsoft.CSharp.RuntimeBinder/RuntimeBinderInternalCompilerException.cs
-Microsoft.CSharp.RuntimeBinder/CSharpBinder.cs
-Microsoft.CSharp.RuntimeBinder/ErrorPrinter.cs
+../../build/common/SR.cs
+../../build/common/Consts.cs
+
+corefx/SR.cs
+
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Binder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/BinderHelper.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpArgumentInfo.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpArgumentInfoFlags.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpBinaryOperationBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpBinaryOperationFlags.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpBinderFlags.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpCallFlags.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpConversionKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpConvertBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpGetIndexBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpGetMemberBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpInvokeBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpInvokeConstructorBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpInvokeMemberBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpIsEventBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpSetIndexBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpSetMemberBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/CSharpUnaryOperationBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Error.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/CController.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/CError.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/CErrorFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/CParameterizedError.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/ErrorCode.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/ErrorFacts.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/ErrorFmt.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/ErrorHandling.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/IErrorSink.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/MessageID.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Errors/UserStringBuilder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ExpressionTreeCallRewriter.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ICSharpInvokeOrInvokeMemberBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ResetBindException.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderController.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderException.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderExtensions.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/RuntimeBinderInternalCompilerException.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Binding/Better.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Binding/ErrorReporting.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BindingContextBase.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BindingContexts.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BindingFlag.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BinOpArgInfo.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BinOpKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/BinOpSig.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/CandidateFunctionMember.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ConstVal.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ConstValFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Conversion.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Conversions.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/COperators.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Declarations/AggregateDeclaration.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Declarations/Declaration.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Declarations/GlobalAttributeDeclaration.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Declarations/NamespaceDeclaration.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ExplicitConversion.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ExpressionBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ExpressionKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/EXPRExtensions.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ExprFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/EXPRFLAG.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/FileRecord.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/FundamentalTypes.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/GlobalSymbolContext.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/GroupToArgsBinder.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/GroupToArgsBinderResult.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ImplicitConversion.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/InputFile.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/ITypeOrNamespace.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/LangCompiler.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MemberLookup.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MemberLookupResults.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MetadataToken.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MethodIterator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MethodKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/MethodTypeInferrer.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/NameGenerator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Nullable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/NullableLift.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Operators.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/OriginalExpressions.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/PredefinedAttributes.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/PredefinedMembers.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/SemanticChecker.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/SubstitutionContext.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/AggregateSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/AssemblyQualifiedNamespaceSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/EventSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/FieldSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/IndexerSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/LabelSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/LocalVariableSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/MethodOrPropertySymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/MethodSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/MiscSymFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/NamespaceOrAggregateSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/NamespaceSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/ParentSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/PropertySymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/Scope.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/Symbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymbolKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymbolLoader.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymbolManagerBase.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymbolMask.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymbolTable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/SymFactoryBase.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/TransparentIdentifierMemberSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/TypeParameterSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/UnresolvedAggregateSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Symbols/VariableSymbol.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ArrayIndex.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ArrayInitialization.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ArrayLength.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Assignment.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/BinaryOperator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Block.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/BoundAnonymousFunction.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Call.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Cast.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Class.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/CompoundOperator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Concatenate.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ConditionalOperator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Constant.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Event.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/EXPR.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ExpressionIterator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Field.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/FieldInfo.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/HoistedLocal.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/List.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/LocalVariable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/MemberGroup.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/MethodInfo.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/MethodReference.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/NamedArgumentSpecification.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Property.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/PropertyInfo.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Return.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Statement.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Temporary.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/This.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/TypeArguments.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/TypeOf.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/TypeOrNamespace.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/UnaryOperator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/UnboundAnonymousFunction.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/UserDefinedConversion.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/UserDefinedLogicalOperator.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Visitors/ExpressionTreeRewriter.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/Visitors/ExprVisitorBase.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Tree/ZeroInitialize.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/TypeBind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/AggregateType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/ArgumentListType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/ArrayType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/BoundLambdaType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/ErrorType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/MethodGroupType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/NullableType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/NullType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/OpenTypePlaceholderType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/ParameterModifierType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/PointerType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/PredefinedTypes.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/Type.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeArray.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeFactory.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeKind.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeManager.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeParameterType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/TypeTable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/Types/VoidType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/UnaOpSig.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/UtilityTypeExtensions.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Semantics/WithType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/SpecialNames.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/SymbolTable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/KnownName.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/NameManager.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/Names.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/NameTable.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/Operators.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/PredefinedName.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/PredefinedType.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/TokenFacts.cs
+../../../external/corefx/src/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/Syntax/TokenKind.cs
--- /dev/null
+//
+// This file was generated by resx2sr tool
+//
+
+partial class SR
+{
+ public const string InternalCompilerError = "An unexpected exception occurred while binding a dynamic operation";
+ public const string BindRequireArguments = "Cannot bind call with no calling object";
+ public const string BindCallFailedOverloadResolution = "Overload resolution failed";
+ public const string BindBinaryOperatorRequireTwoArguments = "Binary operators must be invoked with two arguments";
+ public const string BindUnaryOperatorRequireOneArgument = "Unary operators must be invoked with one argument";
+ public const string BindPropertyFailedMethodGroup = "The name '{0}' is bound to a method and cannot be used like a property";
+ public const string BindPropertyFailedEvent = "The event '{0}' can only appear on the left hand side of +";
+ public const string BindInvokeFailedNonDelegate = "Cannot invoke a non-delegate type";
+ public const string BindImplicitConversionRequireOneArgument = "Implicit conversion takes exactly one argument";
+ public const string BindExplicitConversionRequireOneArgument = "Explicit conversion takes exactly one argument";
+ public const string BindBinaryAssignmentRequireTwoArguments = "Binary operators cannot be invoked with one argument";
+ public const string BindBinaryAssignmentFailedNullReference = "Cannot perform member assignment on a null reference";
+ public const string NullReferenceOnMemberException = "Cannot perform runtime binding on a null reference";
+ public const string BindCallToConditionalMethod = "Cannot dynamically invoke method '{0}' because it has a Conditional attribute";
+ public const string BindToVoidMethodButExpectResult = "Cannot implicitly convert type 'void' to 'object'";
+ public const string BadBinaryOps = "Operator '{0}' cannot be applied to operands of type '{1}' and '{2}'";
+ public const string IntDivByZero = "Division by constant zero";
+ public const string BadIndexLHS = "Cannot apply indexing with [] to an expression of type '{0}'";
+ public const string BadIndexCount = "Wrong number of indices inside []; expected '{0}'";
+ public const string BadUnaryOp = "Operator '{0}' cannot be applied to operand of type '{1}'";
+ public const string NoImplicitConv = "Cannot implicitly convert type '{0}' to '{1}'";
+ public const string NoExplicitConv = "Cannot convert type '{0}' to '{1}'";
+ public const string ConstOutOfRange = "Constant value '{0}' cannot be converted to a '{1}'";
+ public const string AmbigBinaryOps = "Operator '{0}' is ambiguous on operands of type '{1}' and '{2}'";
+ public const string AmbigUnaryOp = "Operator '{0}' is ambiguous on an operand of type '{1}'";
+ public const string ValueCantBeNull = "Cannot convert null to '{0}' because it is a non-nullable value type";
+ public const string WrongNestedThis = "Cannot access a non-static member of outer type '{0}' via nested type '{1}'";
+ public const string NoSuchMember = "'{0}' does not contain a definition for '{1}'";
+ public const string ObjectRequired = "An object reference is required for the non-static field, method, or property '{0}'";
+ public const string AmbigCall = "The call is ambiguous between the following methods or properties: '{0}' and '{1}'";
+ public const string BadAccess = "'{0}' is inaccessible due to its protection level";
+ public const string MethDelegateMismatch = "No overload for '{0}' matches delegate '{1}'";
+ public const string AssgLvalueExpected = "The left-hand side of an assignment must be a variable, property or indexer";
+ public const string NoConstructors = "The type '{0}' has no constructors defined";
+ public const string BadDelegateConstructor = "The delegate '{0}' does not have a valid constructor";
+ public const string PropertyLacksGet = "The property or indexer '{0}' cannot be used in this context because it lacks the get accessor";
+ public const string ObjectProhibited = "Member '{0}' cannot be accessed with an instance reference; qualify it with a type name instead";
+ public const string AssgReadonly = "A readonly field cannot be assigned to (except in a constructor or a variable initializer)";
+ public const string RefReadonly = "A readonly field cannot be passed ref or out (except in a constructor)";
+ public const string AssgReadonlyStatic = "A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)";
+ public const string RefReadonlyStatic = "A static readonly field cannot be passed ref or out (except in a static constructor)";
+ public const string AssgReadonlyProp = "Property or indexer '{0}' cannot be assigned to -- it is read only";
+ public const string AbstractBaseCall = "Cannot call an abstract base member: '{0}'";
+ public const string RefProperty = "A property or indexer may not be passed as an out or ref parameter";
+ public const string ManagedAddr = "Cannot take the address of, get the size of, or declare a pointer to a managed type ('{0}')";
+ public const string FixedNotNeeded = "You cannot use the fixed statement to take the address of an already fixed expression";
+ public const string UnsafeNeeded = "Dynamic calls cannot be used in conjunction with pointers";
+ public const string BadBoolOp = "In order to be applicable as a short circuit operator a user-defined logical operator ('{0}') must have the same return type as the type of its 2 parameters";
+ public const string MustHaveOpTF = "The type ('{0}') must contain declarations of operator true and operator false";
+ public const string CheckedOverflow = "The operation overflows at compile time in checked mode";
+ public const string ConstOutOfRangeChecked = "Constant value '{0}' cannot be converted to a '{1}' (use 'unchecked' syntax to override)";
+ public const string AmbigMember = "Ambiguity between '{0}' and '{1}'";
+ public const string SizeofUnsafe = "'{0}' does not have a predefined size, therefore sizeof can only be used in an unsafe context (consider using System.Runtime.InteropServices.Marshal.SizeOf)";
+ public const string FieldInitRefNonstatic = "A field initializer cannot reference the non-static field, method, or property '{0}'";
+ public const string CallingFinalizeDepracated = "Destructors and object.Finalize cannot be called directly. Consider calling IDisposable.Dispose if available.";
+ public const string CallingBaseFinalizeDeprecated = "Do not directly call your base class Finalize method. It is called automatically from your destructor.";
+ public const string BadCastInFixed = "The right hand side of a fixed statement assignment may not be a cast expression";
+ public const string NoImplicitConvCast = "Cannot implicitly convert type '{0}' to '{1}'. An explicit conversion exists (are you missing a cast?)";
+ public const string InaccessibleGetter = "The property or indexer '{0}' cannot be used in this context because the get accessor is inaccessible";
+ public const string InaccessibleSetter = "The property or indexer '{0}' cannot be used in this context because the set accessor is inaccessible";
+ public const string BadArity = "Using the generic {1} '{0}' requires '{2}' type arguments";
+ public const string BadTypeArgument = "The type '{0}' may not be used as a type argument";
+ public const string TypeArgsNotAllowed = "The {1} '{0}' cannot be used with type arguments";
+ public const string HasNoTypeVars = "The non-generic {1} '{0}' cannot be used with type arguments";
+ public const string NewConstraintNotSatisfied = "'{2}' must be a non-abstract type with a public parameterless constructor in order to use it as parameter '{1}' in the generic type or method '{0}'";
+ public const string GenericConstraintNotSatisfiedRefType = "The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no implicit reference conversion from '{3}' to '{1}'.";
+ public const string GenericConstraintNotSatisfiedNullableEnum = "The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. The nullable type '{3}' does not satisfy the constraint of '{1}'.";
+ public const string GenericConstraintNotSatisfiedNullableInterface = "The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. The nullable type '{3}' does not satisfy the constraint of '{1}'. Nullable types can not satisfy any interface constraints.";
+ public const string GenericConstraintNotSatisfiedTyVar = "The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no boxing conversion or type parameter conversion from '{3}' to '{1}'.";
+ public const string GenericConstraintNotSatisfiedValType = "The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no boxing conversion from '{3}' to '{1}'.";
+ public const string TypeVarCantBeNull = "Cannot convert null to type parameter '{0}' because it could be a non-nullable value type. Consider using 'default({0})' instead.";
+ public const string BadRetType = "'{1} {0}' has the wrong return type";
+ public const string CantInferMethTypeArgs = "The type arguments for method '{0}' cannot be inferred from the usage. Try specifying the type arguments explicitly.";
+ public const string MethGrpToNonDel = "Cannot convert method group '{0}' to non-delegate type '{1}'. Did you intend to invoke the method?";
+ public const string RefConstraintNotSatisfied = "The type '{2}' must be a reference type in order to use it as parameter '{1}' in the generic type or method '{0}'";
+ public const string ValConstraintNotSatisfied = "The type '{2}' must be a non-nullable value type in order to use it as parameter '{1}' in the generic type or method '{0}'";
+ public const string CircularConstraint = "Circular constraint dependency involving '{0}' and '{1}'";
+ public const string BaseConstraintConflict = "Type parameter '{0}' inherits conflicting constraints '{1}' and '{2}'";
+ public const string ConWithValCon = "Type parameter '{1}' has the 'struct' constraint so '{1}' cannot be used as a constraint for '{0}'";
+ public const string AmbigUDConv = "Ambiguous user defined conversions '{0}' and '{1}' when converting from '{2}' to '{3}'";
+ public const string PredefinedTypeNotFound = "Predefined type '{0}' is not defined or imported";
+ public const string PredefinedTypeBadType = "Predefined type '{0}' is declared incorrectly";
+ public const string BindToBogus = "'{0}' is not supported by the language";
+ public const string CantCallSpecialMethod = "'{0}': cannot explicitly call operator or accessor";
+ public const string BogusType = "'{0}' is a type not supported by the language";
+ public const string MissingPredefinedMember = "Missing compiler required member '{0}.{1}'";
+ public const string LiteralDoubleCast = "Literal of type double cannot be implicitly converted to type '{1}'; use an '{0}' suffix to create a literal of this type";
+ public const string UnifyingInterfaceInstantiations = "'{0}' cannot implement both '{1}' and '{2}' because they may unify for some type parameter substitutions";
+ public const string ConvertToStaticClass = "Cannot convert to static type '{0}'";
+ public const string GenericArgIsStaticClass = "'{0}': static types cannot be used as type arguments";
+ public const string PartialMethodToDelegate = "Cannot create delegate from method '{0}' because it is a partial method without an implementing declaration";
+ public const string IncrementLvalueExpected = "The operand of an increment or decrement operator must be a variable, property or indexer";
+ public const string NoSuchMemberOrExtension = "'{0}' does not contain a definition for '{1}' and no extension method '{1}' accepting a first argument of type '{0}' could be found (are you missing a using directive or an assembly reference?)";
+ public const string ValueTypeExtDelegate = "Extension methods '{0}' defined on value type '{1}' cannot be used to create delegates";
+ public const string BadArgCount = "No overload for method '{0}' takes '{1}' arguments";
+ public const string BadArgTypes = "The best overloaded method match for '{0}' has some invalid arguments";
+ public const string BadArgType = "Argument '{0}': cannot convert from '{1}' to '{2}'";
+ public const string RefLvalueExpected = "A ref or out argument must be an assignable variable";
+ public const string BadProtectedAccess = "Cannot access protected member '{0}' via a qualifier of type '{1}'; the qualifier must be of type '{2}' (or derived from it)";
+ public const string BindToBogusProp2 = "Property, indexer, or event '{0}' is not supported by the language; try directly calling accessor methods '{1}' or '{2}'";
+ public const string BindToBogusProp1 = "Property, indexer, or event '{0}' is not supported by the language; try directly calling accessor method '{1}'";
+ public const string BadDelArgCount = "Delegate '{0}' does not take '{1}' arguments";
+ public const string BadDelArgTypes = "Delegate '{0}' has some invalid arguments";
+ public const string AssgReadonlyLocal = "Cannot assign to '{0}' because it is read-only";
+ public const string RefReadonlyLocal = "Cannot pass '{0}' as a ref or out argument because it is read-only";
+ public const string ReturnNotLValue = "Cannot modify the return value of '{0}' because it is not a variable";
+ public const string BadArgExtraRef = "Argument '{0}' should not be passed with the '{1}' keyword";
+ public const string BadArgRef = "Argument '{0}' must be passed with the '{1}' keyword";
+ public const string AssgReadonly2 = "Members of readonly field '{0}' cannot be modified (except in a constructor or a variable initializer)";
+ public const string RefReadonly2 = "Members of readonly field '{0}' cannot be passed ref or out (except in a constructor)";
+ public const string AssgReadonlyStatic2 = "Fields of static readonly field '{0}' cannot be assigned to (except in a static constructor or a variable initializer)";
+ public const string RefReadonlyStatic2 = "Fields of static readonly field '{0}' cannot be passed ref or out (except in a static constructor)";
+ public const string AssgReadonlyLocalCause = "Cannot assign to '{0}' because it is a '{1}'";
+ public const string RefReadonlyLocalCause = "Cannot pass '{0}' as a ref or out argument because it is a '{1}'";
+ public const string ThisStructNotInAnonMeth = "Anonymous methods, lambda expressions, and query expressions inside structs cannot access instance members of 'this'. Consider copying 'this' to a local variable outside the anonymous method, lambda expression or query expression and using the local instead.";
+ public const string DelegateOnNullable = "Cannot bind delegate to '{0}' because it is a member of 'System.Nullable<T>'";
+ public const string BadCtorArgCount = "'{0}' does not contain a constructor that takes '{1}' arguments";
+ public const string BadExtensionArgTypes = "'{0}' does not contain a definition for '{1}' and the best extension method overload '{2}' has some invalid arguments";
+ public const string BadInstanceArgType = "Instance argument: cannot convert from '{0}' to '{1}'";
+ public const string BadArgTypesForCollectionAdd = "The best overloaded Add method '{0}' for the collection initializer has some invalid arguments";
+ public const string InitializerAddHasParamModifiers = "The best overloaded method match '{0}' for the collection initializer element cannot be used. Collection initializer 'Add' methods cannot have ref or out parameters.";
+ public const string NonInvocableMemberCalled = "Non-invocable member '{0}' cannot be used like a method.";
+ public const string NamedArgumentSpecificationBeforeFixedArgument = "Named argument specifications must appear after all fixed arguments have been specified";
+ public const string BadNamedArgument = "The best overload for '{0}' does not have a parameter named '{1}'";
+ public const string BadNamedArgumentForDelegateInvoke = "The delegate '{0}' does not have a parameter named '{1}'";
+ public const string DuplicateNamedArgument = "Named argument '{0}' cannot be specified multiple times";
+ public const string NamedArgumentUsedInPositional = "Named argument '{0}' specifies a parameter for which a positional argument has already been given";
+}
<Compile Include="..\..\mcs\typespec.cs" />\r
<Compile Include="..\..\mcs\visit.cs" />\r
<Compile Include="..\..\tools\monop\outline.cs" />\r
+ <Compile Include="aot.cs" />\r
<Compile Include="Assembly\AssemblyInfo.cs" />\r </ItemGroup>\r
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
Other similar extension points exist, see Microsoft.Common.targets.\r
+Assembly/AssemblyInfo.cs
+aot.cs
../../mcs/anonymous.cs
../../mcs/argument.cs
../../mcs/assign.cs
../../build/common/Consts.cs
../../tools/monop/outline.cs
../../mcs/cs-parser.cs
-Assembly/AssemblyInfo.cs
--- /dev/null
+//
+// aot.cs: AOT System.Reflection.Emit extensions to simplify mcs compilation
+//
+// Authors:
+// Marek Safar <marek.safar@gmail.com>
+//
+// Copyright (C) 2014 Xamarin Inc (http://www.xamarin.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.
+//
+
+#if FULL_AOT_RUNTIME
+
+namespace System.Reflection.Emit
+{
+ static class AssemblyBuilderExtensions
+ {
+ public static void AddResourceFile (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static ModuleBuilder DefineDynamicModule (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static void DefineVersionInfoResource (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static void DefineUnmanagedResource (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static void Save (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static void SetEntryPoint (this AssemblyBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+ }
+
+ static class ConstructorBuilderExtensions
+ {
+ public static void AddDeclarativeSecurity (this ConstructorBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ }
+
+ static class MethodBuilderExtensions
+ {
+ public static void AddDeclarativeSecurity (this MethodBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ }
+
+ static class ModuleBuilderExtensions
+ {
+ public static void DefineManifestResource (this ModuleBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+ }
+
+ static class TypeBuilderExtensions
+ {
+ public static void AddDeclarativeSecurity (this TypeBuilder builder, params object[] args)
+ {
+ throw new NotSupportedException ();
+ }
+
+ public static Type CreateType (this TypeBuilder builder)
+ {
+ throw new NotSupportedException ();
+ }
+ }
+}
+#endif
+++ /dev/null
-//
-// monotouch.cs: iOS System.Reflection.Emit API needed to simplify mcs compilation
-//
-// Authors:
-// Marek Safar <marek.safar@gmail.com>
-//
-// Copyright (C) 2014 Xamarin Inc (http://www.xamarin.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.
-//
-
-namespace System.Reflection.Emit
-{
- public class TypeBuilder : Type
- {
- #region implemented abstract members of MemberInfo
-
- public override bool IsDefined (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override string Name {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- #region implemented abstract members of Type
-
- public override Type GetInterface (string name, bool ignoreCase)
- {
- throw new NotSupportedException ();
- }
-
- public override Type[] GetInterfaces ()
- {
- throw new NotSupportedException ();
- }
-
- public override Type GetElementType ()
- {
- throw new NotSupportedException ();
- }
-
- public override EventInfo GetEvent (string name, BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override EventInfo[] GetEvents (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override FieldInfo GetField (string name, BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override FieldInfo[] GetFields (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override MemberInfo[] GetMembers (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
- {
- throw new NotSupportedException ();
- }
-
- public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override Type GetNestedType (string name, BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override Type[] GetNestedTypes (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
- {
- throw new NotSupportedException ();
- }
-
- protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
- {
- throw new NotSupportedException ();
- }
-
- protected override TypeAttributes GetAttributeFlagsImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool HasElementTypeImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool IsArrayImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool IsByRefImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool IsCOMObjectImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool IsPointerImpl ()
- {
- throw new NotSupportedException ();
- }
-
- protected override bool IsPrimitiveImpl ()
- {
- throw new NotSupportedException ();
- }
-
- public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr)
- {
- throw new NotSupportedException ();
- }
-
- public override object InvokeMember (string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters)
- {
- throw new NotSupportedException ();
- }
-
- public override Assembly Assembly {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string AssemblyQualifiedName {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type BaseType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string FullName {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Guid GUID {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Module Module {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string Namespace {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type UnderlyingSystemType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- public void AddInterfaceImplementation (Type interfaceType)
- {
- throw new NotSupportedException ();
- }
-
- public void AddDeclarativeSecurity (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetParent (object arg)
- {
- throw new NotSupportedException ();
- }
-
- public Type CreateType()
- {
- throw new NotSupportedException ();
- }
-
- public ConstructorBuilder DefineConstructor (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public MethodBuilder DefineMethod (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public TypeBuilder DefineNestedType (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public PropertyBuilder DefineProperty (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public EventBuilder DefineEvent (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public FieldBuilder DefineField (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public GenericTypeParameterBuilder[] DefineGenericParameters (params string[] names)
- {
- throw new NotSupportedException ();
- }
-
- public MethodBuilder DefineMethodOverride (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public static ConstructorInfo GetConstructor (Type type, ConstructorInfo constructor)
- {
- throw new NotSupportedException ();
- }
-
- public static FieldInfo GetField (Type type, FieldInfo field)
- {
- throw new NotSupportedException ();
- }
-
- public static MethodInfo GetMethod (Type type, MethodInfo method)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class MethodBuilder : MethodBase
- {
- #region implemented abstract members of MemberInfo
-
- public override bool IsDefined (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override Type DeclaringType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override MemberTypes MemberType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string Name {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type ReflectedType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- #region implemented abstract members of MethodBase
-
- public override MethodImplAttributes GetMethodImplementationFlags ()
- {
- throw new NotSupportedException ();
- }
-
- public override ParameterInfo[] GetParameters ()
- {
- throw new NotSupportedException ();
- }
-
- public override object Invoke (object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, System.Globalization.CultureInfo culture)
- {
- throw new NotSupportedException ();
- }
-
- public override RuntimeMethodHandle MethodHandle {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override MethodAttributes Attributes {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- public void AddDeclarativeSecurity (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public ParameterBuilder DefineParameter (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public GenericTypeParameterBuilder[] DefineGenericParameters (params string[] names)
- {
- throw new NotSupportedException ();
- }
-
- public MethodToken GetToken()
- {
- throw new NotSupportedException ();
- }
-
- public ILGenerator GetILGenerator ()
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetImplementationFlags (MethodImplAttributes attributes)
- {
- throw new NotSupportedException ();
- }
-
- public void SetParameters (params Type[] parameterTypes)
- {
- throw new NotSupportedException ();
- }
-
- public void SetReturnType (object arg)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class AssemblyBuilder : Assembly
- {
- public void AddResourceFile (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void DefineVersionInfoResource (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public ModuleBuilder DefineDynamicModule (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void DefineUnmanagedResource (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void Save (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetEntryPoint (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class ConstructorBuilder : MethodBase
- {
- #region implemented abstract members of MemberInfo
-
- public override bool IsDefined (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override Type DeclaringType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override MemberTypes MemberType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string Name {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type ReflectedType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- #region implemented abstract members of MethodBase
-
- public override MethodImplAttributes GetMethodImplementationFlags ()
- {
- throw new NotSupportedException ();
- }
-
- public override ParameterInfo[] GetParameters ()
- {
- throw new NotSupportedException ();
- }
-
- public override object Invoke (object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, System.Globalization.CultureInfo culture)
- {
- throw new NotSupportedException ();
- }
-
- public override RuntimeMethodHandle MethodHandle {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override MethodAttributes Attributes {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- public void AddDeclarativeSecurity (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public ParameterBuilder DefineParameter (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public MethodToken GetToken()
- {
- throw new NotSupportedException ();
- }
-
- public ILGenerator GetILGenerator ()
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetImplementationFlags (MethodImplAttributes attributes)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class ModuleBuilder : Module
- {
- public void DefineManifestResource (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public TypeBuilder DefineType (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public MethodToken GetToken()
- {
- throw new NotSupportedException ();
- }
-
- public MethodInfo GetArrayMethod (params object[] args)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class PropertyBuilder : PropertyInfo
- {
- #region implemented abstract members of MemberInfo
-
- public override bool IsDefined (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override Type DeclaringType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string Name {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type ReflectedType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- #region implemented abstract members of PropertyInfo
-
- public override MethodInfo[] GetAccessors (bool nonPublic)
- {
- throw new NotSupportedException ();
- }
-
- public override MethodInfo GetGetMethod (bool nonPublic)
- {
- throw new NotSupportedException ();
- }
-
- public override ParameterInfo[] GetIndexParameters ()
- {
- throw new NotSupportedException ();
- }
-
- public override MethodInfo GetSetMethod (bool nonPublic)
- {
- throw new NotSupportedException ();
- }
-
- public override object GetValue (object obj, BindingFlags invokeAttr, Binder binder, object[] index, System.Globalization.CultureInfo culture)
- {
- throw new NotSupportedException ();
- }
-
- public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, System.Globalization.CultureInfo culture)
- {
- throw new NotSupportedException ();
- }
-
- public override PropertyAttributes Attributes {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override bool CanRead {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override bool CanWrite {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type PropertyType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- public MethodToken GetToken()
- {
- throw new NotSupportedException ();
- }
-
- public void SetGetMethod (object arg)
- {
- throw new NotSupportedException ();
- }
-
- public void SetSetMethod (object arg)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class FieldBuilder : FieldInfo
- {
- #region implemented abstract members of MemberInfo
-
- public override bool IsDefined (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override object[] GetCustomAttributes (Type attributeType, bool inherit)
- {
- throw new NotSupportedException ();
- }
-
- public override Type DeclaringType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override string Name {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type ReflectedType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- #region implemented abstract members of FieldInfo
-
- public override object GetValue (object obj)
- {
- throw new NotSupportedException ();
- }
-
- public override void SetValue (object obj, object value, BindingFlags invokeAttr, Binder binder, System.Globalization.CultureInfo culture)
- {
- throw new NotSupportedException ();
- }
-
- public override FieldAttributes Attributes {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override RuntimeFieldHandle FieldHandle {
- get {
- throw new NotSupportedException ();
- }
- }
-
- public override Type FieldType {
- get {
- throw new NotSupportedException ();
- }
- }
-
- #endregion
-
- public void SetConstant (object arg)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
- public class EventBuilder
- {
- public void SetAddOnMethod (MethodBuilder mdBuilder)
- {
- throw new NotSupportedException ();
- }
-
- public void SetRemoveOnMethod (MethodBuilder mdBuilder)
- {
- throw new NotSupportedException ();
- }
-
- public void SetCustomAttribute (params object[] args)
- {
- throw new NotSupportedException ();
- }
- }
-
-}
\ No newline at end of file
+++ /dev/null
-#include testing_aot_full_Mono.CSharp.dll.sources
+++ /dev/null
-#include testing_aot_full_Mono.CSharp.dll.sources
+++ /dev/null
-#include testing_aot_full_Mono.CSharp.dll.sources
+++ /dev/null
-#include monotouch_Mono.CSharp.dll.sources
+++ /dev/null
-#include Mono.CSharp.dll.sources
-../corlib/System.Reflection.Emit/PEFileKinds.cs
-../corlib/System.Reflection.Emit/MethodToken.cs
-monotouch.cs
+++ /dev/null
-#include Mono.CSharp.dll.sources
-../corlib/System.Reflection.Emit/PEFileKinds.cs
-../corlib/System.Reflection.Emit/MethodToken.cs
-monotouch.cs
var readerParameters = new ReaderParameters ();
- if (options.Debug)
+ if (options.Debug && options.WritePdbFile)
readerParameters.ReadSymbols = true;
var assembly = this.options.Assembly.IsFilename ?
case SQLiteDateFormats.UnixEpoch:\r
return ((long)(dateValue.Subtract(UnixEpoch).Ticks / TimeSpan.TicksPerSecond)).ToString();\r
default:\r
- return dateValue.ToString(_datetimeFormats[5], CultureInfo.InvariantCulture);\r
+ return dateValue.ToString(_datetimeFormats[19], CultureInfo.InvariantCulture);\r
}\r
}\r
\r
}
}
+ [Test]
+ public void DateTimeConvert_UTC ()
+ {
+ using (var connection = new SqliteConnection ($"Data Source={_databasePath};DateTimeKind=Utc")) {
+ connection.Open ();
+
+ using (var cmd = connection.CreateCommand ()) {
+ cmd.CommandText = "CREATE TABLE OnlyDates (Date1 DATETIME)";
+ cmd.CommandType = CommandType.Text;
+ cmd.ExecuteNonQuery();
+ }
+
+ var datetest = DateTime.UtcNow;
+
+ var sqlInsert = "INSERT INTO TestTable (ID, Modified) VALUES (@id, @mod)";
+ using (var cmd = connection.CreateCommand ()) {
+ cmd.CommandText = $"INSERT INTO OnlyDates (Date1) VALUES (@param1);";
+ cmd.CommandType = CommandType.Text;
+ cmd.Parameters.AddWithValue ("@param1", datetest);
+ cmd.ExecuteNonQuery();
+ }
+
+ using (var cmd = connection.CreateCommand ()) {
+ cmd.CommandText = $"SELECT Date1 FROM OnlyDates;";
+ cmd.CommandType = CommandType.Text;
+ object objRetrieved = cmd.ExecuteScalar ();
+ var dateRetrieved = Convert.ToDateTime (objRetrieved);
+ Assert.AreEqual (DateTimeKind.Unspecified, dateRetrieved.Kind);
+ }
+ }
+ }
+
[Test]
public void DateTimeConvert ()
{
code ();
}
- * Avoid using unecessary open/close braces, vertical space
+ * Avoid using unnecessary open/close braces, vertical space
is usually limited:
good:
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\DelegateHelpers.netstandard.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\HoistedLocals.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\ILGen.cs" />\r
- <Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\KeyedQueue.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\KeyedStack.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\LabelInfo.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\LambdaCompiler.Address.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Linq.Expressions\src\System\Linq\Expressions\Compiler\LambdaCompiler.Binary.cs" />\r
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/CompilerScope.Storage.cs
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/CompilerScope.cs
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/ILGen.cs
-../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/KeyedQueue.cs
+../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/KeyedStack.cs
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/LabelInfo.cs
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/LambdaCompiler.Address.cs
../../../external/corefx/src/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/LambdaCompiler.Binary.cs
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbCommand.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DBCommandBuilder.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbConnection.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbConnectionPoolKey.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbConnectionStringBuilder.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataAdapter.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataReader.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataReaderExtensions.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataRecord.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbDataSourceEnumerator.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbEnumerator.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbMetaDataColumnNames.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbParameter.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbParameterCollection.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbProviderFactory.CreatePermission.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbProviderFactory.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbProviderSpecificTypePropertyAttribute.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DBSchemaRow.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DBSchemaTable.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DbTransaction.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DecimalStorage.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\DoubleStorage.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\FieldNameLookup.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\Groupbybehavior.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\IDbColumnSchemaGenerator.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\identifiercase.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\Int16Storage.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\Int32Storage.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\Int64Storage.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\MultipartIdentifier.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\NameValuePair.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\ObjectStorage.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\RowUpdatedEventArgs.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\Common\RowUpdatingEventArgs.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\StatementCompletedEventArgs.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\StatementCompletedEventHandler.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\StatementType.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\StrongTypingException.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\UniqueConstraint.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\UpdateRowSource.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Data\updatestatus.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Xml\XmlDataDocument.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Xml\XmlDataImplementation.cs" />\r
<Compile Include="..\..\..\external\corefx\src\System.Data.Common\src\System\Xml\XPathNodePointer.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\Common\ActivityCorrelator.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\OperationAbortedException.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\ProviderBase\DbConnectionPoolGroupProviderInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\ProviderBase\DbConnectionPoolProviderInfo.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\ProviderBase\DbReferenceCollection.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\ProviderBase\TimeoutTimer.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\SqlClient\ApplicationIntent.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\SqlClient\SqlError.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\SqlClient\SqlErrorCollection.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Data.SqlClient\src\System\Data\SqlClient\SqlInfoMessageEvent.cs" />\r
+ <Compile Include="..\..\..\external\corefx\src\System.Private.Xml\src\Misc\HResults.cs" />\r
<Compile Include="..\..\build\common\AssemblyRef.cs" />\r
<Compile Include="..\..\build\common\Consts.cs" />\r
<Compile Include="..\..\build\common\Locale.cs" />\r
<Compile Include="..\referencesource\System.Data\bid\inc\cs\bidPrivateBase.cs" />\r
<Compile Include="..\referencesource\System.Data\Microsoft\SqlServer\Server\SqlTriggerContext.cs" />\r
<Compile Include="..\referencesource\System.Data\Misc\ExternDll.cs" />\r
- <Compile Include="..\referencesource\System.Data\Misc\HResults.cs" />\r
<Compile Include="..\referencesource\System.Data\Misc\PrivilegedConfigurationManager.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\CodeGen\datacache.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\CodeGen\StrongTypingException.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\ActivityCorrelator.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\AdapterUtil.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DbConnectionOptions.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\DbConnectionPoolKey.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DBConnectionString.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\DbConnectionStringBuilder.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DbConnectionStringCommon.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DBDataPermission.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DBDataPermissionAttribute.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\DbDataReader.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DbProviderConfigurationHandler.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DbProviderFactories.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\DbProviderFactoriesConfigurationHandler.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\DbProviderFactory.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\FieldNameLookup.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\GreenMethods.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\HandlerBase.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\MultipartIdentifier.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\Common\NameValuePair.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\NameValuePermission.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\NativeMethods.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Common\SafeNativeMethods.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\OleDb\PropertyInfoSet.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\OleDb\RowBinding.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\OleDb\SafeHandles.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\OperationAbortedException.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbBuffer.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionClosed.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionFactory.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolAuthenticationContextKey.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolCounters.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolGroup.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolGroupProviderInfo.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolIdentity.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolOptions.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbConnectionPoolProviderInfo.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbMetaDataFactory.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\DbReferenceCollection.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\TimeoutTimer.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\ProviderBase\WrappedIUnknown.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Sql\IBinarySerialize.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Sql\invalidudtexception.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Sql\SqlUserDefinedAggregateAttribute.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Sql\SqlUserDefinedTypeAttribute.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\Sql\TriggerAction.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\SqlClient\ApplicationIntent.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\LocalDBAPI.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlClientEncryptionType.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlClientPermission.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlConnectionString.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlConnectionStringBuilder.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlError.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlErrorCollection.cs" />\r
- <Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlInfoMessageEvent.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\SqlUtil.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\TdsEnums.cs" />\r
<Compile Include="..\referencesource\System.Data\System\Data\SqlClient\TdsParserStaticMethods.cs" />\r
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbCommand.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DBCommandBuilder.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbConnection.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbConnectionPoolKey.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbConnectionStringBuilder.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataAdapter.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataReader.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataReaderExtensions.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataRecord.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbDataSourceEnumerator.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbEnumerator.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbMetaDataColumnNames.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbParameter.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbParameterCollection.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbProviderFactory.CreatePermission.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbProviderFactory.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbProviderSpecificTypePropertyAttribute.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DBSchemaRow.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DBSchemaTable.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DbTransaction.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DecimalStorage.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/DoubleStorage.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/FieldNameLookup.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/Groupbybehavior.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/IDbColumnSchemaGenerator.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/identifiercase.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/Int16Storage.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/Int32Storage.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/Int64Storage.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/MultipartIdentifier.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/Common/NameValuePair.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/ObjectStorage.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/RowUpdatedEventArgs.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/Common/RowUpdatingEventArgs.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/StatementCompletedEventArgs.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/StatementCompletedEventHandler.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/StatementType.cs
+../../../external/corefx/src/System.Data.Common/src/System/Data/StrongTypingException.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/UniqueConstraint.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/UpdateRowSource.cs
../../../external/corefx/src/System.Data.Common/src/System/Data/updatestatus.cs
../../../external/corefx/src/System.Data.Common/src/System/Xml/RegionIterator.cs
../../../external/corefx/src/System.Data.Common/src/System/Xml/TreeIterator.cs
../../../external/corefx/src/System.Data.Common/src/System/Xml/XmlBoundElement.cs
+../../../external/corefx/src/System.Data.Common/src/System/Xml/XmlDataDocument.cs
../../../external/corefx/src/System.Data.Common/src/System/Xml/XmlDataImplementation.cs
../../../external/corefx/src/System.Data.Common/src/System/Xml/XPathNodePointer.cs
-../../../external/corefx/src/System.Data.Common/src/System/Xml/XmlDataDocument.cs
-
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/Common/ActivityCorrelator.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/OperationAbortedException.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/ProviderBase/DbConnectionPoolProviderInfo.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/ProviderBase/DbReferenceCollection.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/ProviderBase/TimeoutTimer.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/SqlClient/ApplicationIntent.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlError.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlErrorCollection.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlInfoMessageEvent.cs
+../../../external/corefx/src/System.Private.Xml/src/Misc/HResults.cs
../referencesource/System.Data/Microsoft/SqlServer/Server/SqlTriggerContext.cs
../referencesource/System.Data/Misc/ExternDll.cs
-../referencesource/System.Data/Misc/HResults.cs
../referencesource/System.Data/System/Data/CodeGen/StrongTypingException.cs
-../referencesource/System.Data/System/Data/Common/ActivityCorrelator.cs
../referencesource/System.Data/System/Data/Common/AdapterUtil.cs
../referencesource/System.Data/System/Data/Common/DbConnectionOptions.cs
-../referencesource/System.Data/System/Data/Common/DbConnectionPoolKey.cs
../referencesource/System.Data/System/Data/Common/DBConnectionString.cs
-../referencesource/System.Data/System/Data/Common/DbConnectionStringBuilder.cs
../referencesource/System.Data/System/Data/Common/DbConnectionStringCommon.cs
../referencesource/System.Data/System/Data/Common/DBDataPermission.cs
../referencesource/System.Data/System/Data/Common/DBDataPermissionAttribute.cs
-../referencesource/System.Data/System/Data/Common/DbDataReader.cs
-../referencesource/System.Data/System/Data/Common/DbProviderFactory.cs
-../referencesource/System.Data/System/Data/Common/FieldNameLookup.cs
../referencesource/System.Data/System/Data/Common/GreenMethods.cs
-../referencesource/System.Data/System/Data/Common/MultipartIdentifier.cs
-../referencesource/System.Data/System/Data/Common/NameValuePair.cs
../referencesource/System.Data/System/Data/Common/NameValuePermission.cs
../referencesource/System.Data/System/Data/Common/SQLTypes/SqlXmlStorage.cs
+../referencesource/System.Data/System/Data/DataSet.cs
../referencesource/System.Data/System/Data/OleDb/OleDbType.cs
../referencesource/System.Data/System/Data/OleDb/PropertyAttributes.cs
-../referencesource/System.Data/System/Data/OperationAbortedException.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolAuthenticationContext.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolAuthenticationContextKey.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolOptions.cs
-../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolProviderInfo.cs
../referencesource/System.Data/System/Data/ProviderBase/DbMetaDataFactory.cs
-../referencesource/System.Data/System/Data/ProviderBase/DbReferenceCollection.cs
-../referencesource/System.Data/System/Data/ProviderBase/TimeoutTimer.cs
../referencesource/System.Data/System/Data/ProviderBase/WrappedIUnknown.cs
../referencesource/System.Data/System/Data/Sql/IBinarySerialize.cs
../referencesource/System.Data/System/Data/Sql/invalidudtexception.cs
../referencesource/System.Data/System/Data/Sql/SqlUserDefinedAggregateAttribute.cs
../referencesource/System.Data/System/Data/Sql/SqlUserDefinedTypeAttribute.cs
../referencesource/System.Data/System/Data/Sql/TriggerAction.cs
-../referencesource/System.Data/System/Data/SqlClient/ApplicationIntent.cs
../referencesource/System.Data/System/Data/SqlClient/LocalDBAPI.cs
../referencesource/System.Data/System/Data/SqlClient/SqlClientEncryptionType.cs
../referencesource/System.Data/System/Data/SqlClient/SqlClientPermission.cs
../referencesource/System.Data/System/Data/SqlClient/SqlConnectionString.cs
../referencesource/System.Data/System/Data/SqlClient/SqlConnectionStringBuilder.cs
-../referencesource/System.Data/System/Data/SqlClient/SqlError.cs
-../referencesource/System.Data/System/Data/SqlClient/SqlErrorCollection.cs
-../referencesource/System.Data/System/Data/SqlClient/SqlInfoMessageEvent.cs
../referencesource/System.Data/System/Data/SqlClient/SqlUtil.cs
../referencesource/System.Data/System/Data/SqlClient/TdsEnums.cs
-../referencesource/System.Data/System/Data/SqlClient/TdsParserStaticMethods.cs
-../referencesource/System.Data/System/Data/DataSet.cs
\ No newline at end of file
+../referencesource/System.Data/System/Data/SqlClient/TdsParserStaticMethods.cs
\ No newline at end of file
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolCounters.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPool.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolGroup.cs
-../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs
+../../../external/corefx/src/System.Data.SqlClient/src/System/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs
../referencesource/System.Data/System/Data/ProviderBase/DbConnectionPoolIdentity.cs
# ../referencesource/System.Data/System/Data/ProviderBase/DbParameterCollectionHelper.cs
# ../referencesource/System.Data/System/Data/ProviderBase/DbParameterHelper.cs
}
if (header.Key == "Transfer-Encoding") {
- // Chunked Transfer-Encoding is never set for HttpWebRequest. It's detected
- // from ContentLength by HttpWebRequest
+ //
+ // Chunked Transfer-Encoding is set for HttpWebRequest later when Content length is checked
+ //
values = values.Where (l => l != "chunked");
}
}
}
- //
- // Content length has to be set because HttpWebRequest is running without buffering
- //
- var contentLength = content.Headers.ContentLength;
- if (contentLength != null) {
- wrequest.ContentLength = contentLength.Value;
+ if (request.Headers.TransferEncodingChunked == true) {
+ wrequest.SendChunked = true;
} else {
- await content.LoadIntoBufferAsync (MaxRequestContentBufferSize).ConfigureAwait (false);
- wrequest.ContentLength = content.Headers.ContentLength.Value;
+ //
+ // Content length has to be set because HttpWebRequest is running without buffering
+ //
+ var contentLength = content.Headers.ContentLength;
+ if (contentLength != null) {
+ wrequest.ContentLength = contentLength.Value;
+ } else {
+ if (MaxRequestContentBufferSize == 0)
+ throw new InvalidOperationException ("The content length of the request content can't be determined. Either set TransferEncodingChunked to true, load content into buffer, or set MaxRequestContentBufferSize.");
+
+ await content.LoadIntoBufferAsync (MaxRequestContentBufferSize).ConfigureAwait (false);
+ wrequest.ContentLength = content.Headers.ContentLength.Value;
+ }
}
wrequest.ResendContentFactory = content.CopyTo;
return CreateResponseMessage (wresponse, request, cancellationToken);
}
-#if NETSTANDARD
public bool CheckCertificateRevocationList {
get {
throw new NotImplementedException ();
throw new NotImplementedException ();
}
}
-
-#endif
}
}
throw new PlatformNotSupportedException (EXCEPTION_MESSAGE);
}
-#if NETSTANDARD
public bool CheckCertificateRevocationList {
get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); }
set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); }
get { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); }
set { throw new PlatformNotSupportedException (EXCEPTION_MESSAGE); }
}
-#endif
}
}
}
}
+ [Test]
+#if FEATURE_NO_BSD_SOCKETS
+ [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
+ public void Post_TransferEncodingChunked ()
+ {
+ bool? failed = null;
+ var listener = CreateListener (l => {
+ try {
+ var request = l.Request;
+
+ Assert.IsNull (request.AcceptTypes, "#1");
+ Assert.AreEqual (-1, request.ContentLength64, "#2");
+ Assert.IsNull (request.ContentType, "#3");
+ Assert.AreEqual (0, request.Cookies.Count, "#4");
+ Assert.IsTrue (request.HasEntityBody, "#5");
+ Assert.AreEqual (TestHost, request.Headers ["Host"], "#6b");
+ Assert.AreEqual ("POST", request.HttpMethod, "#7");
+ Assert.IsFalse (request.IsAuthenticated, "#8");
+ Assert.IsTrue (request.IsLocal, "#9");
+ Assert.IsFalse (request.IsSecureConnection, "#10");
+ Assert.IsFalse (request.IsWebSocketRequest, "#11");
+ Assert.IsTrue (request.KeepAlive, "#12");
+ Assert.AreEqual (HttpVersion.Version11, request.ProtocolVersion, "#13");
+ Assert.IsNull (request.ServiceName, "#14");
+ Assert.IsNull (request.UrlReferrer, "#15");
+ Assert.IsNull (request.UserAgent, "#16");
+ Assert.IsNull (request.UserLanguages, "#17");
+ Assert.AreEqual ("chunked", request.Headers ["Transfer-Encoding"], "#18");
+ Assert.IsNull (request.Headers ["Content-Length"], "#19");
+ failed = false;
+ } catch (Exception e) {
+ failed = true;
+ Console.WriteLine (e);
+ }
+ });
+
+ try {
+ var client = new HttpClient ();
+
+ client.DefaultRequestHeaders.TransferEncodingChunked = true;
+
+ var imageContent = new StreamContent (new MemoryStream ());
+
+ var response = client.PostAsync (LocalServer, imageContent).Result;
+
+ Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "#101");
+ Assert.AreEqual(false, failed, "#102");
+ } finally {
+ listener.Close ();
+ }
+ }
+
+ [Test]
+#if FEATURE_NO_BSD_SOCKETS
+ [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
+ public void Post_StreamCaching ()
+ {
+ bool? failed = null;
+ var listener = CreateListener (l => {
+ try {
+ var request = l.Request;
+
+ Assert.IsNull (request.AcceptTypes, "#1");
+ Assert.AreEqual (0, request.ContentLength64, "#2");
+ Assert.IsNull (request.ContentType, "#3");
+ Assert.AreEqual (0, request.Cookies.Count, "#4");
+ Assert.IsFalse (request.HasEntityBody, "#5");
+ Assert.AreEqual (TestHost, request.Headers ["Host"], "#6b");
+ Assert.AreEqual ("POST", request.HttpMethod, "#7");
+ Assert.IsFalse (request.IsAuthenticated, "#8");
+ Assert.IsTrue (request.IsLocal, "#9");
+ Assert.IsFalse (request.IsSecureConnection, "#10");
+ Assert.IsFalse (request.IsWebSocketRequest, "#11");
+ Assert.IsTrue (request.KeepAlive, "#12");
+ Assert.AreEqual (HttpVersion.Version11, request.ProtocolVersion, "#13");
+ Assert.IsNull (request.ServiceName, "#14");
+ Assert.IsNull (request.UrlReferrer, "#15");
+ Assert.IsNull (request.UserAgent, "#16");
+ Assert.IsNull (request.UserLanguages, "#17");
+ Assert.IsNull (request.Headers ["Transfer-Encoding"], "#18");
+ Assert.AreEqual ("0", request.Headers ["Content-Length"], "#19");
+ failed = false;
+ } catch (Exception e) {
+ failed = true;
+ Console.WriteLine (e);
+ }
+ });
+
+ try {
+ var client = new HttpClient ();
+
+ var imageContent = new StreamContent (new MemoryStream ());
+
+ var response = client.PostAsync (LocalServer, imageContent).Result;
+
+ Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "#101");
+ Assert.AreEqual(false, failed, "#102");
+ } finally {
+ listener.Close ();
+ }
+ }
+
[Test]
[Category ("MobileNotWorking")] // Missing encoding
#if FEATURE_NO_BSD_SOCKETS
+++ /dev/null
-//
-// This file was generated by resx2sr tool
-//
-
-partial class SR
-{
- public const string Arg_ArgumentOutOfRangeException = "Index was out of bounds:";
- public const string Arg_ElementsInSourceIsGreaterThanDestination = "Number of elements in source vector is greater than the destination array";
- public const string Arg_MultiDimArrayNotSupported = "Only one-dimensional arrays are supported";
- public const string Arg_NullArgumentNullRef = "The method was called with a null array argument.";
- public const string Arg_RegisterLengthOfRangeException = "length must be less than";
- public const string Arg_TypeNotSupported = "Specified type is not supported";
- public const string Reflection_MethodNotSupported = "Vector<T>.Count cannot be called via reflection when intrinsics are enabled.";
-}
../../build/common/SR.cs
Assembly/AssemblyInfo.cs
Assembly/TypeForwarders.cs
-SR.cs
+corefx/SR.cs
../../../external/corefx/src/Common/src/System/Numerics/Hashing/HashHelpers.cs
../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/ConstantHelper.cs
-../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//JitIntrinsicAttribute.cs
-../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Register.cs
-../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Vector_Operations.cs
-../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics//Vector.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/JitIntrinsicAttribute.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Register.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector_Operations.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector.cs
--- /dev/null
+//
+// This file was generated by resx2sr tool
+//
+
+partial class SR
+{
+ public const string Arg_ArgumentOutOfRangeException = "Index was out of bounds:";
+ public const string Arg_ElementsInSourceIsGreaterThanDestination = "Number of elements in source vector is greater than the destination array";
+ public const string Arg_NullArgumentNullRef = "The method was called with a null array argument.";
+ public const string Arg_TypeNotSupported = "Specified type is not supported";
+}
LIBRARY = System.Numerics.dll
LIB_REFS = System
-LIB_MCS_FLAGS = /unsafe -nowarn:414 -nowarn:436
+LIB_MCS_FLAGS = /unsafe
TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
-TXT_RESOURCE_STRINGS = ../referencesource/System.Numerics/System.Numerics.txt
+RESX_RESOURCE_STRING = \
+ ../../../external/corefx/src/System.Runtime.Numerics/src/Resources/Strings.resx \
+ ../../../external/corefx/src/System.Numerics.Vectors/src/Resources/Strings.resx
EXTRA_DISTFILES =
+++ /dev/null
-//
-// This file was generated by txt2sr tool
-//
-
-partial class SR
-{
- public const string Argument_InvalidNumberStyles = "An undefined NumberStyles value is being used.";
- public const string Argument_InvalidHexStyle = "With the AllowHexSpecifier bit set in the enum bit field, the only other valid bits that can be combined into the enum value must be a subset of those in HexNumber.";
- public const string Argument_MustBeBigInt = "The parameter must be a BigInteger.";
- public const string Format_InvalidFormatSpecifier = "Format specifier was invalid.";
- public const string Format_TooLarge = "The value is too large to be represented by this format specifier.";
- public const string ArgumentOutOfRange_MustBeNonNeg = "The number must be greater than or equal to zero.";
- public const string Overflow_BigIntInfinity = "BigInteger cannot represent infinity.";
- public const string Overflow_NotANumber = "The value is not a number.";
- public const string Overflow_ParseBigInteger = "The value could not be parsed.";
- public const string Overflow_Int32 = "Value was either too large or too small for an Int32.";
- public const string Overflow_Int64 = "Value was either too large or too small for an Int64.";
- public const string Overflow_UInt32 = "Value was either too large or too small for a UInt32.";
- public const string Overflow_UInt64 = "Value was either too large or too small for a UInt64.";
- public const string Overflow_Decimal = "Value was either too large or too small for a Decimal.";
-}
+../../build/common/Consts.cs
../../build/common/SR.cs
Assembly/AssemblyInfo.cs
-ReferenceSources/SR.cs
-../referencesource/System.Numerics/System/Numerics/BigInteger.cs
-../referencesource/System.Numerics/System/Numerics/BigIntegerBuilder.cs
-../referencesource/System.Numerics/System/Numerics/BigNumber.cs
-../referencesource/System.Numerics/System/Numerics/Complex.cs
-../referencesource/System.Numerics/System/Numerics/NumericsHelpers.cs
-../referencesource/System.Numerics/System/Numerics/HashCodeHelper.cs
-../referencesource/System.Numerics/System/Numerics/JITIntrinsicAttribute.cs
-../referencesource/System.Numerics/System/Numerics/Matrix3x2.cs
-../referencesource/System.Numerics/System/Numerics/Matrix4x4.cs
-../referencesource/System.Numerics/System/Numerics/Plane.cs
-../referencesource/System.Numerics/System/Numerics/Quaternion.cs
-../referencesource/System.Numerics/System/Numerics/Vector2.cs
-../referencesource/System.Numerics/System/Numerics/Vector2_Intrinsics.cs
-../referencesource/System.Numerics/System/Numerics/Vector3.cs
-../referencesource/System.Numerics/System/Numerics/Vector3_Intrinsics.cs
-../referencesource/System.Numerics/System/Numerics/Vector4.cs
-../referencesource/System.Numerics/System/Numerics/Vector4_Intrinsics.cs
-../referencesource/System.Numerics/System/Numerics/Vector_Operations.cs
+corefx/SR.cs
+corefx/Vector.cs
+
+../../../external/corefx/src/Common/src/System/Globalization/FormatProvider.Number.cs
+../../../external/corefx/src/Common/src/System/Numerics/Hashing/HashHelpers.cs
+
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Globalization/FormatProvider.BigInteger.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Globalization/FormatProvider.NumberBuffer.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigInteger.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.AddSub.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.BitsBuffer.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.DivRem.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.FastReducer.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.GcdInv.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.PowMod.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigIntegerCalculator.SquMul.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/BigNumber.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/Complex.cs
+../../../external/corefx/src/System.Runtime.Numerics/src/System/Numerics/NumericsHelpers.cs
+
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/JitIntrinsicAttribute.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Matrix3x2.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Matrix4x4.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Plane.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Quaternion.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector2.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector2_Intrinsics.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector3.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector3_Intrinsics.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector4.cs
+../../../external/corefx/src/System.Numerics.Vectors/src/System/Numerics/Vector4_Intrinsics.cs
--- /dev/null
+//
+// This file was generated by resx2sr tool
+//
+
+partial class SR
+{
+ public const string Argument_BadFormatSpecifier = "Format specifier was invalid.";
+ public const string Argument_InvalidNumberStyles = "An undefined NumberStyles value is being used.";
+ public const string Argument_InvalidHexStyle = "With the AllowHexSpecifier bit set in the enum bit field, the only other valid bits that can be combined into the enum value must be a subset of those in HexNumber.";
+ public const string Argument_MustBeBigInt = "The parameter must be a BigInteger.";
+ public const string Format_TooLarge = "The value is too large to be represented by this format specifier.";
+ public const string ArgumentOutOfRange_MustBeNonNeg = "The number must be greater than or equal to zero.";
+ public const string Overflow_BigIntInfinity = "BigInteger cannot represent infinity.";
+ public const string Overflow_NotANumber = "The value is not a number.";
+ public const string Overflow_ParseBigInteger = "The value could not be parsed.";
+ public const string Overflow_Int32 = "Value was either too large or too small for an Int32.";
+ public const string Overflow_Int64 = "Value was either too large or too small for an Int64.";
+ public const string Overflow_UInt32 = "Value was either too large or too small for a UInt32.";
+ public const string Overflow_UInt64 = "Value was either too large or too small for a UInt64.";
+ public const string Overflow_Decimal = "Value was either too large or too small for a Decimal.";
+ public const string Arg_ArgumentOutOfRangeException = "Index was out of bounds:";
+ public const string Arg_ElementsInSourceIsGreaterThanDestination = "Number of elements in source vector is greater than the destination array";
+ public const string Arg_NullArgumentNullRef = "The method was called with a null array argument.";
+ public const string Arg_TypeNotSupported = "Specified type is not supported";
+}
--- /dev/null
+namespace System.Numerics
+{
+ static class Vector
+ {
+ [JitIntrinsic]
+ public static bool IsHardwareAccelerated {
+ get {
+ return false;
+ }
+ }
+ }
+}
\ No newline at end of file
// This is a copy of external/referencesource/System.Runtime.Caching/Resources/R.Designer.cs
-// This verison does not use ResourceManager, instead it uses hard coded strings.
+// This version does not use ResourceManager, instead it uses hard coded strings.
// This should be removed once Mono has access to .NET resources.
namespace System.Runtime.Caching.Resources {
IsCompleted = true;
+ /* It is possible that this.socket is modified by this.Init which has been called by the callback. This
+ * would lead to inconsistency, as we would for example not release the correct socket.ReadSem or
+ * socket.WriteSem.
+ * For example, this can happen with AcceptAsync followed by a ReceiveAsync on the same
+ * SocketAsyncEventArgs */
+ Socket completedSocket = socket;
+ SocketOperation completedOperation = operation;
+
AsyncCallback callback = AsyncCallback;
if (callback != null) {
ThreadPool.UnsafeQueueUserWorkItem (_ => callback (this), null);
}
- switch (operation) {
+ /* Warning: any field on the current SocketAsyncResult might have changed, as the callback might have
+ * called this.Init */
+
+ switch (completedOperation) {
case SocketOperation.Receive:
case SocketOperation.ReceiveFrom:
case SocketOperation.ReceiveGeneric:
case SocketOperation.Accept:
- socket.ReadSem.Release ();
+ completedSocket.ReadSem.Release ();
break;
case SocketOperation.Send:
case SocketOperation.SendTo:
case SocketOperation.SendGeneric:
- socket.WriteSem.Release ();
+ completedSocket.WriteSem.Release ();
break;
}
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NETSTANDARD
-
namespace System.Net.Sockets
{
public struct SocketReceiveFromResult
public EndPoint RemoteEndPoint;
}
}
-
-#endif
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NETSTANDARD
-
namespace System.Net.Sockets
{
public struct SocketReceiveMessageFromResult
public IPPacketInformation PacketInformation;
}
}
-
-#endif
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-#if NETSTANDARD
-
using System.Collections.Generic;
using System.Threading.Tasks;
}
}
}
-
-#endif
}
public long ContentLength64 {
- get { return content_length; }
+ get { return is_chunked ? -1 : content_length; }
}
public string ContentType {
using System.IO;
using System.Text;
using System.Threading;
+using System.Runtime.InteropServices;
using NUnit.Framework;
string v = Process.GetProcessById (1).ProcessName;
}
+
+ [Test]
+ public void NonChildProcessWaitForExit ()
+ {
+ if (!RunningOnUnix)
+ Assert.Ignore ("accessing parent pid, only available on unix");
+
+ using (Process process = Process.GetProcessById (getppid ()))
+ using (ManualResetEvent mre = new ManualResetEvent (false))
+ {
+ Assert.IsFalse (process.WaitForExit (10), "#1");
+ Assert.IsFalse (process.HasExited, "#2");
+ Assert.Throws<InvalidOperationException>(delegate { int exitCode = process.ExitCode; }, "#3");
+
+ process.Exited += (s, e) => mre.Set ();
+ process.EnableRaisingEvents = true;
+ Assert.IsFalse (mre.WaitOne (100), "#4");
+
+ Assert.IsFalse (process.WaitForExit (10), "#5");
+ Assert.IsFalse (process.HasExited, "#6");
+ Assert.Throws<InvalidOperationException>(delegate { int exitCode = process.ExitCode; }, "#7");
+ }
+ }
+
+ [Test]
+ public void NonChildProcessName ()
+ {
+ if (!RunningOnUnix)
+ Assert.Ignore ("accessing parent pid, only available on unix");
+
+ using (Process process = Process.GetProcessById (getppid ()))
+ {
+ string pname = process.ProcessName;
+ Assert.IsNotNull (pname, "#1");
+ AssertHelper.IsNotEmpty (pname, "#2");
+ }
+ }
+
+ [Test]
+ public void NonChildProcessId ()
+ {
+ if (!RunningOnUnix)
+ Assert.Ignore ("accessing parent pid, only available on unix");
+
+ int ppid;
+ using (Process process = Process.GetProcessById (ppid = getppid ()))
+ {
+ int pid = process.Id;
+ Assert.AreEqual (ppid, pid, "#1");
+ AssertHelper.Greater (pid, 0, "#2");
+ }
+ }
+
+ [DllImport ("libc")]
+ static extern int getppid();
}
}
mSent.Set ();
}, clientSocket);
- if (!mSent.WaitOne (1500))
- throw new TimeoutException ();
- if (!mReceived.WaitOne (1500))
- throw new TimeoutException ();
+ Assert.IsTrue (mSent.WaitOne (5000), "#1");
+ Assert.IsTrue (mReceived.WaitOne (5000), "#2");
} finally {
if (File.Exists (temp))
File.Delete (temp);
Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");
}
+
+ [Test] // Covers https://bugzilla.xamarin.com/show_bug.cgi?id=52549
+ public void SocketMismatchProtocol ()
+ {
+ try {
+ using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Tcp));
+ Assert.Fail ("#1");
+ } catch (SocketException e) {
+ // Only work on OSX
+ // Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#2");
+ }
+
+ try {
+ using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp));
+ Assert.Fail ("#3");
+ } catch (SocketException e) {
+ // Only work on OSX
+ // Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#4");
+ }
+ }
}
}
[Category ("MobileNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
public void CloseAsyncTest ()
{
- Assert.IsTrue (socket.ConnectAsync (new Uri (EchoServerUrl), CancellationToken.None).Wait (5000));
+ if (!socket.ConnectAsync (new Uri (EchoServerUrl), CancellationToken.None).Wait (5000)) {
+ Assert.Inconclusive (socket.State.ToString ());
+ return;
+ }
+
Assert.AreEqual (WebSocketState.Open, socket.State);
Assert.IsTrue (socket.CloseAsync (WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).Wait (5000));
}
[Test]
-#if FEATURE_NO_BSD_SOCKETS
- [ExpectedException (typeof (PlatformNotSupportedException))]
-#else
[ExpectedException (typeof (InvalidOperationException))]
-#endif
+ [Category ("MobileNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
public void SendAsyncArgTest_NotConnected ()
{
socket.SendAsync (new ArraySegment<byte> (new byte[0]), WebSocketMessageType.Text, true, CancellationToken.None);
}
[Test]
-#if FEATURE_NO_BSD_SOCKETS
- [ExpectedException (typeof (PlatformNotSupportedException))]
-#else
[ExpectedException (typeof (InvalidOperationException))]
-#endif
+ [Category ("MobileNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
public void ReceiveAsyncArgTest_NotConnected ()
{
socket.ReceiveAsync (new ArraySegment<byte> (new byte[0]), CancellationToken.None);
[assembly: InternalsVisibleTo ("System, PublicKey=" + AssemblyRef.FrameworkPublicKeyFull2)]
[assembly: InternalsVisibleTo ("System.Core, PublicKey=" + AssemblyRef.FrameworkPublicKeyFull2)]
-[assembly: InternalsVisibleTo ("System.Numerics, PublicKey=00000000000000000400000000000000")]
-
[assembly: InternalsVisibleTo ("System.Runtime.WindowsRuntime, PublicKey=00000000000000000400000000000000")]
[assembly: InternalsVisibleTo ("System.Runtime.WindowsRuntime.UI.Xaml, PublicKey=00000000000000000400000000000000")]
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NETSTANDARD
-
namespace System.Diagnostics.Tracing
{
public class EventCounter
}
}
}
-
-#endif
{
}
-#if NETSTANDARD
[MonoTODO]
public event EventHandler<EventCommandEventArgs> EventCommandExecuted
{
add { throw new NotImplementedException (); }
remove { throw new NotImplementedException (); }
}
-#endif
[MonoTODO]
public static string GenerateManifest (Type eventSourceType, string assemblyPathToIncludeInManifest)
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if !FULL_AOT_RUNTIME || IOS_REFLECTION
using System.Runtime.InteropServices;
namespace System.Reflection.Emit {
WindowApplication = 3
}
}
-
-#endif
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NETSTANDARD
-
namespace System.Reflection.Metadata
{
public static class AssemblyExtensions
}
}
}
-
-#endif
\ No newline at end of file
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NETSTANDARD
-
namespace System.Runtime.Loader
{
//
#pragma warning restore
}
}
-
-#endif
\ No newline at end of file
private void DoCallBack (object timedOut)
{
- if (_callback != null) {
- try {
- _callback (_state, (bool)timedOut);
- } catch {}
- }
-
- lock (this)
- {
- _callsInProcess--;
- if (_unregistered && _callsInProcess == 0 && _finalEvent != null)
- NativeEventCalls.SetEvent (_finalEvent.SafeWaitHandle);
+ try {
+ if (_callback != null)
+ _callback (_state, (bool)timedOut);
+ } finally {
+ lock (this)
+ {
+ _callsInProcess--;
+ if (_unregistered && _callsInProcess == 0 && _finalEvent != null)
+ NativeEventCalls.SetEvent (_finalEvent.SafeWaitHandle);
+ }
}
}
}
}
+ public static void Reverse<T>(T[] array)
+ {
+ if (array == null)
+ throw new ArgumentNullException (nameof (array));
+
+ Reverse (array, 0, array.Length);
+ }
+
+ public static void Reverse<T>(T[] array, int index, int length)
+ {
+ if (array == null)
+ throw new ArgumentNullException (nameof (array));
+ if (index < 0 || length < 0)
+ throw new ArgumentOutOfRangeException ((index < 0 ? nameof (index) : nameof (length)));
+ if (array.Length - index < length)
+ throw new ArgumentException ();
+
+ int i = index;
+ int j = index + length - 1;
+ while (i < j) {
+ T temp = array [i];
+ array [i] = array [j];
+ array [j] = temp;
+ i++;
+ j--;
+ }
+ }
+
[ReliabilityContractAttribute (Consistency.MayCorruptInstance, Cer.MayFail)]
public static void Sort (Array array)
{
return new ReadOnlyCollection<T> (array);
}
+ public static void Fill<T> (T[] array, T value)
+ {
+ if (array == null)
+ throw new ArgumentNullException (nameof (array));
+
+ for (int i = 0; i < array.Length; i++)
+ array [i] = value;
+ }
+
+ public static void Fill<T> (T[] array, T value, int startIndex, int count)
+ {
+ if (array == null)
+ throw new ArgumentNullException (nameof (array));
+
+ if (startIndex < 0 || startIndex > array.Length)
+ throw new ArgumentOutOfRangeException (nameof (startIndex));
+
+ if (count < 0 || startIndex > array.Length - count)
+ throw new ArgumentOutOfRangeException (nameof (count));
+
+ for (int i = startIndex; i < startIndex + count; i++)
+ array [i] = value;
+ }
+
public static T Find<T> (T [] array, Predicate<T> match)
{
if (array == null)
[Test]
public void SetNameInThreadPoolThread ()
{
- for (int i = 0; i < 10; ++i) {
- Task t = Task.Run (delegate () {
- Thread.CurrentThread.Name = "x/" + i;
- Assert.AreEqual (Thread.CurrentThread.Name, "x/" + i, "#1");
+ Task t = Task.Run (delegate () {
+ Thread.CurrentThread.Name = "ThreadName1";
+ Assert.AreEqual (Thread.CurrentThread.Name, "ThreadName1", "#1");
- try {
- Thread.CurrentThread.Name = "y/" + i;
- Assert.Fail ("#2");
- } catch (InvalidOperationException) {
- }
- });
+ try {
+ Thread.CurrentThread.Name = "ThreadName2";
+ Assert.Fail ("#2");
+ } catch (InvalidOperationException) {
+ }
+ });
- t.Wait ();
- }
+ t.Wait ();
}
void CheckIsRunning (string s, Thread t)
// this bucket is used to avoid non-theadlocal issues
class Bucket {
public int count;
+ public ManualResetEventSlim mre = new ManualResetEventSlim (false);
}
[SetUp]
{
}
+ private void Callback2 (object foo)
+ {
+ Bucket b = foo as Bucket;
+ Interlocked.Increment (ref b.count);
+ b.mre.Set ();
+ }
+
+
[Test]
public void TestDueTime ()
{
Bucket bucket = new Bucket();
- using (Timer t = new Timer (o => Callback (o), bucket, 200, Timeout.Infinite)) {
- Thread.Sleep (50);
- Assert.AreEqual (0, bucket.count, "#1");
- Thread.Sleep (200);
- Assert.AreEqual (1, bucket.count, "#2");
- Thread.Sleep (500);
- Assert.AreEqual (1, bucket.count, "#3");
- t.Change (10, 10);
- Thread.Sleep (1000);
- Assert.IsTrue(bucket.count > 20, "#4");
+ using (Timer t = new Timer (o => Callback2 (o), bucket, 200, Timeout.Infinite)) {
+ Assert.IsTrue (bucket.mre.Wait (5000), "#-1");
+ Assert.AreEqual (1, bucket.count, "#1");
}
}
+ [Test]
+ public void TestDispose ()
+ {
+ Bucket bucket = new Bucket();
+
+ using (Timer t = new Timer (o => Callback2 (o), bucket, 10, 10)) {
+ Assert.IsTrue (bucket.mre.Wait (5000), "#-1");
+ }
+ //If the callback is called after dispose, it will NRE and be reported
+ bucket.mre = null;
+ int c = bucket.count;
+ Assert.IsTrue (c > 0, "#1");
+ }
+
[Test]
public void TestChange ()
{
Bucket bucket = new Bucket();
- using (Timer t = new Timer (o => Callback (o), bucket, 10, 10)) {
- Thread.Sleep (500);
+ using (Timer t = new Timer (o => Callback2 (o), bucket, 10, 10)) {
+ Assert.IsTrue (bucket.mre.Wait (5000), "#-1");
int c = bucket.count;
- Assert.IsTrue (c > 20, "#1 " + c.ToString ());
- t.Change (100, 100);
+ Assert.IsTrue (c > 0, "#1 " + c);
+ t.Change (100000, 1000000);
c = bucket.count;
Thread.Sleep (500);
- Assert.IsTrue (bucket.count <= c + 20, "#2 " + c.ToString ());
+ Assert.IsTrue (bucket.count <= c + 1, "#2 " + c);
}
}
{
Bucket bucket = new Bucket();
- using (Timer t = new Timer (o => Callback (o), bucket, 0, Timeout.Infinite)) {
- Thread.Sleep (100);
+ using (Timer t = new Timer (o => Callback2 (o), bucket, 0, Timeout.Infinite)) {
+ Assert.IsTrue (bucket.mre.Wait (5000), "#-1");
+ bucket.mre.Reset ();
Assert.AreEqual (1, bucket.count, "#1");
t.Change (0, Timeout.Infinite);
- Thread.Sleep (100);
+ Assert.IsTrue (bucket.mre.Wait (5000), "#1.5");
Assert.AreEqual (2, bucket.count, "#2");
}
}
- [Test]
- public void TestDispose ()
- {
- Bucket bucket = new Bucket();
-
- using (Timer t = new Timer (o => Callback (o), bucket, 10, 10)) {
- Thread.Sleep (200);
- }
-
- Thread.Sleep (20);
- int c = bucket.count;
- Assert.IsTrue (bucket.count > 5, "#1");
- Thread.Sleep (200);
- Assert.AreEqual (c, bucket.count, "#2");
- }
-
[Test] // bug #320950
public void TestDispose2 ()
{
//
using System;
+using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
[Test]
public void ReRegisterForFinalizeTest ()
{
- Run_ReRegisterForFinalizeTest ();
+ var thread = new Thread (Run_ReRegisterForFinalizeTest);
+ thread.Start ();
+ thread.Join ();
+
var t = Task.Factory.StartNew (() => {
do {
GC.Collect ();
return LambdaCompiler.Compile(this, debugInfoGenerator);
}
-#if NETSTANDARD
public Delegate Compile(bool preferInterpretation) {
// TODO: add logic for preferInterpretation
return Compile();
}
-#endif
/// <summary>
/// Compiles the lambda into a method definition.
return (TDelegate)(object)LambdaCompiler.Compile(this, debugInfoGenerator);
}
-#if NETSTANDARD
public new TDelegate Compile(bool preferInterpretation) {
// TODO: add logic for preferInterpretation
return Compile();
}
-#endif
/// <summary>
/// Creates a new expression that is like this one, but using the
foreach (TSource element in second) yield return element;
}
-#if NETSTANDARD
public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element)
{
if (source == null) throw Error.ArgumentNull("source");
yield return element;
foreach (TSource e1 in source) yield return e1;
}
-#endif
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector) {
if (first == null) throw Error.ArgumentNull("first");
}
}
-#if NETSTANDARD
public static CngAlgorithm ECDiffieHellman {
get {
throw new NotImplementedException ();
throw new NotImplementedException ();
}
}
-#endif
}
}
}
}
-#if NETSTANDARD
public static CngKeyBlobFormat EccFullPrivateBlob {
get {
throw new NotImplementedException ();
throw new NotImplementedException ();
}
}
-#endif
public static CngKeyBlobFormat GenericPrivateBlob {
get {
return CryptoConfig.CreateFromName(algorithm) as ECDsa;
}
-#if NETSTANDARD
public static ECDsa Create (ECCurve curve)
{
throw new NotImplementedException ();
{
throw new NotImplementedException ();
}
-#endif
//
// Signature operations
throw new NotImplementedException ();
}
-#if NETSTANDARD
public ECDsaCng(ECCurve curve) {
throw new NotImplementedException ();
}
-#endif
public CngKey Key {
get {
throw new NotImplementedException ();
}
-#if NETSTANDARD
public RSACng(CngKey key)
{
throw new NotImplementedException ();
}
-#endif
public CngKey Key
{
using System.Data;
using System.Runtime.Serialization;
+#if !COREFX
/// <devdoc>
/// <para>DEV: The exception that is throwing from strong typed DataSet when user access to DBNull value.</para>
/// </devdoc>
HResult = HResults.StrongTyping;
}
}
-
+#endif
/// <devdoc>
/// <para>DEV: The exception that is throwing in generating strong typed DataSet when name conflict happens.</para>
// The resource Framework.txt will ensure proper string text based on the appropriate
// locale.
+ public const CompareOptions DefaultCompareOptions = CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase;
+
static internal Task<T> CreatedTaskWithException<T>(Exception ex) {
TaskCompletionSource<T> completion = new TaskCompletionSource<T>();
completion.SetException(ex);
}
}
- // NOTE: Initializing a Task in SQL CLR requires the "UNSAFE" permission set (http://msdn.microsoft.com/en-us/library/ms172338.aspx)
- // Therefore we are lazily initializing these Tasks to avoid forcing customers to use the "UNSAFE" set when they are actually using no Async features (See Dev11 Bug #193253)
- static private Task<bool> _trueTask = null;
- static internal Task<bool> TrueTask {
- get {
- if (_trueTask == null) {
- _trueTask = Task.FromResult<bool>(true);
- }
- return _trueTask;
- }
- }
+ static internal Task<bool> s_trueTask = Task.FromResult<bool>(true);
- static private Task<bool> _falseTask = null;
- static internal Task<bool> FalseTask {
- get {
- if (_falseTask == null) {
- _falseTask = Task.FromResult<bool>(false);
- }
- return _falseTask;
- }
- }
+ static internal Task<bool> s_falseTask = Task.FromResult<bool>(true);
[BidMethod] // this method accepts BID format as an argument, this attribute allows FXCopBid rule to validate calls to it
static private void TraceException(
_encryptedUsersConnectionString = connectionOptions.UsersConnectionString(false);
_hasPassword = connectionOptions.HasPasswordKeyword;
_parsetable = connectionOptions.Parsetable;
- _keychain = connectionOptions.KeyChain;
+ _keychain = connectionOptions._keyChain;
// we do not want to serialize out user password unless directed so by "persist security info=true"
// otherwise all instances of user's password will be replaced with "*"
private readonly string _usersConnectionString;
private readonly Hashtable _parsetable;
- internal readonly NameValuePair KeyChain;
+ internal readonly NameValuePair _keyChain;
internal readonly bool HasPasswordKeyword;
internal readonly bool HasUserIdKeyword;
// first pass on parsing, initial syntax check
if (0 < _usersConnectionString.Length) {
- KeyChain = ParseInternal(_parsetable, _usersConnectionString, true, synonyms, UseOdbcRules);
+ _keyChain = ParseInternal(_parsetable, _usersConnectionString, true, synonyms, UseOdbcRules);
HasPasswordKeyword = (_parsetable.ContainsKey(KEY.Password) || _parsetable.ContainsKey(SYNONYM.Pwd));
HasUserIdKeyword = (_parsetable.ContainsKey(KEY.User_ID) || _parsetable.ContainsKey(SYNONYM.UID));
}
HasUserIdKeyword = connectionOptions.HasUserIdKeyword;
UseOdbcRules = connectionOptions.UseOdbcRules;
_parsetable = connectionOptions._parsetable;
- KeyChain = connectionOptions.KeyChain;
+ _keyChain = connectionOptions._keyChain;
}
}
public bool IsEmpty {
- get { return (null == KeyChain); }
+ get { return (null == _keyChain); }
}
internal Hashtable Parsetable {
int copyPosition = 0;
bool expanded = false;
- for(NameValuePair current = KeyChain; null != current; current = current.Next) {
+ for(NameValuePair current = _keyChain; null != current; current = current.Next) {
value = current.Value;
// remove duplicate keyswords from connectionstring
int copyPosition = 0;
StringBuilder builder = new StringBuilder(_usersConnectionString.Length);
- for(NameValuePair current = KeyChain; null != current; current = current.Next) {
+ for(NameValuePair current = _keyChain; null != current; current = current.Next) {
if ((current.Name == keyword) && (current.Value == this[keyword])) {
// only replace the parse end-result value instead of all values
// so that when duplicate-keywords occur other original values remain in place
int copyPosition = 0;
NameValuePair head = null, tail = null, next = null;
StringBuilder builder = new StringBuilder(_usersConnectionString.Length);
- for(NameValuePair current = KeyChain; null != current; current = current.Next) {
+ for(NameValuePair current = _keyChain; null != current; current = current.Next) {
if ((KEY.Password != current.Name) && (SYNONYM.Pwd != current.Name)) {
builder.Append(_usersConnectionString, copyPosition, current.Length);
if (fakePassword) {
[BidMethod]
[BidArgumentType(typeof(string))] // format string should have a string spec (%ls) for an Activity ID argument as last
internal static void CorrelationTrace(string fmtPrintfW, System.Int32 a1) {
- if ((modFlags & System.Data.Common.ActivityCorrelator.CorrelationTracePoints) != 0
+ if ((modFlags & Bid.ApiGroup.Correlation) != 0
&& (modFlags & Bid.ApiGroup.Trace) != 0 && modID != NoData) {
System.Data.Common.ActivityCorrelator.ActivityId actId = System.Data.Common.ActivityCorrelator.Next();
NativeMethods.Trace(modID, UIntPtr.Zero, UIntPtr.Zero, fmtPrintfW, a1, actId.ToString());
[BidArgumentType(typeof(string))] // format string should have a string spec (%ls) for an Activity ID argument as last
internal static void CorrelationTrace(string fmtPrintfW)
{
- if ((modFlags & System.Data.Common.ActivityCorrelator.CorrelationTracePoints) != 0
+ if ((modFlags & Bid.ApiGroup.Correlation) != 0
&& (modFlags & Bid.ApiGroup.Trace) != 0 && modID != NoData) {
System.Data.Common.ActivityCorrelator.ActivityId actId = System.Data.Common.ActivityCorrelator.Next();
NativeMethods.Trace(modID, UIntPtr.Zero, UIntPtr.Zero, fmtPrintfW, actId.ToString());
[BidMethod]
[BidArgumentType(typeof(string))] // format string should have a string spec (%ls) for an Activity ID argument as last
internal static void CorrelationTrace(string fmtPrintfW, System.Int32 a1, System.Int32 a2) {
- if ((modFlags & System.Data.Common.ActivityCorrelator.CorrelationTracePoints) != 0
+ if ((modFlags & Bid.ApiGroup.Correlation) != 0
&& (modFlags & Bid.ApiGroup.Trace) != 0 && modID != NoData) {
System.Data.Common.ActivityCorrelator.ActivityId actId = System.Data.Common.ActivityCorrelator.Next();
NativeMethods.Trace(modID, UIntPtr.Zero, UIntPtr.Zero, fmtPrintfW, a1, a2, actId.ToString());
_array[_size] = default(T); // Free memory quicker.
return item;
}
+
+#if MONO
+ public bool TryPop(out T result)
+ {
+ if (_size == 0)
+ {
+ result = default(T);
+ return false;
+ }
+
+ _version++;
+ result = _array[--_size];
+ _array[_size] = default(T); // Free memory quicker.
+ return true;
+ }
+#endif
// Pushes an item to the top of the stack.
//
}
}
-#if NETSTANDARD
[CLSCompliant (false)]
protected IDictionary Caps
{
}
}
}
-#endif
/// <devdoc>
/// <para>
}
}
-#if NETSTANDARD
public static string TargetFrameworkName
{
get
{
throw new NotImplementedException();
}
-#endif
#region Switch APIs
#if !MONO
targs.Arguments = new TypeSpec[hoisted_tparams.Length];
for (int i = 0; i < hoisted_tparams.Length; ++i) {
var tp = hoisted_tparams[i];
- var local_tp = new TypeParameter (tp, null, new MemberName (tp.Name, Location), null);
+ var tp_name = tp.Name;
+#if DEBUG
+ tp_name += "_Proxy";
+#endif
+ var local_tp = new TypeParameter (tp, null, new MemberName (tp_name, Location), null);
tparams.Add (local_tp);
targs.Add (new SimpleName (tp.Name, Location));
var mutator = new TypeParameterMutator (hoisted_tparams, tparams);
return_type = mutator.Mutate (return_type);
local_param_types = mutator.Mutate (local_param_types);
+
+ var inflator = new TypeParameterInflator (this, null, hoisted_tparams, targs.Arguments);
+ for (int i = 0; i < hoisted_tparams.Length; ++i) {
+ var tp_spec = (TypeParameterSpec) targs.Arguments [i];
+ tp_spec.InflateConstraints (inflator, tp_spec);
+ }
} else {
member_name = new MemberName (name);
}
base_parameters[i].Resolve (this, i);
}
- var cloned_params = ParametersCompiled.CreateFullyResolved (base_parameters, method.Parameters.Types);
+ var cloned_params = ParametersCompiled.CreateFullyResolved (base_parameters, local_param_types);
if (method.Parameters.HasArglist) {
cloned_params.FixedParameters[0] = new Parameter (null, "__arglist", Parameter.Modifier.NONE, null, Location);
cloned_params.Types[0] = Module.PredefinedTypes.RuntimeArgumentHandle.Resolve ();
var ie = new InstanceEmitter (instance_copy, IsAddressCall (instance_copy, call_op, method.DeclaringType));
if (Arguments == null) {
- ie.EmitLoad (ec, true);
+ if (ConditionalAccess)
+ ie.Emit (ec, true);
+ else
+ ie.EmitLoad (ec, true);
}
} else if (!InstanceExpressionOnStack) {
var ie = new InstanceEmitter (InstanceExpression, IsAddressCall (InstanceExpression, call_op, method.DeclaringType));
// introduce redundant storey but with `this' only but it's tricky to avoid
// at this stage as we don't know what expressions follow base
//
+ // TODO: It's needed only when the method with base call is moved to a storey
+ //
if (rc.CurrentAnonymousMethod != null) {
if (targs == null && method.IsGeneric) {
targs = method.TypeArguments;
}
}
- static CSharp.Operator.OpType ConvertBinaryToUserOperator (Operator op)
+ public static CSharp.Operator.OpType ConvertBinaryToUserOperator (Operator op)
{
switch (op) {
case Operator.Addition:
args);
}
- protected override Expression DoResolve (ResolveContext ec)
+ protected override Expression DoResolve (ResolveContext rc)
{
- Expression e = base.DoResolve (ec);
+ Expression e = base.DoResolve (rc);
if (type == null)
return null;
if (type.IsDelegate) {
- ec.Report.Error (1958, Initializers.Location,
+ rc.Report.Error (1958, Initializers.Location,
"Object and collection initializers cannot be used to instantiate a delegate");
}
- Expression previous = ec.CurrentInitializerVariable;
- ec.CurrentInitializerVariable = new InitializerTargetExpression (this);
- initializers.Resolve (ec);
- ec.CurrentInitializerVariable = previous;
+ Expression previous = rc.CurrentInitializerVariable;
+ rc.CurrentInitializerVariable = new InitializerTargetExpression (this);
+ using (rc.With (ResolveContext.Options.DontSetConditionalAccessReceiver, false)) {
+ initializers.Resolve (rc);
+ }
+ rc.CurrentInitializerVariable = previous;
dynamic = e as DynamicExpressionStatement;
if (dynamic != null)
public TypeParameter (TypeParameterSpec spec, TypeSpec parentSpec, MemberName name, Attributes attrs)
: base (null, name, attrs)
{
- this.spec = new TypeParameterSpec (parentSpec, spec.DeclaredPosition, spec.MemberDefinition, spec.SpecialConstraint, spec.Variance, null) {
+ this.spec = new TypeParameterSpec (parentSpec, spec.DeclaredPosition, this, spec.SpecialConstraint, spec.Variance, null) {
BaseType = spec.BaseType,
InterfacesDefined = spec.InterfacesDefined,
TypeArguments = spec.TypeArguments
};
}
-
+
#region Properties
public override AttributeTargets AttributeTargets {
return this;
var mutated = (InflatedTypeSpec) MemberwiseClone ();
+#if DEBUG
+ mutated.ID += 1000000;
+#endif
+
if (decl != DeclaringType) {
// Gets back MethodInfo in case of metaInfo was inflated
//mutated.info = MemberCache.GetMember<TypeSpec> (DeclaringType.GetDefinition (), this).info;
var entry_pm = entry as IParametersMember;
if (entry_pm != null) {
entry_param = entry_pm.Parameters;
- if (!TypeSpecComparer.Override.IsEqual (entry_param, member_param))
- continue;
+ if (entry.DeclaringType != member.DeclaringType) {
+ if (!TypeSpecComparer.Override.IsEqual (entry_param, member_param))
+ continue;
+ } else {
+ if (!TypeSpecComparer.Equals (entry_param.Types, member_param.Types))
+ continue;
+ }
}
}
return ms;
}
+#if DEBUG
+ int counter = 100000;
+#endif
+
public MethodSpec MakeGenericMethod (IMemberContext context, params TypeSpec[] targs)
{
if (targs == null)
inflated.constraints = TypeParameterSpec.InflateConstraints (inflator, constraints ?? GenericDefinition.TypeParameters);
inflated.state |= StateFlags.PendingMakeMethod;
+#if DEBUG
+ inflated.ID += counter;
+ counter += 100000;
+#endif
// if (inflated.parent == null)
// inflated.parent = parent;
if (debug_builder == null)
return;
+#if !FULL_AOT_RUNTIME
var token = ConstructorBuilder.GetToken ();
int t = token.Token;
#if STATIC
#endif
debug_builder.DefineMethod (file, t);
+#endif
}
#region IMethodData Members
if (debug_builder == null)
return;
+#if !FULL_AOT_RUNTIME
var token = builder.GetToken ();
int t = token.Token;
#if STATIC
#endif
debug_builder.DefineMethod (file, t);
+#endif
}
}
Right = Unwrap.CreateUnwrapped (Right);
UnwrapRight = Right as Unwrap;
}
+
+ if (Left.Type.BuiltinType == BuiltinTypeSpec.Type.Decimal) {
+ var decimal_operators = MemberCache.GetUserOperator (Left.Type, Binary.ConvertBinaryToUserOperator (Binary.Oper), false);
+
+ Arguments args = new Arguments (2);
+ args.Add (new Argument (Left));
+ args.Add (new Argument (Right));
+
+ const OverloadResolver.Restrictions restr = OverloadResolver.Restrictions.ProbingOnly |
+ OverloadResolver.Restrictions.NoBaseMembers | OverloadResolver.Restrictions.BaseMembersIncluded;
+
+ var res = new OverloadResolver (decimal_operators, restr, loc);
+ UserOperator = res.ResolveOperator (rc, ref args);
+ }
}
type = Binary.Type;
// Special case hoisted return value (happens in try/finally scenario)
//
if (ec.TryFinallyUnwind != null) {
- exit_label = TryFinally.EmitRedirectedReturn (ec, async_body);
+ exit_label = TryFinally.EmitRedirectedReturn (ec, async_body, unwind_protect);
}
var async_return = (IAssignMethod)storey.HoistedReturnValue;
expr.Emit (ec);
if (ec.TryFinallyUnwind != null)
- exit_label = TryFinally.EmitRedirectedReturn (ec, async_body);
+ exit_label = TryFinally.EmitRedirectedReturn (ec, async_body, unwind_protect);
}
ec.Emit (OpCodes.Leave, exit_label);
if (ec.TryFinallyUnwind != null && IsLeavingFinally (label.Block)) {
var async_body = (AsyncInitializer) ec.CurrentAnonymousMethod;
- l = TryFinally.EmitRedirectedJump (ec, async_body, l, label.Block);
+ l = TryFinally.EmitRedirectedJump (ec, async_body, l, label.Block, unwind_protect);
}
ec.Emit (unwind_protect ? OpCodes.Leave : OpCodes.Br, l);
if (ec.TryFinallyUnwind != null) {
var async_body = (AsyncInitializer) ec.CurrentAnonymousMethod;
- l = TryFinally.EmitRedirectedJump (ec, async_body, l, enclosing_loop.Statement as Block);
+ l = TryFinally.EmitRedirectedJump (ec, async_body, l, enclosing_loop.Statement as Block, unwind_protect);
}
ec.Emit (unwind_protect ? OpCodes.Leave : OpCodes.Br, l);
if (ec.TryFinallyUnwind != null) {
var async_body = (AsyncInitializer) ec.CurrentAnonymousMethod;
- l = TryFinally.EmitRedirectedJump (ec, async_body, l, enclosing_loop.Statement as Block);
+ l = TryFinally.EmitRedirectedJump (ec, async_body, l, enclosing_loop.Statement as Block, unwind_protect);
}
ec.Emit (unwind_protect ? OpCodes.Leave : OpCodes.Br, l);
{
ExplicitBlock fini;
List<DefiniteAssignmentBitSet> try_exit_dat;
- List<Label> redirected_jumps;
+ List<Tuple<Label, bool>> redirected_jumps;
Label? start_fin_label;
public TryFinally (Statement stmt, ExplicitBlock fini, Location loc)
return false;
}
- public static Label EmitRedirectedJump (EmitContext ec, AsyncInitializer initializer, Label label, Block labelBlock)
+ public static Label EmitRedirectedJump (EmitContext ec, AsyncInitializer initializer, Label label, Block labelBlock, bool unwindProtect)
{
int idx;
if (labelBlock != null) {
if (labelBlock != null && !fin.IsParentBlock (labelBlock))
break;
- fin.EmitRedirectedExit (ec, label, initializer, set_return_state);
+ fin.EmitRedirectedExit (ec, label, initializer, set_return_state, unwindProtect);
set_return_state = false;
if (fin.start_fin_label == null) {
return label;
}
- public static Label EmitRedirectedReturn (EmitContext ec, AsyncInitializer initializer)
+ public static Label EmitRedirectedReturn (EmitContext ec, AsyncInitializer initializer, bool unwindProtect)
{
- return EmitRedirectedJump (ec, initializer, initializer.BodyEnd, null);
+ return EmitRedirectedJump (ec, initializer, initializer.BodyEnd, null, unwindProtect);
}
- void EmitRedirectedExit (EmitContext ec, Label label, AsyncInitializer initializer, bool setReturnState)
+ void EmitRedirectedExit (EmitContext ec, Label label, AsyncInitializer initializer, bool setReturnState, bool unwindProtect)
{
if (redirected_jumps == null) {
- redirected_jumps = new List<Label> ();
+ redirected_jumps = new List<Tuple<Label, bool>> ();
// Add fallthrough label
- redirected_jumps.Add (ec.DefineLabel ());
+ redirected_jumps.Add (Tuple.Create (ec.DefineLabel (), false));
if (setReturnState)
initializer.HoistedReturnState = ec.GetTemporaryField (ec.Module.Compiler.BuiltinTypes.Int, true);
}
- int index = redirected_jumps.IndexOf (label);
+ int index = redirected_jumps.FindIndex (l => l.Item1 == label);
if (index < 0) {
- redirected_jumps.Add (label);
+ redirected_jumps.Add (Tuple.Create (label, unwindProtect));
index = redirected_jumps.Count - 1;
}
var initializer = (AsyncInitializer)ec.CurrentAnonymousMethod;
initializer.HoistedReturnState.EmitLoad (ec);
- ec.Emit (OpCodes.Switch, redirected_jumps.ToArray ());
+
+ var jumps_table = new Label [redirected_jumps.Count];
+ List<Tuple<Label, Label>> leave_redirect = null;
+ for (int i = 0; i < jumps_table.Length; ++i) {
+ var val = redirected_jumps [i];
+
+ if (val.Item2) {
+ if (leave_redirect == null)
+ leave_redirect = new List<Tuple<Label, Label>> ();
+ var label = ec.DefineLabel ();
+ leave_redirect.Add (Tuple.Create (label, val.Item1));
+ jumps_table [i] = label;
+ } else {
+ jumps_table [i] = val.Item1;
+ }
+ }
+
+ ec.Emit (OpCodes.Switch, jumps_table);
+
+ if (leave_redirect != null) {
+ foreach (var entry in leave_redirect) {
+ ec.MarkLabel (entry.Item1);
+ ec.Emit (OpCodes.Leave, entry.Item2);
+ }
+ }
// Mark fallthrough label
- ec.MarkLabel (redirected_jumps [0]);
+ ec.MarkLabel (jumps_table [0]);
}
protected override bool DoFlowAnalysis (FlowAnalysisContext fc)
}
}
- static FieldInfo flags = typeof (CSharpArgumentInfo).GetField ("flags", BindingFlags.NonPublic | BindingFlags.Instance);
+ static PropertyInfo flags = typeof (CSharpArgumentInfo).GetProperty ("Flags", BindingFlags.NonPublic | BindingFlags.Instance);
static void AssertArgument (CallSiteBinder obj, CSharpArgumentInfo[] expected, string name)
{
- var ai = obj.GetType ().GetField ("argumentInfo", BindingFlags.NonPublic | BindingFlags.Instance);
+ var ai = obj.GetType ().GetField ("_argumentInfo", BindingFlags.NonPublic | BindingFlags.Instance);
+ if (ai == null)
+ throw new ApplicationException ("Could not find 'argumentInfo' private field on " + obj.GetType ());
+
IList<CSharpArgumentInfo> values = (IList<CSharpArgumentInfo>) ai.GetValue (obj);
if (values.Count != expected.Length)
throw new ApplicationException (name + ": Array length does not match " + values.Count + " != " + expected.Length);
if (Disposable.Counter != 1)
return false;
-
+/*
try {
using (dynamic u = new Disposable ()) {
u.VV ();
using (dynamic u = new Disposable ()) {
u.Test ();
}
-
+*/
return true;
}
a[4] ^= b;
dynamic d = 1;
+/*
b = byte.MaxValue;
try {
checked {
}
b += d;
-
+*/
try {
checked {
a.Byte += 100;
() => {
dynamic d = 1;
d ();
- }, "Cannot invoke a non-delegate type `int'");
+ }, "Cannot invoke a non-delegate type");
}
void Using_1 ()
AssertError (
() => {
using (dynamic d = 1) { }
- }, "Cannot implicitly convert type `int' to `System.IDisposable'");
+ }, "Cannot implicitly convert type 'int' to 'System.IDisposable'");
}
void Unsafe_1 ()
dynamic d = 1;
AssertError (
() => Helper.Foo (d),
- "Pointers and fixed size buffers cannot be used in a dynamic context");
+ "Dynamic calls cannot be used in conjunction with pointers");
}
void NullableConversion ()
dynamic b = false;
byte? b2 = null;
b &= b2;
- }, "Operator `&=' cannot be applied to operands of type `bool' and `byte?'");
+ }, "Operator '&=' cannot be applied to operands of type 'bool' and 'byte?'");
}
#pragma warning restore 169
d.Foo ();
return 1;
} catch (RuntimeBinderException e) {
- if (e.Message != "`A.N.Foo()' is inaccessible due to its protection level")
+ if (e.Message != "'object' does not contain a definition for 'Foo'")
return 2;
}
var x = d.Property;
return 3;
} catch (RuntimeBinderException e) {
- if (e.Message != "`A.N.Property.get' is inaccessible due to its protection level")
+ if (e.Message != "'object' does not contain a definition for 'Property'")
return 4;
}
var x = d [4];
return 5;
} catch (RuntimeBinderException e) {
- if (e.Message != "`A.N.this[int]' is inaccessible due to its protection level")
+ if (e.Message != "Cannot apply indexing with [] to an expression of type 'object'")
return 6;
}
try {
getter.Target (getter, new C ());
} catch (RuntimeBinderException e) {
- if (e.Message == "`C' does not contain a definition for `n'")
+ if (e.Message == "'C' does not contain a definition for 'n'")
return 0;
return 2;
d.Value = (object)"value";
return 1;
} catch (RuntimeBinderException e) {
- if (e.Message != "Cannot implicitly convert type `object' to `string'. An explicit conversion exists (are you missing a cast?)")
+ if (e.Message != "Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)")
return 2;
}
--- /dev/null
+using System;
+
+public struct MoneyValue
+{
+ private readonly decimal _amount;
+
+ public MoneyValue (decimal amount)
+ {
+ _amount = amount;
+ }
+
+ public static implicit operator decimal (MoneyValue moneyValue)
+ {
+ return moneyValue._amount;
+ }
+}
+
+public class Program
+{
+ static void Main ()
+ {
+ var nullMoneyValue = (MoneyValue?) null;
+ var moneyValue = new MoneyValue (123);
+
+ var crashApplication = nullMoneyValue < moneyValue;
+
+ Console.WriteLine("All OK");
+ }
+}
--- /dev/null
+// Compiler options: -target:library
+
+namespace SeparateAssembly
+{
+ public interface IGenericAction<T1, T2>
+ {
+ void AddAction(IGenericAction<T1, T2> action);
+ void AddAction(IGenericAction<T2, T1> action);
+ }
+}
\ No newline at end of file
--- /dev/null
+// Compiler options: -r:gtest-645-lib.dll
+
+using System;
+using SeparateAssembly;
+
+class Program
+{
+ public static void Main()
+ {
+ }
+
+ public static void AddChildButton<T1, T2>(IGenericAction<T1, T2> action)
+ {
+ IGenericAction<T2, T1> childAction = null;
+ action.AddAction (childAction);
+ }
+}
\ No newline at end of file
--- /dev/null
+using System;
+
+public abstract class BaseClass<T>
+{
+}
+
+public class DerivedClass : BaseClass<int>
+{
+}
+
+public abstract class CA
+{
+ [Obsolete]
+ public virtual void Foo<T, U> (U args) where T : BaseClass<U>, new()
+ {
+ }
+}
+
+public class CB : CA
+{
+ public CB ()
+ {
+ int x = 4;
+ Action<int> pp = r => base.Foo<DerivedClass, int> (x);
+ }
+
+ public static void Main ()
+ {
+ new CB ();
+ }
+}
\ No newline at end of file
--- /dev/null
+using System.Threading.Tasks;
+
+static class Y
+{
+ public static string ExCall (this X x)
+ {
+ return null;
+ }
+}
+
+class X
+{
+ static X Test (object o)
+ {
+ return null;
+ }
+
+ X Prop { get; set;}
+
+ X Call ()
+ {
+ return null;
+ }
+
+ public static void Main ()
+ {
+ var x = new X ();
+ x.Test ().Wait ();
+ }
+
+ async Task Test ()
+ {
+ var x = X.Test (await Task.FromResult (1))?.Prop?.ExCall ();
+ }
+}
\ No newline at end of file
--- /dev/null
+using System;
+using System.Threading.Tasks;
+
+class C : IDisposable
+{
+ public void Dispose ()
+ {
+ Console.WriteLine ("Disposed");
+ TestClass.Passed++;
+ }
+}
+
+public class TestClass
+{
+ public static int Passed;
+
+ public static async Task Test ()
+ {
+ using (var device_resource = new C ()) {
+ try {
+ Console.WriteLine ("aa");
+ return;
+ } finally {
+ await Task.Delay (0);
+ }
+ }
+ }
+
+ public static int Main()
+ {
+ Test ().Wait ();
+ if (Passed != 1)
+ return 1;
+
+ Console.WriteLine ("PASSED");
+ return 0;
+ }
+}
\ No newline at end of file
--- /dev/null
+using System;
+
+class X
+{
+ public int Field { get; set; }
+
+ public int F3 { get; set; }
+}
+
+class App
+{
+ static void Main()
+ {
+ string s = null;
+ var x = new X {
+ Field = s?.ToString () == null ? 1 : 2
+ }.F3;
+ }
+}
\ No newline at end of file
<size>99</size>
</method>
<method name="Void AssertArgument(System.Runtime.CompilerServices.CallSiteBinder, Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo[], System.String)" attrs="145">
- <size>172</size>
+ <size>206</size>
</method>
<method name="Void BinaryAdd_1(System.Object, DynamicObjectMock)" attrs="129">
<size>124</size>
<size>235</size>
</method>
<method name="Boolean UsingTest()" attrs="129">
- <size>619</size>
+ <size>222</size>
</method>
<method name="Int32 Main()" attrs="150">
<size>99</size>
<size>2</size>
</method>
<method name="Int32 Main()" attrs="150">
- <size>3609</size>
+ <size>3273</size>
</method>
<method name="Void .ctor()" attrs="6278">
<size>39</size>
</method>
</type>
</test>
+ <test name="gtest-644.cs">
+ <type name="MoneyValue">
+ <method name="System.Decimal op_Implicit(MoneyValue)" attrs="2198">
+ <size>16</size>
+ </method>
+ <method name="Void .ctor(Decimal)" attrs="6278">
+ <size>9</size>
+ </method>
+ </type>
+ <type name="Program">
+ <method name="Void Main()" attrs="145">
+ <size>75</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ </test>
+ <test name="gtest-645.cs">
+ <type name="Program">
+ <method name="Void Main()" attrs="150">
+ <size>2</size>
+ </method>
+ <method name="Void AddChildButton[T1,T2](SeparateAssembly.IGenericAction`2[T1,T2])" attrs="150">
+ <size>11</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ </test>
<test name="gtest-anontype-01.cs">
<type name="Test">
<method name="Int32 Main()" attrs="150">
</method>
</type>
</test>
+ <test name="test-anon-178.cs">
+ <type name="BaseClass`1[T]">
+ <method name="Void .ctor()" attrs="6276">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="DerivedClass">
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="CA">
+ <method name="Void Foo[T,U](U)" attrs="454">
+ <size>2</size>
+ </method>
+ <method name="Void .ctor()" attrs="6276">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="CB">
+ <method name="Void Main()" attrs="150">
+ <size>8</size>
+ </method>
+ <method name="Void <Foo>__BaseCallProxy0[T,U](U)" attrs="129">
+ <size>8</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>41</size>
+ </method>
+ </type>
+ <type name="CB+<CB>c__AnonStorey0">
+ <method name="Void <>m__0(Int32)" attrs="131">
+ <size>18</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ </test>
<test name="test-anon-18.cs">
<type name="A">
<method name="Void Invoke()" attrs="454">
</type>
<type name="Test+<TestFinallyWithReturn>c__async1">
<method name="Void MoveNext()" attrs="486">
- <size>377</size>
+ <size>382</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<TestFinallyWithReturnNoValue>c__async2">
<method name="Void MoveNext()" attrs="486">
- <size>347</size>
+ <size>352</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<TestFinallyWithGoto>c__async3">
<method name="Void MoveNext()" attrs="486">
- <size>370</size>
+ <size>375</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<TestFinallyWithGotoAndReturn>c__async4">
<method name="Void MoveNext()" attrs="486">
- <size>407</size>
+ <size>417</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<TestNestedReturn>c__async1">
<method name="Void MoveNext()" attrs="486">
- <size>845</size>
+ <size>855</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<TestNestedGoto>c__async2">
<method name="Void MoveNext()" attrs="486">
- <size>848</size>
+ <size>858</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<BreakTest>c__async1">
<method name="Void MoveNext()" attrs="486">
- <size>898</size>
+ <size>903</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="Test+<ContinueTest>c__async2">
<method name="Void MoveNext()" attrs="486">
- <size>898</size>
+ <size>903</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</type>
<type name="X+<Test>c__async0">
<method name="Void MoveNext()" attrs="486">
- <size>269</size>
+ <size>274</size>
</method>
<method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
<size>13</size>
</method>
</type>
</test>
+ <test name="test-async-90.cs">
+ <type name="Y">
+ <method name="System.String ExCall(X)" attrs="150">
+ <size>10</size>
+ </method>
+ </type>
+ <type name="X">
+ <method name="X Test(System.Object)" attrs="145">
+ <size>10</size>
+ </method>
+ <method name="X get_Prop()" attrs="2177">
+ <size>14</size>
+ </method>
+ <method name="Void set_Prop(X)" attrs="2177">
+ <size>8</size>
+ </method>
+ <method name="X Call()" attrs="129">
+ <size>10</size>
+ </method>
+ <method name="Void Main()" attrs="150">
+ <size>19</size>
+ </method>
+ <method name="System.Threading.Tasks.Task Test()" attrs="129">
+ <size>33</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="X+<Test>c__async0">
+ <method name="Void MoveNext()" attrs="486">
+ <size>290</size>
+ </method>
+ <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
+ <size>13</size>
+ </method>
+ </type>
+ </test>
+ <test name="test-async-91.cs">
+ <type name="C">
+ <method name="Void Dispose()" attrs="486">
+ <size>24</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="TestClass">
+ <method name="System.Threading.Tasks.Task Test()" attrs="150">
+ <size>33</size>
+ </method>
+ <method name="Int32 Main()" attrs="150">
+ <size>48</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="TestClass+<Test>c__async0">
+ <method name="Void MoveNext()" attrs="486">
+ <size>309</size>
+ </method>
+ <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
+ <size>13</size>
+ </method>
+ </type>
+ </test>
<test name="test-cls-00.cs">
<type name="CLSCLass_6">
<method name="Void add_Disposed(Delegate)" attrs="2182">
</method>
</type>
</test>
+ <test name="test-null-operator-24.cs">
+ <type name="X">
+ <method name="Int32 get_Field()" attrs="2182">
+ <size>14</size>
+ </method>
+ <method name="Void set_Field(Int32)" attrs="2182">
+ <size>8</size>
+ </method>
+ <method name="Int32 get_F3()" attrs="2182">
+ <size>14</size>
+ </method>
+ <method name="Void set_F3(Int32)" attrs="2182">
+ <size>8</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="App">
+ <method name="Void Main()" attrs="145">
+ <size>50</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ </test>
<test name="test-partial-01.cs">
<type name="Foo.Hello">
<method name="Void .ctor()" attrs="6278">
LIB_REFS = System Mono.Cecil
+ifdef MCS_MODE
+LIB_REFS += Mono.Cecil.Mdb
+endif
+
include ../../build/executable.make
static void RewriteAssembly (string assemblyLocation, Dictionary<string, string> resourcesStrings, CmdOptions options)
{
- var debugSymbols = Path.ChangeExtension (assemblyLocation, "pdb");
- var useDebugSymbols = File.Exists (debugSymbols);
-
var readerParameters = new ReaderParameters {
+ ReadSymbols = true,
ReadWrite = true,
+ SymbolReaderProvider = new DefaultSymbolReaderProvider (false)
};
- if (useDebugSymbols) {
- readerParameters.SymbolReaderProvider = new PortablePdbReaderProvider ();
- }
-
using (var assembly = AssemblyDefinition.ReadAssembly (assemblyLocation, readerParameters)) {
foreach (var module in assembly.Modules) {
foreach (var type in module.GetTypes ()) {
}
}
- var writerParameters = new WriterParameters ();
-
- if (useDebugSymbols) {
- writerParameters.SymbolWriterProvider = new PortablePdbWriterProvider ();
- }
+ var writerParameters = new WriterParameters () {
+ WriteSymbols = assembly.MainModule.HasSymbols
+ };
assembly.Write (writerParameters);
}
<type fullname="System.Collections.Generic.ICollection`1" />
<type fullname="System.Collections.Generic.IEnumerable`1" />
+ <type fullname="System.Collections.Generic.IEnumerator`1" />
+ <type fullname="System.Collections.Generic.IReadOnlyList`1" />
+ <type fullname="System.Collections.Generic.IReadOnlyCollection`1" />
+
<type fullname="System.Collections.Generic.IList`1" />
<type fullname="System.Collections.Generic.GenericEqualityComparer`1">
<method name=".ctor" />
<Compile Include="..\..\..\external\cecil\symbols\mdb\Mono.Cecil.Mdb\MdbWriter.cs" />\r
<Compile Include="..\..\..\external\cecil\symbols\mdb\Mono.CompilerServices.SymbolWriter\*.cs" />\r
<Compile Include="..\..\..\external\cecil\symbols\pdb\Microsoft.Cci.Pdb\*.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\ISymUnmanagedDocumentWriter.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\ISymUnmanagedWriter2.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\ModuleMetadata.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\PdbHelper.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\PdbReader.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\PdbWriter.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\SymDocumentWriter.cs" />\r
- <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\SymWriter.cs" />\r
+ <Compile Include="..\..\..\external\cecil\symbols\pdb\Mono.Cecil.Pdb\*.cs" />\r
<Compile Include="..\..\..\external\cecil\System.Security.Cryptography\*.cs" />\r
<Compile Include="..\..\class\Mono.Options\Mono.Options\Options.cs" />\r
<Compile Include="LocationProvider.cs" />\r
../../../external/cecil/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs
../../../external/cecil/symbols/mdb/Mono.CompilerServices.SymbolWriter/*.cs
../../../external/cecil/symbols/pdb/Microsoft.Cci.Pdb/*.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/ISymUnmanagedDocumentWriter.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/ISymUnmanagedWriter2.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/ModuleMetadata.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/SymDocumentWriter.cs
-../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/SymWriter.cs
+../../../external/cecil/symbols/pdb/Mono.Cecil.Pdb/*.cs
// this does nothing but adds strong reference to Microsoft.Build.Tasks*.dll that we need to load consistently.
Microsoft.Build.Tasks.Copy dummy;
#pragma warning restore
-
public static void Main (string[] args)
{
- Console.ForegroundColor = ConsoleColor.DarkRed;
- Console.WriteLine ();
- Console.WriteLine (">>>> xbuild tool is deprecated and will be removed in future updates, use msbuild instead <<<<");
- Console.WriteLine ();
- Console.ResetColor ();
-
-
MainClass mc = new MainClass ();
mc.args = args;
mc.Execute ();
bool show_stacktrace = false;
try {
- parameters.ParseArguments (args);
+ try {
+ parameters.ParseArguments (args);
+ } catch {
+ ShowDeprecationNotice ();
+ throw;
+ }
+
show_stacktrace = (parameters.LoggerVerbosity == LoggerVerbosity.Detailed ||
parameters.LoggerVerbosity == LoggerVerbosity.Diagnostic);
- if (!parameters.NoLogo)
+ if (!parameters.NoLogo) {
+ ShowDeprecationNotice ();
ErrorUtilities.ShowVersion (false);
+ }
engine = Engine.GlobalEngine;
if (!String.IsNullOrEmpty (parameters.ToolsVersion)) {
}
}
+
+ void ShowDeprecationNotice ()
+ {
+ Console.ForegroundColor = ConsoleColor.DarkRed;
+ Console.WriteLine ();
+ Console.WriteLine (">>>> xbuild tool is deprecated and will be removed in future updates, use msbuild instead <<<<");
+ Console.WriteLine ();
+ Console.ResetColor ();
+ }
}
// code from mcs/report.cs
MonoAppDomain *ad;
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
mono_portability_helpers_init ();
MonoClass *klass;
MonoAppContext *context;
- mono_error_init (error);
+ error_init (error);
klass = mono_class_load_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context");
context = (MonoAppContext *) mono_object_new_pinned (domain, klass, error);
mono_domain_create_appdomain_checked (char *friendly_name, char *configuration_file, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoDomain *result = NULL;
MonoClass *klass = mono_class_load_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
MonoClass *ads_class;
MonoAppDomainSetupHandle result = MONO_HANDLE_NEW (MonoAppDomainSetup, NULL);
- mono_error_init (error);
+ error_init (error);
caller_domain = mono_domain_get ();
ads_class = mono_class_load_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
MonoClass *adclass;
MonoDomain *data;
- mono_error_init (error);
+ error_init (error);
adclass = mono_class_get_appdomain_class ();
MonoReflectionAssembly *ret;
void *params [1];
- mono_error_init (error);
+ error_init (error);
g_assert (domain != NULL && ((name != NULL) || (tb != NULL)));
MonoObjectHandle
ves_icall_System_AppDomain_GetData (MonoAppDomainHandle ad, MonoStringHandle name, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (name)) {
mono_error_set_argument_null (error, "name", "");
void
ves_icall_System_AppDomain_SetData (MonoAppDomainHandle ad, MonoStringHandle name, MonoObjectHandle data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (name)) {
mono_error_set_argument_null (error, "name", "");
MonoAppDomainSetupHandle
ves_icall_System_AppDomain_getSetup (MonoAppDomainHandle ad, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
g_assert (!MONO_HANDLE_IS_NULL (ad));
MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
g_assert (domain);
MonoStringHandle
ves_icall_System_AppDomain_getFriendlyName (MonoAppDomainHandle ad, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
g_assert (!MONO_HANDLE_IS_NULL (ad));
MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
g_assert (domain);
MonoAppDomainHandle
ves_icall_System_AppDomain_getCurDomain (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *add = mono_domain_get ();
return MONO_HANDLE_NEW (MonoAppDomain, add->domain);
MonoAppDomainHandle
ves_icall_System_AppDomain_getRootDomain (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *root = mono_get_root_domain ();
return MONO_HANDLE_NEW (MonoAppDomain, root->domain);
MonoAppDomainHandle
ves_icall_System_AppDomain_createDomain (MonoStringHandle friendly_name, MonoAppDomainSetupHandle setup, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAppDomainHandle ad = MONO_HANDLE_NEW (MonoAppDomain, NULL);
#ifdef DISABLE_APPDOMAINS
add_assembly_to_array (MonoDomain *domain, MonoArrayHandle dest, int dest_idx, MonoAssembly* assm, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionAssemblyHandle assm_obj = mono_assembly_get_object_handle (domain, assm, error);
if (!is_ok (error))
goto leave;
MonoArrayHandle
ves_icall_System_AppDomain_GetAssemblies (MonoAppDomainHandle ad, MonoBoolean refonly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
MonoAssembly* ass;
GSList *tmp;
mono_try_assembly_resolve (MonoDomain *domain, const char *fname_raw, MonoAssembly *requesting, gboolean refonly, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoAssembly *result = NULL;
MonoStringHandle fname = mono_string_new_handle (domain, fname_raw, error);
if (!is_ok (error))
MonoBoolean isrefonly;
gpointer params [3];
- mono_error_init (error);
+ error_init (error);
if (mono_runtime_get_no_exec ())
return ret;
char *
mono_make_shadow_copy (const char *filename, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return (char *) filename;
}
#else
char *userdir;
char *location;
- mono_error_init (error);
+ error_init (error);
setup = domain->setup;
if (setup->cache_path != NULL && setup->application_name != NULL) {
char *location, *tmploc;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
hash = get_cstring_hash (bname);
hash2 = get_cstring_hash (dirname);
char *shadow_dir;
gint32 copy_error;
- mono_error_init (oerror);
+ error_init (oerror);
set_domain_search_path (domain);
MonoReflectionAssemblyHandle
ves_icall_System_Reflection_Assembly_LoadFrom (MonoStringHandle fname, MonoBoolean refOnly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
char *name, *filename;
MonoImageOpenStatus status = MONO_IMAGE_OK;
MonoBoolean refonly,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAssembly *ass;
MonoReflectionAssemblyHandle refass = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE);
MonoDomain *domain = MONO_HANDLE_GETVAL(ad, data);
MonoReflectionAssemblyHandle
ves_icall_System_AppDomain_LoadAssembly (MonoAppDomainHandle ad, MonoStringHandle assRef, MonoObjectHandle evidence, MonoBoolean refOnly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
MonoImageOpenStatus status = MONO_IMAGE_OK;
MonoAssembly *ass;
void
ves_icall_System_AppDomain_InternalUnload (gint32 domain_id, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain * domain = mono_domain_get_by_id (domain_id);
if (NULL == domain) {
gboolean
ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get_by_id (domain_id);
if (!domain)
MonoReflectionAssemblyHandle refass, MonoArrayHandle args,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoImage *image;
MonoMethod *method;
MonoAppDomainHandle
ves_icall_System_AppDomain_InternalSetDomain (MonoAppDomainHandle ad, MonoError* error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *old_domain = mono_domain_get ();
if (!mono_domain_set (MONO_HANDLE_GETVAL (ad, data), FALSE)) {
void
ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomainHandle ad, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_thread_push_appdomain_ref (MONO_HANDLE_GETVAL (ad, data));
}
void
ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get_by_id (domain_id);
if (!domain) {
void
ves_icall_System_AppDomain_InternalPopDomainRef (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_thread_pop_appdomain_ref ();
}
MonoStringHandle
ves_icall_System_AppDomain_InternalGetProcessGuid (MonoStringHandle newguid, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain* mono_root_domain = mono_get_root_domain ();
mono_domain_lock (mono_root_domain);
if (process_guid_set) {
gboolean
mono_assembly_has_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
/*
* This might be called during assembly loading, so do everything using the low-level
prevent_reference_assembly_from_running (MonoAssembly* candidate, gboolean refonly)
{
MonoError refasm_error;
- mono_error_init (&refasm_error);
+ error_init (&refasm_error);
if (candidate && !refonly && mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error)) {
candidate = NULL;
}
MonoClass *res = NULL;
MonoImage *module;
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_verify_typeref_row (image, (type_token & 0xffffff) - 1, error))
return NULL;
static MonoType*
inflate_generic_type (MonoImage *image, MonoType *type, MonoGenericContext *context, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
switch (type->type) {
case MONO_TYPE_MVAR: {
mono_class_inflate_generic_type_with_mempool (MonoImage *image, MonoType *type, MonoGenericContext *context, MonoError *error)
{
MonoType *inflated = NULL;
- mono_error_init (error);
+ error_init (error);
if (context)
inflated = inflate_generic_type (image, type, context, error);
{
MonoType *inflated = NULL;
- mono_error_init (error);
+ error_init (error);
if (context) {
inflated = inflate_generic_type (image, type, context, error);
return_val_if_nok (error, NULL);
MonoGenericInst *method_inst = NULL;
MonoGenericContext res = { NULL, NULL };
- mono_error_init (error);
+ error_init (error);
if (context->class_inst) {
class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with, error);
MonoMethodSignature *sig;
MonoGenericContext tmp_context;
- mono_error_init (error);
+ error_init (error);
/* The `method' has already been instantiated before => we need to peel out the instantiation and create a new context */
while (method->is_inflated) {
g_assert (klass->enumtype);
- mono_error_init (error);
+ error_init (error);
container = mono_class_try_get_generic_container (klass);
if (mono_class_is_ginst (klass)) {
{
if (mono_class_has_failure (caused_by)) {
MonoError cause_error;
- mono_error_init (&cause_error);
+ error_init (&cause_error);
mono_error_set_for_class_failure (&cause_error, caused_by);
mono_class_set_type_load_failure (klass, "%s, due to: %s", msg, mono_error_get_message (&cause_error));
mono_error_cleanup (&cause_error);
mono_class_setup_fields (field_class);
if (mono_class_has_failure (field_class)) {
MonoError field_error;
- mono_error_init (&field_error);
+ error_init (&field_error);
mono_error_set_for_class_failure (&field_error, field_class);
mono_class_set_type_load_failure (klass, "Could not set up field '%s' due to: %s", field->name, mono_error_get_message (&field_error));
mono_error_cleanup (&field_error);
MonoEvent *event = &events [i];
MonoEvent *gevent = &ginfo->events [i];
- mono_error_init (&error); //since we do conditional calls, we must ensure the default value is ok
+ error_init (&error); //since we do conditional calls, we must ensure the default value is ok
event->parent = klass;
event->name = gevent->name;
guint32 field_last, method_last;
guint32 nesting_tokeen;
- mono_error_init (error);
+ error_init (error);
if (mono_metadata_token_table (type_token) != MONO_TABLE_TYPEDEF || tidx > tt->rows) {
mono_error_set_bad_image (error, image, "Invalid typedef token %x", type_token);
if (eclass->byval_arg.type == MONO_TYPE_TYPEDBYREF || eclass->byval_arg.type == MONO_TYPE_VOID) {
/*Arrays of those two types are invalid.*/
MonoError prepared_error;
- mono_error_init (&prepared_error);
+ error_init (&prepared_error);
mono_error_set_invalid_program (&prepared_error, "Arrays of void or System.TypedReference types are invalid.");
mono_class_set_failure (klass, mono_error_box (&prepared_error, klass->image));
mono_error_cleanup (&prepared_error);
{
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
klass = mono_class_get_checked (image, type_token, error);
if (klass && context && mono_metadata_token_table (type_token) == MONO_TABLE_TYPESPEC)
{
MonoClass *klass = NULL;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
int table = mono_metadata_token_table (type_token);
MonoType *type = NULL;
gboolean inflated = FALSE;
- mono_error_init (error);
+ error_init (error);
//FIXME: this will not fix the very issue for which mono_type_get_full exists -but how to do it then?
if (image_is_dynamic (image)) {
const char *nspace;
guint32 i, visib;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
guint32 token = 0;
MonoClass *klass;
int i;
- mono_error_init (error);
+ error_init (error);
/*
* The EXPORTEDTYPES table only contains public types, so have to search the
char *nested;
char buf [1024];
- mono_error_init (error);
+ error_init (error);
// Checking visited images avoids stack overflows when cyclic references exist.
if (g_hash_table_lookup (visited_images, image))
mono_ldtoken_checked (MonoImage *image, guint32 token, MonoClass **handle_class,
MonoGenericContext *context, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
MonoClass *tmp_handle_class;
mono_lookup_dynamic_token (MonoImage *image, guint32 token, MonoGenericContext *context, MonoError *error)
{
MonoClass *handle_class;
- mono_error_init (error);
+ error_init (error);
return mono_reflection_lookup_dynamic_token (image, token, TRUE, &handle_class, context, error);
}
MonoType*
mono_field_get_type_checked (MonoClassField *field, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!field->type)
mono_field_resolve_type (field, error);
return field->type;
if (mono_class_has_failure (klass))
return FALSE;
- mono_error_init (&prepare_error);
+ error_init (&prepare_error);
va_start (args, fmt);
mono_error_vset_type_load_class (&prepare_error, klass, fmt, args);
if (!mono_class_has_failure (klass))
return NULL;
MonoError unboxed_error;
- mono_error_init (&unboxed_error);
+ error_init (&unboxed_error);
mono_error_set_for_class_failure (&unboxed_error, klass);
return mono_error_convert_to_exception (&unboxed_error);
}
int i, interface_count;
MonoClass **interfaces;
- mono_error_init (error);
+ error_init (error);
if (klass->interfaces_inited)
return;
MonoType *ftype;
int field_idx = field - klass->fields;
- mono_error_init (error);
+ error_init (error);
if (gtd) {
MonoClassField *gfield = >d->fields [field_idx];
g_assert (ic);
g_assert (MONO_CLASS_IS_INTERFACE (ic));
- mono_error_init (error);
+ error_init (error);
mono_cominterop_lock ();
if (obj->itf_hash)
static void*
cominterop_get_idispatch_for_object (MonoObject* object, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!object)
return NULL;
GList *ccw_list, *ccw_list_item;
MonoCustomAttrInfo *cinfo = NULL;
- mono_error_init (error);
+ error_init (error);
if (!object)
return NULL;
static int
cominterop_ccw_getfreethreadedmarshaler (MonoCCW* ccw, MonoObject* object, gpointer* ppv, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
#ifdef HOST_WIN32
if (!ccw->free_marshaler) {
int ret = 0;
{
MonoString * res = NULL;
- mono_error_init (error);
+ error_init (error);
if (!bstr)
return NULL;
mono_string_from_bstr_checked (gpointer bstr, MonoError *error)
{
MonoString *res = NULL;
- mono_error_init (error);
+ error_init (error);
if (!bstr)
return NULL;
#ifdef HOST_WIN32
ves_icall_System_ConsoleDriver_Isatty (HANDLE handle)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("Console");
ves_icall_System_ConsoleDriver_SetEcho (MonoBoolean want_echo)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("Console");
ves_icall_System_ConsoleDriver_SetBreak (MonoBoolean want_break)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("Console");
ves_icall_System_ConsoleDriver_InternalKeyAvailable (gint32 timeout)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("Console");
ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardown, MonoArray **control_chars, int **size)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("Console");
MonoType *t;
int slen = mono_metadata_decode_value (p, &p);
- mono_error_init (error);
+ error_init (error);
n = (char *)g_memdup (p, slen + 1);
n [slen] = 0;
int slen, type = t->type;
MonoClass *tklass = t->data.klass;
- mono_error_init (error);
+ error_init (error);
handle_enum:
switch (type) {
static MonoObject*
load_cattr_value_boxed (MonoDomain *domain, MonoImage *image, MonoType *t, const char* p, const char** end, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
gboolean is_ref = type_is_reference (t);
MonoObject *retval;
void *params [2], *unboxed;
- mono_error_init (error);
+ error_init (error);
if (!ctor)
ctor = mono_class_get_method_from_name (mono_class_get_custom_attribute_typed_argument_class (), ".ctor", 2);
MonoObject *retval;
void *unboxed, *params [2];
- mono_error_init (error);
+ error_init (error);
if (!ctor)
ctor = mono_class_get_method_from_name (mono_class_get_custom_attribute_named_argument_class (), ".ctor", 2);
void **params = NULL;
MonoMethodSignature *sig;
- mono_error_init (error);
+ error_init (error);
mono_class_init (method->klass);
*named_args = NULL;
*named_arg_info = NULL;
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_verify_cattr_content (image, method, data, len, NULL)) {
mono_error_set_generic_error (error, "System.Reflection", "CustomAttributeFormatException", "Binary format of the specified custom attribute was invalid.");
CattrNamedArg *arginfo = NULL;
int i;
- mono_error_init (error);
+ error_init (error);
*ctor_args = NULL;
*named_args = NULL;
MonoDomain *domain;
void *params [4];
- mono_error_init (error);
+ error_init (error);
g_assert (image->assembly);
MonoObject *attr;
int i, n;
- mono_error_init (error);
+ error_init (error);
for (i = 0; i < cinfo->num_attrs; ++i) {
MonoCustomAttrEntry *centry = &cinfo->attrs[i];
MonoObject *attr;
int i;
- mono_error_init (error);
+ error_init (error);
result = mono_array_new_checked (mono_domain_get (), mono_defaults.customattribute_data_class, cinfo->num_attrs, error);
return_val_if_nok (error, NULL);
for (i = 0; i < cinfo->num_attrs; ++i) {
const char *data;
MonoCustomAttrEntry* attr;
- mono_error_init (error);
+ error_init (error);
ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
g_warning ("Can't find custom attr constructor image: %s mtoken: 0x%08x due to: %s", image->name, mtoken, mono_error_get_message (error));
if (ignore_missing) {
mono_error_cleanup (error);
- mono_error_init (error);
+ error_init (error);
} else {
g_list_free (list);
g_free (ainfo);
{
guint32 idx;
- mono_error_init (error);
+ error_init (error);
/*
* An instantiated method has the same cattrs as the generic method definition.
{
guint32 idx;
- mono_error_init (error);
+ error_init (error);
if (mono_class_is_ginst (klass))
klass = mono_class_get_generic_class (klass)->container_class;
{
guint32 idx;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (assembly->image))
return lookup_custom_attr (assembly->image, assembly);
mono_custom_attrs_from_field_checked (MonoClass *klass, MonoClassField *field, MonoError *error)
{
guint32 idx;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (klass->image)) {
field = mono_metadata_get_corresponding_field_from_generic_type_definition (field);
MonoImage *image;
MonoReflectionMethodAux *aux;
- mono_error_init (error);
+ error_init (error);
/*
* An instantiated method has the same cattrs as the generic method definition.
g_assert (attr_klass != NULL);
- mono_error_init (error);
+ error_init (error);
for (i = 0; i < ainfo->num_attrs; ++i) {
centry = &ainfo->attrs[i];
MonoClass *klass;
MonoCustomAttrInfo *cinfo = NULL;
- mono_error_init (error);
+ error_init (error);
klass = obj->vtable->klass;
if (klass == mono_defaults.runtimetype_class) {
MonoArray *result;
MonoCustomAttrInfo *cinfo;
- mono_error_init (error);
+ error_init (error);
cinfo = mono_reflection_get_custom_attrs_info_checked (obj, error);
return_val_if_nok (error, NULL);
MonoArray *result;
MonoCustomAttrInfo *cinfo;
- mono_error_init (error);
+ error_init (error);
cinfo = mono_reflection_get_custom_attrs_info_checked (obj, error);
return_val_if_nok (error, NULL);
MonoObject *obj;
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
obj = lookup_dyn_token (assembly, token);
if (!obj) {
gpointer
mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean valid_token, MonoClass **handle_class, MonoGenericContext *context, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return NULL;
}
#endif /* DISABLE_REFLECTION_EMIT */
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
char *name = mono_string_to_utf8_checked (str, error);
return_val_if_nok (error, -1);
guint32 idx;
{
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
klass = mono_class_load_from_name (image, name_space, name);
return create_exception_two_strings (klass, a1, a2, error);
{
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
klass = mono_class_get_checked (image, token, error);
mono_error_assert_ok (error); /* FIXME handle the error. */
MonoMethod *method;
gpointer iter;
- mono_error_init (error);
+ error_init (error);
klass = mono_class_load_from_name (mono_get_corlib (), "System.Reflection", "ReflectionTypeLoadException");
{
char *trace;
MonoStringHandle res;
- mono_error_init (error);
+ error_init (error);
if (!exc) {
mono_error_set_argument_null (error, "exception", "");
mono_gc_wbarrier_set_root (&((s)->fieldname), (MonoObject*)value); \
} while (0)
-void mono_gc_finalize_threadpool_threads (void);
-
/* fast allocation support */
typedef enum {
static MonoCoopMutex reference_queue_mutex;
static GSList *domains_to_finalize;
-static MonoMList *threads_to_finalize;
static gboolean finalizer_thread_exited;
/* Uses finalizer_mutex */
return res;
}
-static gboolean
-add_thread_to_finalize (MonoInternalThread *thread, MonoError *error)
-{
- mono_error_init (error);
- mono_finalizer_lock ();
- if (!threads_to_finalize)
- MONO_GC_REGISTER_ROOT_SINGLE (threads_to_finalize, MONO_ROOT_SOURCE_FINALIZER_QUEUE, "finalizable threads list");
- threads_to_finalize = mono_mlist_append_checked (threads_to_finalize, (MonoObject*)thread, error);
- mono_finalizer_unlock ();
- return is_ok (error);
-}
-
/*
* actually, we might want to queue the finalize requests in a separate thread,
* but we need to be careful about the execution domain of the thread...
if (mono_gc_is_finalizer_internal_thread (t))
/* Avoid finalizing ourselves */
return;
-
- if (t->threadpool_thread && finalizing_root_domain) {
- /* Don't finalize threadpool threads when
- shutting down - they're finalized when the
- threadpool shuts down. */
- if (!add_thread_to_finalize (t, &error))
- goto unhandled_error;
- return;
- }
}
if (o->vtable->klass->image == mono_defaults.corlib && !strcmp (o->vtable->klass->name, "DynamicMethod") && finalizing_root_domain) {
mono_domain_set_internal (caller_domain);
}
-void
-mono_gc_finalize_threadpool_threads (void)
-{
- while (threads_to_finalize) {
- MonoInternalThread *thread = (MonoInternalThread*) mono_mlist_get_data (threads_to_finalize);
-
- /* Force finalization of the thread. */
- thread->threadpool_thread = FALSE;
- mono_object_register_finalizer ((MonoObject*)thread);
-
- mono_gc_run_finalize (thread, NULL);
-
- threads_to_finalize = mono_mlist_next (threads_to_finalize);
- }
-}
-
gpointer
mono_gc_out_of_memory (size_t size)
{
goto done;
}
- if (domain == mono_get_root_domain ()) {
- mono_threadpool_cleanup ();
- mono_gc_finalize_threadpool_threads ();
- }
-
done:
if (InterlockedDecrement (&req->ref) == 0) {
mono_coop_sem_destroy (&req->done);
mono_icall_get_logical_drives (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetLogicalDriveStrings");
mono_icall_broadcast_setting_change (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("SendMessageTimeout");
mono_icall_drive_info_get_drive_type (MonoString *root_path_name)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetDriveType");
mono_icall_wait_for_input_idle (gpointer handle, gint32 milliseconds)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("WaitForInputIdle");
static void
mono_class_init_checked (MonoClass *klass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!mono_class_init (klass))
mono_error_set_for_class_failure (error, klass);
gint64 i64 = 0;
gdouble r64 = 0;
- mono_error_init (&error);
+ error_init (&error);
if (value)
vc = value->vtable->klass;
ICALL_EXPORT void
ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArrayHandle array, MonoClassField *field_handle, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_handle_class (array);
guint32 size = mono_array_element_size (klass);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_System_Object_GetType (MonoObjectHandle obj, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (obj);
MonoClass *klass = mono_handle_class (obj);
#ifndef DISABLE_REMOTING
gboolean type_resolve = FALSE;
MonoImage *rootimage = NULL;
- mono_error_init (error);
+ error_init (error);
/*
* We must compute the calling assembly as type loading must happen under a metadata context.
MonoBoolean ignoreCase,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoTypeNameParse info;
gboolean parsedOk;
MonoAssembly *caller_assembly;
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_System_Type_internal_from_handle (MonoType *handle, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
return mono_type_get_object_handle (domain, handle, error);
ICALL_EXPORT guint32
ves_icall_type_GetTypeCodeInternal (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
int t = type->type;
ICALL_EXPORT guint32
ves_icall_RuntimeTypeHandle_type_is_assignable_from (MonoReflectionTypeHandle ref_type, MonoReflectionTypeHandle ref_c, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
g_assert (!MONO_HANDLE_IS_NULL (ref_type));
ICALL_EXPORT guint32
ves_icall_RuntimeTypeHandle_IsInstanceOfType (MonoReflectionTypeHandle ref_type, MonoObjectHandle obj, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
mono_class_init_checked (klass, error);
ICALL_EXPORT guint32
ves_icall_RuntimeTypeHandle_GetAttributes (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
return mono_class_get_flags (klass);
ICALL_EXPORT MonoReflectionMarshalAsAttributeHandle
ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionFieldHandle field_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (field_h);
MonoClassField *field = MONO_HANDLE_GETVAL (field_h, field);
MonoClass *klass = field->parent;
g_assert (handle);
- mono_error_init (error);
+ error_init (error);
if (!type) {
klass = handle->parent;
g_assert (handle);
- mono_error_init (error);
+ error_init (error);
if (!type) {
klass = handle->parent;
ICALL_EXPORT MonoReflectionPropertyHandle
ves_icall_System_Reflection_PropertyInfo_internal_from_handle_type (MonoProperty *handle, MonoType *type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass;
g_assert (handle);
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionFieldHandle field_h, MonoBoolean optional, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClassField *field = MONO_HANDLE_GETVAL (field_h, field);
MonoType *type = mono_field_get_type_checked (field, error);
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_MonoMethodInfo_get_parameter_info (MonoMethod *method, MonoReflectionMethodHandle member, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoReflectionTypeHandle reftype = MONO_HANDLE_NEW (MonoReflectionType, NULL);
ICALL_EXPORT MonoReflectionMarshalAsAttributeHandle
ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoReflectionMarshalAsAttributeHandle res = MONO_HANDLE_NEW (MonoReflectionMarshalAsAttribute, NULL);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_MonoField_GetParentType (MonoReflectionFieldHandle field, MonoBoolean declaring, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (field);
MonoClass *parent;
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_MonoField_ResolveType (MonoReflectionFieldHandle ref_field, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_field);
MonoClassField *field = MONO_HANDLE_GETVAL (ref_field, field);
MonoType *type = mono_field_get_type_checked (field, error);
ICALL_EXPORT MonoArrayHandle
ves_icall_RuntimeType_GetInterfaces (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
set_interface_map_data_method_object (MonoDomain *domain, MonoMethod *method, MonoClass *iclass, int ioffset, MonoClass *klass, MonoArrayHandle targets, MonoArrayHandle methods, int i, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionMethodHandle member = mono_method_get_object_handle (domain, method, iclass, error);
if (!is_ok (error))
goto leave;
ICALL_EXPORT void
ves_icall_RuntimeType_GetInterfaceMapData (MonoReflectionTypeHandle ref_type, MonoReflectionTypeHandle ref_iface, MonoArrayHandleOut targets, MonoArrayHandleOut methods, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
MonoType *iface = MONO_HANDLE_GETVAL (ref_iface, type);
ICALL_EXPORT void
ves_icall_RuntimeType_GetPacking (MonoReflectionTypeHandle ref_type, guint32 *packing, guint32 *size, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeTypeHandle_GetBaseType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
ICALL_EXPORT MonoBoolean
ves_icall_RuntimeTypeHandle_IsPointer (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
return type->type == MONO_TYPE_PTR;
}
ICALL_EXPORT MonoBoolean
ves_icall_RuntimeTypeHandle_IsPrimitive (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
return (!type->byref && (((type->type >= MONO_TYPE_BOOLEAN) && (type->type <= MONO_TYPE_R8)) || (type->type == MONO_TYPE_I) || (type->type == MONO_TYPE_U)));
}
ICALL_EXPORT MonoBoolean
ves_icall_RuntimeTypeHandle_IsByRef (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
return type->byref;
}
ICALL_EXPORT MonoBoolean
ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
mono_class_init_checked (klass, error);
ICALL_EXPORT guint32
ves_icall_reflection_get_token (MonoObjectHandle obj, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return mono_reflection_get_token_checked (obj, error);
}
ICALL_EXPORT MonoReflectionModuleHandle
ves_icall_RuntimeTypeHandle_GetModule (MonoReflectionTypeHandle type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (type);
MonoType *t = MONO_HANDLE_GETVAL (type, type);
MonoClass *klass = mono_class_from_mono_type (t);
ICALL_EXPORT MonoReflectionAssemblyHandle
ves_icall_RuntimeTypeHandle_GetAssembly (MonoReflectionTypeHandle type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoType *t = MONO_HANDLE_GETVAL (type, type);
MonoClass *klass = mono_class_from_mono_type (t);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeType_get_DeclaringType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass;
ICALL_EXPORT gint32
ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
if (type->type != MONO_TYPE_ARRAY && type->type != MONO_TYPE_SZARRAY) {
set_type_object_in_array (MonoDomain *domain, MonoType *type, MonoArrayHandle dest, int i, MonoError *error)
{
HANDLE_FUNCTION_ENTER();
- mono_error_init (error);
+ error_init (error);
MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, type, error);
if (!is_ok (error))
goto leave;
ICALL_EXPORT MonoArrayHandle
ves_icall_RuntimeType_GetGenericArguments (MonoReflectionTypeHandle ref_type, MonoBoolean runtimeTypeArray, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
ICALL_EXPORT gboolean
ves_icall_RuntimeTypeHandle_IsGenericTypeDefinition (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!IS_MONOTYPE (MONO_HANDLE_RAW(ref_type)))
return FALSE;
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeTypeHandle_GetGenericTypeDefinition_impl (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoReflectionTypeHandle ret = MONO_HANDLE_NEW (MonoReflectionType, NULL);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeType_MakeGenericType (MonoReflectionTypeHandle reftype, MonoArrayHandle type_array, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (reftype);
g_assert (IS_MONOTYPE_HANDLE (reftype));
ICALL_EXPORT gboolean
ves_icall_RuntimeTypeHandle_HasInstantiation (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass;
if (!IS_MONOTYPE (MONO_HANDLE_RAW (ref_type)))
ICALL_EXPORT gint32
ves_icall_RuntimeType_GetGenericParameterPosition (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!IS_MONOTYPE_HANDLE (ref_type))
return -1;
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
ICALL_EXPORT MonoGenericParamInfo *
ves_icall_RuntimeTypeHandle_GetGenericParameterInfo (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
return mono_generic_param_info (type->data.generic_param);
}
MonoReflectionMethodHandle generic,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_RuntimeType_get_DeclaringMethod (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoReflectionMethodHandle ret = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
ICALL_EXPORT MonoBoolean
ves_icall_System_RuntimeType_IsTypeExportedToWindowsRuntime (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_error_set_not_implemented (error, "%s", "");
return FALSE;
}
ICALL_EXPORT MonoBoolean
ves_icall_System_RuntimeType_IsWindowsRuntimeObjectType (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_error_set_not_implemented (error, "%s", "");
return FALSE;
}
const char *import = NULL;
const char *scope = NULL;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
MonoReflectionMethodAux *method_aux =
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethodHandle ref_method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *method = MONO_HANDLE_GETVAL (ref_method, method);
if (method->is_generic)
set_array_generic_argument_handle_inflated (MonoDomain *domain, MonoGenericInst *inst, int i, MonoArrayHandle arr, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, inst->type_argv [i], error);
if (!is_ok (error))
goto leave;
set_array_generic_argument_handle_gparam (MonoDomain *domain, MonoGenericContainer *container, int i, MonoArrayHandle arr, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoGenericParam *param = mono_generic_container_get_param (container, i);
MonoClass *pklass = mono_class_from_generic_parameter_internal (param);
MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, &pklass->byval_arg, error);
ICALL_EXPORT MonoArrayHandle
ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethodHandle ref_method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_method);
MonoMethod *method = MONO_HANDLE_GETVAL (ref_method, method);
static void
get_enum_field (MonoDomain *domain, MonoArrayHandle names, MonoArrayHandle values, int base_type, MonoClassField *field, guint* j, guint64 *previous_value, gboolean *sorted, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
HANDLE_FUNCTION_ENTER();
guint64 field_value;
const char *p;
guint64 previous_value = 0;
gboolean sorted = TRUE;
- mono_error_init (error);
+ error_init (error);
mono_class_init_checked (enumc, error);
return_val_if_nok (error, FALSE);
ICALL_EXPORT GPtrArray*
ves_icall_RuntimeType_GetFields_native (MonoReflectionTypeHandle ref_type, char *utf8_name, guint32 bflags, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
if (type->byref) {
array = g_ptr_array_new ();
startklass = klass;
- mono_error_init (error);
+ error_init (error);
if (name != NULL)
compare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;
ICALL_EXPORT GPtrArray*
ves_icall_RuntimeType_GetMethodsByName_native (MonoReflectionTypeHandle ref_type, const char *mname, guint32 bflags, MonoBoolean ignore_case, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT GPtrArray*
ves_icall_RuntimeType_GetConstructors_native (MonoReflectionTypeHandle ref_type, guint32 bflags, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
if (type->byref) {
return g_ptr_array_new ();
ICALL_EXPORT GPtrArray*
ves_icall_RuntimeType_GetPropertiesByName_native (MonoReflectionTypeHandle ref_type, gchar *propname, guint32 bflags, MonoBoolean ignore_case, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
ICALL_EXPORT GPtrArray*
ves_icall_RuntimeType_GetEvents_native (MonoReflectionTypeHandle ref_type, char *utf8_name, guint32 bflags, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
if (type->byref) {
ICALL_EXPORT GPtrArray *
ves_icall_RuntimeType_GetNestedTypes_native (MonoReflectionTypeHandle ref_type, char *str, guint32 bflags, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
if (type->byref) {
get_type_from_module_builder_module (MonoArrayHandle modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *type = NULL;
MonoReflectionModuleBuilderHandle mb = MONO_HANDLE_NEW (MonoReflectionModuleBuilder, NULL);
MONO_HANDLE_ARRAY_GETREF (mb, modules, i);
get_type_from_module_builder_loaded_modules (MonoArrayHandle loaded_modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *type = NULL;
MonoReflectionModuleHandle mod = MONO_HANDLE_NEW (MonoReflectionModule, NULL);
MONO_HANDLE_ARRAY_GETREF (mod, loaded_modules, i);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssemblyHandle assembly_h, MonoReflectionModuleHandle module, MonoStringHandle name, MonoBoolean throwOnError, MonoBoolean ignoreCase, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoTypeNameParse info;
gboolean type_resolve;
ICALL_EXPORT MonoStringHandle
ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssemblyHandle assembly, MonoBoolean escaped, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
gchar *absolute;
ICALL_EXPORT MonoBoolean
ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly,assembly);
return mass->in_gac;
ICALL_EXPORT MonoBoolean
ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
return assembly->ref_only;
}
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoMethod *method;
ICALL_EXPORT MonoReflectionModuleHandle
ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
MonoAssembly *a = MONO_HANDLE_GETVAL (assembly, assembly);
return mono_module_get_object_handle (domain, a->image, error);
add_manifest_resource_name_to_array (MonoDomain *domain, MonoImage *image, MonoTableInfo *table, int i, MonoArrayHandle dest, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
const char *val = mono_metadata_string_heap (image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
MonoStringHandle str = mono_string_new_handle (domain, val, error);
if (!is_ok (error))
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
static MonoAssemblyName*
create_referenced_assembly_name (MonoDomain *domain, MonoImage *image, MonoTableInfo *t, int i, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAssemblyName *aname = g_new0 (MonoAssemblyName, 1);
mono_assembly_get_assemblyref (image, i, aname);
ICALL_EXPORT GPtrArray*
ves_icall_System_Reflection_Assembly_InternalGetReferencedAssemblies (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
MonoAssembly *ass = MONO_HANDLE_GETVAL(assembly, assembly);
MonoImage *image = ass->image;
ICALL_EXPORT void *
ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, gint32 *size, MonoReflectionModuleHandleOut ref_module, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
ICALL_EXPORT gboolean
ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoManifestResourceInfoHandle info_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return get_manifest_resource_info_internal (assembly_h, name, info_h, error);
}
add_filename_to_files_array (MonoDomain *domain, MonoAssembly * assembly, MonoTableInfo *table, int i, MonoArrayHandle dest, int dest_idx, MonoError *error)
{
HANDLE_FUNCTION_ENTER();
- mono_error_init (error);
+ error_init (error);
const char *val = mono_metadata_string_heap (assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
char *n = g_concat_dir_and_file (assembly->basedir, val);
MonoStringHandle str = mono_string_new_handle (domain, n, error);
ICALL_EXPORT MonoObjectHandle
ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoBoolean resource_modules, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_FILE];
add_module_to_modules_array (MonoDomain *domain, MonoArrayHandle dest, int *dest_idx, MonoImage* module, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
if (module) {
MonoReflectionModuleHandle rm = mono_module_get_object_handle (domain, module, error);
if (!is_ok (error))
add_file_to_modules_array (MonoDomain *domain, MonoArrayHandle dest, int dest_idx, MonoImage *image, MonoTableInfo *table, int table_idx, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
guint32 cols [MONO_FILE_SIZE];
mono_metadata_decode_row (table, table_idx, cols, MONO_FILE_SIZE);
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get();
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoClass *klass;
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_GetCurrentMethod (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *m = mono_method_get_last_managed ();
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType_native (MonoMethod *method, MonoType *type, MonoBoolean generic_check, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass;
if (type && generic_check) {
klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionMethodBodyHandle
ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return mono_method_body_get_object_handle (mono_domain_get (), method, error);
}
ICALL_EXPORT MonoReflectionAssemblyHandle
ves_icall_System_Reflection_Assembly_GetExecutingAssembly (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *dest = NULL;
mono_stack_walk_no_il (get_executing, &dest);
ICALL_EXPORT MonoReflectionAssemblyHandle
ves_icall_System_Reflection_Assembly_GetEntryAssembly (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain* domain = mono_domain_get ();
ICALL_EXPORT MonoReflectionAssemblyHandle
ves_icall_System_Reflection_Assembly_GetCallingAssembly (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *m;
MonoMethod *dest;
ICALL_EXPORT int
vell_icall_RuntimeType_get_core_clr_security_level (MonoReflectionTypeHandle rfield, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (rfield, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT int
ves_icall_MonoMethod_get_core_clr_security_level (MonoReflectionMethodHandle rfield, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *method = MONO_HANDLE_GETVAL (rfield, method);
return mono_security_core_clr_method_level (method, TRUE);
}
ICALL_EXPORT MonoStringHandle
ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
gchar *name;
MonoImage *image;
char *dirname;
- mono_error_init (error);
+ error_init (error);
filename = mono_string_handle_to_utf8 (fname, error);
return_if_nok (error);
ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssemblyHandle assembly_h,
char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoBoolean result = FALSE;
MonoDeclSecurityEntry entry;
static void
image_get_type (MonoDomain *domain, MonoImage *image, MonoTableInfo *tdef, int table_idx, int count, MonoArrayHandle res, MonoArrayHandle exceptions, MonoBoolean exportedOnly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
HANDLE_FUNCTION_ENTER ();
MonoError klass_error;
MonoClass *klass = mono_class_get_checked (image, table_idx | MONO_TOKEN_TYPE_DEF, &klass_error);
MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
int i, count;
- mono_error_init (error);
+ error_init (error);
/* we start the count from 1 because we skip the special type <Module> */
if (exportedOnly) {
append_module_types (MonoDomain *domain, MonoArrayHandleOut res, MonoArrayHandleOut exceptions, MonoImage *image, MonoBoolean exportedOnly, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoArrayHandle ex2 = MONO_HANDLE_NEW (MonoArray, NULL);
MonoArrayHandle res2 = mono_module_get_types (domain, image, ex2, exportedOnly, error);
if (!is_ok (error))
{
HANDLE_FUNCTION_ENTER ();
MonoError unboxed_error;
- mono_error_init (&unboxed_error);
+ error_init (&unboxed_error);
mono_error_set_for_class_failure (&unboxed_error, klass);
MonoExceptionHandle exc = MONO_HANDLE_NEW (MonoException, mono_error_convert_to_exception (&unboxed_error));
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModuleHandle module, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoImage *image = MONO_HANDLE_GETVAL (module, image);
MonoDomain *domain = MONO_HANDLE_DOMAIN (module);
module_resolve_type_token (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *result = NULL;
MonoClass *klass;
int table = mono_metadata_token_table (token);
module_resolve_method_token (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoMethod *method = NULL;
int table = mono_metadata_token_table (token);
int index = mono_metadata_token_index (token);
MonoGenericContext context;
MonoClassField *field = NULL;
- mono_error_init (error);
+ error_init (error);
*resolve_error = ResolveTokenError_Other;
/* Validate token */
{
int table = mono_metadata_token_table (token);
- mono_error_init (merror);
+ error_init (merror);
*error = ResolveTokenError_Other;
switch (table) {
ICALL_EXPORT MonoArrayHandle
ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
int table = mono_metadata_token_table (token);
int idx = mono_metadata_token_index (token);
MonoTableInfo *tables = image->tables;
ICALL_EXPORT MonoBoolean
ves_icall_RuntimeTypeHandle_IsArray (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoBoolean res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
{
char *name;
- mono_error_init (error);
+ error_init (error);
if (klass->byval_arg.type != MONO_TYPE_TYPEDBYREF)
return;
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeType_make_array_type (MonoReflectionTypeHandle ref_type, int rank, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeType_make_byref_type (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionTypeHandle
ves_icall_RuntimeType_MakePointerType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoObjectHandle
ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObjectHandle this_obj, MonoStringHandle class_name, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (this_obj);
MonoRealProxyHandle rp = MONO_HANDLE_CAST (MonoRealProxy, this_obj);
ICALL_EXPORT gboolean
ves_icall_get_resources_ptr (MonoReflectionAssemblyHandle assembly, gpointer *result, gint32 *size, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoPEResourceDataEntry *entry;
MonoImage *image;
ICALL_EXPORT MonoObjectHandle
ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
MonoClass *klass = mono_class_from_mono_type (type);
ICALL_EXPORT MonoReflectionMethodHandle
ves_icall_MonoMethod_get_base_method (MonoReflectionMethodHandle m, gboolean definition, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *method = MONO_HANDLE_GETVAL (m, method);
MonoMethod *base = mono_method_get_base_method (method, definition, error);
ICALL_EXPORT MonoStringHandle
ves_icall_MonoMethod_get_name (MonoReflectionMethodHandle m, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *method = MONO_HANDLE_GETVAL (m, method);
MonoStringHandle s = mono_string_new_handle (MONO_HANDLE_DOMAIN (m), method->name, error);
{
const char *exc_class, *exc_arg;
- mono_error_init (error);
+ error_init (error);
if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
return;
mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
add_modifier_to_array (MonoDomain *domain, MonoImage *image, MonoCustomMod *modifier, MonoArrayHandle dest, int dest_idx, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_class_get_checked (image, modifier->token, error);
if (!is_ok (error))
goto leave;
int i, count = 0;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
for (i = 0; i < type->num_mods; ++i) {
if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required))
count++;
ICALL_EXPORT MonoArrayHandle
ves_icall_ParameterInfo_GetTypeModifiers (MonoReflectionParameterHandle param, MonoBoolean optional, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionTypeHandle rt = MONO_HANDLE_NEW (MonoReflectionType, NULL);
MONO_HANDLE_GET (rt, param, ClassImpl);
MonoType *type = MONO_HANDLE_GETVAL (rt, type);
ICALL_EXPORT MonoArrayHandle
ves_icall_MonoPropertyInfo_GetTypeModifiers (MonoReflectionPropertyHandle property, MonoBoolean optional, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoProperty *prop = MONO_HANDLE_GETVAL (property, property);
MonoClass *klass = MONO_HANDLE_GETVAL (property, klass);
MonoType *type = get_property_type (prop);
char *info;
MonoStringHandle display_name;
- mono_error_init (error);
+ error_init (error);
info = mono_get_runtime_callbacks ()->get_runtime_build_info ();
display_name = mono_string_new_handle (mono_domain_get (), info, error);
g_free (info);
res = mono_metadata_signature_alloc (corlib, len - 1);
res->pinvoke = 1;
-#ifdef HOST_WIN32
+#ifdef TARGET_WIN32
/*
* Under windows, the default pinvoke calling convention is STDCALL but
* we need CDECL.
GList *list_iter, *valid_modules = NULL;
MonoImageOpenStatus status;
- mono_error_init (error);
+ error_init (error);
if ((image->module_count == 0) || (idx > image->module_count || idx <= 0))
return NULL;
const char *fname;
guint32 fname_id;
- mono_error_init (error);
+ error_init (error);
if (fileidx < 1 || fileidx > t->rows)
return NULL;
const char *ptr;
guint32 idx = mono_metadata_token_index (token);
- mono_error_init (error);
+ error_init (error);
mono_metadata_decode_row (&tables [MONO_TABLE_MEMBERREF], idx-1, cols, MONO_MEMBERREF_SIZE);
nindex = cols [MONO_MEMBERREF_CLASS] >> MONO_MEMBERREF_PARENT_BITS;
guint32 type;
MonoClassField *field;
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
MonoClassField *result;
int i;
/* Search directly in the metadata to avoid calling setup_methods () */
- mono_error_init (error);
+ error_init (error);
/* FIXME: !mono_class_is_ginst (from_class) condition causes test failures. */
if (klass->type_token && !image_is_dynamic (klass->image) && !klass->methods && !klass->rank && klass == from_class && !mono_class_is_ginst (from_class)) {
MonoMethod *result = NULL;
MonoClass *initial_class = in_class;
- mono_error_init (error);
+ error_init (error);
is_interface = MONO_CLASS_IS_INTERFACE (in_class);
if (ic) {
gboolean is_open;
int i;
- mono_error_init (error);
+ error_init (error);
if (!context)
return sig;
res->is_transient = TRUE;
- mono_error_init (error);
+ error_init (error);
for (int i = 0; i < header->num_locals; ++i) {
res->locals [i] = mono_class_inflate_generic_type_checked (header->locals [i], context, error);
MonoMethodSignature *sig;
const char *ptr;
- mono_error_init (error);
+ error_init (error);
/* !table is for wrappers: we should really assign their own token to them */
if (!table || table == MONO_TABLE_METHOD)
MonoMethodSignature *sig;
const char *ptr;
- mono_error_init (error);
+ error_init (error);
mono_metadata_decode_row (&tables [MONO_TABLE_MEMBERREF], idx-1, cols, 3);
nindex = cols [MONO_MEMBERREF_CLASS] >> MONO_MEMBERREF_PARENT_BITS;
guint32 cols [MONO_METHODSPEC_SIZE];
guint32 token, nindex, param_count;
- mono_error_init (error);
+ error_init (error);
mono_metadata_decode_row (&tables [MONO_TABLE_METHODSPEC], idx - 1, cols, MONO_METHODSPEC_SIZE);
token = cols [MONO_METHODSPEC_METHOD];
const char *sig = NULL;
guint32 cols [MONO_TYPEDEF_SIZE];
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (image)) {
MonoClass *handle_class;
/* We do everything inside the lock to prevent creation races */
- mono_error_init (error);
+ error_init (error);
mono_image_lock (image);
MonoGenericContext *method_context = NULL;
MonoMethodSignature *sig, *original_sig;
- mono_error_init (error);
+ error_init (error);
mono_class_init (constrained_class);
original_sig = sig = mono_method_signature_checked (method, error);
MonoMethod *
mono_get_method_constrained_checked (MonoImage *image, guint32 token, MonoClass *constrained_class, MonoGenericContext *context, MonoMethod **cil_method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
*cil_method = mono_get_method_from_token (image, token, NULL, context, NULL, error);
if (!*cil_method)
/* We need memory barriers below because of the double-checked locking pattern */
- mono_error_init (error);
+ error_init (error);
if (m->signature)
return m->signature;
}
if (m->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) {
signature->pinvoke = 1;
-#ifdef HOST_WIN32
+#ifdef TARGET_WIN32
/*
* On Windows the default pinvoke calling convention is STDCALL but
* we need CDECL since this is actually an icall.
gpointer loc;
MonoGenericContainer *container;
- mono_error_init (error);
+ error_init (error);
img = method->klass->image;
if ((method->flags & METHOD_ATTRIBUTE_ABSTRACT) || (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) || (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) {
MonoArray *ret;
int i, len = 0;
- mono_error_init (error);
+ error_init (error);
for (i = 0; i < ml; i++) {
if (gs [i] == -1)
MonoDomain *domain;
int i;
- mono_error_init (error);
+ error_init (error);
if (names == NULL)
return NULL;
MonoDomain *domain;
int i, len = 0;
- mono_error_init (error);
+ error_init (error);
if (names == NULL)
return NULL;
{
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
this_obj->lcid = ci->lcid;
MONO_OBJECT_SETREF (this_obj, name, mono_string_new (domain, idx2string (ci->name)));
mono_register_jit_icall (func, name, sig, no_wrapper);
}
+static void
+register_icall_no_wrapper (gpointer func, const char *name, const char *sigstr)
+{
+ MonoMethodSignature *sig = mono_create_icall_signature (sigstr);
+
+ mono_register_jit_icall (func, name, sig, TRUE);
+}
+
MonoMethodSignature*
mono_signature_no_pinvoke (MonoMethod *method)
{
register_icall (mono_string_to_byvalstr, "mono_string_to_byvalstr", "void ptr ptr int32", FALSE);
register_icall (mono_string_to_byvalwstr, "mono_string_to_byvalwstr", "void ptr ptr int32", FALSE);
register_icall (g_free, "g_free", "void ptr", FALSE);
- register_icall (mono_object_isinst_icall, "mono_object_isinst_icall", "object object ptr", FALSE);
+ register_icall_no_wrapper (mono_object_isinst_icall, "mono_object_isinst_icall", "object object ptr");
register_icall (mono_struct_delete_old, "mono_struct_delete_old", "void ptr ptr", FALSE);
register_icall (mono_delegate_begin_invoke, "mono_delegate_begin_invoke", "object object ptr", FALSE);
register_icall (mono_delegate_end_invoke, "mono_delegate_end_invoke", "object object ptr", FALSE);
target_handle = mono_gchandle_new_weakref (delegate->target, FALSE);
}
- wrapper = mono_marshal_get_managed_wrapper (method, klass, target_handle);
+ wrapper = mono_marshal_get_managed_wrapper (method, klass, target_handle, &error);
+ if (!is_ok (&error))
+ goto fail;
delegate->delegate_trampoline = mono_compile_method_checked (wrapper, &error);
if (!is_ok (&error))
* If target_handle==0, the wrapper info will be a WrapperInfo structure.
*/
MonoMethod *
-mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, uint32_t target_handle)
+mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, uint32_t target_handle, MonoError *error)
{
- MonoError error;
MonoMethodSignature *sig, *csig, *invoke_sig;
MonoMethodBuilder *mb;
MonoMethod *res, *invoke;
EmitMarshalContext m;
g_assert (method != NULL);
- g_assert (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL));
+ error_init (error);
+
+ if (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) {
+ mono_error_set_invalid_program (error, "Failed because method (%s) marked PInvokeCallback (managed method) and extern (unmanaged) simultaneously.", mono_method_full_name (method, TRUE));
+ return NULL;
+ }
/*
* FIXME: Should cache the method+delegate type pair, since the same method
* contents of the attribute without constructing it, as that might not be
* possible when running in cross-compiling mode.
*/
- cinfo = mono_custom_attrs_from_class_checked (delegate_klass, &error);
- mono_error_assert_ok (&error);
+ cinfo = mono_custom_attrs_from_class_checked (delegate_klass, error);
+ mono_error_assert_ok (error);
attr = NULL;
if (cinfo) {
for (i = 0; i < cinfo->num_attrs; ++i) {
mono_mb_emit_byte (mb, CEE_RET);
break;
- case STELEMREF_COMPLEX:
+ case STELEMREF_COMPLEX: {
+ int b_fast;
/*
<ldelema (bound check)>
if (!value)
*/
aklass = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+ vklass = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
array_slot_addr = mono_mb_add_local (mb, &mono_defaults.object_class->this_arg);
#if 0
/* aklass = array->vtable->klass->element_class */
load_array_class (mb, aklass);
+ /* vklass = value->vtable->klass */
+ load_value_class (mb, vklass);
+
+ /* fastpath */
+ mono_mb_emit_ldloc (mb, vklass);
+ mono_mb_emit_ldloc (mb, aklass);
+ b_fast = mono_mb_emit_branch (mb, CEE_BEQ);
/*if (mono_object_isinst (value, aklass)) */
mono_mb_emit_ldarg (mb, 2);
/* do_store: */
mono_mb_patch_branch (mb, b1);
+ mono_mb_patch_branch (mb, b_fast);
mono_mb_emit_ldloc (mb, array_slot_addr);
mono_mb_emit_ldarg (mb, 2);
mono_mb_emit_byte (mb, CEE_STIND_REF);
mono_mb_emit_exception (mb, "ArrayTypeMismatchException", NULL);
break;
-
+ }
case STELEMREF_SEALED_CLASS:
/*
<ldelema (bound check)>
vklass = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
array_slot_addr = mono_mb_add_local (mb, &mono_defaults.object_class->this_arg);
-
/* ldelema (implicit bound check) */
load_array_element_address (mb);
mono_mb_emit_stloc (mb, array_slot_addr);
mono_mb_emit_exception (mb, "ArrayTypeMismatchException", NULL);
break;
- case STELEMREF_CLASS:
+ case STELEMREF_CLASS: {
+ int b_fast;
+
/*
the method:
<ldelema (bound check)>
/* vklass = value->vtable->klass */
load_value_class (mb, vklass);
+ /* fastpath */
+ mono_mb_emit_ldloc (mb, vklass);
+ mono_mb_emit_ldloc (mb, aklass);
+ b_fast = mono_mb_emit_branch (mb, CEE_BEQ);
+
/*if (mono_object_isinst (value, aklass)) */
mono_mb_emit_ldarg (mb, 2);
mono_mb_emit_ldloc (mb, aklass);
/* do_store: */
mono_mb_patch_branch (mb, b1);
+ mono_mb_patch_branch (mb, b_fast);
mono_mb_emit_ldloc (mb, array_slot_addr);
mono_mb_emit_ldarg (mb, 2);
mono_mb_emit_byte (mb, CEE_STIND_REF);
mono_mb_emit_exception (mb, "ArrayTypeMismatchException", NULL);
break;
-
+ }
case STELEMREF_INTERFACE:
/*Mono *klass;
MonoVTable *vt;
{
gpointer res;
- mono_error_init (error);
+ error_init (error);
res = mono_marshal_alloc_co_task_mem (size);
if (!res)
{
MonoError error;
MonoString *result = NULL;
- mono_error_init (&error);
+ error_init (&error);
if (ptr == NULL)
mono_error_set_argument_null (&error, "ptr", "");
else
MonoString *res = NULL;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (&error);
+ error_init (&error);
if (ptr == NULL) {
res = NULL;
MonoMethod *method;
gpointer pa [2];
- mono_error_init (error);
+ error_init (error);
method = mono_marshal_get_ptr_to_struct (dst->vtable->klass);
MonoThreadInfo *info = mono_thread_info_current ();
mono_stack_mark_init (info, stackmark);
- mono_error_init (error);
+ error_init (error);
return info;
}
mono_icall_end (MonoThreadInfo *info, HandleStackMark *stackmark, MonoError *error)
{
mono_stack_mark_pop (info, stackmark);
- mono_error_set_pending_exception (error);
+ if (G_UNLIKELY (!is_ok (error)))
+ mono_error_set_pending_exception (error);
}
mono_marshal_get_string_ctor_signature (MonoMethod *method);
MonoMethod *
-mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, uint32_t this_loc);
+mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, uint32_t this_loc, MonoError *exernal_error);
gpointer
mono_marshal_get_vtfixup_ftnptr (MonoImage *image, guint32 token, guint16 type);
{
VerifyContext ctx;
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_is_enabled_for_image (image))
return TRUE;
MonoTableInfo *table = &image->tables [MONO_TABLE_TYPEREF];
guint32 data [MONO_TYPEREF_SIZE];
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_is_enabled_for_image (image))
return TRUE;
MonoTableInfo *table = &image->tables [MONO_TABLE_METHODIMPL];
guint32 data [MONO_METHODIMPL_SIZE];
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_is_enabled_for_image (image))
return TRUE;
gboolean
mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
gboolean
mono_verifier_verify_typeref_row (MonoImage *image, guint32 row, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
gboolean
mono_verifier_verify_methodimpl_row (MonoImage *image, guint32 row, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
int count = 0; // Number of mod arguments
gboolean found;
- mono_error_init (error);
+ error_init (error);
/*
* According to the spec, custom modifiers should come before the byref
mono_metadata_parse_signature_checked (MonoImage *image, guint32 token, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoTableInfo *tables = image->tables;
guint32 idx = mono_metadata_token_index (token);
guint32 sig;
guint32 gen_param_count = 0;
gboolean is_open = FALSE;
- mono_error_init (error);
+ error_init (error);
if (*ptr & 0x10)
gen_param_count = 1;
MonoGenericInst *nginst = NULL;
int i, count = 0;
- mono_error_init (error);
+ error_init (error);
if (!ginst->is_open)
return ginst;
MonoGenericInst *ginst;
int i;
- mono_error_init (error);
+ error_init (error);
type_argv = g_new0 (MonoType*, count);
for (i = 0; i < count; i++) {
MonoType *gtype;
int count;
- mono_error_init (error);
+ error_init (error);
// XXX how about transient?
gtype = mono_metadata_parse_type_checked (m, NULL, 0, FALSE, ptr, &ptr, error);
if (rptr)
*rptr = ptr;
- mono_error_init (error);
+ error_init (error);
generic_container = select_container (generic_container, type);
if (!generic_container) {
static gboolean
compare_type_literals (MonoImage *image, int class_type, int type_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
/* byval_arg.type can be zero if we're decoding a type that references a class been loading.
* See mcs/test/gtest-440. and #650936.
static gboolean
verify_var_type_and_container (MonoImage *image, int var_type, MonoGenericContainer *container, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (var_type == MONO_TYPE_MVAR) {
if (!container->is_method) { //MVAR and a method container
mono_error_set_bad_image (error, image, "MVAR parsed in a context without a method container");
do_mono_metadata_parse_type (MonoType *type, MonoImage *m, MonoGenericContainer *container,
gboolean transient, const char *ptr, const char **rptr, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
type->type = (MonoTypeEnum)mono_metadata_decode_value (ptr, &ptr);
guint32 sect_data_len;
MonoExceptionClause* clauses = NULL;
- mono_error_init (error);
+ error_init (error);
while (1) {
/* align on 32-bit boundary */
MonoTableInfo *t = &m->tables [MONO_TABLE_STANDALONESIG];
guint32 cols [MONO_STAND_ALONE_SIGNATURE_SIZE];
- mono_error_init (error);
+ error_init (error);
if (!ptr) {
mono_error_set_bad_image (error, m, "Method header with null pointer");
*interfaces = NULL;
*count = 0;
- mono_error_init (error);
+ error_init (error);
if (!tdef->base)
return TRUE;
const char *ptr;
MonoType *type, *type2;
- mono_error_init (error);
+ error_init (error);
mono_image_lock (image);
type = (MonoType *)g_hash_table_lookup (image->typespec_cache, GUINT_TO_POINTER (type_spec));
MonoMethod *result = NULL;
guint32 idx = tok >> MONO_METHODDEFORREF_BITS;
- mono_error_init (error);
+ error_init (error);
switch (tok & MONO_METHODDEFORREF_MASK) {
case MONO_METHODDEFORREF_METHODDEF:
GSList *cons = NULL, *tmp;
MonoGenericContext *context = &container->context;
- mono_error_init (error);
+ error_init (error);
*constraints = NULL;
found = 0;
{
guint32 start_row, i, owner;
- mono_error_init (error);
+ error_init (error);
if (! (start_row = mono_metadata_get_generic_param_row (image, token, &owner)))
return TRUE;
{
MonoSimpleBasicBlock *res, *bb = first;
- mono_error_init (error);
+ error_init (error);
if (bb_idx_is_contained (hint, target)) {
first = hint;
MonoSimpleBasicBlock *branch, *next, *current;
const MonoOpcode *opcode;
- mono_error_init (error);
+ error_init (error);
current = bb;
int i;
int end = header->code_size;
- mono_error_init (error);
+ error_init (error);
/*We must split at all points to verify for targets in the middle of an instruction*/
for (i = 0; i < header->num_clauses; ++i) {
MonoSimpleBasicBlock *bb, *root;
const unsigned char *start, *end;
- mono_error_init (error);
+ error_init (error);
start = header->code;
end = start + header->code_size;
MonoMList*
mono_mlist_alloc_checked (MonoObject *data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMList* res;
if (!monolist_item_vtable) {
MonoClass *klass = mono_class_load_from_name (mono_defaults.corlib, "System", "MonoListItem");
MonoMList*
mono_mlist_prepend_checked (MonoMList* list, MonoObject *data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMList* res = mono_mlist_alloc_checked (data, error);
return_val_if_nok (error, NULL);
MonoMList*
mono_mlist_append_checked (MonoMList* list, MonoObject *data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMList* res = mono_mlist_alloc_checked (data, error);
return_val_if_nok (error, NULL);
SharedInstance* inst;
char *name;
- mono_error_init (error);
+ error_init (error);
scounter = find_custom_counter (cat, counter);
if (!scounter)
return NULL;
{
int i;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
MonoArray * res = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), count, error);
return_val_if_nok (error, NULL);
for (i = 0; i < count; ++i) {
{
int i;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
MonoArray * res = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), count, error);
return_val_if_nok (error, NULL);
for (i = 0; i < count; ++i) {
int res;
void **buf = NULL;
MonoArray *array;
- mono_error_init (error);
+ error_init (error);
do {
count *= 2;
g_free (buf);
void **buf = NULL;
int i, count;
MonoArray *array;
- mono_error_init (error);
+ error_init (error);
count = mono_cpu_count () + 1; /* +1 for "_Total" */
buf = g_new (void*, count);
for (i = 0; i < count; ++i)
MonoArray *array;
int count = 0;
void **buf = mono_process_list (&count);
- mono_error_init (error);
+ error_init (error);
if (!buf)
return get_string_array (NULL, 0, FALSE, error);
array = get_string_array (buf, count, TRUE, error);
{
MonoArray *array;
int count = 0;
- mono_error_init (error);
+ error_init (error);
void **buf = mono_networkinterface_list (&count);
if (!buf)
return get_string_array_of_strings (NULL, 0, error);
get_custom_instances (MonoString *category, MonoError *error)
{
SharedCategory *scat;
- mono_error_init (error);
+ error_init (error);
scat = find_custom_category (category);
if (scat) {
GSList *list = get_custom_instances_list (scat);
ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("OpenThreadToken, OpenProcessToken");
ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetTokenInformation");
ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken (gpointer token)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("DuplicateToken");
ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken (gpointer token)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("ImpersonateLoggedOnUser");
ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("RevertToSelf");
mono_security_win_get_token_name (gpointer token, gunichar2 ** uniname)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetTokenInformation");
mono_security_win_is_machine_protected (gunichar2 *path)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetNamedSecurityInfo, LocalFree");
mono_security_win_is_user_protected (gunichar2 *path)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetNamedSecurityInfo, LocalFree");
mono_security_win_protect_machine (gunichar2 *path)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("BuildTrusteeWithSid, SetEntriesInAcl, SetNamedSecurityInfo, LocalFree, FreeSid");
mono_security_win_protect_user (gunichar2 *path)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("BuildTrusteeWithSid, SetEntriesInAcl, SetNamedSecurityInfo, LocalFree");
gunichar2 *uniname = NULL;
gint32 size = 0;
- mono_error_init (&error);
+ error_init (&error);
size = mono_security_win_get_token_name (token, &uniname);
gunichar2 *uniname = NULL;
gint32 size = 0;
- mono_error_init (&error);
+ error_init (&error);
size = internal_get_token_name (token, &uniname);
MonoBoolean
ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssemblyHandle refass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (refass))
return FALSE;
MonoAssembly *assembly = MONO_HANDLE_GETVAL (refass, assembly);
MonoMethod *method;
void *params [2];
- mono_error_init (error);
+ error_init (error);
if (system_security_assembly == NULL) {
system_security_assembly = mono_image_loaded ("System.Security");
MonoMethod *method = NULL;
MonoClass *klass = this_obj->vtable->klass;
- mono_error_init (error);
+ error_init (error);
method = mono_class_get_method_from_name (klass, ".ctor", 0);
if (!method)
g_error ("Could not lookup zero argument constructor for class %s", mono_type_get_full_name (klass));
MonoDomain *last_domain = NULL;
MonoException * pending_tae = NULL;
- mono_error_init (error);
+ error_init (error);
if (vtable->initialized)
return TRUE;
else
mono_error_cleanup (error);
- mono_error_init (error);
+ error_init (error);
/* If the initialization failed, mark the class as unusable. */
/* Avoid infinite loops */
MONO_REQ_GC_NEUTRAL_MODE
- mono_error_init (error);
+ error_init (error);
g_assert (callbacks.compile_method);
res = callbacks.compile_method (method, error);
MONO_REQ_GC_NEUTRAL_MODE;
- mono_error_init (error);
+ error_init (error);
res = callbacks.create_jump_trampoline (domain, method, add_sync_wrapper, error);
return res;
}
MonoClassRuntimeInfo *runtime_info;
- mono_error_init (error);
+ error_init (error);
g_assert (klass);
gpointer iter;
gpointer *interface_offsets;
- mono_error_init (error);
+ error_init (error);
mono_loader_lock (); /*FIXME mono_class_init acquires it*/
mono_domain_lock (domain);
int bcsize;
#endif
- mono_error_init (error);
+ error_init (error);
vt = mono_class_vtable (domain, klass);
g_assert (vt); /*FIXME property handle failure*/
gpointer* key, *mp_key;
char *name;
- mono_error_init (error);
+ error_init (error);
key = create_remote_class_key (NULL, proxy_class);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
mono_loader_lock (); /*FIXME mono_class_from_mono_type and mono_class_proxy_vtable take it*/
mono_domain_lock (domain);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoTransparentProxyHandle tproxy = MONO_HANDLE_CAST (MonoTransparentProxy, proxy_object);
MonoRemoteClass *remote_class = MONO_HANDLE_GETVAL (tproxy, remote_class);
MonoMethod*
mono_object_handle_get_virtual_method (MonoObjectHandle obj, MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
gboolean is_proxy = FALSE;
MonoClass *klass = mono_handle_class (obj);
static MonoMethod*
class_get_virtual_method (MonoClass *klass, MonoMethod *method, gboolean is_proxy, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!is_proxy && ((method->flags & METHOD_ATTRIBUTE_FINAL) || !(method->flags & METHOD_ATTRIBUTE_VIRTUAL)))
g_assert (callbacks.runtime_invoke);
- mono_error_init (error);
+ error_init (error);
if (mono_profiler_get_events () & MONO_PROFILE_METHOD_EVENTS)
mono_profiler_method_start_invoke (method);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoObject *o;
MonoClass *klass;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
int retval = 0;
const char *p = blob;
mono_metadata_decode_blob_size (p, &p);
MonoTypeEnum def_type;
const char* data;
- mono_error_init (error);
+ error_init (error);
data = mono_class_get_field_default_value (field, &def_type);
mono_get_constant_value_from_blob (domain, def_type, data, value, error);
void *src;
- mono_error_init (error);
+ error_init (error);
g_return_if_fail (field->type->attrs & FIELD_ATTRIBUTE_STATIC);
MonoObject *exc;
- mono_error_init (error);
+ error_init (error);
do_runtime_invoke (prop->set, obj, params, &exc, error);
if (exc != NULL && is_ok (error))
mono_error_set_exception_instance (error, (MonoException*)exc);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoClass *param_class = klass->cast_class;
mono_class_setup_fields (klass);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoMethod *im;
MonoClass *klass = delegate->vtable->klass;
MonoObject *o;
MonoObject*
mono_runtime_delegate_invoke_checked (MonoObject *delegate, void **params, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return mono_runtime_delegate_try_invoke (delegate, params, NULL, error);
}
int i;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
res = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, num_main_args, error);
return_val_if_nok (error, NULL);
mono_runtime_run_main_checked (MonoMethod *method, int argc, char* argv[],
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoArray *args = prepare_run_main (method, argc, argv);
return mono_runtime_exec_main_checked (method, args, error);
}
MonoReflectionType *reflection_type;
MonoTransparentProxy *transparent_proxy;
- mono_error_init (error);
+ error_init (error);
if (!get_proxy_method)
get_proxy_method = mono_class_get_method_from_name (mono_defaults.real_proxy_class, "GetTransparentProxy", 0);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoObject *deserialized = NULL;
#ifndef DISABLE_REMOTING
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoClass *klass;
gpointer args [2];
MonoMethod *method = NULL;
gpointer pa [1];
int rval;
- mono_error_init (error);
+ error_init (error);
g_assert (args);
pa [0] = args;
int
mono_runtime_exec_main_checked (MonoMethod *method, MonoArray *args, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
prepare_thread_to_exec_main (mono_object_domain (args), method);
return do_exec_main_checked (method, args, error);
}
{
MonoType *t_orig = t;
gpointer result = NULL;
- mono_error_init (error);
+ error_init (error);
again:
switch (t->type) {
case MONO_TYPE_U1:
mono_runtime_invoke_array_checked (MonoMethod *method, void *obj, MonoArray *params,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return mono_runtime_try_invoke_array (method, obj, params, NULL, error);
}
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoMethodSignature *sig = mono_method_signature (method);
gpointer *pa = NULL;
MonoVTable *vtable;
- mono_error_init (error);
+ error_init (error);
vtable = mono_class_vtable (domain, klass);
g_assert (vtable); /* FIXME don't swallow the error */
MonoObject *o;
- mono_error_init (error);
+ error_init (error);
/* check for is_com_object for COM Interop */
if (mono_vtable_is_remote (vtable) || mono_class_is_com_object (vtable->klass))
MonoObject *o;
- mono_error_init (error);
+ error_init (error);
o = (MonoObject *)mono_gc_alloc_obj (vtable, vtable->klass->instance_size);
MonoObject *o;
- mono_error_init (error);
+ error_init (error);
o = mono_gc_alloc_obj (vtable, vtable->klass->instance_size);
MonoObject *o;
- mono_error_init (error);
+ error_init (error);
o = mono_gc_alloc_mature (vtable, vtable->klass->instance_size);
MonoObject *o;
int size;
- mono_error_init (error);
+ error_init (error);
size = obj->vtable->klass->instance_size;
uintptr_t size = 0;
MonoClass *klass = mono_handle_class (array_handle);
- mono_error_init (error);
+ error_init (error);
/* Pin source array here - if bounds is non-NULL, it's a pointer into the object data */
uint32_t src_handle = mono_gchandle_from_handle (MONO_HANDLE_CAST (MonoObject, array_handle), TRUE);
MONO_REQ_GC_UNSAFE_MODE;
HANDLE_FUNCTION_ENTER ();
/* FIXME: callers of mono_array_clone_checked should use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoArray, array);
MonoArrayHandle result = mono_array_clone_in_domain (MONO_HANDLE_DOMAIN (array), array, error);
HANDLE_FUNCTION_RETURN_OBJ (result);
MonoVTable *vtable;
int i;
- mono_error_init (error);
+ error_init (error);
if (!array_class->inited)
mono_class_init (array_class);
{
MonoClass *ac;
- mono_error_init (error);
+ error_init (error);
ac = mono_array_class_get (eclass, 1);
g_assert (ac);
MonoObject *o;
uintptr_t byte_len;
- mono_error_init (error);
+ error_init (error);
if (G_UNLIKELY (n > MONO_ARRAY_MAX_INDEX)) {
mono_error_set_generic_error (error, "System", "OverflowException", "");
MonoString *s;
- mono_error_init (error);
+ error_init (error);
s = mono_string_new_size_checked (domain, len, error);
if (s != NULL)
GError *gerror = NULL;
glong items_written;
- mono_error_init (error);
+ error_init (error);
utf16_output = g_ucs4_to_utf16 (text, len, NULL, &items_written, &gerror);
if (gerror)
MonoVTable *vtable;
size_t size;
- mono_error_init (error);
+ error_init (error);
/* check for overflow */
if (len < 0 || len > ((SIZE_MAX - G_STRUCT_OFFSET (MonoString, chars) - 8) / 2)) {
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
GError *eg_error = NULL;
MonoString *o = NULL;
glong items_written;
int l;
- mono_error_init (error);
+ error_init (error);
l = strlen (text);
int size;
MonoVTable *vtable;
- mono_error_init (error);
+ error_init (error);
g_assert (klass->valuetype);
if (mono_class_is_nullable (klass))
MONO_REQ_GC_UNSAFE_MODE;
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoObject, obj);
MonoObjectHandle result = mono_object_handle_isinst (obj, klass, error);
HANDLE_FUNCTION_RETURN_OBJ (result);
MonoObjectHandle
mono_object_handle_isinst (MonoObjectHandle obj, MonoClass *klass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!klass->inited)
mono_class_init (klass);
MonoObjectHandle
mono_object_handle_isinst_mbyref (MonoObjectHandle obj, MonoClass *klass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoObjectHandle result = MONO_HANDLE_NEW (MonoObject, NULL);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
/* We only need to make a pinned version of a string if this is a moving GC */
if (!mono_gc_is_moving ())
MonoString *s, *res;
MonoDomain *domain;
- mono_error_init (error);
+ error_init (error);
domain = ((MonoObject *)str)->vtable->domain;
ldstr_table = domain->ldstr_table;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
return mono_string_is_interned_lookup (str, TRUE, error);
}
mono_ldstr_checked (MonoDomain *domain, MonoImage *image, guint32 idx, MonoError *error)
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
if (image->dynamic) {
MonoString *str = (MonoString *)mono_lookup_dynamic_token (image, MONO_TOKEN_STRING | idx, NULL, error);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
const char *str = sig;
MonoString *o, *interned;
size_t len2;
char *as;
GError *gerror = NULL;
- mono_error_init (error);
+ error_init (error);
if (!mono_verifier_verify_string_signature (image, idx, NULL))
return NULL; /*FIXME we should probably be raising an exception here*/
char *as;
GError *gerror = NULL;
- mono_error_init (error);
+ error_init (error);
if (s == NULL)
return NULL;
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
int len = 0;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoString* result = NULL;
mono_unichar2 *utf16_output = NULL;
GError *gerror = NULL;
gpointer params [1];
static MonoMethod *handle_set;
- mono_error_init (error);
+ error_init (error);
res = (MonoWaitHandle *)mono_object_new_checked (domain, mono_defaults.manualresetevent_class, error);
return_val_if_nok (error, NULL);
RuntimeInvokeFunction runtime_invoke;
- mono_error_init (error);
+ error_init (error);
if (!domain->capture_context_runtime_invoke || !domain->capture_context_method) {
MonoMethod *method = mono_get_context_capture_method ();
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoAsyncResult *res = (MonoAsyncResult *)mono_object_new_checked (domain, mono_defaults.asyncresult_class, error);
return_val_if_nok (error, NULL);
MonoObject *context = mono_runtime_capture_context (domain, error);
if (wait_event != NULL)
mono_w32event_set (wait_event);
- mono_error_init (&error); //the else branch would leave it in an undefined state
+ error_init (&error); //the else branch would leave it in an undefined state
if (ac->cb_method)
mono_runtime_invoke_checked (ac->cb_method, ac->cb_target, (gpointer*) &ares, &error);
g_assert (init_message_method != NULL);
}
- mono_error_init (error);
+ error_init (error);
/* FIXME set domain instead? */
g_assert (domain == mono_domain_get ());
g_assert (exc);
- mono_error_init (error);
+ error_init (error);
/*static MonoObject *(*invoke) (gpointer, gpointer, MonoObject **, MonoArray **) = NULL;*/
MONO_REQ_GC_UNSAFE_MODE;
static MonoClass *object_array_klass;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain;
MonoMethod *method;
MonoString *
mono_object_to_string_checked (MonoObject *obj, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
void *target;
MonoMethod *method = prepare_to_string_method (obj, &target);
return (MonoString*) mono_runtime_invoke_checked (method, target, NULL, error);
mono_object_try_to_string (MonoObject *obj, MonoObject **exc, MonoError *error)
{
g_assert (exc);
- mono_error_init (error);
+ error_init (error);
void *target;
MonoMethod *method = prepare_to_string_method (obj, &target);
return (MonoString*) mono_runtime_try_invoke (method, target, NULL, exc, error);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDelegate *delegate = (MonoDelegate *)this_obj;
g_assert (this_obj);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoJitInfo *ji;
MonoMethod *method = NULL;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoMethodSignature *sig = mono_method_signature (method);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoMethodSignature *sig = mono_method_signature (method);
int i, j, type, size, out_len;
static MonoMethod *getter = NULL;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoTransparentProxy *tp = (MonoTransparentProxy *) this_obj;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
static MonoMethod *tp_load = NULL;
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = mono_domain_get ();
MonoClass *field_class;
static MonoMethod *tp_store = NULL;
- mono_error_init (error);
+ error_init (error);
g_assert (mono_object_is_transparent_proxy (this_obj));
MonoArray *res;
int len, i;
- mono_error_init (error);
+ error_init (error);
if (!list)
return NULL;
static inline MonoObjectHandle
check_or_construct_handle (MonoDomain *domain, MonoClass *klass, gpointer item, gpointer user_data, MonoError *error, ReflectionCacheConstructFunc_handle construct)
{
- mono_error_init (error);
+ error_init (error);
MonoObjectHandle obj = check_object_handle (domain, klass, item);
if (!MONO_HANDLE_IS_NULL (obj))
return obj;
static MonoReflectionAssemblyHandle
assembly_object_construct (MonoDomain *domain, MonoClass *unused_klass, MonoAssembly *assembly, gpointer user_data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionAssemblyHandle res = MONO_HANDLE_NEW (MonoReflectionAssembly, mono_object_new_checked (domain, mono_class_get_mono_assembly_class (), error));
return_val_if_nok (error, MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE));
MONO_HANDLE_SETVAL (res, assembly, MonoAssembly*, assembly);
MonoReflectionAssemblyHandle
mono_assembly_get_object_handle (MonoDomain *domain, MonoAssembly *assembly, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionAssemblyHandle, assembly, NULL, assembly_object_construct, NULL);
}
{
char* basename;
- mono_error_init (error);
+ error_init (error);
MonoReflectionModuleHandle res = MONO_HANDLE_NEW (MonoReflectionModule, mono_object_new_checked (domain, mono_class_get_mono_module_class (), error));
if (!is_ok (error))
goto fail;
MonoReflectionModuleHandle
mono_module_get_object_handle (MonoDomain *domain, MonoImage *image, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionModuleHandle, image, NULL, module_object_construct, NULL);
}
guint32 i, name_idx;
const char *val;
- mono_error_init (error);
+ error_init (error);
MonoReflectionModuleHandle res = MONO_HANDLE_NEW (MonoReflectionModule, mono_object_new_checked (domain, mono_class_get_mono_module_class (), error));
if (!is_ok (error))
MonoReflectionType *res;
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
g_assert (type != NULL);
klass = mono_class_from_mono_type (type);
static MonoReflectionMethodHandle
method_object_construct (MonoDomain *domain, MonoClass *refclass, MonoMethod *method, gpointer user_data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
g_assert (refclass != NULL);
/*
* We use the same C representation for methods and constructors, but the type
*/
MonoClass *klass;
- mono_error_init (error);
+ error_init (error);
if (*method->name == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0)) {
klass = mono_class_get_mono_cmethod_class ();
MonoReflectionMethodHandle
mono_method_get_object_handle (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!refclass)
refclass = method->klass;
static MonoReflectionFieldHandle
field_object_construct (MonoDomain *domain, MonoClass *klass, MonoClassField *field, gpointer user_data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionFieldHandle res = MONO_HANDLE_NEW (MonoReflectionField, mono_object_new_checked (domain, mono_class_get_mono_field_class (), error));
if (!is_ok (error))
MonoReflectionFieldHandle
mono_field_get_object_handle (MonoDomain *domain, MonoClass *klass, MonoClassField *field, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionFieldHandle, field, klass, field_object_construct, NULL);
}
static MonoReflectionPropertyHandle
property_object_construct (MonoDomain *domain, MonoClass *klass, MonoProperty *property, gpointer user_data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionPropertyHandle res = MONO_HANDLE_NEW (MonoReflectionProperty, mono_object_new_checked (domain, mono_class_get_mono_property_class (), error));
if (!is_ok (error))
event_object_construct (MonoDomain *domain, MonoClass *klass, MonoEvent *event, gpointer user_data, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionMonoEventHandle mono_event = MONO_HANDLE_NEW (MonoReflectionMonoEvent, mono_object_new_checked (domain, mono_class_get_mono_event_class (), error));
if (!is_ok (error))
return MONO_HANDLE_CAST (MonoReflectionEvent, NULL_HANDLE);
MonoReflectionEventHandle
mono_event_get_object_handle (MonoDomain *domain, MonoClass *klass, MonoEvent *event, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionEventHandle, event, klass, event_object_construct, NULL);
}
{
static MonoClassField *dbnull_value_field = NULL;
- mono_error_init (error);
+ error_init (error);
if (!dbnull_value_field) {
MonoClass *dbnull_klass;
static MonoObjectHandle
get_dbnull (MonoDomain *domain, MonoObjectHandle dbnull, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (dbnull))
MONO_HANDLE_ASSIGN (dbnull, get_dbnull_object (domain, error));
return dbnull;
add_parameter_object_to_array (MonoDomain *domain, MonoMethod *method, MonoObjectHandle member, int idx, const char *name, MonoType *sig_param, guint32 blob_type_enum, const char *blob, MonoMarshalSpec *mspec, MonoObjectHandle missing, MonoObjectHandle dbnull, MonoArrayHandle dest, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionParameterHandle param = MONO_HANDLE_NEW (MonoReflectionParameter, mono_object_new_checked (domain, mono_class_get_mono_parameter_info_class (), error));
if (!is_ok (error))
goto leave;
MonoMarshalSpec **mspecs = NULL;
int i;
- mono_error_init (error);
+ error_init (error);
MonoReflectionMethodHandle member = mono_method_get_object_handle (domain, method, refclass, error);
if (!is_ok (error))
MonoArrayHandle
mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
/* side-effect: sets method->signature non-NULL on success */
MonoMethodSignature *sig = mono_method_signature_checked (method, error);
add_local_var_info_to_array (MonoDomain *domain, MonoMethodHeader *header, int idx, MonoArrayHandle dest, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionLocalVariableInfoHandle info = MONO_HANDLE_NEW (MonoReflectionLocalVariableInfo, mono_object_new_checked (domain, mono_class_get_local_variable_info_class (), error));
if (!is_ok (error))
goto leave;
add_exception_handling_clause_to_array (MonoDomain *domain, MonoMethodHeader *header, int idx, MonoArrayHandle dest, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoReflectionExceptionHandlingClauseHandle info = MONO_HANDLE_NEW (MonoReflectionExceptionHandlingClause, mono_object_new_checked (domain, mono_class_get_exception_handling_clause_class (), error));
if (!is_ok (error))
goto leave;
unsigned char format, flags;
int i;
- mono_error_init (error);
+ error_init (error);
/* for compatibility with .net */
if (method_is_dynamic (method)) {
MonoReflectionMethodBodyHandle
mono_method_body_get_object_handle (MonoDomain *domain, MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethodBodyHandle, method, NULL, method_body_object_construct, NULL);
}
MonoObject *object;
MonoType *basetype = type;
- mono_error_init (error);
+ error_init (error);
if (!blob)
return NULL;
MonoType *type;
MonoImage *rootimage = image;
- mono_error_init (error);
+ error_init (error);
if (info->assembly.name) {
MonoAssembly *assembly = mono_assembly_loaded (&info->assembly);
if (type == NULL && !info->assembly.name && image != mono_defaults.corlib) {
/* ignore the error and try again */
mono_error_cleanup (error);
- mono_error_init (error);
+ error_init (error);
image = mono_defaults.corlib;
type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve, error);
}
int modval;
gboolean bounded = FALSE;
- mono_error_init (error);
+ error_init (error);
if (!image)
image = mono_defaults.corlib;
*/
MonoType*
mono_reflection_get_type_checked (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error) {
- mono_error_init (error);
+ error_init (error);
return mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, type_resolve, error);
}
module_builder_array_get_type (MonoArrayHandle module_builders, int i, MonoImage *rootimage, MonoTypeNameParse *info, gboolean ignorecase, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *type = NULL;
MonoReflectionModuleBuilderHandle mb = MONO_HANDLE_NEW (MonoReflectionModuleBuilder, NULL);
MONO_HANDLE_ARRAY_GETREF (mb, module_builders, i);
module_array_get_type (MonoArrayHandle modules, int i, MonoImage *rootimage, MonoTypeNameParse *info, gboolean ignorecase, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *type = NULL;
MonoReflectionModuleHandle mod = MONO_HANDLE_NEW (MonoReflectionModule, NULL);
MONO_HANDLE_ARRAY_GETREF (mod, modules, i);
MonoType *type = NULL;
int i;
- mono_error_init (error);
+ error_init (error);
g_assert (assembly_is_dynamic (assembly));
MonoReflectionAssemblyBuilderHandle abuilder = MONO_HANDLE_CAST (MonoReflectionAssemblyBuilder, mono_assembly_get_object_handle (((MonoDynamicAssembly*)assembly)->domain, assembly, error));
if (!is_ok (error))
GString *fullName;
GList *mod;
- mono_error_init (error);
+ error_init (error);
if (image && image_is_dynamic (image))
type = mono_reflection_get_type_internal_dynamic (rootimage, image->assembly, info, ignorecase, error);
MonoTypeNameParse info;
char *tmp;
- mono_error_init (error);
+ error_init (error);
/* Make a copy since parse_type modifies its argument */
tmp = g_strdup (name);
{
guint32 token = 0;
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_handle_class (obj);
gboolean is_dynamic = FALSE;
MonoClass *geninst;
- mono_error_init (error);
+ error_init (error);
mono_loader_lock ();
generic_inst_from_type_array_handle (MonoArrayHandle types, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoGenericInst *ginst = NULL;
int count = mono_array_handle_length (types);
MonoType **type_argv = g_new0 (MonoType *, count);
MonoMethod *inflated;
MonoGenericContext tmp_context;
- mono_error_init (error);
+ error_init (error);
klass = method->klass;
MonoReflectionMethodHandle
ves_icall_MonoMethod_MakeGenericMethod_impl (MonoReflectionMethodHandle rmethod, MonoArrayHandle types, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
g_assert (0 != strcmp (mono_handle_class (rmethod)->name, "MethodBuilder"));
MonoMethod *method = MONO_HANDLE_GETVAL (rmethod, method);
void *params [1];
static MonoMethod *method = NULL;
- mono_error_init (error);
+ error_init (error);
if (method == NULL) {
method = mono_class_get_method_from_name (mono_class_get_type_builder_class (), "IsAssignableTo", 1);
goto fail;
if (exc) {
- mono_error_init (&error);
+ error_init (&error);
mono_error_set_exception_instance (&error, (MonoException *)exc);
goto fail;
}
xdomain_copy_array_element_inplace (MonoArrayHandle arr, int i, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoObjectHandle item = MONO_HANDLE_NEW (MonoObject, NULL);
MONO_HANDLE_ARRAY_GETREF (item, arr, i);
MonoObjectHandle
mono_marshal_xdomain_copy_value_handle (MonoObjectHandle val, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoObjectHandle result = MONO_HANDLE_NEW (MonoObject, NULL);
if (MONO_HANDLE_IS_NULL (val))
goto leave;
mono_runtime_set_shutting_down ();
- /* This will kill the tp threads which cannot be suspended */
- mono_threadpool_cleanup ();
-
/*TODO move the follow to here:
mono_thread_suspend_all_other_threads (); OR mono_thread_wait_all_other_threads
gboolean
mono_security_core_clr_ensure_reflection_access_field (MonoClassField *field, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *caller = get_reflection_caller ();
/* CoreCLR restrictions applies to Transparent code/caller */
if (mono_security_core_clr_method_level (caller, TRUE) != MONO_SECURITY_CORE_CLR_TRANSPARENT)
gboolean
mono_security_core_clr_ensure_reflection_access_method (MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoMethod *caller = get_reflection_caller ();
/* CoreCLR restrictions applies to Transparent code/caller */
if (mono_security_core_clr_method_level (caller, TRUE) != MONO_SECURITY_CORE_CLR_TRANSPARENT)
{
MonoMethod *caller;
- mono_error_init (error);
+ error_init (error);
/* note: mscorlib creates delegates to avoid reflection (optimization), we ignore those cases */
if (can_avoid_corlib_reflection_delegate_optimization (method))
gboolean
mono_security_core_clr_ensure_reflection_access_field (MonoClassField *field, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
gboolean
mono_security_core_clr_ensure_reflection_access_method (MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
gboolean
mono_security_core_clr_ensure_delegate_creation (MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return TRUE;
}
{
int p_var, size_var, real_size_var, thread_var G_GNUC_UNUSED;
gboolean slowpath = variant == MANAGED_ALLOCATOR_SLOW_PATH;
- guint32 slowpath_branch, max_size_branch;
+ guint32 fastpath_branch, max_size_branch, no_oom_branch;
MonoMethodBuilder *mb;
MonoMethod *res;
MonoMethodSignature *csig;
/* if (G_LIKELY (new_next < tlab_temp_end)) */
mono_mb_emit_ldloc (mb, new_next_var);
EMIT_TLS_ACCESS_TEMP_END (mb, thread_var);
- slowpath_branch = mono_mb_emit_short_branch (mb, MONO_CEE_BLT_UN_S);
+ fastpath_branch = mono_mb_emit_short_branch (mb, MONO_CEE_BLT_UN_S);
/* Slowpath */
if (atype != ATYPE_SMALL)
} else {
g_assert_not_reached ();
}
+
+ /* if (ret == NULL) throw OOM; */
+ mono_mb_emit_byte (mb, CEE_DUP);
+ no_oom_branch = mono_mb_emit_branch (mb, CEE_BRTRUE);
+ mono_mb_emit_exception (mb, "OutOfMemoryException", NULL);
+
+ mono_mb_patch_branch (mb, no_oom_branch);
mono_mb_emit_byte (mb, CEE_RET);
/* Fastpath */
- mono_mb_patch_short_branch (mb, slowpath_branch);
+ mono_mb_patch_short_branch (mb, fastpath_branch);
/* FIXME: Memory barrier */
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
if (!type) {
sigbuffer_add_value (buf, MONO_TYPE_VOID);
encode_reflection_type_raw (MonoDynamicImage *assembly, MonoReflectionType* type_raw, SigBuffer *buf, MonoError *error)
{
HANDLE_FUNCTION_ENTER (); /* FIXME callers of encode_reflection_type_raw should use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoReflectionType, type);
encode_reflection_type (assembly, type, buf, error);
HANDLE_FUNCTION_RETURN ();
int i;
- mono_error_init (error);
+ error_init (error);
if (!MONO_HANDLE_IS_NULL (modreq)) {
for (i = 0; i < mono_array_handle_length (modreq); ++i) {
encode_custom_modifiers_raw (MonoDynamicImage *assembly, MonoArray *modreq_raw, MonoArray *modopt_raw, SigBuffer *buf, MonoError *error)
{
HANDLE_FUNCTION_ENTER (); /* FIXME callers of encode_custom_modifiers_raw should use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoArray, modreq);
MONO_HANDLE_DCL (MonoArray, modopt);
encode_custom_modifiers (assembly, modreq, modopt, buf, error);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
/*
* FIXME: reuse code from method_encode_signature().
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 *values;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
SigBuffer buf;
guint32 idx;
encode_sighelper_arg (MonoDynamicImage *assembly, int i, MonoArrayHandle helper_arguments, MonoArrayHandle helper_modreqs, MonoArrayHandle helper_modopts, SigBuffer* buf, MonoError *error)
{
HANDLE_FUNCTION_ENTER();
- mono_error_init (error);
+ error_init (error);
MonoArrayHandle modreqs = MONO_HANDLE_NEW (MonoArray, NULL);
MonoArrayHandle modopts = MONO_HANDLE_NEW (MonoArray, NULL);
guint32 nargs;
guint32 i, idx;
- mono_error_init (error);
+ error_init (error);
if (!assembly->save)
return 0;
MonoArray *result;
SigBuffer buf;
- mono_error_init (error);
+ error_init (error);
sigbuffer_init (&buf, 32);
MonoArray *result;
SigBuffer buf;
- mono_error_init (error);
+ error_init (error);
sigbuffer_init (&buf, 32);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
char *str;
SigBuffer buf;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
SigBuffer buf;
guint32 nparams = 0;
image_create_token_raw (MonoDynamicImage *assembly, MonoObject* obj_raw, gboolean create_methodspec, gboolean register_token, MonoError *error)
{
HANDLE_FUNCTION_ENTER (); /* FIXME callers of image_create_token_raw should use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoObject, obj);
guint32 result = mono_image_create_token (assembly, obj, create_methodspec, register_token, error);
HANDLE_FUNCTION_RETURN_VAL (result);
char blob_size [6];
char *p = blob_size;
- mono_error_init (error);
+ error_init (error);
/* it is legal to pass a NULL cattrs: we avoid to use the if in a lot of places */
if (!cattrs)
guint32 header_size = 12;
MonoArray *code;
- mono_error_init (error);
+ error_init (error);
if ((mb->attrs & (METHOD_ATTRIBUTE_PINVOKE_IMPL | METHOD_ATTRIBUTE_ABSTRACT)) ||
(mb->iattrs & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)))
guint32 *values;
guint i, count;
- mono_error_init (error);
+ error_init (error);
/* room in this table is already allocated */
table = &assembly->tables [MONO_TABLE_METHOD];
MonoReflectionMethod *m;
int i;
- mono_error_init (error);
+ error_init (error);
if (!mb->override_methods)
return TRUE;
ReflectionMethodBuilder rmb;
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error) ||
!mono_image_basic_method (&rmb, assembly, error))
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 *values;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 *values;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoDynamicTable *table;
guint32 num_constraints, i;
guint32 *values;
guint32 table_idx;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_GENERICPARAM];
table_idx = table->next_idx ++;
params_add_cattrs (MonoDynamicImage *assembly, MonoArray *pinfo, MonoError *error) {
int i;
- mono_error_init (error);
+ error_init (error);
if (!pinfo)
return TRUE;
for (i = 0; i < mono_array_length (pinfo); ++i) {
type_add_cattrs (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb, MonoError *error) {
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_image_add_cattrs (assembly, tb->table_idx, MONO_CUSTOM_ATTR_TYPEDEF, tb->cattrs, error))
return FALSE;
{
int i;
- mono_error_init (error);
+ error_init (error);
if (!mono_image_add_cattrs (assembly, moduleb->table_idx, MONO_CUSTOM_ATTR_MODULE, moduleb->cattrs, error))
return FALSE;
char *b = blob_size;
char *dir, *path;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_FILE];
table->rows++;
MonoDynamicTable *table;
int i;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_MODULE];
mb->table_idx = table->next_idx ++;
MonoClass *klass;
guint32 idx, i;
- mono_error_init (error);
+ error_init (error);
MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
return_if_nok (error);
unsigned char *p;
struct StreamDesc stream_desc [5];
- mono_error_init (error);
+ error_init (error);
qsort (assembly->gen_params->pdata, assembly->gen_params->len, sizeof (gpointer), compare_genericparam);
for (i = 0; i < assembly->gen_params->len; i++) {
MonoDynamicTable *table;
guint32 *values;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_MANIFESTRESOURCE];
table->rows++;
char *name, *sname;
guint32 idx, offset;
- mono_error_init (error);
+ error_init (error);
if (rsrc->filename) {
name = mono_string_to_utf8_checked (rsrc->filename, error);
gchar *ver, *p, *str;
guint32 i;
- mono_error_init (error);
+ error_init (error);
values [MONO_ASSEMBLY_MAJOR_VERSION] = 0;
values [MONO_ASSEMBLY_MINOR_VERSION] = 0;
int i;
guint32 module_index;
- mono_error_init (error);
+ error_init (error);
assemblyb = moduleb->assemblyb;
assembly = moduleb->dynamic_image;
int i, is_object = 0, is_system = 0;
char *n;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_TYPEDEF];
values = table->values + tb->table_idx * MONO_TYPEDEF_SIZE;
guint32 *values;
int i, j;
- mono_error_init (error);
+ error_init (error);
assemblyb = moduleb->assemblyb;
assembly = moduleb->dynamic_image;
0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
- mono_error_init (error);
+ error_init (error);
assemblyb = mb->assemblyb;
/* FIXME all callers to string_to_utf8_image_raw should use handles */
HANDLE_FUNCTION_ENTER ();
char* result = NULL;
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoString, s);
result = mono_string_to_utf8_image (image, s, error);
HANDLE_FUNCTION_RETURN_VAL (result);
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
MonoExceptionClause *clauses;
MonoExceptionClause *clause;
{
MONO_REQ_GC_UNSAFE_MODE;
- mono_error_init (error);
+ error_init (error);
memset (rmb, 0, sizeof (ReflectionMethodBuilder));
rmb->ilgen = mb->ilgen;
const char *name = mb->attrs & METHOD_ATTRIBUTE_STATIC ? ".cctor": ".ctor";
- mono_error_init (error);
+ error_init (error);
memset (rmb, 0, sizeof (ReflectionMethodBuilder));
MonoDynamicTable *table;
guint32 *values;
- mono_error_init (error);
+ error_init (error);
table = &assembly->tables [MONO_TABLE_STANDALONESIG];
idx = table->next_idx ++;
MonoMethodSignature *sig = NULL;
char *name = NULL;
- mono_error_init (error);
+ error_init (error);
MonoArrayHandle parameters = MONO_HANDLE_NEW_GET (MonoArray, m, parameters);
guint32 nparams = mono_array_handle_length (parameters);
{
guint32 token = 0;
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_handle_class (obj);
if (strcmp (klass->name, "MonoMethod") == 0 || strcmp (klass->name, "MonoCMethod") == 0) {
{
guint32 token = 0;
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_handle_class (obj);
static gboolean
image_module_basic_init (MonoReflectionModuleBuilderHandle moduleb, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoDomain *domain = MONO_HANDLE_DOMAIN (moduleb);
MonoDynamicImage *image = MONO_HANDLE_GETVAL (moduleb, dynamic_image);
MonoReflectionAssemblyBuilderHandle ab = MONO_HANDLE_NEW (MonoReflectionAssemblyBuilder, NULL);
static gboolean
mono_image_module_basic_init (MonoReflectionModuleBuilderHandle moduleb, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return image_module_basic_init (moduleb, error);
}
mono_type_array_get_and_resolve (MonoArrayHandle array, int idx, MonoError *error)
{
HANDLE_FUNCTION_ENTER();
- mono_error_init (error);
+ error_init (error);
MonoReflectionTypeHandle t = MONO_HANDLE_NEW (MonoReflectionType, NULL);
MONO_HANDLE_ARRAY_GETREF (t, array, idx);
MonoType *result = mono_reflection_type_handle_mono_type (t, error);
static MonoMethod *method_get_underlying_system_type = NULL;
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
if (!method_get_underlying_system_type)
method_get_underlying_system_type = mono_class_get_method_from_name (mono_defaults.systemtype_class, "get_UnderlyingSystemType", 0);
mono_reflection_type_get_handle (MonoReflectionType* ref_raw, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoReflectionType, ref);
MonoType *result = mono_reflection_type_handle_mono_type (ref, error);
HANDLE_FUNCTION_RETURN_VAL (result);
reflection_param_handle_mono_type (MonoReflectionGenericParamHandle ref_gparam, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType *result = NULL;
mono_type_array_get_and_resolve_raw (MonoArray* array_raw, int idx, MonoError *error)
{
HANDLE_FUNCTION_ENTER(); /* FIXME callers of mono_type_array_get_and_resolve_raw should use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoArray, array);
MonoType *result = mono_type_array_get_and_resolve (array, idx, error);
HANDLE_FUNCTION_RETURN_VAL (result);
mono_reflection_type_handle_mono_type (MonoReflectionTypeHandle ref, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoType* result = NULL;
MonoMethodSignature *sig;
int count, i;
- mono_error_init (error);
+ error_init (error);
count = MONO_HANDLE_IS_NULL (parameters) ? 0 : mono_array_handle_length (parameters);
ctor_builder_to_signature (MonoImage *image, MonoReflectionCtorBuilderHandle ctor, MonoError *error) {
MonoMethodSignature *sig;
- mono_error_init (error);
+ error_init (error);
sig = parameters_to_signature (image, MONO_HANDLE_NEW_GET (MonoArray, ctor, parameters), error);
return_val_if_nok (error, NULL);
method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilderHandle method, MonoError *error) {
MonoMethodSignature *sig;
- mono_error_init (error);
+ error_init (error);
sig = parameters_to_signature (image, MONO_HANDLE_NEW_GET(MonoArray, method, parameters), error);
return_val_if_nok (error, NULL);
HANDLE_FUNCTION_ENTER ();
MonoMethodSignature *sig = NULL;
- mono_error_init (error);
+ error_init (error);
sig = parameters_to_signature (NULL, MONO_HANDLE_NEW_GET (MonoArray, method, parameters), error);
if (!is_ok (error))
static void
get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_object_class (prop);
if (strcmp (klass->name, "PropertyBuilder") == 0) {
MonoReflectionPropertyBuilder *pb = (MonoReflectionPropertyBuilder *)prop;
static void
get_field_name_and_type (MonoObject *field, char **name, MonoType **type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_object_class (field);
if (strcmp (klass->name, "FieldBuilder") == 0) {
MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)field;
{
MonoTypeEnum simple_type;
- mono_error_init (error);
+ error_init (error);
if ((p-buffer) + 10 >= *buflen) {
char *newbuf;
*buflen *= 2;
{
int len;
- mono_error_init (error);
+ error_init (error);
/* Preallocate a large enough buffer */
if (type->type == MONO_TYPE_VALUETYPE && type->data.klass->enumtype) {
char *buffer, *p;
guint32 buflen, i;
- mono_error_init (error);
+ error_init (error);
if (strcmp (ctor->vtable->klass->name, "MonoCMethod")) {
/* sig is freed later so allocate it in the heap */
reflection_setup_internal_class (MonoReflectionTypeBuilderHandle ref_tb, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
mono_loader_lock ();
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
reflection_setup_internal_class (ref_tb, error);
if (!is_ok (error))
{
MonoMarshalSpec *res;
- mono_error_init (error);
+ error_init (error);
res = image_g_new0 (image, MonoMarshalSpec, 1);
res->native = (MonoMarshalNative)minfo->type;
mono_reflection_marshal_as_attribute_from_marshal_spec (MonoDomain *domain, MonoClass *klass,
MonoMarshalSpec *spec, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoReflectionMarshalAsAttributeHandle minfo = MONO_HANDLE_NEW (MonoReflectionMarshalAsAttribute, mono_object_new_checked (domain, mono_class_get_marshal_as_attribute_class (), error));
if (!is_ok (error))
gboolean dynamic;
int i;
- mono_error_init (error);
+ error_init (error);
/*
* Methods created using a MethodBuilder should have their memory allocated
* inside the image mempool, while dynamic methods should have their memory
ReflectionMethodBuilder rmb;
MonoMethodSignature *sig;
- mono_error_init (error);
+ error_init (error);
mono_loader_lock ();
methodbuilder_to_mono_method_raw (MonoClass *klass, MonoReflectionMethodBuilder* mb_raw, MonoError *error)
{
HANDLE_FUNCTION_ENTER (); /* FIXME change callers of methodbuilder_to_mono_method_raw to use handles */
- mono_error_init (error);
+ error_init (error);
MONO_HANDLE_DCL (MonoReflectionMethodBuilder, mb);
MonoMethod *result = methodbuilder_to_mono_method (klass, mb, error);
HANDLE_FUNCTION_RETURN_VAL (result);
MonoClass *gklass = mono_class_get_generic_class (klass)->container_class;
int i;
- mono_error_init (error);
+ error_init (error);
if (klass->wastypebuilder)
return TRUE;
{
MonoClass *gklass = mono_class_get_generic_class (klass)->container_class;
- mono_error_init (error);
+ error_init (error);
if (!ensure_runtime_vtable (gklass, error))
return FALSE;
MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)mono_class_get_ref_info_raw (klass); /* FIXME use handles */
int i, num, j;
- mono_error_init (error);
+ error_init (error);
if (!image_is_dynamic (klass->image) || (!tb && !mono_class_is_ginst (klass)) || klass->wastypebuilder)
return TRUE;
static MonoMethod*
mono_reflection_method_get_handle (MonoObject *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
MonoClass *klass = mono_object_class (method);
if (is_sr_mono_method (klass)) {
MonoReflectionMethod *sr_method = (MonoReflectionMethod*)method;
int i, j, onum;
MonoReflectionMethod *m;
- mono_error_init (error);
+ error_init (error);
*overrides = NULL;
*num_overrides = 0;
int fcount = tb->num_fields;
mono_class_set_field_count (klass, fcount);
- mono_error_init (error);
+ error_init (error);
if (tb->class_size) {
packing_size = tb->packing_size;
MonoClassPropertyInfo *info;
int i;
- mono_error_init (error);
+ error_init (error);
info = mono_class_get_property_info (klass);
if (!info) {
MonoClassEventInfo *info;
int i;
- mono_error_init (error);
+ error_init (error);
info = mono_class_alloc0 (klass, sizeof (MonoClassEventInfo));
mono_class_set_event_info (klass, info);
MonoReflectionTypeHandle
ves_icall_TypeBuilder_create_runtime_class (MonoReflectionTypeBuilderHandle ref_tb, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
reflection_create_generic_class (ref_tb, error);
mono_error_assert_ok (error);
GSList *l;
int i;
- mono_error_init (error);
+ error_init (error);
if (mono_runtime_is_shutting_down ()) {
mono_error_set_generic_error (error, "System", "InvalidOperationException", "");
MonoMethodSignature *sig;
g_assert (image_is_dynamic (image));
- mono_error_init (error);
+ error_init (error);
sig = (MonoMethodSignature *)g_hash_table_lookup (((MonoDynamicImage*)image)->vararg_aux_hash, GUINT_TO_POINTER (token));
if (sig)
static void
ensure_complete_type (MonoClass *klass, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (image_is_dynamic (klass->image) && !klass->wastypebuilder && mono_class_has_ref_info (klass)) {
MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)mono_class_get_ref_info_raw (klass); /* FIXME use handles */
MonoClass *oklass = obj->vtable->klass;
gpointer result = NULL;
- mono_error_init (error);
+ error_init (error);
if (strcmp (oklass->name, "String") == 0) {
result = mono_string_intern_checked ((MonoString*)obj, error);
void
mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
*overrides = NULL;
*num_overrides = 0;
}
void
ves_icall_DynamicMethod_create_dynamic_method (MonoReflectionDynamicMethodHandle mb, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
}
MonoType*
mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (!ref)
return NULL;
return ref->type;
MonoType*
mono_reflection_type_handle_mono_type (MonoReflectionTypeHandle ref, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (ref))
return NULL;
return MONO_HANDLE_GETVAL (ref, type);
gint32
ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, gboolean create_open_instance, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (obj)) {
mono_error_set_argument_null (error, "obj", "");
return 0;
MonoArrayHandle opt_param_types,
MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
if (MONO_HANDLE_IS_NULL (method)) {
mono_error_set_argument_null (error, "method", "");
return 0;
void
ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, guint32 token, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_dynamic_image_register_token (MONO_HANDLE_GETVAL (mb, dynamic_image), token, obj);
}
void
ves_icall_ModuleBuilder_basic_init (MonoReflectionModuleBuilderHandle moduleb, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
mono_image_module_basic_init (moduleb, error);
}
}
}
+static void
+selector_thread_interrupt (gpointer unused)
+{
+ selector_thread_wakeup ();
+}
+
static gsize WINAPI
selector_thread (gpointer data)
{
states = mono_g_hash_table_new_type (g_direct_hash, g_direct_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_THREAD_POOL, "i/o thread pool states table");
- for (;;) {
+ while (!mono_runtime_is_shutting_down ()) {
gint i, j;
gint res;
+ gboolean interrupted = FALSE;
+
+ if (mono_thread_interruption_checkpoint ())
+ continue;
mono_coop_mutex_lock (&threadpool_io->updates_lock);
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_THREADPOOL, "io threadpool: wai");
- res = threadpool_io->backend.event_wait (wait_callback, states);
+ mono_thread_info_install_interrupt (selector_thread_interrupt, NULL, &interrupted);
+ if (interrupted)
+ continue;
- if (res == -1 || mono_runtime_is_shutting_down ())
+ res = threadpool_io->backend.event_wait (wait_callback, states);
+ if (res == -1)
break;
+
+ mono_thread_info_uninstall_interrupt (&interrupted);
}
mono_g_hash_table_destroy (states);
static void
cleanup (void)
{
- /* we make the assumption along the code that we are
- * cleaning up only if the runtime is shutting down */
- g_assert (mono_runtime_is_shutting_down ());
-
- selector_thread_wakeup ();
- while (io_selector_running)
- mono_thread_info_usleep (1000);
+ // FIXME destroy everything
}
void
#include <mono/utils/atomic.h>
#include <mono/utils/mono-compiler.h>
#include <mono/utils/mono-complex.h>
-#include <mono/utils/mono-lazy-init.h>
#include <mono/utils/mono-logger.h>
#include <mono/utils/mono-logger-internals.h>
#include <mono/utils/mono-proclib.h>
gint64 as_gint64;
} ThreadPoolWorkerCounter;
-typedef MonoInternalThread ThreadPoolWorkerThread;
-
-struct MonoThreadPoolWorker {
+typedef struct {
MonoRefCount ref;
ThreadPoolWorkerCounter counters;
- GPtrArray *threads; // ThreadPoolWorkerThread* []
- MonoCoopMutex threads_lock; /* protect access to working_threads and parked_threads */
+ MonoCoopMutex parked_threads_lock;
gint32 parked_threads_count;
MonoCoopCond parked_threads_cond;
- MonoCoopCond threads_exit_cond;
ThreadPoolWorkItem *work_items; // ThreadPoolWorkItem []
gint32 work_items_count;
gboolean suspended;
gint32 monitor_status;
-};
+} ThreadPoolWorker;
enum {
MONITOR_STATUS_REQUESTED,
MONITOR_STATUS_NOT_RUNNING,
};
+static ThreadPoolWorker worker;
+
#define COUNTER_CHECK(counter) \
do { \
g_assert (counter._.max_working > 0); \
g_assert (counter._.working >= 0); \
} while (0)
-#define COUNTER_ATOMIC(worker,var,block) \
+#define COUNTER_ATOMIC(var,block) \
do { \
ThreadPoolWorkerCounter __old; \
do { \
- g_assert (worker); \
- __old = COUNTER_READ (worker); \
+ __old = COUNTER_READ (); \
(var) = __old; \
{ block; } \
COUNTER_CHECK (var); \
- } while (InterlockedCompareExchange64 (&worker->counters.as_gint64, (var).as_gint64, __old.as_gint64) != __old.as_gint64); \
+ } while (InterlockedCompareExchange64 (&worker.counters.as_gint64, (var).as_gint64, __old.as_gint64) != __old.as_gint64); \
} while (0)
static inline ThreadPoolWorkerCounter
-COUNTER_READ (MonoThreadPoolWorker *worker)
+COUNTER_READ (void)
{
ThreadPoolWorkerCounter counter;
- counter.as_gint64 = InterlockedRead64 (&worker->counters.as_gint64);
+ counter.as_gint64 = InterlockedRead64 (&worker.counters.as_gint64);
return counter;
}
static void
destroy (gpointer data)
{
- MonoThreadPoolWorker *worker;
+ mono_coop_mutex_destroy (&worker.parked_threads_lock);
+ mono_coop_cond_destroy (&worker.parked_threads_cond);
- worker = (MonoThreadPoolWorker*) data;
- g_assert (worker);
+ mono_coop_mutex_destroy (&worker.work_items_lock);
- // FIXME destroy everything
+ mono_coop_mutex_destroy (&worker.worker_creation_lock);
- g_free (worker);
+ mono_coop_mutex_destroy (&worker.heuristic_lock);
+
+ g_free (worker.cpu_usage_state);
}
void
-mono_threadpool_worker_init (MonoThreadPoolWorker **worker)
+mono_threadpool_worker_init (void)
{
- MonoThreadPoolWorker *wk;
ThreadPoolHillClimbing *hc;
const char *threads_per_cpu_env;
gint threads_per_cpu;
gint threads_count;
- g_assert (worker);
-
- wk = *worker = g_new0 (MonoThreadPoolWorker, 1);
+ mono_refcount_init (&worker, destroy);
- mono_refcount_init (wk, destroy);
+ mono_coop_mutex_init (&worker.parked_threads_lock);
+ worker.parked_threads_count = 0;
+ mono_coop_cond_init (&worker.parked_threads_cond);
- wk->threads = g_ptr_array_new ();
- mono_coop_mutex_init (&wk->threads_lock);
- wk->parked_threads_count = 0;
- mono_coop_cond_init (&wk->parked_threads_cond);
- mono_coop_cond_init (&wk->threads_exit_cond);
+ /* worker.work_items_size is inited to 0 */
+ mono_coop_mutex_init (&worker.work_items_lock);
- /* wk->work_items_size is inited to 0 */
- mono_coop_mutex_init (&wk->work_items_lock);
+ worker.worker_creation_current_second = -1;
+ mono_coop_mutex_init (&worker.worker_creation_lock);
- wk->worker_creation_current_second = -1;
- mono_coop_mutex_init (&wk->worker_creation_lock);
-
- wk->heuristic_adjustment_interval = 10;
- mono_coop_mutex_init (&wk->heuristic_lock);
+ worker.heuristic_adjustment_interval = 10;
+ mono_coop_mutex_init (&worker.heuristic_lock);
mono_rand_open ();
- hc = &wk->heuristic_hill_climbing;
+ hc = &worker.heuristic_hill_climbing;
hc->wave_period = HILL_CLIMBING_WAVE_PERIOD;
hc->max_thread_wave_magnitude = HILL_CLIMBING_MAX_WAVE_MAGNITUDE;
threads_count = mono_cpu_count () * threads_per_cpu;
- wk->limit_worker_min = threads_count;
+ worker.limit_worker_min = threads_count;
#if defined (PLATFORM_ANDROID) || defined (HOST_IOS)
- wk->limit_worker_max = CLAMP (threads_count * 100, MIN (threads_count, 200), MAX (threads_count, 200));
+ worker.limit_worker_max = CLAMP (threads_count * 100, MIN (threads_count, 200), MAX (threads_count, 200));
#else
- wk->limit_worker_max = threads_count * 100;
+ worker.limit_worker_max = threads_count * 100;
#endif
- wk->counters._.max_working = wk->limit_worker_min;
+ worker.counters._.max_working = worker.limit_worker_min;
- wk->cpu_usage_state = g_new0 (MonoCpuUsageState, 1);
+ worker.cpu_usage_state = g_new0 (MonoCpuUsageState, 1);
- wk->suspended = FALSE;
+ worker.suspended = FALSE;
- wk->monitor_status = MONITOR_STATUS_NOT_RUNNING;
+ worker.monitor_status = MONITOR_STATUS_NOT_RUNNING;
}
void
-mono_threadpool_worker_cleanup (MonoThreadPoolWorker *worker)
+mono_threadpool_worker_cleanup (void)
{
- MonoInternalThread *current;
-
- /* we make the assumption along the code that we are
- * cleaning up only if the runtime is shutting down */
- g_assert (mono_runtime_is_shutting_down ());
-
- current = mono_thread_internal_current ();
-
- while (worker->monitor_status != MONITOR_STATUS_NOT_RUNNING)
- mono_thread_info_sleep (1, NULL);
-
- mono_coop_mutex_lock (&worker->threads_lock);
-
- /* unpark all worker->parked_threads */
- mono_coop_cond_broadcast (&worker->parked_threads_cond);
-
-#if 0
- for (;;) {
- ThreadPoolWorkerCounter counter;
-
- counter = COUNTER_READ (worker);
- if (counter._.starting + counter._.working + counter._.parked == 0)
- break;
-
- if (counter._.starting + counter._.working + counter._.parked == 1) {
- if (worker->threads->len == 1 && g_ptr_array_index (worker->threads, 0) == current) {
- /* We are waiting on ourselves */
- break;
- }
- }
-
- mono_coop_cond_wait (&worker->threads_exit_cond, &worker->threads_lock);
- }
-#endif
-
- mono_coop_mutex_unlock (&worker->threads_lock);
-
- mono_refcount_dec (worker);
+ mono_refcount_dec (&worker);
}
static void
-work_item_lock (MonoThreadPoolWorker *worker)
+work_item_lock (void)
{
- mono_coop_mutex_lock (&worker->work_items_lock);
+ mono_coop_mutex_lock (&worker.work_items_lock);
}
static void
-work_item_unlock (MonoThreadPoolWorker *worker)
+work_item_unlock (void)
{
- mono_coop_mutex_unlock (&worker->work_items_lock);
+ mono_coop_mutex_unlock (&worker.work_items_lock);
}
static void
-work_item_push (MonoThreadPoolWorker *worker, MonoThreadPoolWorkerCallback callback, gpointer data)
+work_item_push (MonoThreadPoolWorkerCallback callback, gpointer data)
{
ThreadPoolWorkItem work_item;
- g_assert (worker);
g_assert (callback);
work_item.callback = callback;
work_item.data = data;
- work_item_lock (worker);
+ work_item_lock ();
- g_assert (worker->work_items_count <= worker->work_items_size);
+ g_assert (worker.work_items_count <= worker.work_items_size);
- if (G_UNLIKELY (worker->work_items_count == worker->work_items_size)) {
- worker->work_items_size += 64;
- worker->work_items = g_renew (ThreadPoolWorkItem, worker->work_items, worker->work_items_size);
+ if (G_UNLIKELY (worker.work_items_count == worker.work_items_size)) {
+ worker.work_items_size += 64;
+ worker.work_items = g_renew (ThreadPoolWorkItem, worker.work_items, worker.work_items_size);
}
- g_assert (worker->work_items);
+ g_assert (worker.work_items);
- worker->work_items [worker->work_items_count ++] = work_item;
+ worker.work_items [worker.work_items_count ++] = work_item;
- // printf ("[push] worker->work_items = %p, worker->work_items_count = %d, worker->work_items_size = %d\n",
- // worker->work_items, worker->work_items_count, worker->work_items_size);
+ // printf ("[push] worker.work_items = %p, worker.work_items_count = %d, worker.work_items_size = %d\n",
+ // worker.work_items, worker.work_items_count, worker.work_items_size);
- work_item_unlock (worker);
+ work_item_unlock ();
}
static gboolean
-work_item_try_pop (MonoThreadPoolWorker *worker, ThreadPoolWorkItem *work_item)
+work_item_try_pop (ThreadPoolWorkItem *work_item)
{
- g_assert (worker);
g_assert (work_item);
- work_item_lock (worker);
+ work_item_lock ();
- // printf ("[pop] worker->work_items = %p, worker->work_items_count = %d, worker->work_items_size = %d\n",
- // worker->work_items, worker->work_items_count, worker->work_items_size);
+ // printf ("[pop] worker.work_items = %p, worker.work_items_count = %d, worker.work_items_size = %d\n",
+ // worker.work_items, worker.work_items_count, worker.work_items_size);
- if (worker->work_items_count == 0) {
- work_item_unlock (worker);
+ if (worker.work_items_count == 0) {
+ work_item_unlock ();
return FALSE;
}
- *work_item = worker->work_items [-- worker->work_items_count];
+ *work_item = worker.work_items [-- worker.work_items_count];
- if (G_UNLIKELY (worker->work_items_count >= 64 * 3 && worker->work_items_count < worker->work_items_size / 2)) {
- worker->work_items_size -= 64;
- worker->work_items = g_renew (ThreadPoolWorkItem, worker->work_items, worker->work_items_size);
+ if (G_UNLIKELY (worker.work_items_count >= 64 * 3 && worker.work_items_count < worker.work_items_size / 2)) {
+ worker.work_items_size -= 64;
+ worker.work_items = g_renew (ThreadPoolWorkItem, worker.work_items, worker.work_items_size);
}
- work_item_unlock (worker);
+ work_item_unlock ();
return TRUE;
}
static gint32
-work_item_count (MonoThreadPoolWorker *worker)
+work_item_count (void)
{
gint32 count;
- work_item_lock (worker);
- count = worker->work_items_count;
- work_item_unlock (worker);
+ work_item_lock ();
+ count = worker.work_items_count;
+ work_item_unlock ();
return count;
}
-static void worker_request (MonoThreadPoolWorker *worker);
+static void worker_request (void);
void
-mono_threadpool_worker_enqueue (MonoThreadPoolWorker *worker, MonoThreadPoolWorkerCallback callback, gpointer data)
+mono_threadpool_worker_enqueue (MonoThreadPoolWorkerCallback callback, gpointer data)
{
- work_item_push (worker, callback, data);
+ if (!mono_refcount_tryinc (&worker))
+ return;
+
+ work_item_push (callback, data);
+
+ worker_request ();
- worker_request (worker);
+ mono_refcount_dec (&worker);
}
static void
-worker_wait_interrupt (gpointer data)
+worker_wait_interrupt (gpointer unused)
{
- MonoThreadPoolWorker *worker;
+ /* If the runtime is not shutting down, we are not using this mechanism to wake up a unparked thread, and if the
+ * runtime is shutting down, then we need to wake up ALL the threads.
+ * It might be a bit wasteful, but I witnessed shutdown hang where the main thread would abort and then wait for all
+ * background threads to exit (see mono_thread_manage). This would go wrong because not all threadpool threads would
+ * be unparked. It would end up getting unstucked because of the timeout, but that would delay shutdown by 5-60s. */
+ if (!mono_runtime_is_shutting_down ())
+ return;
- worker = (MonoThreadPoolWorker*) data;
- g_assert (worker);
+ if (!mono_refcount_tryinc (&worker))
+ return;
- mono_coop_mutex_lock (&worker->threads_lock);
- mono_coop_cond_signal (&worker->parked_threads_cond);
- mono_coop_mutex_unlock (&worker->threads_lock);
+ mono_coop_mutex_lock (&worker.parked_threads_lock);
+ mono_coop_cond_broadcast (&worker.parked_threads_cond);
+ mono_coop_mutex_unlock (&worker.parked_threads_lock);
- mono_refcount_dec (worker);
+ mono_refcount_dec (&worker);
}
/* return TRUE if timeout, FALSE otherwise (worker unpark or interrupt) */
static gboolean
-worker_park (MonoThreadPoolWorker *worker)
+worker_park (void)
{
gboolean timeout = FALSE;
+ gboolean interrupted = FALSE;
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] worker parking", mono_native_thread_id_get ());
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] worker parking", mono_native_thread_id_get ());
- mono_coop_mutex_lock (&worker->threads_lock);
+ mono_coop_mutex_lock (&worker.parked_threads_lock);
if (!mono_runtime_is_shutting_down ()) {
static gpointer rand_handle = NULL;
MonoInternalThread *thread;
- gboolean interrupted = FALSE;
ThreadPoolWorkerCounter counter;
if (!rand_handle)
thread = mono_thread_internal_current ();
g_assert (thread);
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.working --;
counter._.parked ++;
});
- worker->parked_threads_count += 1;
+ worker.parked_threads_count += 1;
- mono_thread_info_install_interrupt (worker_wait_interrupt, mono_refcount_inc (worker), &interrupted);
- if (interrupted) {
- mono_refcount_dec (worker);
+ mono_thread_info_install_interrupt (worker_wait_interrupt, NULL, &interrupted);
+ if (interrupted)
goto done;
- }
- if (mono_coop_cond_timedwait (&worker->parked_threads_cond, &worker->threads_lock, rand_next (&rand_handle, 5 * 1000, 60 * 1000)) != 0)
+ if (mono_coop_cond_timedwait (&worker.parked_threads_cond, &worker.parked_threads_lock, rand_next (&rand_handle, 5 * 1000, 60 * 1000)) != 0)
timeout = TRUE;
mono_thread_info_uninstall_interrupt (&interrupted);
- if (!interrupted)
- mono_refcount_dec (worker);
done:
- worker->parked_threads_count -= 1;
+ worker.parked_threads_count -= 1;
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.working ++;
counter._.parked --;
});
}
- mono_coop_mutex_unlock (&worker->threads_lock);
+ mono_coop_mutex_unlock (&worker.parked_threads_lock);
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] worker unparking, timeout? %s", mono_native_thread_id_get (), timeout ? "yes" : "no");
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] worker unparking, timeout? %s interrupted? %s",
+ mono_native_thread_id_get (), timeout ? "yes" : "no", interrupted ? "yes" : "no");
return timeout;
}
static gboolean
-worker_try_unpark (MonoThreadPoolWorker *worker)
+worker_try_unpark (void)
{
gboolean res = FALSE;
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try unpark worker", mono_native_thread_id_get ());
- mono_coop_mutex_lock (&worker->threads_lock);
- if (worker->parked_threads_count > 0) {
- mono_coop_cond_signal (&worker->parked_threads_cond);
+ mono_coop_mutex_lock (&worker.parked_threads_lock);
+ if (worker.parked_threads_count > 0) {
+ mono_coop_cond_signal (&worker.parked_threads_cond);
res = TRUE;
}
- mono_coop_mutex_unlock (&worker->threads_lock);
+ mono_coop_mutex_unlock (&worker.parked_threads_lock);
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try unpark worker, success? %s", mono_native_thread_id_get (), res ? "yes" : "no");
}
static gsize WINAPI
-worker_thread (gpointer data)
+worker_thread (gpointer unused)
{
- MonoThreadPoolWorker *worker;
MonoInternalThread *thread;
ThreadPoolWorkerCounter counter;
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] worker starting", mono_native_thread_id_get ());
- worker = (MonoThreadPoolWorker*) data;
- g_assert (worker);
+ if (!mono_refcount_tryinc (&worker))
+ return 0;
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.starting --;
counter._.working ++;
});
thread = mono_thread_internal_current ();
g_assert (thread);
- mono_coop_mutex_lock (&worker->threads_lock);
- g_ptr_array_add (worker->threads, thread);
- mono_coop_mutex_unlock (&worker->threads_lock);
-
while (!mono_runtime_is_shutting_down ()) {
ThreadPoolWorkItem work_item;
if (mono_thread_interruption_checkpoint ())
continue;
- if (!work_item_try_pop (worker, &work_item)) {
+ if (!work_item_try_pop (&work_item)) {
gboolean timeout;
- timeout = worker_park (worker);
+ timeout = worker_park ();
if (timeout)
break;
work_item.callback (work_item.data);
}
- mono_coop_mutex_lock (&worker->threads_lock);
-
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.working --;
});
- g_ptr_array_remove (worker->threads, thread);
-
- mono_coop_cond_signal (&worker->threads_exit_cond);
-
- mono_coop_mutex_unlock (&worker->threads_lock);
-
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] worker finishing", mono_native_thread_id_get ());
- mono_refcount_dec (worker);
+ mono_refcount_dec (&worker);
return 0;
}
static gboolean
-worker_try_create (MonoThreadPoolWorker *worker)
+worker_try_create (void)
{
MonoError error;
MonoInternalThread *thread;
if (mono_runtime_is_shutting_down ())
return FALSE;
- mono_coop_mutex_lock (&worker->worker_creation_lock);
+ mono_coop_mutex_lock (&worker.worker_creation_lock);
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try create worker", mono_native_thread_id_get ());
g_warning ("failed to get 100ns ticks");
} else {
now = current_ticks / (10 * 1000 * 1000);
- if (worker->worker_creation_current_second != now) {
- worker->worker_creation_current_second = now;
- worker->worker_creation_current_count = 0;
+ if (worker.worker_creation_current_second != now) {
+ worker.worker_creation_current_second = now;
+ worker.worker_creation_current_count = 0;
} else {
- g_assert (worker->worker_creation_current_count <= WORKER_CREATION_MAX_PER_SEC);
- if (worker->worker_creation_current_count == WORKER_CREATION_MAX_PER_SEC) {
+ g_assert (worker.worker_creation_current_count <= WORKER_CREATION_MAX_PER_SEC);
+ if (worker.worker_creation_current_count == WORKER_CREATION_MAX_PER_SEC) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try create worker, failed: maximum number of worker created per second reached, current count = %d",
- mono_native_thread_id_get (), worker->worker_creation_current_count);
- mono_coop_mutex_unlock (&worker->worker_creation_lock);
+ mono_native_thread_id_get (), worker.worker_creation_current_count);
+ mono_coop_mutex_unlock (&worker.worker_creation_lock);
return FALSE;
}
}
}
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
if (counter._.working >= counter._.max_working) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try create worker, failed: maximum number of working threads reached",
mono_native_thread_id_get ());
- mono_coop_mutex_unlock (&worker->worker_creation_lock);
+ mono_coop_mutex_unlock (&worker.worker_creation_lock);
return FALSE;
}
counter._.starting ++;
});
- thread = mono_thread_create_internal (mono_get_root_domain (), worker_thread, mono_refcount_inc (worker), TRUE, 0, &error);
+ thread = mono_thread_create_internal (mono_get_root_domain (), worker_thread, NULL, TRUE, 0, &error);
if (!thread) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try create worker, failed: could not create thread due to %s", mono_native_thread_id_get (), mono_error_get_message (&error));
mono_error_cleanup (&error);
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.starting --;
});
- mono_coop_mutex_unlock (&worker->worker_creation_lock);
-
- mono_refcount_dec (worker);
+ mono_coop_mutex_unlock (&worker.worker_creation_lock);
return FALSE;
}
- worker->worker_creation_current_count += 1;
+ worker.worker_creation_current_count += 1;
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] try create worker, created %p, now = %d count = %d",
- mono_native_thread_id_get (), (gpointer) thread->tid, now, worker->worker_creation_current_count);
+ mono_native_thread_id_get (), (gpointer) thread->tid, now, worker.worker_creation_current_count);
- mono_coop_mutex_unlock (&worker->worker_creation_lock);
+ mono_coop_mutex_unlock (&worker.worker_creation_lock);
return TRUE;
}
-static void monitor_ensure_running (MonoThreadPoolWorker *worker);
+static void monitor_ensure_running (void);
static void
-worker_request (MonoThreadPoolWorker *worker)
+worker_request (void)
{
- g_assert (worker);
-
- if (worker->suspended)
+ if (worker.suspended)
return;
- monitor_ensure_running (worker);
+ monitor_ensure_running ();
- if (worker_try_unpark (worker)) {
+ if (worker_try_unpark ()) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] request worker, unparked", mono_native_thread_id_get ());
return;
}
- if (worker_try_create (worker)) {
+ if (worker_try_create ()) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] request worker, created", mono_native_thread_id_get ());
return;
}
}
static gboolean
-monitor_should_keep_running (MonoThreadPoolWorker *worker)
+monitor_should_keep_running (void)
{
static gint64 last_should_keep_running = -1;
- g_assert (worker->monitor_status == MONITOR_STATUS_WAITING_FOR_REQUEST || worker->monitor_status == MONITOR_STATUS_REQUESTED);
+ g_assert (worker.monitor_status == MONITOR_STATUS_WAITING_FOR_REQUEST || worker.monitor_status == MONITOR_STATUS_REQUESTED);
- if (InterlockedExchange (&worker->monitor_status, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST) {
+ if (InterlockedExchange (&worker.monitor_status, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST) {
gboolean should_keep_running = TRUE, force_should_keep_running = FALSE;
if (mono_runtime_is_shutting_down ()) {
should_keep_running = FALSE;
} else {
- if (work_item_count (worker) == 0)
+ if (work_item_count () == 0)
should_keep_running = FALSE;
if (!should_keep_running) {
last_should_keep_running = mono_100ns_ticks ();
} else {
last_should_keep_running = -1;
- if (InterlockedCompareExchange (&worker->monitor_status, MONITOR_STATUS_NOT_RUNNING, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST)
+ if (InterlockedCompareExchange (&worker.monitor_status, MONITOR_STATUS_NOT_RUNNING, MONITOR_STATUS_WAITING_FOR_REQUEST) == MONITOR_STATUS_WAITING_FOR_REQUEST)
return FALSE;
}
}
- g_assert (worker->monitor_status == MONITOR_STATUS_WAITING_FOR_REQUEST || worker->monitor_status == MONITOR_STATUS_REQUESTED);
+ g_assert (worker.monitor_status == MONITOR_STATUS_WAITING_FOR_REQUEST || worker.monitor_status == MONITOR_STATUS_REQUESTED);
return TRUE;
}
static gboolean
-monitor_sufficient_delay_since_last_dequeue (MonoThreadPoolWorker *worker)
+monitor_sufficient_delay_since_last_dequeue (void)
{
gint64 threshold;
- g_assert (worker);
-
- if (worker->cpu_usage < CPU_USAGE_LOW) {
+ if (worker.cpu_usage < CPU_USAGE_LOW) {
threshold = MONITOR_INTERVAL;
} else {
ThreadPoolWorkerCounter counter;
- counter = COUNTER_READ (worker);
+ counter = COUNTER_READ ();
threshold = counter._.max_working * MONITOR_INTERVAL * 2;
}
- return mono_msec_ticks () >= worker->heuristic_last_dequeue + threshold;
+ return mono_msec_ticks () >= worker.heuristic_last_dequeue + threshold;
}
-static void hill_climbing_force_change (MonoThreadPoolWorker *worker, gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition);
+static void hill_climbing_force_change (gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition);
static gsize WINAPI
-monitor_thread (gpointer data)
+monitor_thread (gpointer unused)
{
- MonoThreadPoolWorker *worker;
MonoInternalThread *internal;
guint i;
- worker = (MonoThreadPoolWorker*) data;
- g_assert (worker);
+ if (!mono_refcount_tryinc (&worker))
+ return 0;
internal = mono_thread_internal_current ();
g_assert (internal);
- mono_cpu_usage (worker->cpu_usage_state);
+ mono_cpu_usage (worker.cpu_usage_state);
// printf ("monitor_thread: start\n");
gint32 interval_left = MONITOR_INTERVAL;
gint32 awake = 0; /* number of spurious awakes we tolerate before doing a round of rebalancing */
- g_assert (worker->monitor_status != MONITOR_STATUS_NOT_RUNNING);
+ g_assert (worker.monitor_status != MONITOR_STATUS_NOT_RUNNING);
- // counter = COUNTER_READ (worker);
+ // counter = COUNTER_READ ();
// printf ("monitor_thread: starting = %d working = %d parked = %d max_working = %d\n",
// counter._.starting, counter._.working, counter._.parked, counter._.max_working);
if (mono_runtime_is_shutting_down ())
continue;
- if (worker->suspended)
+ if (worker.suspended)
continue;
- if (work_item_count (worker) == 0)
+ if (work_item_count () == 0)
continue;
- worker->cpu_usage = mono_cpu_usage (worker->cpu_usage_state);
+ worker.cpu_usage = mono_cpu_usage (worker.cpu_usage_state);
- if (!monitor_sufficient_delay_since_last_dequeue (worker))
+ if (!monitor_sufficient_delay_since_last_dequeue ())
continue;
limit_worker_max_reached = FALSE;
- COUNTER_ATOMIC (worker, counter, {
- if (counter._.max_working >= worker->limit_worker_max) {
+ COUNTER_ATOMIC (counter, {
+ if (counter._.max_working >= worker.limit_worker_max) {
limit_worker_max_reached = TRUE;
break;
}
if (limit_worker_max_reached)
continue;
- hill_climbing_force_change (worker, counter._.max_working, TRANSITION_STARVATION);
+ hill_climbing_force_change (counter._.max_working, TRANSITION_STARVATION);
for (i = 0; i < 5; ++i) {
if (mono_runtime_is_shutting_down ())
break;
- if (worker_try_unpark (worker)) {
+ if (worker_try_unpark ()) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] monitor thread, unparked", mono_native_thread_id_get ());
break;
}
- if (worker_try_create (worker)) {
+ if (worker_try_create ()) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] monitor thread, created", mono_native_thread_id_get ());
break;
}
}
- } while (monitor_should_keep_running (worker));
+ } while (monitor_should_keep_running ());
// printf ("monitor_thread: stop\n");
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] monitor thread, finished", mono_native_thread_id_get ());
+ mono_refcount_dec (&worker);
return 0;
}
static void
-monitor_ensure_running (MonoThreadPoolWorker *worker)
+monitor_ensure_running (void)
{
MonoError error;
for (;;) {
- switch (worker->monitor_status) {
+ switch (worker.monitor_status) {
case MONITOR_STATUS_REQUESTED:
// printf ("monitor_thread: requested\n");
return;
case MONITOR_STATUS_WAITING_FOR_REQUEST:
// printf ("monitor_thread: waiting for request\n");
- InterlockedCompareExchange (&worker->monitor_status, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_WAITING_FOR_REQUEST);
+ InterlockedCompareExchange (&worker.monitor_status, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_WAITING_FOR_REQUEST);
break;
case MONITOR_STATUS_NOT_RUNNING:
// printf ("monitor_thread: not running\n");
if (mono_runtime_is_shutting_down ())
return;
- if (InterlockedCompareExchange (&worker->monitor_status, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_NOT_RUNNING) == MONITOR_STATUS_NOT_RUNNING) {
+ if (InterlockedCompareExchange (&worker.monitor_status, MONITOR_STATUS_REQUESTED, MONITOR_STATUS_NOT_RUNNING) == MONITOR_STATUS_NOT_RUNNING) {
// printf ("monitor_thread: creating\n");
- if (!mono_thread_create_internal (mono_get_root_domain (), monitor_thread, worker, TRUE, SMALL_STACK, &error)) {
+ if (!mono_thread_create_internal (mono_get_root_domain (), monitor_thread, NULL, TRUE, SMALL_STACK, &error)) {
// printf ("monitor_thread: creating failed\n");
- worker->monitor_status = MONITOR_STATUS_NOT_RUNNING;
+ worker.monitor_status = MONITOR_STATUS_NOT_RUNNING;
mono_error_cleanup (&error);
+ mono_refcount_dec (&worker);
}
return;
}
}
static void
-hill_climbing_change_thread_count (MonoThreadPoolWorker *worker, gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition)
+hill_climbing_change_thread_count (gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition)
{
ThreadPoolHillClimbing *hc;
- g_assert (worker);
-
- hc = &worker->heuristic_hill_climbing;
+ hc = &worker.heuristic_hill_climbing;
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_THREADPOOL, "[%p] hill climbing, change max number of threads %d", mono_native_thread_id_get (), new_thread_count);
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_THREADPOOL, "[%p] hill climbing, change max number of threads %d", mono_native_thread_id_get (), new_thread_count);
hc->last_thread_count = new_thread_count;
hc->current_sample_interval = rand_next (&hc->random_interval_generator, hc->sample_interval_low, hc->sample_interval_high);
}
static void
-hill_climbing_force_change (MonoThreadPoolWorker *worker, gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition)
+hill_climbing_force_change (gint16 new_thread_count, ThreadPoolHeuristicStateTransition transition)
{
ThreadPoolHillClimbing *hc;
- g_assert (worker);
-
- hc = &worker->heuristic_hill_climbing;
+ hc = &worker.heuristic_hill_climbing;
if (new_thread_count != hc->last_thread_count) {
hc->current_control_setting += new_thread_count - hc->last_thread_count;
- hill_climbing_change_thread_count (worker, new_thread_count, transition);
+ hill_climbing_change_thread_count (new_thread_count, transition);
}
}
static double_complex
-hill_climbing_get_wave_component (MonoThreadPoolWorker *worker, gdouble *samples, guint sample_count, gdouble period)
+hill_climbing_get_wave_component (gdouble *samples, guint sample_count, gdouble period)
{
ThreadPoolHillClimbing *hc;
gdouble w, cosine, sine, coeff, q0, q1, q2;
guint i;
- g_assert (worker);
g_assert (sample_count >= period);
g_assert (period >= 2);
- hc = &worker->heuristic_hill_climbing;
+ hc = &worker.heuristic_hill_climbing;
w = 2.0 * M_PI / period;
cosine = cos (w);
}
static gint16
-hill_climbing_update (MonoThreadPoolWorker *worker, gint16 current_thread_count, guint32 sample_duration, gint32 completions, gint64 *adjustment_interval)
+hill_climbing_update (gint16 current_thread_count, guint32 sample_duration, gint32 completions, gint64 *adjustment_interval)
{
ThreadPoolHillClimbing *hc;
ThreadPoolHeuristicStateTransition transition;
double_complex throughput_wave_component;
double_complex ratio;
- g_assert (worker);
g_assert (adjustment_interval);
- hc = &worker->heuristic_hill_climbing;
+ hc = &worker.heuristic_hill_climbing;
/* If someone changed the thread count without telling us, update our records accordingly. */
if (current_thread_count != hc->last_thread_count)
- hill_climbing_force_change (worker, current_thread_count, TRANSITION_INITIALIZING);
+ hill_climbing_force_change (current_thread_count, TRANSITION_INITIALIZING);
/* Update the cumulative stats for this thread count */
hc->elapsed_since_last_change += sample_duration;
* range we're targeting, which will not be filtered by the frequency-domain translation. */
if (hc->total_samples > 0 && ((current_thread_count - 1.0) / completions) >= hc->max_sample_error) {
/* Not accurate enough yet. Let's accumulate the data so
- * far, and tell the MonoThreadPoolWorker to collect a little more. */
+ * far, and tell the ThreadPoolWorker to collect a little more. */
hc->accumulated_sample_duration = sample_duration;
hc->accumulated_completion_count = completions;
*adjustment_interval = 10;
/* Get the the three different frequency components of the throughput (scaled by average
* throughput). Our "error" estimate (the amount of noise that might be present in the
* frequency band we're really interested in) is the average of the adjacent bands. */
- throughput_wave_component = mono_double_complex_scalar_div (hill_climbing_get_wave_component (worker, hc->samples, sample_count, hc->wave_period), average_throughput);
- throughput_error_estimate = cabs (mono_double_complex_scalar_div (hill_climbing_get_wave_component (worker, hc->samples, sample_count, adjacent_period_1), average_throughput));
+ throughput_wave_component = mono_double_complex_scalar_div (hill_climbing_get_wave_component (hc->samples, sample_count, hc->wave_period), average_throughput);
+ throughput_error_estimate = cabs (mono_double_complex_scalar_div (hill_climbing_get_wave_component (hc->samples, sample_count, adjacent_period_1), average_throughput));
if (adjacent_period_2 <= sample_count) {
throughput_error_estimate = MAX (throughput_error_estimate, cabs (mono_double_complex_scalar_div (hill_climbing_get_wave_component (
- worker, hc->samples, sample_count, adjacent_period_2), average_throughput)));
+ hc->samples, sample_count, adjacent_period_2), average_throughput)));
}
/* Do the same for the thread counts, so we have something to compare to. We don't
* measure thread count noise, because there is none; these are exact measurements. */
- thread_wave_component = mono_double_complex_scalar_div (hill_climbing_get_wave_component (worker, hc->thread_counts, sample_count, hc->wave_period), average_thread_count);
+ thread_wave_component = mono_double_complex_scalar_div (hill_climbing_get_wave_component (hc->thread_counts, sample_count, hc->wave_period), average_thread_count);
/* Update our moving average of the throughput noise. We'll use this
* later as feedback to determine the new size of the thread wave. */
move = MIN (move, hc->max_change_per_sample);
/* If the result was positive, and CPU is > 95%, refuse the move. */
- if (move > 0.0 && worker->cpu_usage > CPU_USAGE_HIGH)
+ if (move > 0.0 && worker.cpu_usage > CPU_USAGE_HIGH)
move = 0.0;
/* Apply the move to our control setting. */
* hc->target_signal_to_noise_ratio * hc->thread_magnitude_multiplier * 2.0));
new_thread_wave_magnitude = CLAMP (new_thread_wave_magnitude, 1, hc->max_thread_wave_magnitude);
- /* Make sure our control setting is within the MonoThreadPoolWorker's limits. */
- hc->current_control_setting = CLAMP (hc->current_control_setting, worker->limit_worker_min, worker->limit_worker_max - new_thread_wave_magnitude);
+ /* Make sure our control setting is within the ThreadPoolWorker's limits. */
+ hc->current_control_setting = CLAMP (hc->current_control_setting, worker.limit_worker_min, worker.limit_worker_max - new_thread_wave_magnitude);
/* Calculate the new thread count (control setting + square wave). */
new_thread_count = (gint)(hc->current_control_setting + new_thread_wave_magnitude * ((hc->total_samples / (hc->wave_period / 2)) % 2));
- /* Make sure the new thread count doesn't exceed the MonoThreadPoolWorker's limits. */
- new_thread_count = CLAMP (new_thread_count, worker->limit_worker_min, worker->limit_worker_max);
+ /* Make sure the new thread count doesn't exceed the ThreadPoolWorker's limits. */
+ new_thread_count = CLAMP (new_thread_count, worker.limit_worker_min, worker.limit_worker_max);
if (new_thread_count != current_thread_count)
- hill_climbing_change_thread_count (worker, new_thread_count, transition);
+ hill_climbing_change_thread_count (new_thread_count, transition);
- if (creal (ratio) < 0.0 && new_thread_count == worker->limit_worker_min)
+ if (creal (ratio) < 0.0 && new_thread_count == worker.limit_worker_min)
*adjustment_interval = (gint)(0.5 + hc->current_sample_interval * (10.0 * MAX (-1.0 * creal (ratio), 1.0)));
else
*adjustment_interval = hc->current_sample_interval;
}
static gboolean
-heuristic_should_adjust (MonoThreadPoolWorker *worker)
+heuristic_should_adjust (void)
{
- if (worker->heuristic_last_dequeue > worker->heuristic_last_adjustment + worker->heuristic_adjustment_interval) {
+ if (worker.heuristic_last_dequeue > worker.heuristic_last_adjustment + worker.heuristic_adjustment_interval) {
ThreadPoolWorkerCounter counter;
- counter = COUNTER_READ (worker);
+ counter = COUNTER_READ ();
if (counter._.working <= counter._.max_working)
return TRUE;
}
}
static void
-heuristic_adjust (MonoThreadPoolWorker *worker)
+heuristic_adjust (void)
{
- if (mono_coop_mutex_trylock (&worker->heuristic_lock) == 0) {
- gint32 completions = InterlockedExchange (&worker->heuristic_completions, 0);
+ if (mono_coop_mutex_trylock (&worker.heuristic_lock) == 0) {
+ gint32 completions = InterlockedExchange (&worker.heuristic_completions, 0);
gint64 sample_end = mono_msec_ticks ();
- gint64 sample_duration = sample_end - worker->heuristic_sample_start;
+ gint64 sample_duration = sample_end - worker.heuristic_sample_start;
- if (sample_duration >= worker->heuristic_adjustment_interval / 2) {
+ if (sample_duration >= worker.heuristic_adjustment_interval / 2) {
ThreadPoolWorkerCounter counter;
gint16 new_thread_count;
- counter = COUNTER_READ (worker);
- new_thread_count = hill_climbing_update (worker, counter._.max_working, sample_duration, completions, &worker->heuristic_adjustment_interval);
+ counter = COUNTER_READ ();
+ new_thread_count = hill_climbing_update (counter._.max_working, sample_duration, completions, &worker.heuristic_adjustment_interval);
- COUNTER_ATOMIC (worker, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.max_working = new_thread_count;
});
if (new_thread_count > counter._.max_working)
- worker_request (worker);
+ worker_request ();
- worker->heuristic_sample_start = sample_end;
- worker->heuristic_last_adjustment = mono_msec_ticks ();
+ worker.heuristic_sample_start = sample_end;
+ worker.heuristic_last_adjustment = mono_msec_ticks ();
}
- mono_coop_mutex_unlock (&worker->heuristic_lock);
+ mono_coop_mutex_unlock (&worker.heuristic_lock);
}
}
static void
-heuristic_notify_work_completed (MonoThreadPoolWorker *worker)
+heuristic_notify_work_completed (void)
{
- g_assert (worker);
-
- InterlockedIncrement (&worker->heuristic_completions);
- worker->heuristic_last_dequeue = mono_msec_ticks ();
+ InterlockedIncrement (&worker.heuristic_completions);
+ worker.heuristic_last_dequeue = mono_msec_ticks ();
- if (heuristic_should_adjust (worker))
- heuristic_adjust (worker);
+ if (heuristic_should_adjust ())
+ heuristic_adjust ();
}
gboolean
-mono_threadpool_worker_notify_completed (MonoThreadPoolWorker *worker)
+mono_threadpool_worker_notify_completed (void)
{
ThreadPoolWorkerCounter counter;
- heuristic_notify_work_completed (worker);
+ heuristic_notify_work_completed ();
- counter = COUNTER_READ (worker);
+ counter = COUNTER_READ ();
return counter._.working <= counter._.max_working;
}
gint32
-mono_threadpool_worker_get_min (MonoThreadPoolWorker *worker)
+mono_threadpool_worker_get_min (void)
{
- return worker->limit_worker_min;
+ gint32 ret;
+
+ if (!mono_refcount_tryinc (&worker))
+ return 0;
+
+ ret = worker.limit_worker_min;
+
+ mono_refcount_dec (&worker);
+ return ret;
}
gboolean
-mono_threadpool_worker_set_min (MonoThreadPoolWorker *worker, gint32 value)
+mono_threadpool_worker_set_min (gint32 value)
{
- if (value <= 0 || value > worker->limit_worker_max)
+ if (value <= 0 || value > worker.limit_worker_max)
+ return FALSE;
+
+ if (!mono_refcount_tryinc (&worker))
return FALSE;
- worker->limit_worker_min = value;
+ worker.limit_worker_min = value;
+
+ mono_refcount_dec (&worker);
return TRUE;
}
gint32
-mono_threadpool_worker_get_max (MonoThreadPoolWorker *worker)
+mono_threadpool_worker_get_max (void)
{
- return worker->limit_worker_max;
+ gint32 ret;
+
+ if (!mono_refcount_tryinc (&worker))
+ return 0;
+
+ ret = worker.limit_worker_max;
+
+ mono_refcount_dec (&worker);
+ return ret;
}
gboolean
-mono_threadpool_worker_set_max (MonoThreadPoolWorker *worker, gint32 value)
+mono_threadpool_worker_set_max (gint32 value)
{
- gint32 cpu_count = mono_cpu_count ();
+ gint32 cpu_count;
+
+ cpu_count = mono_cpu_count ();
+ if (value < worker.limit_worker_min || value < cpu_count)
+ return FALSE;
- if (value < worker->limit_worker_min || value < cpu_count)
+ if (!mono_refcount_tryinc (&worker))
return FALSE;
- worker->limit_worker_max = value;
+ worker.limit_worker_max = value;
+
+ mono_refcount_dec (&worker);
return TRUE;
}
void
-mono_threadpool_worker_set_suspended (MonoThreadPoolWorker *worker, gboolean suspended)
+mono_threadpool_worker_set_suspended (gboolean suspended)
{
- worker->suspended = suspended;
+ if (!mono_refcount_tryinc (&worker))
+ return;
+
+ worker.suspended = suspended;
if (!suspended)
- worker_request (worker);
+ worker_request ();
+
+ mono_refcount_dec (&worker);
}
#ifndef _MONO_METADATA_THREADPOOL_WORKER_H
#define _MONO_METADATA_THREADPOOL_WORKER_H
-typedef struct MonoThreadPoolWorker MonoThreadPoolWorker;
+#include <glib.h>
typedef void (*MonoThreadPoolWorkerCallback)(gpointer);
void
-mono_threadpool_worker_init (MonoThreadPoolWorker **worker);
+mono_threadpool_worker_init (void);
void
-mono_threadpool_worker_cleanup (MonoThreadPoolWorker *worker);
+mono_threadpool_worker_cleanup (void);
void
-mono_threadpool_worker_enqueue (MonoThreadPoolWorker *worker, MonoThreadPoolWorkerCallback callback, gpointer data);
+mono_threadpool_worker_enqueue (MonoThreadPoolWorkerCallback callback, gpointer data);
gboolean
-mono_threadpool_worker_notify_completed (MonoThreadPoolWorker *worker);
+mono_threadpool_worker_notify_completed (void);
gint32
-mono_threadpool_worker_get_min (MonoThreadPoolWorker *worker);
+mono_threadpool_worker_get_min (void);
gboolean
-mono_threadpool_worker_set_min (MonoThreadPoolWorker *worker, gint32 value);
+mono_threadpool_worker_set_min (gint32 value);
gint32
-mono_threadpool_worker_get_max (MonoThreadPoolWorker *worker);
+mono_threadpool_worker_get_max (void);
gboolean
-mono_threadpool_worker_set_max (MonoThreadPoolWorker *worker, gint32 value);
+mono_threadpool_worker_set_max (gint32 value);
void
-mono_threadpool_worker_set_suspended (MonoThreadPoolWorker *worker, gboolean suspended);
+mono_threadpool_worker_set_suspended (gboolean suspended);
#endif /* _MONO_METADATA_THREADPOOL_WORKER_H */
/* Number of currently executing jobs */
gint32 threadpool_jobs;
/* Signalled when threadpool_jobs + outstanding_request is 0 */
- /* Protected by threadpool->domains_lock */
+ /* Protected by threadpool.domains_lock */
MonoCoopCond cleanup_cond;
} ThreadPoolDomain;
GPtrArray *domains; // ThreadPoolDomain* []
MonoCoopMutex domains_lock;
- GPtrArray *threads; // MonoInternalThread* []
- MonoCoopMutex threads_lock;
- MonoCoopCond threads_exit_cond;
-
ThreadPoolCounter counters;
gint32 limit_io_min;
gint32 limit_io_max;
-
- MonoThreadPoolWorker *worker;
} ThreadPool;
static mono_lazy_init_t status = MONO_LAZY_INIT_STATUS_NOT_INITIALIZED;
-static ThreadPool* threadpool;
+static ThreadPool threadpool;
-#define COUNTER_ATOMIC(threadpool,var,block) \
+#define COUNTER_ATOMIC(var,block) \
do { \
ThreadPoolCounter __old; \
do { \
- g_assert (threadpool); \
- (var) = __old = COUNTER_READ (threadpool); \
+ (var) = __old = COUNTER_READ (); \
{ block; } \
if (!(counter._.starting >= 0)) \
g_error ("%s: counter._.starting = %d, but should be >= 0", __func__, counter._.starting); \
if (!(counter._.working >= 0)) \
g_error ("%s: counter._.working = %d, but should be >= 0", __func__, counter._.working); \
- } while (InterlockedCompareExchange (&threadpool->counters.as_gint32, (var).as_gint32, __old.as_gint32) != __old.as_gint32); \
+ } while (InterlockedCompareExchange (&threadpool.counters.as_gint32, (var).as_gint32, __old.as_gint32) != __old.as_gint32); \
} while (0)
static inline ThreadPoolCounter
-COUNTER_READ (ThreadPool *threadpool)
+COUNTER_READ (void)
{
ThreadPoolCounter counter;
- counter.as_gint32 = InterlockedRead (&threadpool->counters.as_gint32);
+ counter.as_gint32 = InterlockedRead (&threadpool.counters.as_gint32);
return counter;
}
static inline void
domains_lock (void)
{
- mono_coop_mutex_lock (&threadpool->domains_lock);
+ mono_coop_mutex_lock (&threadpool.domains_lock);
}
static inline void
domains_unlock (void)
{
- mono_coop_mutex_unlock (&threadpool->domains_lock);
+ mono_coop_mutex_unlock (&threadpool.domains_lock);
}
static void
destroy (gpointer unused)
{
- g_ptr_array_free (threadpool->domains, TRUE);
- mono_coop_mutex_destroy (&threadpool->domains_lock);
-
- g_ptr_array_free (threadpool->threads, TRUE);
- mono_coop_mutex_destroy (&threadpool->threads_lock);
- mono_coop_cond_destroy (&threadpool->threads_exit_cond);
-
- /* We cannot free the threadpool, because there is a race
- * on shutdown where a managed thread may request a new
- * threadpool thread, but we already destroyed the
- * threadpool. So to avoid a use-after-free, we simply do
- * not free the threadpool, as we won't be able to access
- * the threadpool anyway because the ref count will be 0 */
- // g_free (threadpool);
+ g_ptr_array_free (threadpool.domains, TRUE);
+ mono_coop_mutex_destroy (&threadpool.domains_lock);
}
static void
initialize (void)
{
- g_assert (!threadpool);
- threadpool = g_new0 (ThreadPool, 1);
- g_assert (threadpool);
-
g_assert (sizeof (ThreadPoolCounter) == sizeof (gint32));
- mono_refcount_init (threadpool, destroy);
+ mono_refcount_init (&threadpool, destroy);
- threadpool->domains = g_ptr_array_new ();
- mono_coop_mutex_init (&threadpool->domains_lock);
+ threadpool.domains = g_ptr_array_new ();
+ mono_coop_mutex_init (&threadpool.domains_lock);
- threadpool->threads = g_ptr_array_new ();
- mono_coop_mutex_init (&threadpool->threads_lock);
- mono_coop_cond_init (&threadpool->threads_exit_cond);
+ threadpool.limit_io_min = mono_cpu_count ();
+ threadpool.limit_io_max = CLAMP (threadpool.limit_io_min * 100, MIN (threadpool.limit_io_min, 200), MAX (threadpool.limit_io_min, 200));
- threadpool->limit_io_min = mono_cpu_count ();
- threadpool->limit_io_max = CLAMP (threadpool->limit_io_min * 100, MIN (threadpool->limit_io_min, 200), MAX (threadpool->limit_io_min, 200));
-
- mono_threadpool_worker_init (&threadpool->worker);
+ mono_threadpool_worker_init ();
}
static void
cleanup (void)
{
- guint i;
- MonoInternalThread *current;
-
- /* we make the assumption along the code that we are
- * cleaning up only if the runtime is shutting down */
- g_assert (mono_runtime_is_shutting_down ());
-
- current = mono_thread_internal_current ();
-
- mono_coop_mutex_lock (&threadpool->threads_lock);
-
- /* stop all threadpool->threads */
- for (i = 0; i < threadpool->threads->len; ++i) {
- MonoInternalThread *thread = (MonoInternalThread*) g_ptr_array_index (threadpool->threads, i);
- if (thread != current)
- mono_thread_internal_abort (thread);
- }
-
- mono_coop_mutex_unlock (&threadpool->threads_lock);
-
-#if 0
- /* give a chance to the other threads to exit */
- mono_thread_info_yield ();
-
- mono_coop_mutex_lock (&threadpool->threads_lock);
-
- for (;;) {
- if (threadpool->threads->len == 0)
- break;
-
- if (threadpool->threads->len == 1 && g_ptr_array_index (threadpool->threads, 0) == current) {
- /* We are waiting on ourselves */
- break;
- }
-
- mono_coop_cond_wait (&threadpool->threads_exit_cond, &threadpool->threads_lock);
- }
-
- mono_coop_mutex_unlock (&threadpool->threads_lock);
-#endif
+ mono_threadpool_worker_cleanup ();
- mono_threadpool_worker_cleanup (threadpool->worker);
-
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
}
gboolean
MonoBoolean f;
gpointer args [2];
- mono_error_init (error);
+ error_init (error);
g_assert (work_item);
if (!threadpool_class)
return TRUE;
}
-/* LOCKING: domains_lock must be held */
-static void
-tpdomain_add (ThreadPoolDomain *tpdomain)
+/* LOCKING: domains_lock must be held. */
+static ThreadPoolDomain *
+tpdomain_create (MonoDomain *domain)
{
- guint i, len;
+ ThreadPoolDomain *tpdomain;
- g_assert (tpdomain);
+ tpdomain = g_new0 (ThreadPoolDomain, 1);
+ tpdomain->domain = domain;
+ mono_coop_cond_init (&tpdomain->cleanup_cond);
- len = threadpool->domains->len;
- for (i = 0; i < len; ++i) {
- if (g_ptr_array_index (threadpool->domains, i) == tpdomain)
- break;
- }
+ g_ptr_array_add (threadpool.domains, tpdomain);
- if (i == len)
- g_ptr_array_add (threadpool->domains, tpdomain);
+ return tpdomain;
}
/* LOCKING: domains_lock must be held. */
tpdomain_remove (ThreadPoolDomain *tpdomain)
{
g_assert (tpdomain);
- return g_ptr_array_remove (threadpool->domains, tpdomain);
+ return g_ptr_array_remove (threadpool.domains, tpdomain);
}
/* LOCKING: domains_lock must be held */
static ThreadPoolDomain *
-tpdomain_get (MonoDomain *domain, gboolean create)
+tpdomain_get (MonoDomain *domain)
{
- guint i;
- ThreadPoolDomain *tpdomain;
+ gint i;
g_assert (domain);
- for (i = 0; i < threadpool->domains->len; ++i) {
+ for (i = 0; i < threadpool.domains->len; ++i) {
ThreadPoolDomain *tpdomain;
- tpdomain = (ThreadPoolDomain *)g_ptr_array_index (threadpool->domains, i);
+ tpdomain = (ThreadPoolDomain *)g_ptr_array_index (threadpool.domains, i);
if (tpdomain->domain == domain)
return tpdomain;
}
- if (!create)
- return NULL;
-
- tpdomain = g_new0 (ThreadPoolDomain, 1);
- tpdomain->domain = domain;
- mono_coop_cond_init (&tpdomain->cleanup_cond);
-
- tpdomain_add (tpdomain);
-
- return tpdomain;
+ return NULL;
}
static void
tpdomain_get_next (ThreadPoolDomain *current)
{
ThreadPoolDomain *tpdomain = NULL;
- guint len;
+ gint len;
- len = threadpool->domains->len;
+ len = threadpool.domains->len;
if (len > 0) {
- guint i, current_idx = -1;
+ gint i, current_idx = -1;
if (current) {
for (i = 0; i < len; ++i) {
- if (current == g_ptr_array_index (threadpool->domains, i)) {
+ if (current == g_ptr_array_index (threadpool.domains, i)) {
current_idx = i;
break;
}
}
- g_assert (current_idx != (guint)-1);
}
for (i = current_idx + 1; i < len + current_idx + 1; ++i) {
- ThreadPoolDomain *tmp = (ThreadPoolDomain *)g_ptr_array_index (threadpool->domains, i % len);
+ ThreadPoolDomain *tmp = (ThreadPoolDomain *)g_ptr_array_index (threadpool.domains, i % len);
if (tmp->outstanding_request > 0) {
tpdomain = tmp;
break;
try_invoke_perform_wait_callback (MonoObject** exc, MonoError *error)
{
HANDLE_FUNCTION_ENTER ();
- mono_error_init (error);
+ error_init (error);
MonoObject *res = mono_runtime_try_invoke (mono_defaults.threadpool_perform_wait_callback_method, NULL, NULL, exc, error);
HANDLE_FUNCTION_RETURN_VAL (res);
}
ThreadPoolCounter counter;
MonoInternalThread *thread;
+ if (!mono_refcount_tryinc (&threadpool))
+ return;
+
thread = mono_thread_internal_current ();
- COUNTER_ATOMIC (threadpool, counter, {
+ COUNTER_ATOMIC (counter, {
if (!(counter._.working < 32767 /* G_MAXINT16 */))
g_error ("%s: counter._.working = %d, but should be < 32767", __func__, counter._.working);
});
if (mono_runtime_is_shutting_down ()) {
- COUNTER_ATOMIC (threadpool, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.working --;
});
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
return;
}
- mono_coop_mutex_lock (&threadpool->threads_lock);
- g_ptr_array_add (threadpool->threads, thread);
- mono_coop_mutex_unlock (&threadpool->threads_lock);
-
/*
* This is needed so there is always an lmf frame in the runtime invoke call below,
* so ThreadAbortExceptions are caught even if the thread is in native code.
while (!mono_runtime_is_shutting_down ()) {
gboolean retire = FALSE;
- if ((thread->state & (ThreadState_AbortRequested | ThreadState_SuspendRequested)) != 0) {
+ if (thread->state & (ThreadState_AbortRequested | ThreadState_SuspendRequested)) {
domains_unlock ();
- mono_thread_interruption_checkpoint ();
+ if (mono_thread_interruption_checkpoint ()) {
+ domains_lock ();
+ continue;
+ }
domains_lock ();
}
domains_unlock ();
- mono_coop_mutex_lock (&threadpool->threads_lock);
-
- g_ptr_array_remove_fast (threadpool->threads, thread);
-
- mono_coop_cond_signal (&threadpool->threads_exit_cond);
-
- mono_coop_mutex_unlock (&threadpool->threads_lock);
-
- COUNTER_ATOMIC (threadpool, counter, {
+ COUNTER_ATOMIC (counter, {
counter._.working --;
});
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
}
void
if (!async_call_klass)
async_call_klass = mono_class_load_from_name (mono_defaults.corlib, "System", "MonoAsyncCall");
- mono_lazy_initialize (&status, initialize);
-
- mono_error_init (error);
+ error_init (error);
message = mono_method_call_message_new (method, params, mono_get_delegate_invoke (method->klass), (params != NULL) ? (&async_callback) : NULL, (params != NULL) ? (&state) : NULL, error);
return_val_if_nok (error, NULL);
{
MonoAsyncCall *ac;
- mono_error_init (error);
+ error_init (error);
g_assert (exc);
g_assert (out_args);
if (!mono_lazy_is_initialized (&status))
return TRUE;
- mono_refcount_inc (threadpool);
+ mono_refcount_inc (&threadpool);
domains_lock ();
- tpdomain = tpdomain_get (domain, FALSE);
+ tpdomain = tpdomain_get (domain);
if (!tpdomain) {
domains_unlock ();
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
return TRUE;
}
while (tpdomain->outstanding_request + tpdomain->threadpool_jobs > 0) {
if (timeout == -1) {
- mono_coop_cond_wait (&tpdomain->cleanup_cond, &threadpool->domains_lock);
+ mono_coop_cond_wait (&tpdomain->cleanup_cond, &threadpool.domains_lock);
} else {
gint64 now;
gint res;
break;
}
- res = mono_coop_cond_timedwait (&tpdomain->cleanup_cond, &threadpool->domains_lock, end - now);
+ res = mono_coop_cond_timedwait (&tpdomain->cleanup_cond, &threadpool.domains_lock, end - now);
if (res != 0) {
ret = FALSE;
break;
mono_coop_cond_destroy (&tpdomain->cleanup_cond);
tpdomain_free (tpdomain);
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
return ret;
}
void
mono_threadpool_suspend (void)
{
- if (threadpool)
- mono_threadpool_worker_set_suspended (threadpool->worker, TRUE);
+ if (mono_lazy_is_initialized (&status))
+ mono_threadpool_worker_set_suspended (TRUE);
}
void
mono_threadpool_resume (void)
{
- if (threadpool)
- mono_threadpool_worker_set_suspended (threadpool->worker, FALSE);
+ if (mono_lazy_is_initialized (&status))
+ mono_threadpool_worker_set_suspended (FALSE);
}
void
if (!worker_threads || !completion_port_threads)
return;
- mono_lazy_initialize (&status, initialize);
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool)) {
+ *worker_threads = 0;
+ *completion_port_threads = 0;
+ return;
+ }
- counter = COUNTER_READ (threadpool);
+ counter = COUNTER_READ ();
- *worker_threads = MAX (0, mono_threadpool_worker_get_max (threadpool->worker) - counter._.working);
- *completion_port_threads = threadpool->limit_io_max;
+ *worker_threads = MAX (0, mono_threadpool_worker_get_max () - counter._.working);
+ *completion_port_threads = threadpool.limit_io_max;
+
+ mono_refcount_dec (&threadpool);
}
void
if (!worker_threads || !completion_port_threads)
return;
- mono_lazy_initialize (&status, initialize);
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool)) {
+ *worker_threads = 0;
+ *completion_port_threads = 0;
+ return;
+ }
+
+ *worker_threads = mono_threadpool_worker_get_min ();
+ *completion_port_threads = threadpool.limit_io_min;
- *worker_threads = mono_threadpool_worker_get_min (threadpool->worker);
- *completion_port_threads = threadpool->limit_io_min;
+ mono_refcount_dec (&threadpool);
}
void
if (!worker_threads || !completion_port_threads)
return;
- mono_lazy_initialize (&status, initialize);
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool)) {
+ *worker_threads = 0;
+ *completion_port_threads = 0;
+ return;
+ }
+
+ *worker_threads = mono_threadpool_worker_get_max ();
+ *completion_port_threads = threadpool.limit_io_max;
- *worker_threads = mono_threadpool_worker_get_max (threadpool->worker);
- *completion_port_threads = threadpool->limit_io_max;
+ mono_refcount_dec (&threadpool);
}
MonoBoolean
ves_icall_System_Threading_ThreadPool_SetMinThreadsNative (gint32 worker_threads, gint32 completion_port_threads)
{
- mono_lazy_initialize (&status, initialize);
+ if (completion_port_threads <= 0 || completion_port_threads > threadpool.limit_io_max)
+ return FALSE;
- if (completion_port_threads <= 0 || completion_port_threads > threadpool->limit_io_max)
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool))
return FALSE;
- if (!mono_threadpool_worker_set_min (threadpool->worker, worker_threads))
+ if (!mono_threadpool_worker_set_min (worker_threads)) {
+ mono_refcount_dec (&threadpool);
return FALSE;
+ }
- threadpool->limit_io_min = completion_port_threads;
+ threadpool.limit_io_min = completion_port_threads;
+ mono_refcount_dec (&threadpool);
return TRUE;
}
{
gint cpu_count = mono_cpu_count ();
- mono_lazy_initialize (&status, initialize);
+ if (completion_port_threads < threadpool.limit_io_min || completion_port_threads < cpu_count)
+ return FALSE;
- if (completion_port_threads < threadpool->limit_io_min || completion_port_threads < cpu_count)
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool))
return FALSE;
- if (!mono_threadpool_worker_set_max (threadpool->worker, worker_threads))
+ if (!mono_threadpool_worker_set_max (worker_threads)) {
+ mono_refcount_dec (&threadpool);
return FALSE;
+ }
- threadpool->limit_io_max = completion_port_threads;
+ threadpool.limit_io_max = completion_port_threads;
+ mono_refcount_dec (&threadpool);
return TRUE;
}
if (mono_domain_is_unloading (mono_domain_get ()) || mono_runtime_is_shutting_down ())
return FALSE;
- return mono_threadpool_worker_notify_completed (threadpool->worker);
+ return mono_threadpool_worker_notify_completed ();
}
void
ves_icall_System_Threading_ThreadPool_NotifyWorkItemProgressNative (void)
{
- mono_threadpool_worker_notify_completed (threadpool->worker);
+ mono_threadpool_worker_notify_completed ();
}
void
if (mono_domain_is_unloading (domain))
return FALSE;
- if (!mono_refcount_tryinc (threadpool)) {
+ if (!mono_lazy_initialize (&status, initialize) || !mono_refcount_tryinc (&threadpool)) {
/* threadpool has been destroyed, we are shutting down */
return FALSE;
}
domains_lock ();
- /* synchronize with mono_threadpool_remove_domain_jobs */
- if (mono_domain_is_unloading (domain)) {
- domains_unlock ();
- mono_refcount_dec (threadpool);
- return FALSE;
+ tpdomain = tpdomain_get (domain);
+ if (!tpdomain) {
+ /* synchronize with mono_threadpool_remove_domain_jobs */
+ if (mono_domain_is_unloading (domain)) {
+ domains_unlock ();
+ mono_refcount_dec (&threadpool);
+ return FALSE;
+ }
+
+ tpdomain = tpdomain_create (domain);
}
- tpdomain = tpdomain_get (domain, TRUE);
g_assert (tpdomain);
tpdomain->outstanding_request ++;
domains_unlock ();
- COUNTER_ATOMIC (threadpool, counter, {
+ COUNTER_ATOMIC (counter, {
if (counter._.starting == 16) {
- mono_refcount_dec (threadpool);
+ mono_refcount_dec (&threadpool);
return TRUE;
}
counter._.starting ++;
});
- mono_threadpool_worker_enqueue (threadpool->worker, worker_callback, NULL);
+ mono_threadpool_worker_enqueue (worker_callback, NULL);
+ mono_refcount_dec (&threadpool);
return TRUE;
}
if (shutting_down && !force_attach) {
mono_threads_unlock ();
+ mono_thread_pop_appdomain_ref ();
return FALSE;
}
*/
mono_threads_join_threads ();
- mono_error_init (error);
+ error_init (error);
mono_threads_lock ();
if (shutting_down) {
MonoInternalThread *internal;
gboolean res;
- mono_error_init (error);
+ error_init (error);
internal = create_internal_thread_object ();
MonoError error;
MonoString* str;
- mono_error_init (&error);
+ error_init (&error);
LOCK_THREAD (this_obj);
{
LOCK_THREAD (this_obj);
- mono_error_init (error);
+ error_init (error);
if (reset) {
this_obj->flags &= ~MONO_THREAD_FLAG_NAME_SET;
{
MonoArray *copy;
- mono_error_init (error);
+ error_init (error);
if (!arr)
return NULL;
gint32 diff_ms;
gint32 wait = ms;
- mono_error_init (error);
+ error_init (error);
start = (ms == -1) ? 0 : mono_msec_ticks ();
for (;;) {
gint32 diff_ms;
gint32 wait = ms;
- mono_error_init (error);
+ error_init (error);
start = (ms == -1) ? 0 : mono_100ns_ticks ();
do {
if (wait->num >= MONO_W32HANDLE_MAXIMUM_WAIT_OBJECTS)
return FALSE;
- /* The finalizer thread is not a background thread */
- if (!mono_native_thread_id_equals (thread_get_tid (thread), self)
- && (thread->state & ThreadState_Background) != 0
- && (thread->flags & MONO_THREAD_FLAG_DONT_MANAGE) == 0
- ) {
+ if (mono_native_thread_id_equals (thread_get_tid (thread), self))
+ return FALSE;
+ if (mono_gc_is_finalizer_internal_thread (thread))
+ return FALSE;
+
+ if ((thread->state & ThreadState_Background) && !(thread->flags & MONO_THREAD_FLAG_DONT_MANAGE)) {
wait->handles[wait->num] = mono_threads_open_thread_handle (thread->handle);
wait->threads[wait->num] = thread;
wait->num++;
THREAD_DEBUG (g_print ("%s: Aborting id: %"G_GSIZE_FORMAT"\n", __func__, (gsize)thread->tid));
mono_thread_internal_abort (thread);
- return TRUE;
}
- return !mono_native_thread_id_equals (thread_get_tid (thread), self)
- && !mono_gc_is_finalizer_internal_thread (thread);
+ return TRUE;
}
/**
MonoDebugSourceLocation *location;
int tindex, nthreads;
- mono_error_init (error);
+ error_init (error);
*out_threads = NULL;
*out_stack_frames = NULL;
{
MonoException *exc;
- mono_error_init (error);
+ error_init (error);
/* FIXME this is insanely broken, it doesn't cause interruption to happen synchronously
* since passing FALSE to mono_thread_request_interruption makes sure it returns NULL */
for (i = 0; i < ctx.code_size && i < ip_offset; ++i) {
if (ctx.code [i].flags & IL_CODE_FLAG_WAS_TARGET) {
if (!(ctx.code [i].flags & IL_CODE_FLAG_SEEN))
- ADD_VERIFY_ERROR (&ctx, g_strdup_printf ("Branch or exception block target middle of intruction at 0x%04x", i));
+ ADD_VERIFY_ERROR (&ctx, g_strdup_printf ("Branch or exception block target middle of instruction at 0x%04x", i));
if (ctx.code [i].flags & IL_CODE_DELEGATE_SEQUENCE)
CODE_NOT_VERIFIABLE (&ctx, g_strdup_printf ("Branch to delegate code sequence at 0x%04x", i));
#define WSAENOTSOCK 10038
#define WSAEDESTADDRREQ 10039
#define WSAEMSGSIZE 10040
+#define WSAEPROTOTYPE 10041
#define WSAENOPROTOOPT 10042
#define WSAEPROTONOSUPPORT 10043
#define WSAESOCKTNOSUPPORT 10044
*/
static void file_close (gpointer handle, gpointer data)
{
- MONO_REQ_GC_SAFE_MODE; /* FIXME: after mono_w32handle_close is coop-aware, change this to UNSAFE_MODE and switch to SAFE around close() below */
+ /* FIXME: after mono_w32handle_close is coop-aware, change this to MONO_REQ_GC_UNSAFE_MODE and leave just the switch to SAFE around close() below */
MONO_ENTER_GC_UNSAFE;
MonoW32HandleFile *file_handle = (MonoW32HandleFile *)data;
gint fd = file_handle->fd;
static void console_close (gpointer handle, gpointer data)
{
- MONO_REQ_GC_SAFE_MODE; /* FIXME: after mono_w32handle_close is coop-aware, change this to UNSAFE_MODE and switch to SAFE around close() below */
+ /* FIXME: after mono_w32handle_close is coop-aware, change this to MONO_REQ_GC_UNSAFE_MODE and leave just the switch to SAFE around close() below */
MONO_ENTER_GC_UNSAFE;
MonoW32HandleFile *console_handle = (MonoW32HandleFile *)data;
gint fd = console_handle->fd;
static void pipe_close (gpointer handle, gpointer data)
{
- MONO_REQ_GC_SAFE_MODE; /* FIXME: after mono_w32handle_close is coop-aware, change this to UNSAFE_MODE and switch to SAFE around close() below */
+ /* FIXME: after mono_w32handle_close is coop-aware, change this to MONO_REQ_GC_UNSAFE_MODE and leave just the switch to SAFE around close() below */
MONO_ENTER_GC_UNSAFE;
MonoW32HandleFile *pipe_handle = (MonoW32HandleFile*)data;
gint fd = pipe_handle->fd;
mono_w32handle_unlock_handle (handle);
+ MONO_ENTER_GC_SAFE;
mono_w32handle_unref (handle);
+ MONO_EXIT_GC_SAFE;
return(TRUE);
}
&pipe_write_handle);
if (write_handle == INVALID_HANDLE_VALUE) {
g_warning ("%s: error creating pipe write handle", __func__);
+
+ MONO_ENTER_GC_SAFE;
mono_w32handle_unref (read_handle);
- MONO_ENTER_GC_SAFE;
close (filedes[0]);
close (filedes[1]);
MONO_EXIT_GC_SAFE;
mono_w32file_get_console_output (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetStdHandle (STD_OUTPUT_HANDLE)");
mono_w32file_get_console_input (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetStdHandle (STD_INPUT_HANDLE)");
mono_w32file_get_console_error (void)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetStdHandle (STD_ERROR_HANDLE)");
len = MAX_PATH + 1; /*FIXME this is too smal under most unix systems.*/
buf = g_new (gunichar2, len);
- mono_error_init (&error);
+ error_init (&error);
*io_error=ERROR_SUCCESS;
result = NULL;
extern char **environ;
#endif
-/*
- * Handles > _WAPI_PROCESS_UNHANDLED are pseudo handles which represent processes
- * not started by the runtime.
- */
-/* This marks a system process that we don't have a handle on */
-/* FIXME: Cope with PIDs > sizeof guint */
-#define _WAPI_PROCESS_UNHANDLED (1 << (8*sizeof(pid_t)-1))
-
-#define WAPI_IS_PSEUDO_PROCESS_HANDLE(handle) ((GPOINTER_TO_UINT(handle) & _WAPI_PROCESS_UNHANDLED) == _WAPI_PROCESS_UNHANDLED)
-#define WAPI_PID_TO_HANDLE(pid) GINT_TO_POINTER (_WAPI_PROCESS_UNHANDLED + (pid))
-#define WAPI_HANDLE_TO_PID(handle) (GPOINTER_TO_UINT ((handle)) - _WAPI_PROCESS_UNHANDLED)
-
typedef enum {
STARTF_USESHOWWINDOW=0x001,
STARTF_USESIZE=0x002,
/* MonoW32HandleProcess is a structure containing all the required information for process handling. */
typedef struct {
pid_t pid;
+ gboolean child;
guint32 exitstatus;
gpointer main_thread;
guint64 create_time;
static const gunichar2 utf16_quote_bytes [2] = { 0x22, 0 };
static const gunichar2 *utf16_quote = utf16_quote_bytes;
+/* Check if a pid is valid - i.e. if a process exists with this pid. */
+static gboolean
+process_is_alive (pid_t pid)
+{
+#if defined(HOST_WATCHOS)
+ return TRUE; // TODO: Rewrite using sysctl
+#elif defined(PLATFORM_MACOSX) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ if (pid == 0)
+ return FALSE;
+ if (kill (pid, 0) == 0)
+ return TRUE;
+ if (errno == EPERM)
+ return TRUE;
+ return FALSE;
+#elif defined(__HAIKU__)
+ team_info teamInfo;
+ if (get_team_info ((team_id)pid, &teamInfo) == B_OK)
+ return TRUE;
+ return FALSE;
+#else
+ gchar *dir = g_strdup_printf ("/proc/%d", pid);
+ gboolean result = access (dir, F_OK) == 0;
+ g_free (dir);
+ return result;
+#endif
+}
+
static void
process_details (gpointer data)
{
Process *process;
gboolean res;
- /* FIXME: We can now easily wait on processes that aren't our own children,
- * but WaitFor*Object won't call us for pseudo handles. */
- g_assert (!WAPI_IS_PSEUDO_PROCESS_HANDLE (handle));
-
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u)", __func__, handle, timeout);
if (alerted)
pid = process_handle->pid;
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): PID: %d", __func__, handle, timeout, pid);
-
- /* We don't need to lock processes here, the entry
- * has a handle_count > 0 which means it will not be freed. */
- process = process_handle->process;
- if (!process) {
- pid_t res;
-
- if (pid == mono_process_current_pid ()) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): waiting on current process", __func__, handle, timeout);
- return MONO_W32HANDLE_WAIT_RET_TIMEOUT;
- }
+ if (pid == mono_process_current_pid ()) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): waiting on current process", __func__, handle, timeout);
+ return MONO_W32HANDLE_WAIT_RET_TIMEOUT;
+ }
- /* This path is used when calling Process.HasExited, so
- * it is only used to poll the state of the process, not
- * to actually wait on it to exit */
- g_assert (timeout == 0);
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): PID: %d", __func__, handle, timeout, pid);
+ if (!process_handle->child) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): waiting on non-child process", __func__, handle, timeout);
- res = waitpid (pid, &status, WNOHANG);
- if (res == 0) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): non-child process wait timeout", __func__, handle, timeout);
- return MONO_W32HANDLE_WAIT_RET_TIMEOUT;
- }
- if (res > 0) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): non-child process waited successfully", __func__, handle, timeout);
+ if (!process_is_alive (pid)) {
+ /* assume the process has exited */
+ process_handle->exited = TRUE;
+ process_handle->exitstatus = -1;
+ mono_w32handle_set_signal_state (handle, TRUE, TRUE);
+
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s (%p, %u): non-child process is not alive anymore (2)", __func__, handle, timeout);
return MONO_W32HANDLE_WAIT_RET_SUCCESS_0;
}
return MONO_W32HANDLE_WAIT_RET_FAILED;
}
+ /* We don't need to lock processes here, the entry
+ * has a handle_count > 0 which means it will not be freed. */
+ process = process_handle->process;
+ g_assert (process);
+
start = mono_msec_ticks ();
now = start;
g_free (cli_launcher);
}
-/* Check if a pid is valid - i.e. if a process exists with this pid. */
-static gboolean
-is_pid_valid (pid_t pid)
-{
- gboolean result = FALSE;
-
-#if defined(HOST_WATCHOS)
- result = TRUE; // TODO: Rewrite using sysctl
-#elif defined(PLATFORM_MACOSX) || defined(__OpenBSD__) || defined(__FreeBSD__)
- if (((kill(pid, 0) == 0) || (errno == EPERM)) && pid != 0)
- result = TRUE;
-#elif defined(__HAIKU__)
- team_info teamInfo;
- if (get_team_info ((team_id)pid, &teamInfo) == B_OK)
- result = TRUE;
-#else
- char *dir = g_strdup_printf ("/proc/%d", pid);
- if (!access (dir, F_OK))
- result = TRUE;
- g_free (dir);
-#endif
-
- return result;
-}
-
static int
len16 (const gunichar2 *str)
{
MonoW32HandleProcess *process_handle;
gboolean res;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
- /* This is a pseudo handle */
- return WAPI_HANDLE_TO_PID (handle);
- }
-
res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
if (!res) {
mono_w32error_set_last (ERROR_INVALID_HANDLE);
if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_PROCESS)
return FALSE;
- g_assert (!WAPI_IS_PSEUDO_PROCESS_HANDLE (handle));
-
process_handle = (MonoW32HandleProcess*) handle_specific;
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: looking at process %d", __func__, process_handle->pid);
return handle;
}
- if (is_pid_valid (pid)) {
- /* Return a pseudo handle for processes we don't have handles for */
- return WAPI_PID_TO_HANDLE (pid);
+ if (process_is_alive (pid)) {
+ /* non-child process */
+ MonoW32HandleProcess process_handle;
+
+ memset (&process_handle, 0, sizeof (process_handle));
+ process_handle.pid = pid;
+ process_handle.pname = mono_w32process_get_name (pid);
+
+ handle = mono_w32handle_new (MONO_W32HANDLE_PROCESS, &process_handle);
+ if (handle == INVALID_HANDLE_VALUE) {
+ g_warning ("%s: error creating process handle", __func__);
+
+ mono_w32error_set_last (ERROR_OUTOFMEMORY);
+ return NULL;
+ }
+
+ return handle;
}
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find pid %d", __func__, pid);
if (size < sizeof(gpointer))
return FALSE;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (process)) {
- pid = WAPI_HANDLE_TO_PID (process);
- pname = mono_w32process_get_name (pid);
- } else {
- res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
- return FALSE;
- }
-
- pid = process_handle->pid;
- pname = g_strdup (process_handle->pname);
+ res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
+ return FALSE;
}
+ pid = process_handle->pid;
+ pname = g_strdup (process_handle->pname);
+
if (!pname) {
modules[0] = NULL;
*needed = sizeof(gpointer);
if (basename == NULL || size == 0)
return 0;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (process)) {
- /* This is a pseudo handle */
- pid = (pid_t)WAPI_HANDLE_TO_PID (process);
- pname = mono_w32process_get_name (pid);
- } else {
- res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
- return 0;
- }
-
- pid = process_handle->pid;
- pname = g_strdup (process_handle->pname);
+ res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
+ return 0;
}
+ pid = process_handle->pid;
+ pname = g_strdup (process_handle->pname);
+
mods = mono_w32process_get_modules (pid);
if (!mods) {
g_free (pname);
if (modinfo == NULL || size < sizeof (MODULEINFO))
return FALSE;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (process)) {
- pid = (pid_t)WAPI_HANDLE_TO_PID (process);
- pname = mono_w32process_get_name (pid);
- } else {
- res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
- return FALSE;
- }
-
- pid = process_handle->pid;
- pname = g_strdup (process_handle->pname);
+ res = mono_w32handle_lookup (process, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, process);
+ return FALSE;
}
+ pid = process_handle->pid;
+ pname = g_strdup (process_handle->pname);
+
mods = mono_w32process_get_modules (pid);
if (!mods) {
g_free (pname);
memset (&process_handle, 0, sizeof (process_handle));
process_handle.pid = pid;
+ process_handle.child = TRUE;
process_handle.pname = g_strdup (prog);
process_set_defaults (&process_handle);
ves_icall_Microsoft_Win32_NativeMethods_GetExitCodeProcess (gpointer handle, gint32 *exitcode)
{
MonoW32HandleProcess *process_handle;
- guint32 pid;
gboolean res;
if (!exitcode)
return FALSE;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
- pid = WAPI_HANDLE_TO_PID (handle);
- /* This is a pseudo handle, so we don't know what the exit
- * code was, but we can check whether it's alive or not */
- if (is_pid_valid (pid)) {
- *exitcode = STILL_ACTIVE;
- return TRUE;
- } else {
- *exitcode = -1;
- return TRUE;
- }
- }
-
res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
if (!res) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
MonoBoolean
ves_icall_Microsoft_Win32_NativeMethods_CloseProcess (gpointer handle)
{
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle))
- return TRUE;
return mono_w32handle_close (handle);
}
MonoW32HandleProcess *process_handle;
int ret;
pid_t pid;
+ gboolean res;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
- /* This is a pseudo handle */
- pid = (pid_t)WAPI_HANDLE_TO_PID (handle);
- } else {
- gboolean res;
-
- res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
- mono_w32error_set_last (ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- pid = process_handle->pid;
+ res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
+ mono_w32error_set_last (ERROR_INVALID_HANDLE);
+ return FALSE;
}
+ pid = process_handle->pid;
+
ret = kill (pid, exitcode == -1 ? SIGKILL : SIGTERM);
if (ret == 0)
return TRUE;
if (!min || !max)
return FALSE;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle))
- return FALSE;
-
res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
if (!res) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
return FALSE;
}
+ if (!process_handle->child)
+ return FALSE;
+
*min = process_handle->min_working_set;
*max = process_handle->max_working_set;
return TRUE;
MonoW32HandleProcess *process_handle;
gboolean res;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle))
- return FALSE;
-
res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
if (!res) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
return FALSE;
}
+ if (!process_handle->child)
+ return FALSE;
+
process_handle->min_working_set = min;
process_handle->max_working_set = max;
return TRUE;
MonoW32HandleProcess *process_handle;
gint ret;
pid_t pid;
+ gboolean res;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
- /* This is a pseudo handle */
- pid = (pid_t)WAPI_HANDLE_TO_PID (handle);
- } else {
- gboolean res;
-
- res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_w32error_set_last (ERROR_INVALID_HANDLE);
- return 0;
- }
-
- pid = process_handle->pid;
+ res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_w32error_set_last (ERROR_INVALID_HANDLE);
+ return 0;
}
+ pid = process_handle->pid;
+
errno = 0;
ret = getpriority (PRIO_PROCESS, pid);
if (ret == -1 && errno != 0) {
int ret;
int prio;
pid_t pid;
+ gboolean res;
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
- /* This is a pseudo handle */
- pid = (pid_t)WAPI_HANDLE_TO_PID (handle);
- } else {
- gboolean res;
-
- res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_w32error_set_last (ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- pid = process_handle->pid;
+ res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_w32error_set_last (ERROR_INVALID_HANDLE);
+ return FALSE;
}
+ pid = process_handle->pid;
+
switch (priorityClass) {
case MONO_W32PROCESS_PRIORITY_CLASS_IDLE:
prio = 19;
memset (kernel_processtime, 0, sizeof (ProcessTime));
memset (user_processtime, 0, sizeof (ProcessTime));
- if (WAPI_IS_PSEUDO_PROCESS_HANDLE (handle)) {
+ res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
+ if (!res) {
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
+ return FALSE;
+ }
+
+ if (!process_handle->child) {
gint64 start_ticks, user_ticks, kernel_ticks;
- mono_process_get_times (GINT_TO_POINTER (WAPI_HANDLE_TO_PID (handle)),
+ mono_process_get_times (GINT_TO_POINTER (process_handle->pid),
&start_ticks, &user_ticks, &kernel_ticks);
ticks_to_processtime (start_ticks, creation_processtime);
return TRUE;
}
- res = mono_w32handle_lookup (handle, MONO_W32HANDLE_PROCESS, (gpointer*) &process_handle);
- if (!res) {
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't find process %p", __func__, handle);
- return FALSE;
- }
-
ticks_to_processtime (process_handle->create_time, creation_processtime);
/* A process handle is only signalled if the process has
ves_icall_System_Diagnostics_Process_GetProcess_internal (guint32 pid)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("OpenProcess");
{
g_unsupported_api ("GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue, VerLanguageName");
- mono_error_init (error);
+ error_init (error);
mono_error_set_not_supported (error, G_UNSUPPORTED_API, "GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue, VerLanguageName");
SetLastError (ERROR_NOT_SUPPORTED);
{
g_unsupported_api ("GetModuleInformation");
- mono_error_init (error);
+ error_init (error);
mono_error_set_not_supported (error, G_UNSUPPORTED_API, "GetModuleInformation");
SetLastError (ERROR_NOT_SUPPORTED);
ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject *this_obj, HANDLE process)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("EnumProcessModules, GetModuleBaseName, GetModuleFileNameEx");
ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal (MonoW32ProcessStartInfo *proc_start_info, MonoW32ProcessInfo *process_info)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("ShellExecuteEx");
memset (&process_info, 0, sizeof (PROCESS_INFORMATION));
g_unsupported_api (api_name);
- mono_error_init (&mono_error);
+ error_init (&mono_error);
mono_error_set_not_supported (&mono_error, G_UNSUPPORTED_API, api_name);
mono_error_set_pending_exception (&mono_error);
mono_icall_get_process_working_set_size (gpointer handle, gsize *min, gsize *max)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetProcessWorkingSetSize");
mono_icall_set_process_working_set_size (gpointer handle, gsize min, gsize max)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("SetProcessWorkingSetSize");
mono_icall_get_priority_class (gpointer handle)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("GetPriorityClass");
mono_icall_set_priority_class (gpointer handle, gint32 priorityClass)
{
MonoError mono_error;
- mono_error_init (&mono_error);
+ error_init (&mono_error);
g_unsupported_api ("SetPriorityClass");
MonoClassField *field;
MonoString *string;
- mono_error_init (error);
+ error_init (error);
LOGDEBUG (g_message ("%s: Setting field %s to [%s]", __func__, fieldname, g_utf16_to_utf8 (val, len, NULL, NULL, NULL)));
gunichar2 *lang_key, *buffer;
UINT chars;
- mono_error_init (error);
+ error_init (error);
lang_key_utf8 = g_strdup_printf (key, lang_lo, lang_hi, 0x04, 0xb0);
gunichar2 lang_buf[128];
guint32 lang, lang_count;
- mono_error_init (error);
+ error_init (error);
datalen = mono_w32process_get_fileversion_info_size (filename, &verinfohandle);
if (datalen) {
MODULEINFO modinfo;
BOOL ok;
- mono_error_init (error);
+ error_init (error);
/* Build a System.Diagnostics.ProcessModule with the data. */
item = mono_object_new_checked (domain, proc_class, error);
gchar *filename;
const gchar *modulename;
- mono_error_init (error);
+ error_init (error);
domain = mono_domain_get ();
case ENETDOWN: return WSAENETDOWN;
#endif
case ENODEV: return WSAENETDOWN;
+#ifdef EPROTOTYPE
+ case EPROTOTYPE: return WSAEPROTOTYPE;
+#endif
default:
g_error ("%s: no translation into winsock error for (%d) \"%s\"", __func__, error, g_strerror (error));
}
MonoArray *data;
MonoAddressFamily family;
- mono_error_init (error);
+ error_init (error);
/* Build a System.Net.SocketAddress object instance */
if (!domain->sockaddr_class)
gint32 family;
int len;
- mono_error_init (error);
+ error_init (error);
if (!domain->sockaddr_class)
domain->sockaddr_class = mono_class_load_from_name (get_socket_assembly (), "System.Net", "SocketAddress");
int addr_index;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error);
+ error_init (error);
addr_index = 0;
*h_aliases = mono_array_new_checked (domain, mono_get_string_class (), 0, error);
return_val_if_nok (error, FALSE);
return FALSE;
}
- MONO_ENTER_GC_SAFE;
-
mono_w32file_close (file);
- MONO_EXIT_GC_SAFE;
-
if (*werror)
return FALSE;
interpreter_sources = \
interpreter/hacks.h \
interpreter/interp.h \
+ interpreter/interp-internals.h \
interpreter/interp.c \
interpreter/mintops.h \
interpreter/mintops.def \
gc-test.cs \
gshared.cs
+if NACL_CODEGEN
+test_sources += nacl.cs
+endif
-regtests_UNIVERSAL=basic.exe basic-float.exe basic-long.exe basic-calls.exe objects.exe arrays.exe basic-math.exe exceptions.exe iltests.exe devirtualization.exe generics.exe basic-simd.exe basic-vectors.exe
-iregtests=basic.exe basic-float.exe basic-long.exe basic-calls.exe generics-interp.exe
-
-if FULL_AOT_TESTS
-regtests= \
- $(regtests_UNIVERSAL)
+regtests_UNIVERSAL = \
+ basic.exe \
+ basic-float.exe \
+ basic-long.exe \
+ basic-calls.exe \
+ objects.exe \
+ arrays.exe \
+ basic-math.exe \
+ exceptions.exe \
+ iltests.exe \
+ devirtualization.exe \
+ generics.exe \
+ basic-simd.exe \
+ basic-vectors.exe
if NACL_CODEGEN
-test_sources += nacl.cs
-regtests += nacl.exe
+regtests_UNIVERSAL += nacl.exe
endif
-else
-regtests= \
- $(regtests_UNIVERSAL) \
- $(regtests_FULL_AOT_TESTS_BLACKLIST)
+regtests_DISABLED =
+
+if FULL_AOT_TESTS
+regtests_DISABLED +=
endif
+regtests = $(filter-out $(regtests_DISABLED),$(regtests_UNIVERSAL))
+
+iregtests = \
+ basic.exe \
+ basic-float.exe \
+ basic-long.exe \
+ basic-calls.exe \
+ generics.exe \
+ objects.exe
+
if X86
arch_sources = $(x86_sources)
arch_built=cpu-x86.h
fullaot_regtests = $(regtests) aot-tests.exe $(if $(GSHAREDVT),gshared.exe)
-# Skip aoting the tests that aren't compiled
-# on the full aot profiles because they're skipped
-# on mobile profiles
-FULLAOT_LIBS_FULL_AOT_TESTS_BLACKLIST = \
- Mono.Posix.dll \
- System.Configuration.dll
-
FULLAOT_LIBS_UNIVERSAL = \
mscorlib.dll \
System.Core.dll \
Mono.Simd.dll \
Mono.Security.dll \
System.Numerics.dll \
- System.Numerics.Vectors.dll
+ System.Numerics.Vectors.dll \
+ Mono.Posix.dll \
+ System.Configuration.dll
+
+FULLAOT_LIBS_DISABLED =
if FULL_AOT_TESTS
-FULLAOT_LIBS= \
- $(FULLAOT_LIBS_UNIVERSAL)
-else
-FULLAOT_LIBS= \
- $(FULLAOT_LIBS_UNIVERSAL) \
- $(FULLAOT_LIBS_FULL_AOT_TESTS_BLACKLIST)
+# Skip aoting the tests that aren't compiled
+# on the full aot profiles because they're skipped
+# on mobile profiles
+FULLAOT_LIBS_DISABLED += \
+ Mono.Posix.dll \
+ System.Configuration.dll
endif
+FULLAOT_LIBS = $(filter-out $(FULLAOT_LIBS_DISABLED),$(FULLAOT_LIBS_UNIVERSAL))
+
FULLAOT_TMP_DIR=$(top_builddir)/mono/mini/fullaot-tmp
# This currently only works on amd64/arm
named += slen;
}
- wrapper = mono_marshal_get_managed_wrapper (method, klass, 0);
+ wrapper = mono_marshal_get_managed_wrapper (method, klass, 0, &error);
+ mono_error_assert_ok (&error);
+
add_method (acfg, wrapper);
if (export_name)
g_hash_table_insert (acfg->export_names, wrapper, export_name);
g_assert (index < amodule->image_table_len);
- mono_error_init (error);
+ error_init (error);
if (amodule->image_table [index])
return amodule->image_table [index];
MonoGenericInst *inst;
guint8 *p = buf;
- mono_error_init (error);
+ error_init (error);
type_argc = decode_value (p, &p);
type_argv = g_new0 (MonoType*, type_argc);
guint8 *p = buf;
guint8 *p2;
int argc;
- mono_error_init (error);
+ error_init (error);
p2 = p;
argc = decode_value (p, &p);
guint8 *p = buf;
int reftype;
- mono_error_init (error);
+ error_init (error);
reftype = decode_value (p, &p);
if (reftype == 0) {
*endbuf = p;
MonoType *t;
t = (MonoType *)g_malloc0 (sizeof (MonoType));
- mono_error_init (error);
+ error_init (error);
while (TRUE) {
if (*p == MONO_TYPE_PINNED) {
guint8 *p = buf;
memset (ref, 0, sizeof (MethodRef));
- mono_error_init (error);
+ error_init (error);
value = decode_value (p, &p);
image_index = value >> 24;
klass = decode_klass_ref (module, p, &p, error);
if (!klass)
return FALSE;
- ref->method = mono_marshal_get_managed_wrapper (m, klass, 0);
+ ref->method = mono_marshal_get_managed_wrapper (m, klass, 0, error);
+ if (!mono_error_ok (error))
+ return FALSE;
break;
}
default:
{
MethodRef ref;
- mono_error_init (error);
+ error_init (error);
if (!decode_method_ref_with_target (module, &ref, target, buf, endbuf, error))
return NULL;
gpointer addr;
MonoError inner_error;
- mono_error_init (error);
+ error_init (error);
if (MONO_CLASS_IS_INTERFACE (klass) || klass->rank || !amodule)
return NULL;
guint8 *code = NULL, *info;
gboolean res;
- mono_error_init (error);
+ error_init (error);
init_amodule_got (amodule);
MonoJitInfo *jinfo = NULL;
guint8 *code, *info;
- mono_error_init (error);
+ error_init (error);
code = (guint8 *)amodule->methods [method_index];
info = &amodule->blob [mono_aot_get_offset (amodule->method_info_offsets, method_index)];
gboolean cache_result = FALSE;
MonoError inner_error;
- mono_error_init (error);
+ error_init (error);
if (domain != mono_get_root_domain ())
/* Non shared AOT code can't be used in other appdomains */
int method_index;
gpointer res;
- mono_error_init (error);
+ error_init (error);
if (!aot_module)
return NULL;
MonoMemPool *mp;
gboolean using_gsharedvt = FALSE;
- mono_error_init (error);
+ error_init (error);
//printf ("DYN: %p %d\n", aot_module, plt_info_offset);
mono_aot_get_method_checked (MonoDomain *domain,
MonoMethod *method, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return NULL;
}
gpointer
mono_aot_get_method_from_token (MonoDomain *domain, MonoImage *image, guint32 token, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return NULL;
}
gpointer
mono_aot_get_method_from_vt_slot (MonoDomain *domain, MonoVTable *vtable, int slot, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
return NULL;
}
gboolean it_has_sp = FALSE;
if (error)
- mono_error_init (error);
+ error_init (error);
mono_seq_point_iterator_init (&it, seq_points);
while (mono_seq_point_iterator_next (&it)) {
MonoJitInfo *ji;
if (error)
- mono_error_init (error);
+ error_init (error);
code = mono_jit_find_compiled_method_with_jit_info (domain, method, &ji);
if (!code) {
int i;
if (error)
- mono_error_init (error);
+ error_init (error);
// FIXME:
// - suspend/resume the vm to prevent code patching problems
{
HANDLE_FUNCTION_ENTER();
ErrorCode err = ERR_NONE;
- mono_error_init (error);
+ error_init (error);
MonoReflectionAssemblyHandle o = mono_assembly_get_object_handle (domain, ass, error);
if (MONO_HANDLE_IS_NULL (o)) {
err = ERR_INVALID_OBJECT;
MonoError error;
GPtrArray *array;
- mono_error_init (&error);
+ error_init (&error);
array = mono_class_get_methods_by_name (klass, name, flags & ~BINDING_FLAGS_IGNORE_CASE, (flags & BINDING_FLAGS_IGNORE_CASE) != 0, TRUE, &error);
if (!is_ok (&error)) {
mono_error_cleanup (&error);
case DO_REGRESSION:
#ifdef ENABLE_INTERPRETER
if (mono_use_interpreter) {
- if (interp_regression_list (2, argc -i, argv + i)) {
+ if (mono_interp_regression_list (2, argc -i, argv + i)) {
g_print ("Regression ERRORS!\n");
// mini_cleanup (domain);
return 1;
aname = argv [i];
break;
default:
-#ifdef ENABLE_INTERPRETER
- if (mono_use_interpreter)
- g_error ("not yet");
-#endif
if (argc - i < 1) {
mini_usage ();
mini_cleanup (domain);
+++ /dev/null
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.CompilerServices;
-using System.Threading;
-using System.Threading.Tasks;
-
-#if __MOBILE__
-class GenericsTests
-#else
-class Tests
-#endif
-{
- struct TestStruct {
- public int i;
- public int j;
-
- public TestStruct (int i, int j) {
- this.i = i;
- this.j = j;
- }
- }
-
-#if !__MOBILE__
- public static int Main (string[] args) {
- return TestDriver.RunTests (typeof (Tests), args);
- }
-#endif
-
- public static int test_1_no_nullable_unbox ()
- {
- return Unbox<int> (1);
- }
-
- public static int test_1_nullable_unbox_null ()
- {
- return Unbox<int?> (null).HasValue ? 0 : 1;
- }
-
- public static int test_1_nullable_box ()
- {
- return (int) Box<int?> (1);
- }
-
- public static int test_1_nullable_box_null ()
- {
- return Box<int?> (null) == null ? 1 : 0;
- }
-
- public static int test_1_isinst_nullable ()
- {
- object o = 1;
- return (o is int?) ? 1 : 0;
- }
-
- public static int test_1_nullable_unbox_vtype ()
- {
- return Unbox<TestStruct?> (new TestStruct (1, 2)).Value.i;
- }
-
-
- public static int test_1_nullable_unbox_null_vtype ()
- {
- return Unbox<TestStruct?> (null).HasValue ? 0 : 1;
- }
-
- public static int test_1_nullable_box_vtype ()
- {
- return ((TestStruct)(Box<TestStruct?> (new TestStruct (1, 2)))).i;
- }
-
- public static int test_1_nullable_box_null_vtype ()
- {
- return Box<TestStruct?> (null) == null ? 1 : 0;
- }
-
- public static int test_1_isinst_nullable_vtype ()
- {
- object o = new TestStruct (1, 2);
- return (o is TestStruct?) ? 1 : 0;
- }
-
- public static int test_0_nullable_normal_unbox ()
- {
- int? i = 5;
-
- object o = i;
- // This uses unbox instead of unbox_any
- int? j = (int?)o;
-
- if (j != 5)
- return 1;
-
- return 0;
- }
-
- public static void stelem_any<T> (T[] arr, T elem) {
- arr [0] = elem;
- }
-
- public static T ldelem_any<T> (T[] arr) {
- return arr [0];
- }
-
- public static int test_1_ldelem_stelem_any_int () {
- int[] arr = new int [3];
- stelem_any (arr, 1);
-
- return ldelem_any (arr);
- }
-
- public static T return_ref<T> (ref T t) {
- return t;
- }
-
- public static T ldelema_any<T> (T[] arr) {
- return return_ref<T> (ref arr [0]);
- }
-
- public static int test_0_ldelema () {
- string[] arr = new string [1];
-
- arr [0] = "Hello";
-
- if (ldelema_any <string> (arr) == "Hello")
- return 0;
- else
- return 1;
- }
-
- public static T[,] newarr_multi<T> () {
- return new T [1, 1];
- }
-
- public static int test_0_newarr_multi_dim () {
- return newarr_multi<string> ().GetType () == typeof (string[,]) ? 0 : 1;
- }
-
- static object Box<T> (T t)
- {
- return t;
- }
-
- static T Unbox <T> (object o) {
- return (T) o;
- }
-}
return 0;
}
+ [Category ("!INTERPRETER")]
public static int test_0_generic_get_value_optimization_vtype () {
TestStruct[] arr = new TestStruct[] { new TestStruct (100, 200), new TestStruct (300, 400) };
IEnumerator<TestStruct> enumerator = GenericClass<TestStruct>.Y (arr);
}
#endif
+ [Category ("!INTERPRETER")]
public static int test_0_ldvirtftn_generic_method () {
new GenericsTests ().ldvirtftn<string> ();
// This cannot be made to work with full-aot, since there it is impossible to
// statically determine that Foo<string>.Bar <int> is needed, the code only
// references IFoo.Bar<int>
+ [Category ("!INTERPRETER")]
[Category ("!FULLAOT")]
public static int test_0_generic_virtual_on_interfaces () {
Foo<string>.count1 = 0;
return 0;
}
+ [Category ("!INTERPRETER")]
public static int test_0_generic_virtual_on_interfaces_ref () {
Foo<string>.count1 = 0;
Foo<string>.count2 = 0;
Value_2 = 2
}
+ [Category ("!INTERPRETER")]
public static int test_0_regress_550964_constrained_enum_long () {
MyEnumUlong a = MyEnumUlong.Value_2;
MyEnumUlong b = MyEnumUlong.Value_2;
}
}
+ [Category ("!INTERPRETER")]
public static int test_0_fullaot_linq () {
var allWords = new XElement [] { new XElement { Value = "one" } };
var filteredWords = allWords.Where(kw => kw.Value.StartsWith("T"));
int c = ((ICollection<T>)arr).Count;
}
+ [Category ("!INTERPRETER")]
/* Test that treating arrays as generic collections works with full-aot */
public static int test_0_fullaot_array_wrappers () {
GenericsTests[] arr = new GenericsTests [10];
return typeof (T);
}
+ [Category ("!INTERPRETER")]
public static int test_0_gshared_delegate_rgctx () {
Func<Type> t = new Func<Type> (get_type<string>);
return 1;
}
+ [Category ("!INTERPRETER")]
// Creating a delegate from a generic method from gshared code
public static int test_0_gshared_delegate_from_gshared () {
if (gshared_delegate_from_gshared <object> () != 0)
public delegate TRet Transform<TRet> (TKey key, TValue value);
}
+ [Category ("!INTERPRETER")]
public static int test_0_bug_620864 () {
var d = new Pair<string, Type>.Transform<KeyValuePair<string, Type>> (Pair<string, Type>.make_pair);
return 0;
}
+ [Category ("!INTERPRETER")]
[Category ("GSHAREDVT")]
public static int test_6_partial_sharing_linq () {
var messages = new List<Message> ();
return messages.Max(i => i.MessageID);
}
+ [Category ("!INTERPRETER")]
public static int test_0_partial_shared_method_in_nonshared_class () {
var c = new Class1<double> ();
return (c.Foo<string> (5).GetType () == typeof (Class1<string>)) ? 0 : 1;
}
}
+ [Category ("!INTERPRETER")]
[Category ("!FULLAOT")]
[Category ("!BITCODE")]
public static int test_0_regress_668095_synchronized_gshared () {
}
}
+ [Category ("!INTERPRETER")]
[Category ("GSHAREDVT")]
static int test_0_synchronized_gshared () {
var c = new SyncClass<string> ();
}
// #2155
+ [Category ("!INTERPRETER")]
[Category ("GSHAREDVT")]
public static int test_0_fullaot_sflda_cctor () {
List<Doc> documents = new List<Doc>();
static List<A> sources = new List<A>();
// #6112
+ [Category ("!INTERPRETER")]
public static int test_0_fullaot_imt () {
sources.Add(null);
sources.Add(null);
class BClass : AClass {
}
+ [Category ("!INTERPRETER")]
public static int test_0_fullaot_variant_iface () {
var arr = new BClass [10];
var enumerable = (IEnumerable<AClass>)arr;
}
}
+ [Category ("!INTERPRETER")]
public static int test_1_regress_constrained_iface_call_7571 () {
var r = new Record [10];
Foo2<Record>.Extract (r);
Val = 1
}
+ [Category ("!INTERPRETER")]
public static int test_0_regress_constrained_iface_call_enum () {
var r = new ConstrainedEnum [10];
return Foo3<ConstrainedEnum>.CompareTo (r);
}
#endif
+ [Category ("!INTERPRETER")]
public static int test_0_delegate_callvirt_fullaot () {
Func<string> f = delegate () { return "A"; };
var f2 = (Func<Func<string>, string>)Delegate.CreateDelegate (typeof
return t.GetHashCode ();
}
+ [Category ("!INTERPRETER")]
public static int test_0_constrained_partial_sharing () {
string s;
static object delegate_8_args_res;
+ [Category ("!INTERPRETER")]
public static int test_0_delegate_8_args () {
delegate_8_args_res = null;
Action<string, string, string, string, string, string, string,
fprintf (fp, "}\n");
}
-#if 0
-
-static void
-mono_print_label (FILE *fp, MonoInst *tree) {
- int arity;
-
- if (!tree)
- return;
-
- arity = mono_burg_arity [tree->opcode];
-
- fprintf (fp, "\\ %s%s", arity? "(": "", mono_inst_name (tree->opcode));
-
- switch (tree->opcode) {
- case OP_ICONST:
- fprintf (fp, "[%ld]", (long)tree->inst_c0);
- break;
- case OP_I8CONST:
- fprintf (fp, "[%lld]", (long long)tree->inst_l);
- break;
- case OP_R8CONST:
- fprintf (fp, "[%f]", *(double*)tree->inst_p0);
- break;
- case OP_R4CONST:
- fprintf (fp, "[%f]", *(float*)tree->inst_p0);
- break;
- case OP_ARG:
- case OP_LOCAL:
- fprintf (fp, "[%d]", (int)tree->inst_c0);
- break;
- case OP_REGOFFSET:
- fprintf (fp, "[0x%x(%s)]", (int)tree->inst_offset, mono_arch_regname (tree->inst_basereg));
- break;
- case OP_REGVAR:
- fprintf (fp, "[%s]", mono_arch_regname (tree->dreg));
- break;
- case CEE_NEWARR:
- fprintf (fp, "[%s]", tree->inst_newa_class->name);
- mono_print_label (fp, tree->inst_newa_len);
- break;
- case OP_CALL:
- case OP_CALL_MEMBASE:
- case OP_FCALL:
- case OP_FCALL_MEMBASE:
- case OP_LCALL:
- case OP_LCALL_MEMBASE:
- case OP_VCALL:
- case OP_VCALL_MEMBASE:
- case OP_VOIDCALL:
- case OP_VOIDCALL_MEMBASE: {
- MonoCallInst *call = (MonoCallInst*)tree;
- if (call->method) {
- if (mono_method_signature (call->method)->hasthis && tree->inst_left) {
- mono_print_label (fp, tree->inst_left);
- }
- fprintf (fp, "[%s]", call->method->name);
- }
- break;
- }
- case OP_PHI: {
- int i;
- fprintf (fp, "[%d\\ (", (int)tree->inst_c0);
- for (i = 0; i < tree->inst_phi_args [0]; i++) {
- if (i)
- fprintf (fp, ",\\ ");
- fprintf (fp, "%d", tree->inst_phi_args [i + 1]);
- }
- fprintf (fp, ")]");
- break;
- }
- case OP_NOP:
- case OP_JMP:
- case OP_BREAK:
- break;
- case OP_BR:
- fprintf (fp, "[B%d]", tree->inst_target_bb->block_num);
- break;
- case OP_SWITCH:
- case CEE_ISINST:
- case CEE_CASTCLASS:
- case OP_CALL_REG:
- case OP_FCALL_REG:
- case OP_LCALL_REG:
- case OP_VCALL_REG:
- case OP_VOIDCALL_REG:
- mono_print_label (fp, tree->inst_left);
- break;
- case CEE_BNE_UN:
- case CEE_BEQ:
- case CEE_BLT:
- case CEE_BLT_UN:
- case CEE_BGT:
- case CEE_BGT_UN:
- case CEE_BGE:
- case CEE_BGE_UN:
- case CEE_BLE:
- case CEE_BLE_UN:
- fprintf (fp, "[B%dB%d]", tree->inst_true_bb->block_num, tree->inst_false_bb->block_num);
- mono_print_label (fp, tree->inst_left);
- break;
- default:
- if (arity) {
- mono_print_label (fp, tree->inst_left);
- if (arity > 1)
- mono_print_label (fp, tree->inst_right);
- }
- break;
- }
-
- if (arity)
- fprintf (fp, ")");
-}
-
-#endif
-
static void
mono_draw_code_cfg (MonoCompile *cfg, FILE *fp)
{
return t.ToString ();
}
- enum AnEnum {
+ public enum AnEnum {
One,
Two
};
interface IConstrainedCalls {
Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T: IReturnVType;
+ AnEnum enum_ret<T, T2>(T t, T2 t2) where T: IReturnVType;
}
public interface IReturnVType {
Pair<int, int> return_vtype ();
+ AnEnum return_enum ();
}
public class CConstrainedCalls : IConstrainedCalls {
public Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T : IReturnVType {
return t.return_vtype ();
}
+
+ [MethodImplAttribute (MethodImplOptions.NoInlining)]
+ public AnEnum enum_ret<T, T2>(T t, T2 t2) where T : IReturnVType {
+ return t.return_enum ();
+ }
}
class ReturnVType : IReturnVType {
public Pair<int, int> return_vtype () {
return new Pair<int, int> () { First = 1, Second = 2 };
}
+ public AnEnum return_enum () {
+ return AnEnum.Two;
+ }
}
public static int test_0_constrained_vtype_ret () {
return 0;
}
+ public static int test_0_constrained_enum_ret () {
+ IConstrainedCalls c = new CConstrainedCalls ();
+ var r = c.enum_ret<ReturnVType, int> (new ReturnVType (), 1);
+ if (r != AnEnum.Two)
+ return 1;
+ return 0;
+ }
+
public struct Pair<T1, T2> {
public T1 First;
public T2 Second;
--- /dev/null
+#ifndef __MONO_MINI_INTERPRETER_INTERNALS_H__
+#define __MONO_MINI_INTERPRETER_INTERNALS_H__
+
+#include <setjmp.h>
+#include <glib.h>
+#include <mono/metadata/loader.h>
+#include <mono/metadata/object.h>
+#include <mono/metadata/domain-internals.h>
+#include <mono/metadata/class-internals.h>
+#include "config.h"
+
+enum {
+ VAL_I32 = 0,
+ VAL_DOUBLE = 1,
+ VAL_I64 = 2,
+ VAL_VALUET = 3,
+ VAL_POINTER = 4,
+ VAL_NATI = 0 + VAL_POINTER,
+ VAL_MP = 1 + VAL_POINTER,
+ VAL_TP = 2 + VAL_POINTER,
+ VAL_OBJ = 3 + VAL_POINTER
+};
+
+#if SIZEOF_VOID_P == 4
+typedef guint32 mono_u;
+typedef gint32 mono_i;
+#elif SIZEOF_VOID_P == 8
+typedef guint64 mono_u;
+typedef gint64 mono_i;
+#endif
+
+/*
+ * Value types are represented on the eval stack as pointers to the
+ * actual storage. The size field tells how much storage is allocated.
+ * A value type can't be larger than 16 MB.
+ */
+typedef struct {
+ union {
+ gint32 i;
+ gint64 l;
+ double f;
+ /* native size integer and pointer types */
+ gpointer p;
+ mono_u nati;
+ gpointer vt;
+ } data;
+#if defined(__ppc__) || defined(__powerpc__)
+ int pad;
+#endif
+} stackval;
+
+typedef struct _MonoInvocation MonoInvocation;
+
+typedef void (*MonoFuncV) (void);
+typedef void (*MonoPIFunc) (MonoFuncV callme, void *margs);
+
+/*
+ * Structure representing a method transformed for the interpreter
+ * This is domain specific
+ */
+typedef struct _RuntimeMethod
+{
+ /* NOTE: These first two elements (method and
+ next_jit_code_hash) must be in the same order and at the
+ same offset as in MonoJitInfo, because of the jit_code_hash
+ internal hash table in MonoDomain. */
+ MonoMethod *method;
+ struct _RuntimeMethod *next_jit_code_hash;
+ guint32 locals_size;
+ guint32 args_size;
+ guint32 stack_size;
+ guint32 vt_stack_size;
+ guint32 alloca_size;
+ unsigned short *code;
+ unsigned short *new_body_start; /* after all STINARG instrs */
+ MonoPIFunc func;
+ int num_clauses;
+ MonoExceptionClause *clauses;
+ void **data_items;
+ int transformed;
+ guint32 *arg_offsets;
+ guint32 *local_offsets;
+ unsigned int param_count;
+ unsigned int hasthis;
+ unsigned int valuetype;
+} RuntimeMethod;
+
+struct _MonoInvocation {
+ MonoInvocation *parent; /* parent */
+ RuntimeMethod *runtime_method; /* parent */
+ MonoMethod *method; /* parent */
+ stackval *retval; /* parent */
+ char *args;
+ stackval *stack_args; /* parent */
+ stackval *stack;
+ stackval *sp; /* For GC stack marking */
+ /* exception info */
+ unsigned char invoke_trap;
+ const unsigned short *ip;
+ MonoException *ex;
+ MonoExceptionClause *ex_handler;
+};
+
+typedef struct {
+ MonoDomain *domain;
+ MonoInvocation *base_frame;
+ MonoInvocation *current_frame;
+ MonoInvocation *env_frame;
+ jmp_buf *current_env;
+ unsigned char search_for_handler;
+ unsigned char managed_code;
+} ThreadContext;
+
+extern int mono_interp_traceopt;
+
+MonoException *
+mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *context);
+
+MonoDelegate*
+mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn);
+
+void
+mono_interp_transform_init (void);
+
+RuntimeMethod *
+mono_interp_get_runtime_method (MonoDomain *domain, MonoMethod *method, MonoError *error);
+
+#endif /* __MONO_MINI_INTERPRETER_INTERNALS_H__ */
#include <mono/metadata/mono-debug.h>
#include "interp.h"
+#include "interp-internals.h"
#include "mintops.h"
#include "hacks.h"
#include <mono/mini/mini.h>
+#include <mono/mini/jit-icalls.h>
/* Mingw 2.1 doesnt need this any more, but leave it in for now for older versions */
#if DEBUG_INTERP
int mono_interp_traceopt = 2;
/* If true, then we output the opcodes as we interpret them */
-static int global_tracing = 1;
+static int global_tracing = 2;
static int debug_indent_level = 0;
mono_interp_get_runtime_method (MonoDomain *domain, MonoMethod *method, MonoError *error)
{
RuntimeMethod *rtm;
- mono_error_init (error);
+ error_init (error);
mono_os_mutex_lock (&runtime_method_lookup_section);
if ((rtm = mono_internal_hash_table_lookup (&domain->jit_code_hash, method))) {
return ret;
}
+ mono_class_setup_vtable (obj->vtable->klass);
+
int slot = mono_method_get_vtable_slot (m);
if (mono_class_is_interface (m->klass)) {
g_assert (obj->vtable->klass != m->klass);
if (type->data.klass->enumtype) {
stackval_from_data (mono_class_enum_basetype (type->data.klass), result, data, pinvoke);
return;
- } else {
- int size;
-
- if (pinvoke)
- size = mono_class_native_size (type->data.klass, NULL);
- else
- size = mono_class_value_size (type->data.klass, NULL);
- memcpy (result->data.vt, data, size);
- }
+ } else
+ mono_value_copy (result->data.vt, data, type->data.klass);
+ return;
+ case MONO_TYPE_GENERICINST:
+ stackval_from_data (&type->data.generic_class->container_class->byval_arg, result, data, pinvoke);
return;
default:
g_warning ("got type 0x%02x", type->type);
if (type->data.klass->enumtype) {
stackval_to_data (mono_class_enum_basetype (type->data.klass), val, data, pinvoke);
return;
- } else {
- int size;
-
- if (pinvoke)
- size = mono_class_native_size (type->data.klass, NULL);
- else
- size = mono_class_value_size (type->data.klass, NULL);
-
- memcpy (data, val->data.p, size);
- }
+ } else
+ mono_value_copy (data, val->data.vt, type->data.klass);
return;
case MONO_TYPE_GENERICINST:
stackval_to_data (&type->data.generic_class->container_class->byval_arg, val, data, pinvoke);
case MONO_TYPE_OBJECT:
case MONO_TYPE_STRING:
case MONO_TYPE_I8:
+ case MONO_TYPE_VALUETYPE:
margs->ilen++;
break;
default:
if (margs->ilen > 0)
margs->iargs = g_malloc0 (sizeof (gpointer) * margs->ilen);
- if (margs->ilen > 3)
- g_error ("build_args_from_sig: TODO, more than two iregs: %d\n", margs->ilen);
+ if (margs->ilen > 6)
+ g_error ("build_args_from_sig: TODO, more than 6 iregs: %d\n", margs->ilen);
if (margs->flen > 0)
g_error ("build_args_from_sig: TODO, allocate floats: %d\n", margs->flen);
case MONO_TYPE_OBJECT:
case MONO_TYPE_STRING:
case MONO_TYPE_I8:
+ case MONO_TYPE_VALUETYPE:
margs->iargs [int_i] = frame->stack_args [i].data.p;
#if DEBUG_INTERP
g_print ("build_args_from_sig: margs->iargs[%d]: %p (frame @ %d)\n", int_i, margs->iargs[int_i], i);
#endif
MonoObject*
-interp_mono_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error)
+mono_interp_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error)
{
MonoInvocation frame;
ThreadContext * volatile context = mono_native_tls_get_value (thread_context_id);
MonoInvocation *old_frame = NULL;
jmp_buf env;
- mono_error_init (error);
+ error_init (error);
frame.ex = NULL;
static GHashTable *method_pointer_hash = NULL;
+static MonoMethod *method_pointers [2] = {0};
+
+static MonoObject *
+mp_tramp_0 (MonoObject *this_obj, void **params, MonoObject **exc, void *compiled_method) {
+ MonoError error;
+ void *params_real[] = {this_obj, ¶ms, &exc, &compiled_method};
+ MonoObject *ret = mono_interp_runtime_invoke (method_pointers [0], NULL, params_real, NULL, &error);
+ mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+ return ret;
+}
+
+static MonoObject *
+mp_tramp_1 (MonoObject *this_obj, void **params, MonoObject **exc, void *compiled_method) {
+ MonoError error;
+ void *params_real[] = {this_obj, ¶ms, &exc, &compiled_method};
+ MonoObject *ret = mono_interp_runtime_invoke (method_pointers [1], NULL, params_real, NULL, &error);
+ mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+ return ret;
+}
+
+gpointer *mp_tramps[] = {(gpointer) mp_tramp_0, (gpointer) mp_tramp_1};
+
+static int tramps_used = 0;
+
gpointer
-interp_create_method_pointer (MonoMethod *method, MonoError *error)
+mono_interp_create_method_pointer (MonoMethod *method, MonoError *error)
{
gpointer addr;
MonoJitInfo *ji;
mono_jit_info_table_add (mono_get_root_domain (), ji);
}
else {
- g_error ("FIXME: not available? figure out new API");
-#if 0
- addr = mono_arch_create_method_pointer (method);
-#endif
+ g_assert (method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE);
+ g_assert (tramps_used < 2);
+
+ /* FIXME: needs locking */
+ method_pointers [tramps_used] = method;
+ addr = mp_tramps [tramps_used];
+ tramps_used++;
}
g_hash_table_insert (method_pointer_hash, method, addr);
if (csignature->hasthis)
--sp;
child_frame.stack_args = sp;
- if (csignature->hasthis && mono_object_is_transparent_proxy (sp->data.p)) {
+
+ /* `this' can be NULL for string:.ctor */
+ if (csignature->hasthis && sp->data.p && mono_object_is_transparent_proxy (sp->data.p)) {
child_frame.runtime_method = mono_interp_get_runtime_method (context->domain, mono_marshal_get_remoting_invoke (child_frame.runtime_method->method), &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
} else if (child_frame.runtime_method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) {
if (child_frame.runtime_method->hasthis)
--sp;
child_frame.stack_args = sp;
- if (child_frame.runtime_method->hasthis && !child_frame.runtime_method->valuetype && mono_object_is_transparent_proxy (sp->data.p)) {
+
+ /* `this' can be NULL for string:.ctor */
+ if (child_frame.runtime_method->hasthis && !child_frame.runtime_method->valuetype && sp->data.p && mono_object_is_transparent_proxy (sp->data.p)) {
child_frame.runtime_method = mono_interp_get_runtime_method (context->domain, mono_marshal_get_remoting_invoke (child_frame.runtime_method->method), &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
}
child_frame.runtime_method = get_virtual_method (context->domain, child_frame.runtime_method, this_arg);
if (this_arg->vtable->klass->valuetype && child_frame.runtime_method->valuetype) {
- sp->data.p = (char *) this_arg + sizeof (MonoObject);
+ /* unbox */
+ gpointer *unboxed = mono_object_unbox (this_arg);
+ stackval_from_data (&this_arg->vtable->klass->byval_arg, sp, (char *) unboxed, FALSE);
}
ves_exec_method_with_context (&child_frame, context);
child_frame.runtime_method = get_virtual_method (context->domain, child_frame.runtime_method, this_arg);
if (this_arg->vtable->klass->valuetype && child_frame.runtime_method->valuetype) {
- sp->data.p = (char *) this_arg + sizeof (MonoObject);
+ gpointer *unboxed = mono_object_unbox (this_arg);
+ stackval_from_data (&this_arg->vtable->klass->byval_arg, sp, (char *) unboxed, FALSE);
}
ves_exec_method_with_context (&child_frame, context);
++ip;
sp[-1].data.l = *(gint64*)sp[-1].data.p;
MINT_IN_BREAK;
- MINT_IN_CASE(MINT_LDIND_I)
- ++ip;
- sp[-1].data.p = *(gpointer*)sp[-1].data.p;
+ MINT_IN_CASE(MINT_LDIND_I) {
+ guint16 offset = * (guint16 *)(ip + 1);
+ sp[-1 - offset].data.p = *(gpointer*)sp[-1 - offset].data.p;
+ ip += 2;
MINT_IN_BREAK;
+ }
MINT_IN_CASE(MINT_LDIND_R4)
++ip;
sp[-1].data.f = *(gfloat*)sp[-1].data.p;
mono_thread_interruption_checkpoint ();
sp->data.p = o;
} else {
+ sp->data.p = NULL;
child_frame.retval = &retval;
}
}
}
MINT_IN_CASE(MINT_LDSFLDA) {
MonoClassField *field = rtm->data_items[*(guint16 *)(ip + 1)];
- MonoVTable *vt = mono_class_vtable (context->domain, field->parent);
- gpointer addr;
-
- if (!vt->initialized) {
- frame->ip = ip;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
+ sp->data.p = mono_class_static_field_address (context->domain, field);
ip += 2;
-
- if (context->domain->special_static_fields && (addr = g_hash_table_lookup (context->domain->special_static_fields, field)))
- sp->data.p = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
- else
- sp->data.p = (char*)(vt->vtable) + field->offset;
++sp;
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_LDSFLD) {
- MonoVTable *vt;
- MonoClassField *field;
- gpointer addr;
-
- field = rtm->data_items[*(guint16 *)(ip + 1)];
- vt = rtm->data_items [*(guint16 *)(ip + 2)];
- if (!vt->initialized) {
- frame->ip = ip;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
- ip += 3;
- if (context->domain->special_static_fields && (addr = g_hash_table_lookup (context->domain->special_static_fields, field)))
- addr = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
- else
- addr = (char*)(vt->vtable) + field->offset;
-
+ MonoClassField *field = rtm->data_items [* (guint16 *)(ip + 1)];
+ gpointer addr = mono_class_static_field_address (context->domain, field);
stackval_from_data (field->type, sp, addr, FALSE);
- ++sp;
- MINT_IN_BREAK;
- }
- MINT_IN_CASE(MINT_LDSFLD_I4) {
- MonoClassField *field = rtm->data_items[*(guint16 *)(ip + 1)];
- MonoVTable *vt = rtm->data_items [*(guint16 *)(ip + 2)];
- if (!vt->initialized) {
- frame->ip = ip;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
- ip += 3;
- sp->data.i = * (gint32 *)((char*)(vt->vtable) + field->offset);
- ++sp;
- MINT_IN_BREAK;
- }
- MINT_IN_CASE(MINT_LDSFLD_O) {
- MonoClassField *field = rtm->data_items[*(guint16 *)(ip + 1)];
- MonoVTable *vt = rtm->data_items [*(guint16 *)(ip + 2)];
- if (!vt->initialized) {
- frame->ip = ip;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
- ip += 3;
- sp->data.p = * (gpointer *)((char*)(vt->vtable) + field->offset);
+ ip += 2;
++sp;
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_LDSFLD_VT) {
- MonoVTable *vt;
- MonoClassField *field;
- guint32 token;
- gpointer addr;
- int size;
-
- token = * (guint16 *)(ip + 1);
- size = READ32(ip + 2);
- field = rtm->data_items[token];
+ MonoClassField *field = rtm->data_items [* (guint16 *)(ip + 1)];
+ gpointer addr = mono_class_static_field_address (context->domain, field);
+ int size = READ32 (ip + 2);
ip += 4;
-
- vt = mono_class_vtable (context->domain, field->parent);
- if (!vt->initialized) {
- frame->ip = ip - 2;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
-
- if (context->domain->special_static_fields && (addr = g_hash_table_lookup (context->domain->special_static_fields, field)))
- addr = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
- else
- addr = (char*)(vt->vtable) + field->offset;
sp->data.p = vt_sp;
vt_sp += (size + 7) & ~7;
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_STSFLD) {
- MonoVTable *vt;
- MonoClassField *field;
- guint32 token;
- gpointer addr;
-
- token = * (guint16 *)(ip + 1);
- field = rtm->data_items[token];
+ MonoClassField *field = rtm->data_items [* (guint16 *)(ip + 1)];
+ gpointer addr = mono_class_static_field_address (context->domain, field);
ip += 2;
--sp;
-
- vt = mono_class_vtable (context->domain, field->parent);
- if (!vt->initialized) {
- frame->ip = ip - 2;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
-
- if (context->domain->special_static_fields && (addr = g_hash_table_lookup (context->domain->special_static_fields, field)))
- addr = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
- else
- addr = (char*)(vt->vtable) + field->offset;
-
stackval_to_data (field->type, sp, addr, FALSE);
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_STSFLD_VT) {
- MonoVTable *vt;
- MonoClassField *field;
- guint32 token;
- gpointer addr;
- int size;
-
- token = * (guint16 *)(ip + 1);
- size = READ32(ip + 2);
- field = rtm->data_items[token];
+ MonoClassField *field = rtm->data_items [* (guint16 *)(ip + 1)];
+ gpointer addr = mono_class_static_field_address (context->domain, field);
+ int size = READ32 (ip + 2);
ip += 4;
-
- vt = mono_class_vtable (context->domain, field->parent);
- if (!vt->initialized) {
- frame->ip = ip - 2;
- mono_runtime_class_init_full (vt, &error);
- mono_error_cleanup (&error); /* FIXME: don't swallow the error */
- }
-
- if (context->domain->special_static_fields && (addr = g_hash_table_lookup (context->domain->special_static_fields, field)))
- addr = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
- else
- addr = (char*)(vt->vtable) + field->offset;
+
--sp;
stackval_to_data (field->type, sp, addr, FALSE);
vt_sp -= (size + 7) & ~7;
sp [-1].data.i = (mono_u)sp [-1].data.l;
++ip;
MINT_IN_BREAK;
- MINT_IN_CASE(MINT_BOX)
+ MINT_IN_CASE(MINT_BOX) {
c = rtm->data_items [* (guint16 *)(ip + 1)];
+ guint16 offset = * (guint16 *)(ip + 2);
if (c->byval_arg.type == MONO_TYPE_VALUETYPE && !c->enumtype) {
int size = mono_class_value_size (c, NULL);
- sp [-1].data.p = mono_value_box_checked (context->domain, c, sp [-1].data.p, &error);
+ sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, sp [-1 - offset].data.p, &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
size = (size + 7) & ~7;
vt_sp -= size;
- }
- else {
- stackval_to_data (&c->byval_arg, &sp [-1], (char*)&sp [-1], FALSE);
- sp [-1].data.p = mono_value_box_checked (context->domain, c, &sp [-1], &error);
+ } else {
+ stackval_to_data (&c->byval_arg, &sp [-1 - offset], (char *) &sp [-1 - offset], FALSE);
+ sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, &sp [-1 - offset], &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
}
- ip += 2;
+ ip += 3;
MINT_IN_BREAK;
+ }
MINT_IN_CASE(MINT_NEWARR)
sp [-1].data.p = (MonoObject*) mono_array_new_checked (context->domain, rtm->data_items[*(guint16 *)(ip + 1)], sp [-1].data.i, &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
MINT_IN_CASE(MINT_LDELEM_I) /* fall through */
MINT_IN_CASE(MINT_LDELEM_R4) /* fall through */
MINT_IN_CASE(MINT_LDELEM_R8) /* fall through */
- MINT_IN_CASE(MINT_LDELEM_REF) {
+ MINT_IN_CASE(MINT_LDELEM_REF) /* fall through */
+ MINT_IN_CASE(MINT_LDELEM_VT) {
MonoArray *o;
mono_u aindex;
case MINT_LDELEM_REF:
sp [0].data.p = mono_array_get (o, gpointer, aindex);
break;
+ case MINT_LDELEM_VT: {
+ MonoClass *klass_vt = rtm->data_items [*(guint16 *) (ip + 1)];
+ i32 = READ32 (ip + 2);
+ char *src_addr = mono_array_addr_with_size ((MonoArray *) o, i32, aindex);
+ sp [0].data.vt = vt_sp;
+ stackval_from_data (&klass_vt->byval_arg, sp, src_addr, FALSE);
+ vt_sp += (i32 + 7) & ~7;
+ ip += 3;
+ break;
+ }
default:
ves_abort();
}
MINT_IN_CASE(MINT_STELEM_I8) /* fall through */
MINT_IN_CASE(MINT_STELEM_R4) /* fall through */
MINT_IN_CASE(MINT_STELEM_R8) /* fall through */
- MINT_IN_CASE(MINT_STELEM_REF) {
+ MINT_IN_CASE(MINT_STELEM_REF) /* fall through */
+ MINT_IN_CASE(MINT_STELEM_VT) {
mono_u aindex;
sp -= 3;
if (sp [2].data.p && !isinst_obj)
THROW_EX (mono_get_exception_array_type_mismatch (), ip);
mono_array_set ((MonoArray *)o, gpointer, aindex, sp [2].data.p);
- } break;
+ break;
+ }
+ case MINT_STELEM_VT: {
+ MonoClass *klass_vt = rtm->data_items [*(guint16 *) (ip + 1)];
+ i32 = READ32 (ip + 2);
+ char *dst_addr = mono_array_addr_with_size ((MonoArray *) o, i32, aindex);
+
+ stackval_to_data (&klass_vt->byval_arg, &sp [2], dst_addr, FALSE);
+ vt_sp -= (i32 + 7) & ~7;
+ ip += 3;
+ break;
+ }
default:
ves_abort();
}
g_timer_start (timer);
for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) {
+ MonoObject *exc = NULL;
MonoError error;
MonoMethod *method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL, NULL, &error);
if (!method) {
} else {
filter = strcmp (method->name, name) == 0;
}
- } else { // no filter
+ } else { /* no filter, check for `Category' attribute on method */
filter = TRUE;
+ MonoCustomAttrInfo* ainfo = mono_custom_attrs_from_method_checked (method, &error);
+ mono_error_cleanup (&error);
+
+ if (ainfo) {
+ int j;
+ for (j = 0; j < ainfo->num_attrs && filter; ++j) {
+ MonoCustomAttrEntry *centry = &ainfo->attrs [j];
+ if (centry->ctor == NULL)
+ continue;
+
+ MonoClass *klass = centry->ctor->klass;
+ if (strcmp (klass->name, "CategoryAttribute"))
+ continue;
+
+ MonoObject *obj = mono_custom_attrs_get_attr_checked (ainfo, klass, &error);
+ /* FIXME: there is an ordering problem if there're multiple attributes, do this instead:
+ * MonoObject *obj = create_custom_attr (ainfo->image, centry->ctor, centry->data, centry->data_size, &error); */
+ mono_error_cleanup (&error);
+ MonoMethod *getter = mono_class_get_method_from_name (klass, "get_Category", -1);
+ MonoObject *str = mono_interp_runtime_invoke (getter, obj, NULL, &exc, &error);
+ mono_error_cleanup (&error);
+ char *utf8_str = mono_string_to_utf8_checked ((MonoString *) str, &error);
+ mono_error_cleanup (&error);
+ if (!strcmp (utf8_str, "!INTERPRETER")) {
+ g_print ("skip %s...\n", method->name);
+ filter = FALSE;
+ }
+ }
+ }
}
if (strncmp (method->name, "test_", 5) == 0 && filter) {
MonoError interp_error;
MonoObject *exc = NULL;
- result_obj = interp_mono_runtime_invoke (method, NULL, NULL, &exc, &interp_error);
+ result_obj = mono_interp_runtime_invoke (method, NULL, NULL, &exc, &interp_error);
if (!mono_error_ok (&interp_error)) {
cfailed++;
g_print ("Test '%s' execution failed.\n", method->name);
}
int
-interp_regression_list (int verbose, int count, char *images [])
+mono_interp_regression_list (int verbose, int count, char *images [])
{
int i, total, total_run, run;
-#include <setjmp.h>
-#include <glib.h>
-#include <mono/metadata/loader.h>
-#include <mono/metadata/object.h>
-#include <mono/metadata/domain-internals.h>
-#include <mono/metadata/class-internals.h>
-#include "config.h"
-
-enum {
- VAL_I32 = 0,
- VAL_DOUBLE = 1,
- VAL_I64 = 2,
- VAL_VALUET = 3,
- VAL_POINTER = 4,
- VAL_NATI = 0 + VAL_POINTER,
- VAL_MP = 1 + VAL_POINTER,
- VAL_TP = 2 + VAL_POINTER,
- VAL_OBJ = 3 + VAL_POINTER
-};
-
-#if SIZEOF_VOID_P == 4
-typedef guint32 mono_u;
-typedef gint32 mono_i;
-#elif SIZEOF_VOID_P == 8
-typedef guint64 mono_u;
-typedef gint64 mono_i;
-#endif
-
-/*
- * Value types are represented on the eval stack as pointers to the
- * actual storage. The size field tells how much storage is allocated.
- * A value type can't be larger than 16 MB.
- */
-typedef struct {
- union {
- gint32 i;
- gint64 l;
- double f;
- /* native size integer and pointer types */
- gpointer p;
- mono_u nati;
- gpointer vt;
- } data;
-#if defined(__ppc__) || defined(__powerpc__)
- int pad;
-#endif
-} stackval;
-
-typedef struct _MonoInvocation MonoInvocation;
-
-typedef void (*MonoFuncV) (void);
-typedef void (*MonoPIFunc) (MonoFuncV callme, void *margs);
-
-/*
- * Structure representing a method transformed for the interpreter
- * This is domain specific
- */
-typedef struct _RuntimeMethod
-{
- /* NOTE: These first two elements (method and
- next_jit_code_hash) must be in the same order and at the
- same offset as in MonoJitInfo, because of the jit_code_hash
- internal hash table in MonoDomain. */
- MonoMethod *method;
- struct _RuntimeMethod *next_jit_code_hash;
- guint32 locals_size;
- guint32 args_size;
- guint32 stack_size;
- guint32 vt_stack_size;
- guint32 alloca_size;
- unsigned short *code;
- unsigned short *new_body_start; /* after all STINARG instrs */
- MonoPIFunc func;
- int num_clauses;
- MonoExceptionClause *clauses;
- void **data_items;
- int transformed;
- guint32 *arg_offsets;
- guint32 *local_offsets;
- unsigned int param_count;
- unsigned int hasthis;
- unsigned int valuetype;
-} RuntimeMethod;
-
-struct _MonoInvocation {
- MonoInvocation *parent; /* parent */
- RuntimeMethod *runtime_method; /* parent */
- MonoMethod *method; /* parent */
- stackval *retval; /* parent */
- char *args;
- stackval *stack_args; /* parent */
- stackval *stack;
- stackval *sp; /* For GC stack marking */
- /* exception info */
- unsigned char invoke_trap;
- const unsigned short *ip;
- MonoException *ex;
- MonoExceptionClause *ex_handler;
-};
-
-typedef struct {
- MonoDomain *domain;
- MonoInvocation *base_frame;
- MonoInvocation *current_frame;
- MonoInvocation *env_frame;
- jmp_buf *current_env;
- unsigned char search_for_handler;
- unsigned char managed_code;
-} ThreadContext;
-
-void mono_init_icall (void);
-
-MonoException *
-mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *context);
-
-MonoDelegate*
-mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn);
+#ifndef __MONO_MINI_INTERPRETER_H__
+#define __MONO_MINI_INTERPRETER_H__
+#include <mono/mini/mini.h>
int
-interp_regression_list (int verbose, int count, char *images []);
+mono_interp_regression_list (int verbose, int count, char *images []);
void
-mono_interp_transform_init (void);
-
-static void inline stackval_from_data (MonoType *type, stackval *result, char *data, gboolean pinvoke);
-static void inline stackval_to_data (MonoType *type, stackval *val, char *data, gboolean pinvoke);
-void ves_exec_method (MonoInvocation *frame);
-
-/*
- * defined in an arch specific file.
- */
-MonoPIFunc
-mono_arch_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor);
+mono_interp_init (void);
-RuntimeMethod *
-mono_interp_get_runtime_method (MonoDomain *domain, MonoMethod *method, MonoError *error);
+gpointer
+mono_interp_create_method_pointer (MonoMethod *method, MonoError *error);
-void *mono_arch_create_method_pointer (MonoMethod *method);
+MonoObject*
+mono_interp_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error);
-extern int mono_interp_traceopt;
+#endif /* __MONO_MINI_INTERPRETER_H__ */
OPDEF(MINT_STRMFLD, "strmfld", 2, MintOpFieldToken)
OPDEF(MINT_STRMFLD_VT, "strmfld.vt", 4, MintOpShortAndInt)
-OPDEF(MINT_LDSFLD, "ldsfld", 3, MintOpTwoShorts)
-OPDEF(MINT_LDSFLD_I4, "ldsfld.i4", 3, MintOpTwoShorts)
-OPDEF(MINT_LDSFLD_O, "ldsfld.o", 3, MintOpTwoShorts)
+OPDEF(MINT_LDSFLD, "ldsfld", 2, MintOpFieldToken)
OPDEF(MINT_LDSFLD_VT, "ldsfld.vt", 4, MintOpShortAndInt)
OPDEF(MINT_STSFLD, "stsfld", 2, MintOpUShortInt)
OPDEF(MINT_STSFLD_VT, "stsfld.vt", 4, MintOpShortAndInt)
OPDEF(MINT_LDIND_I4, "ldind.i4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_U4, "ldind.u4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_I8, "ldind.i8", 1, MintOpNoArgs)
-OPDEF(MINT_LDIND_I, "ldind.i", 1, MintOpNoArgs)
+OPDEF(MINT_LDIND_I, "ldind.i", 2, MintOpUShortInt)
OPDEF(MINT_LDIND_R4, "ldind.r4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_R8, "ldind.r8", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_REF, "ldind.ref", 1, MintOpNoArgs)
OPDEF(MINT_CASTCLASS, "castclass", 2, MintOpClassToken)
OPDEF(MINT_ISINST, "isinst", 2, MintOpClassToken)
OPDEF(MINT_NEWARR, "newarr", 2, MintOpClassToken)
-OPDEF(MINT_BOX, "box", 2, MintOpClassToken)
+OPDEF(MINT_BOX, "box", 3, MintOpTwoShorts)
OPDEF(MINT_UNBOX, "unbox", 2, MintOpClassToken)
OPDEF(MINT_LDTOKEN, "ldtoken", 2, MintOpClassToken) /* not really */
OPDEF(MINT_LDFTN, "ldftn", 2, MintOpMethodToken)
OPDEF(MINT_LDELEM_R4, "ldelem.r4", 1, MintOpNoArgs)
OPDEF(MINT_LDELEM_R8, "ldelem.r8", 1, MintOpNoArgs)
OPDEF(MINT_LDELEM_REF, "ldelem.ref", 1, MintOpNoArgs)
+OPDEF(MINT_LDELEM_VT, "ldelem.vt", 4, MintOpShortAndInt)
OPDEF(MINT_LDELEMA, "ldelema", 2, MintOpClassToken)
OPDEF(MINT_STELEM_R4, "stelem.r4", 1, MintOpNoArgs)
OPDEF(MINT_STELEM_R8, "stelem.r8", 1, MintOpNoArgs)
OPDEF(MINT_STELEM_REF, "stelem.ref", 1, MintOpNoArgs)
+OPDEF(MINT_STELEM_VT, "stelem.vt", 4, MintOpShortAndInt)
OPDEF(MINT_LDLEN, "ldlen", 1, MintOpNoArgs)
#include <mono/mini/mini.h>
#include "mintops.h"
+#include "interp-internals.h"
#include "interp.h"
// TODO: export from marshal.c
WRITE32 (td, &size);
}
} else {
- ADD_CODE(td, MINT_LDARG_I1 + (mt - MINT_TYPE_I1));
- ADD_CODE(td, td->rtm->arg_offsets [n]); /* FIX for large offset */
- if (mt == MINT_TYPE_O)
- klass = mono_class_from_mono_type (type);
+ if (hasthis && n == 0) {
+ mt = MINT_TYPE_P;
+ ADD_CODE (td, MINT_LDARG_P);
+ ADD_CODE (td, td->rtm->arg_offsets [n]); /* FIX for large offset */
+ klass = NULL;
+ } else {
+ ADD_CODE(td, MINT_LDARG_I1 + (mt - MINT_TYPE_I1));
+ ADD_CODE(td, td->rtm->arg_offsets [n]); /* FIX for large offset */
+ if (mt == MINT_TYPE_O)
+ klass = mono_class_from_mono_type (type);
+ }
}
PUSH_TYPE(td, stack_type[mt], klass);
}
type = mono_method_signature (td->method)->params [n - !!hasthis];
int mt = mint_type (type);
+ if (hasthis && n == 0) {
+ ADD_CODE (td, MINT_STINARG_P);
+ ADD_CODE (td, n);
+ return;
+ }
if (mt == MINT_TYPE_VT) {
- if (hasthis && n == 0) {
- ADD_CODE (td, MINT_STINARG_P);
- ADD_CODE (td, n);
- return;
- }
MonoClass *klass = mono_class_from_mono_type (type);
gint32 size;
if (mono_method_signature (td->method)->pinvoke)
}
static void
-interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target_method, MonoDomain *domain, MonoGenericContext *generic_context, unsigned char *is_bb_start, int body_start_offset)
+interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target_method, MonoDomain *domain, MonoGenericContext *generic_context, unsigned char *is_bb_start, int body_start_offset, MonoClass *constrained_class)
{
MonoImage *image = method->klass->image;
MonoMethodSignature *csignature;
csignature = mono_method_signature (target_method);
}
+ if (constrained_class) {
+ if (constrained_class->enumtype && !strcmp (target_method->name, "GetHashCode")) {
+ /* Use the corresponding method from the base type to avoid boxing */
+ MonoType *base_type = mono_class_enum_basetype (constrained_class);
+ g_assert (base_type);
+ constrained_class = mono_class_from_mono_type (base_type);
+ target_method = mono_class_get_method_from_name (constrained_class, target_method->name, 0);
+ g_assert (target_method);
+ }
+ }
+
+ if (constrained_class) {
+ mono_class_setup_vtable (constrained_class);
+#if DEBUG_INTERP
+ g_print ("CONSTRAINED.CALLVIRT: %s::%s. %s (%p) ->\n", target_method->klass->name, target_method->name, mono_signature_full_name (target_method->signature), target_method);
+#endif
+ target_method = mono_get_method_constrained_with_method (image, target_method, constrained_class, generic_context, &error);
+#if DEBUG_INTERP
+ g_print (" : %s::%s. %s (%p)\n", target_method->klass->name, target_method->name, mono_signature_full_name (target_method->signature), target_method);
+#endif
+ mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+ mono_class_setup_vtable (target_method->klass);
+
+ if (constrained_class->valuetype && (target_method->klass == mono_defaults.object_class || target_method->klass == mono_defaults.enum_class->parent || target_method->klass == mono_defaults.enum_class)) {
+ ADD_CODE (td, MINT_BOX);
+ ADD_CODE (td, get_data_item_index (td, constrained_class));
+ ADD_CODE (td, csignature->param_count);
+ } else if (!constrained_class->valuetype) {
+ /* managed pointer on the stack, we need to deref that puppy */
+ ADD_CODE (td, MINT_LDIND_I);
+ ADD_CODE (td, csignature->param_count);
+ } else {
+ g_assert (target_method->klass->valuetype);
+ virtual = FALSE;
+ }
+ }
+
+ if (target_method)
+ mono_class_init (target_method->klass);
+
CHECK_STACK (td, csignature->param_count + csignature->hasthis);
if (!calli && (!virtual || (target_method->flags & METHOD_ATTRIBUTE_VIRTUAL) == 0) &&
(target_method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) == 0 &&
MonoImage *image = method->klass->image;
MonoDomain *domain = mono_domain_get ();
MonoGenericContext *generic_context = NULL;
+ MonoClass *constrained_class = NULL;
MonoError error;
int offset, mt;
int i;
td.ip += 2;
break;
case CEE_LDARGA_S: {
+ /* NOTE: n includes this */
int n = ((guint8 *)td.ip)[1];
if (n == 0 && signature->hasthis) {
g_error ("LDTHISA: NOPE");
}
else {
ADD_CODE(&td, MINT_LDARGA);
- ADD_CODE(&td, td.rtm->arg_offsets [n - signature->hasthis]);
+ ADD_CODE(&td, td.rtm->arg_offsets [n]);
}
PUSH_SIMPLE_TYPE(&td, STACK_TYPE_MP);
td.ip += 2;
case CEE_CALLVIRT: /* Fall through */
case CEE_CALLI: /* Fall through */
case CEE_CALL: {
- interp_transform_call (&td, method, NULL, domain, generic_context, is_bb_start, body_start_offset);
+ interp_transform_call (&td, method, NULL, domain, generic_context, is_bb_start, body_start_offset, constrained_class);
+ constrained_class = NULL;
break;
}
case CEE_RET: {
case CEE_LDIND_I:
CHECK_STACK (&td, 1);
SIMPLE_OP (td, MINT_LDIND_I);
+ ADD_CODE (&td, 0);
SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I);
break;
case CEE_LDIND_R4:
} else if (mono_class_is_nullable (klass)) {
MonoMethod *target_method = mono_class_get_method_from_name (klass, "Unbox", 1);
/* td.ip is incremented by interp_transform_call */
- interp_transform_call (&td, method, target_method, domain, generic_context, is_bb_start, body_start_offset);
+ interp_transform_call (&td, method, target_method, domain, generic_context, is_bb_start, body_start_offset, NULL);
} else {
int mt = mint_type (&klass->byval_arg);
ADD_CODE (&td, MINT_UNBOX);
int size = mono_class_value_size (klass, NULL);
size = (size + 7) & ~7;
td.vt_sp -= size;
+ ADD_CODE (&td, MINT_VTRESULT);
+ ADD_CODE (&td, 0);
+ WRITE32 (&td, &size);
}
td.ip += 5;
SET_TYPE(td.sp - 1, stack_type [mt], field_klass);
ADD_CODE(&td, get_data_item_index (&td, field));
klass = NULL;
if (mt == MINT_TYPE_VT) {
- g_error ("data.klass");
- int size = mono_class_value_size (field->type->data.klass, NULL);
+ MonoClass *klass = mono_class_from_mono_type (field->type);
+ int size = mono_class_value_size (klass, NULL);
PUSH_VT(&td, size);
WRITE32(&td, &size);
klass = field->type->data.klass;
} else {
if (mt == MINT_TYPE_O)
klass = mono_class_from_mono_type (field->type);
- if (!domain->special_static_fields || !g_hash_table_lookup (domain->special_static_fields, field)) {
- if (mt == MINT_TYPE_O)
- td.new_ip [-2] = MINT_LDSFLD_O;
- else if (mt == MINT_TYPE_I4)
- td.new_ip [-2] = MINT_LDSFLD_I4;
- }
- ADD_CODE(&td, get_data_item_index (&td, mono_class_vtable (domain, field->parent)));
}
td.ip += 5;
PUSH_TYPE(&td, stack_type [mt], klass);
ADD_CODE(&td, mt == MINT_TYPE_VT ? MINT_STSFLD_VT : MINT_STSFLD);
ADD_CODE(&td, get_data_item_index (&td, field));
if (mt == MINT_TYPE_VT) {
- g_error ("data.klass");
- int size = mono_class_value_size (field->type->data.klass, NULL);
- POP_VT(&td, size);
- WRITE32(&td, &size);
+ MonoClass *klass = mono_class_from_mono_type (field->type);
+ int size = mono_class_value_size (klass, NULL);
+ POP_VT (&td, size);
+ WRITE32 (&td, &size);
}
td.ip += 5;
--td.sp;
klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
else
klass = mono_class_get_full (image, token, generic_context);
- g_assert (klass->valuetype);
if (mono_class_is_nullable (klass)) {
MonoMethod *target_method = mono_class_get_method_from_name (klass, "Box", 1);
/* td.ip is incremented by interp_transform_call */
- interp_transform_call (&td, method, target_method, domain, generic_context, is_bb_start, body_start_offset);
+ interp_transform_call (&td, method, target_method, domain, generic_context, is_bb_start, body_start_offset, NULL);
+ } else if (!klass->valuetype) {
+ /* already boxed, do nothing. */
+ td.ip += 5;
} else {
- if (klass->byval_arg.type == MONO_TYPE_VALUETYPE && !klass->enumtype) {
+ if (mint_type (&klass->byval_arg) == MINT_TYPE_VT && !klass->enumtype) {
size = mono_class_value_size (klass, NULL);
size = (size + 7) & ~7;
td.vt_sp -= size;
}
ADD_CODE(&td, MINT_BOX);
ADD_CODE(&td, get_data_item_index (&td, klass));
+ ADD_CODE (&td, 0);
SET_TYPE(td.sp - 1, STACK_TYPE_O, klass);
td.ip += 5;
}
--td.sp;
SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I4);
break;
+ case MINT_TYPE_VT: {
+ int size = mono_class_value_size (klass, NULL);
+ ENSURE_I4 (&td, 1);
+ SIMPLE_OP (td, MINT_LDELEM_VT);
+ ADD_CODE (&td, get_data_item_index (&td, klass));
+ WRITE32 (&td, &size);
+ --td.sp;
+ SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_VT);
+ PUSH_VT (&td, size);
+ break;
+ }
default: {
GString *res = g_string_new ("");
mono_type_get_desc (res, &klass->byval_arg, TRUE);
case MINT_TYPE_I4:
SIMPLE_OP (td, MINT_STELEM_I4);
break;
+ case MINT_TYPE_O:
+ SIMPLE_OP (td, MINT_STELEM_REF);
+ break;
+ case MINT_TYPE_VT: {
+ int size = mono_class_value_size (klass, NULL);
+ SIMPLE_OP (td, MINT_STELEM_VT);
+ ADD_CODE (&td, get_data_item_index (&td, klass));
+ WRITE32 (&td, &size);
+ POP_VT (&td, size);
+ break;
+ }
default: {
GString *res = g_string_new ("");
mono_type_get_desc (res, &klass->byval_arg, TRUE);
switch (*td.ip) {
case CEE_MONO_CALLI_EXTRA_ARG:
/* Same as CEE_CALLI, llvm specific */
- interp_transform_call (&td, method, NULL, domain, generic_context, is_bb_start, body_start_offset);
+ interp_transform_call (&td, method, NULL, domain, generic_context, is_bb_start, body_start_offset, NULL);
break;
case CEE_MONO_ICALL: {
guint32 token;
}
else {
ADD_CODE(&td, MINT_LDARGA);
- ADD_CODE(&td, td.rtm->arg_offsets [n - signature->hasthis]); /* FIX for large offsets */
+ ADD_CODE(&td, td.rtm->arg_offsets [n]); /* FIX for large offsets */
}
PUSH_SIMPLE_TYPE(&td, STACK_TYPE_MP);
td.ip += 3;
td.sp -= 3;
++td.ip;
break;
-#if 0
- case CEE_CONSTRAINED_: {
- guint32 token;
- /* FIXME: implement */
- ++ip;
- token = read32 (ip);
- ip += 4;
+ case CEE_CONSTRAINED_:
+ token = read32 (td.ip + 1);
+ constrained_class = mono_class_get_full (image, token, generic_context);
+ mono_class_init (constrained_class);
+ td.ip += 5;
break;
- }
-#endif
case CEE_INITBLK:
CHECK_STACK(&td, 3);
ADD_CODE(&td, MINT_INITBLK);
MonoMethod *m;
int vt_slot, iface_offset;
- mono_error_init (error);
+ error_init (error);
if (mono_class_is_interface (klass)) {
MonoObject *this_obj;
gpointer addr, compiled_method, aot_addr;
gboolean need_rgctx_tramp = FALSE, need_unbox_tramp = FALSE;
- mono_error_init (error);
+ error_init (error);
if (!this_obj)
/* The caller will handle it */
return NULL;
gpointer addr, compiled_method;
gboolean need_unbox_tramp = FALSE;
- mono_error_init (error);
+ error_init (error);
/* Same as in common_call_trampoline () */
/* Avoid loading metadata or creating a generic vtable if possible */
char *caller_name = mono_method_full_name (caller, 1);
MonoError error;
- mono_error_init (&error);
+ error_init (&error);
mono_error_set_generic_error (&error, "System", "MethodAccessException", "Method `%s' is inaccessible from method `%s'\n", callee_name, caller_name);
mono_error_set_pending_exception (&error);
g_free (callee_name);
* pack the arguments into an array, and do the rest of the work in in an icall.
*/
if (((cmethod->klass == mono_defaults.object_class) || mono_class_is_interface (cmethod->klass) || (!cmethod->klass->valuetype && cmethod->klass->image != mono_defaults.corlib)) &&
- (MONO_TYPE_IS_VOID (fsig->ret) || MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_IS_REFERENCE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret) || mini_is_gsharedvt_type (fsig->ret)) &&
+ (MONO_TYPE_IS_VOID (fsig->ret) || MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_IS_REFERENCE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret) || mono_class_is_enum (mono_class_from_mono_type (fsig->ret)) || mini_is_gsharedvt_type (fsig->ret)) &&
(fsig->param_count == 0 || (!fsig->hasthis && fsig->param_count == 1) || (fsig->param_count == 1 && (MONO_TYPE_IS_REFERENCE (fsig->params [0]) || fsig->params [0]->byref || mini_is_gsharedvt_type (fsig->params [0]))))) {
MonoInst *args [16];
if (mini_is_gsharedvt_type (fsig->ret)) {
ins = handle_unbox_gsharedvt (cfg, mono_class_from_mono_type (fsig->ret), ins);
- } else if (MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret)) {
+ } else if (MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret) || mono_class_is_enum (mono_class_from_mono_type (fsig->ret))) {
MonoInst *add;
/* Unbox */
{
MonoMethod *method;
- mono_error_init (error);
+ error_init (error);
if (m->wrapper_type != MONO_WRAPPER_NONE) {
method = (MonoMethod *)mono_method_get_wrapper_data (m, token);
{
MonoMethodSignature *fsig;
- mono_error_init (error);
+ error_init (error);
if (method->wrapper_type != MONO_WRAPPER_NONE) {
fsig = (MonoMethodSignature *)mono_method_get_wrapper_data (method, token);
} else {
tclass, MONO_RGCTX_INFO_REFLECTION_TYPE);
} else if (cfg->compile_aot) {
if (method->wrapper_type) {
- mono_error_init (&error); //got to do it since there are multiple conditionals below
+ error_init (&error); //got to do it since there are multiple conditionals below
if (mono_class_get_checked (tclass->image, tclass->type_token, &error) == tclass && !generic_context) {
/* Special case for static synchronized wrappers */
EMIT_NEW_TYPE_FROM_HANDLE_CONST (cfg, ins, tclass->image, tclass->type_token, generic_context);
nwords = (align_size + sizeof (gpointer) -1 ) / sizeof (gpointer);
ainfo->storage = RegTypeStructByVal;
ainfo->struct_size = size;
+ ainfo->align = align;
/* FIXME: align stack_size if needed */
if (eabi_supported) {
if (align >= 8 && (gr & 1))
break;
case RegTypeStructByVal:
lainfo->storage = LLVMArgAsIArgs;
- lainfo->nslots = ainfo->struct_size / sizeof (gpointer);
+ if (eabi_supported && ainfo->align == 8) {
+ /* LLVM models this by passing an int64 array */
+ lainfo->nslots = ALIGN_TO (ainfo->struct_size, 8) / 8;
+ lainfo->esize = 8;
+ } else {
+ lainfo->nslots = ainfo->struct_size / sizeof (gpointer);
+ lainfo->esize = 4;
+ }
+
+ printf ("D: %d\n", ainfo->align);
break;
case RegTypeStructByAddr:
case RegTypeStructByAddrOnStack:
guint8 reg;
ArgStorage storage;
/* RegTypeStructByVal */
- gint32 struct_size;
+ gint32 struct_size, align;
guint8 size : 4; /* 1, 2, 4, 8, or regs used by RegTypeStructByVal */
} ArgInfo;
static MonoArray*
build_native_trace (MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
/* This puppy only makes sense on mobile, IOW, ARM. */
#if defined (HAVE_BACKTRACE_SYMBOLS) && defined (TARGET_ARM)
MonoArray *res;
}
MonoError isinst_error;
- mono_error_init (&isinst_error);
+ error_init (&isinst_error);
if (ei->flags == MONO_EXCEPTION_CLAUSE_NONE && mono_object_isinst_checked (ex_obj, catch_class, &error)) {
setup_stack_trace (mono_ex, dynamic_methods, &trace_ips);
g_slist_free (dynamic_methods);
filter_idx ++;
}
- mono_error_init (&error);
+ error_init (&error);
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE &&
mono_object_isinst_checked (ex_obj, catch_class, &error)) || filtered) {
/*
static gpointer
class_type_info (MonoDomain *domain, MonoClass *klass, MonoRgctxInfoType info_type, MonoError *error)
{
- mono_error_init (error);
+ error_init (error);
switch (info_type) {
case MONO_RGCTX_INFO_STATIC_DATA: {
gpointer data;
gboolean temporary;
- mono_error_init (error);
+ error_init (error);
if (!oti->data)
return NULL;
int rgctx_index;
gboolean do_free;
- mono_error_init (error);
+ error_init (error);
g_assert (rgctx);
MonoRuntimeGenericContext *rgctx;
gpointer info;
- mono_error_init (error);
+ error_init (error);
mono_domain_lock (domain);
{
MonoJumpInfo *patch_info;
- mono_error_init (error);
+ error_init (error);
for (patch_info = ji; patch_info; patch_info = patch_info->next) {
unsigned char *ip = patch_info->ip.i + code;
pindex ++;
break;
case LLVMArgAsIArgs:
- param_types [pindex] = LLVMArrayType (IntPtrType (), ainfo->nslots);
+ if (ainfo->esize == 8)
+ param_types [pindex] = LLVMArrayType (LLVMInt64Type (), ainfo->nslots);
+ else
+ param_types [pindex] = LLVMArrayType (IntPtrType (), ainfo->nslots);
pindex ++;
break;
case LLVMArgVtypeByRef:
}
case LLVMArgAsIArgs:
g_assert (addresses [reg]);
- args [pindex] = LLVMBuildLoad (ctx->builder, convert (ctx, addresses [reg], LLVMPointerType (LLVMArrayType (IntPtrType (), ainfo->nslots), 0)), "");
+ if (ainfo->esize == 8)
+ args [pindex] = LLVMBuildLoad (ctx->builder, convert (ctx, addresses [reg], LLVMPointerType (LLVMArrayType (LLVMInt64Type (), ainfo->nslots), 0)), "");
+ else
+ args [pindex] = LLVMBuildLoad (ctx->builder, convert (ctx, addresses [reg], LLVMPointerType (LLVMArrayType (IntPtrType (), ainfo->nslots), 0)), "");
break;
case LLVMArgVtypeAsScalar:
g_assert_not_reached ();
{
MonoJumpInfo *patch_info;
- mono_error_init (error);
+ error_init (error);
for (patch_info = ji; patch_info; patch_info = patch_info->next) {
unsigned char *ip = patch_info->ip.i + code;
#endif
/* Same as OUTARG_VT, but has a dreg */
-#ifdef ENABLE_LLVM
MINI_OP(OP_LLVM_OUTARG_VT, "llvm_outarg_vt", IREG, VREG, NONE)
-#endif
MINI_OP(OP_OBJC_GET_SELECTOR, "objc_get_selector", IREG, NONE, NONE)
MonoJumpInfo *patch_info;
gboolean compile_aot = !run_cctors;
- mono_error_init (error);
+ error_init (error);
for (patch_info = ji; patch_info; patch_info = patch_info->next) {
unsigned char *ip = patch_info->ip.i + code;
#include <mono/utils/mono-threads-coop.h>
#include <mono/utils/checked-build.h>
#include <mono/metadata/w32handle.h>
+#include <mono/metadata/threadpool.h>
#include "mini.h"
#include "seq-points.h"
#endif
#endif
+#ifdef ENABLE_INTERPRETER
+#include "interpreter/interp.h"
+#endif
+
static guint32 default_opt = 0;
static gboolean default_opt_set = FALSE;
unsigned char *ip = patch_info->ip.i + code;
gconstpointer target = NULL;
- mono_error_init (error);
+ error_init (error);
switch (patch_info->type) {
case MONO_PATCH_INFO_BB:
MonoJitICallInfo *callinfo = NULL;
WrapperInfo *winfo = NULL;
- mono_error_init (error);
+ error_init (error);
#ifdef ENABLE_INTERPRETER
if (mono_use_interpreter)
- return interp_create_method_pointer (method, error);
+ return mono_interp_create_method_pointer (method, error);
#endif
if (mono_llvm_only)
gpointer *param_refs;
int i, pindex;
- mono_error_init (error);
+ error_init (error);
g_assert (info->gsharedvt_invoke);
#ifdef ENABLE_INTERPRETER
if (mono_use_interpreter)
- return interp_mono_runtime_invoke (method, obj, params, exc, error);
+ return mono_interp_runtime_invoke (method, obj, params, exc, error);
#endif
- mono_error_init (error);
+ error_init (error);
if (obj == NULL && !(method->flags & METHOD_ATTRIBUTE_STATIC) && !method->string_ctor && (method->wrapper_type == 0)) {
g_warning ("Ignoring invocation of an instance method on a NULL instance.\n");
MonoMethod *nm;
guint8 *addr = NULL;
- mono_error_init (error);
+ error_init (error);
if ((method->flags & METHOD_ATTRIBUTE_VIRTUAL) && mono_method_signature (method)->generic_param_count) {
return mono_create_specific_trampoline (method, MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING,
mono_runtime_cleanup (domain);
#endif
+ mono_threadpool_cleanup ();
+
mono_profiler_shutdown ();
free_jit_tls_data ((MonoJitTlsData *)mono_tls_get_jit_tls ());
{
MonoJumpInfo *patch_info;
- mono_error_init (error);
+ error_init (error);
for (patch_info = ji; patch_info; patch_info = patch_info->next) {
unsigned char *ip = patch_info->ip.i + code;
{
MonoJumpInfo *patch_info;
- mono_error_init (error);
+ error_init (error);
/* FIXME: Move part of this to arch independent code */
for (patch_info = ji; patch_info; patch_info = patch_info->next) {
g_assert (imt_slot < MONO_IMT_SIZE);
- mono_error_init (error);
+ error_init (error);
/* This has to be variance aware since imt_method can be from an interface that vt->klass doesn't directly implement */
interface_offset = mono_class_interface_offset_with_variance (vt->klass, imt_method->klass, &variance_used);
if (interface_offset < 0)
gpointer *orig_vtable_slot, *vtable_slot_to_patch = NULL;
MonoJitInfo *ji = NULL;
- mono_error_init (error);
+ error_init (error);
virtual_ = vt && (gpointer)vtable_slot > (gpointer)vt;
imt_call = vt && (gpointer)vtable_slot < (gpointer)vt;
if (!is_remote) {
sig = tramp_info->sig;
if (!(sig && method == tramp_info->method)) {
- mono_error_init (&err);
+ error_init (&err);
sig = mono_method_signature_checked (method, &err);
if (!sig) {
mono_error_set_pending_exception (&err);
if (method) {
sig = tramp_info->sig;
if (!(sig && method == tramp_info->method)) {
- mono_error_init (&err);
+ error_init (&err);
sig = mono_method_signature_checked (method, &err);
if (!sig) {
mono_error_set_pending_exception (&err);
gpointer code;
guint32 code_size = 0;
- mono_error_init (error);
+ error_init (error);
code = mono_jit_find_compiled_method_with_jit_info (domain, method, &ji);
/*
{
gpointer tramp;
- mono_error_init (error);
+ error_init (error);
if (mono_aot_only) {
if (mono_llvm_only && method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)
tramp_info->impl_nothis = mono_arch_get_delegate_invoke_impl (mono_method_signature (invoke), FALSE);
tramp_info->method = method;
if (method) {
- mono_error_init (&error);
+ error_init (&error);
tramp_info->sig = mono_method_signature_checked (method, &error);
tramp_info->need_rgctx_tramp = mono_method_needs_static_rgctx_invoke (method, FALSE);
}
if (cfg->gen_seq_points)
cfg->seq_points = g_ptr_array_new ();
- mono_error_init (&cfg->error);
+ error_init (&cfg->error);
if (cfg->compile_aot && !try_generic_shared && (method->is_generic || mono_class_is_gtd (method->klass) || method_is_gshared)) {
cfg->exception_type = MONO_EXCEPTION_GENERIC_SHARING_FAILED;
}
cfg->method_to_register = method_to_register;
- mono_error_init (&err);
+ error_init (&err);
sig = mono_method_signature_checked (cfg->method, &err);
if (!sig) {
cfg->exception_type = MONO_EXCEPTION_TYPE_LOAD;
GTimer *jit_timer;
MonoMethod *prof_method, *shared;
- mono_error_init (error);
+ error_init (error);
if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) {
* in the structure.
*/
int nslots;
- /* Only if storage == LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */
+ /* Only if storage == LLVMArgAsIArgs/LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */
int esize;
/* Parameter index in the LLVM signature */
int pindex;
int type;
} StackSlot;
-#if HAVE_ARRAY_ELEM_INIT
-extern const guint8 mono_burg_arity [];
-#else
-extern guint8 mono_burg_arity [];
-#endif
-
extern const char MONO_ARCH_CPU_SPEC [];
#define MONO_ARCH_CPU_SPEC_IDX_COMBINE(a) a ## _idx
#define MONO_ARCH_CPU_SPEC_IDX(a) MONO_ARCH_CPU_SPEC_IDX_COMBINE(a)
guint8* mono_arch_get_call_target (guint8 *code);
guint32 mono_arch_get_plt_info_offset (guint8 *plt_entry, mgreg_t *regs, guint8 *code);
GSList *mono_arch_get_trampolines (gboolean aot);
-#ifdef ENABLE_INTERPRETER
-gpointer mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info);
-void mono_interp_init (void);
-gpointer interp_create_method_pointer (MonoMethod *method, MonoError *error);
-MonoObject* interp_mono_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error);
-#endif
+gpointer mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info);
/* Handle block guard */
gpointer mono_arch_install_handler_block_guard (MonoJitInfo *ji, MonoJitExceptionInfo *clause, MonoContext *ctx, gpointer new_value);
return o.GetHashCode ();
}
+ [Category ("!INTERPRETER")]
public static int test_0_unbox_trampoline2 () {
int i = 12;
object o = i;
return 0;
}
+ [Category ("!INTERPRETER")]
public static int test_0_multi_array_cast () {
Duper[,] d = new Duper [1, 1];
object[,] o = d;
}
}
+ [Category ("!INTERPRETER")]
public static int test_42_vtype_delegate () {
var s = new VtypeVirtualDelStruct () { f = 42 };
Func<int> f = s.return_field_nonvirt;
return f ();
}
+ [Category ("!INTERPRETER")]
public static int test_42_vtype_virtual_delegate () {
IFaceVirtualDel s = new VtypeVirtualDelStruct () { f = 42 };
Func<int> f = s.return_field;
return f ();
}
+ [Category ("!INTERPRETER")]
public static int test_1_store_decimal () {
decimal[,] a = {{1}};
return 0;
}
+ [Category ("!INTERPRETER")]
static int test_0_array_get_set_soft_float () {
float[,] arr = new float [2, 2];
arr [0, 0] = 256f;
return mInstance;
}
+ [Category ("!INTERPRETER")]
static int test_0_synchronized () {
getInstance ();
return 0;
}
}
+ [Category ("!INTERPRETER")]
public static int test_0_delegate_to_virtual_generic_on_ifaces () {
IComparer2 c = new AClass ();
enum Mine { One, Two }
+ [Category ("!INTERPRETER")]
public static int test_0_enum_gethashcode_opt () {
int sum = 0;
for (int i = 0; i < 1000000; ++i)
}
}
+ g_free (seq_points);
+
if (has_debug_data)
g_free (next);
return buf;
}
+#endif /* !DISABLE_JIT */
-
-#ifdef ENABLE_INTERPRETER
/*
* mono_arch_get_enter_icall_trampoline:
*
gpointer
mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info)
{
- guint8 *start = NULL, *code, *exits[4], *leave_tramp;
+#ifdef ENABLE_INTERPRETER
+ const int gregs_num = 6;
+ guint8 *start = NULL, *code, *exits [gregs_num], *leave_tramp;
MonoJumpInfo *ji = NULL;
GSList *unwind_ops = NULL;
- static int arg_regs[] = {AMD64_ARG_REG1, AMD64_ARG_REG2, AMD64_ARG_REG3, AMD64_ARG_REG4};
- int i;
+ static int arg_regs[] = {AMD64_ARG_REG1, AMD64_ARG_REG2, AMD64_ARG_REG3, AMD64_ARG_REG4, AMD64_R8, AMD64_R9};
+ int i, offset = 0;
start = code = (guint8 *) mono_global_codeman_reserve (256);
/* load pointer to iregs into R11 */ // TODO: struct offset
amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 8, 8);
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < gregs_num; i++) {
amd64_test_reg_reg (code, AMD64_RAX, AMD64_RAX);
exits [i] = code;
x86_branch8 (code, X86_CC_Z, 0, FALSE);
- amd64_mov_reg_membase (code, arg_regs [i], AMD64_R11, i * sizeof (gpointer), 8);
+#ifdef TARGET_WIN32
+ if (i < 4) {
+#else
+ if (i < 6) {
+#endif
+ amd64_mov_reg_membase (code, arg_regs [i], AMD64_R11, i * sizeof (gpointer), 8);
+ } else {
+ g_error ("not tested yet.");
+ amd64_push_reg (code, AMD64_RAX);
+ amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, i * sizeof (gpointer), 8);
+ amd64_mov_membase_reg (code, AMD64_RBP, offset, AMD64_RAX, sizeof (gpointer));
+ offset += sizeof (gpointer);
+ amd64_pop_reg (code, AMD64_RAX);
+ }
amd64_dec_reg_size (code, AMD64_RAX, 1);
}
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < gregs_num; i++) {
x86_patch (exits [i], code);
}
*info = mono_tramp_info_create ("enter_icall_trampoline", start, code - start, ji, unwind_ops);
return start;
+#else
+ g_assert_not_reached ();
+ return NULL;
+#endif /* ENABLE_INTERPRETER */
}
-#endif
-#endif /* !DISABLE_JIT */
#ifdef DISABLE_JIT
gpointer
return NULL;
}
-#ifdef ENABLE_INTERPRETER
gpointer
mono_arch_get_enter_icall_trampoline (MonoTrampInfo **info)
{
g_assert_not_reached ();
return NULL;
}
-#endif
#endif /* DISABLE_JIT */
if (data->private_gray_queue.num_sections > 16 && workers_finished && worker_awakenings < active_workers_num) {
/* We bound the number of worker awakenings just to be sure */
worker_awakenings++;
+ mono_os_mutex_lock (&finished_lock);
sgen_workers_ensure_awake ();
+ mono_os_mutex_unlock (&finished_lock);
}
} else {
worker_try_finish (data);
worker_awakenings = 0;
mono_memory_write_barrier ();
+ /*
+ * We expect workers to start finishing only after all of them were awaken.
+ * Otherwise we might think that we have fewer workers and use wrong context.
+ */
+ mono_os_mutex_lock (&finished_lock);
sgen_workers_ensure_awake ();
+ mono_os_mutex_unlock (&finished_lock);
}
void
ILASM = $(TOOLS_RUNTIME) $(mcs_topdir)/class/lib/build/ilasm.exe
-if FULL_AOT_TESTS
-TEST_RUNNER = ./test-runner.exe --runtime $(top_builddir)/runtime/mono-wrapper --mono-path "$(CLASS)" --aot-run-flags "$(AOT_RUN_FLAGS)" --aot-build-flags "$(AOT_BUILD_FLAGS)"
-else
TEST_RUNNER = ./test-runner.exe --runtime $(top_builddir)/runtime/mono-wrapper --mono-path "$(CLASS)"
+
+if FULL_AOT_TESTS
+TEST_RUNNER += --aot-run-flags "$(AOT_RUN_FLAGS)" --aot-build-flags "$(AOT_BUILD_FLAGS)"
+endif
+
+if HYBRID_AOT_TESTS
+TEST_RUNNER += --aot-run-flags "$(AOT_RUN_FLAGS)" --aot-build-flags "$(AOT_BUILD_FLAGS)"
endif
$(ILASM) -out:$@ $<
if !FULL_AOT_TESTS
-if !HYBRID_AOT_TESTS
TEST_DRIVER_HARD_KILL_FEATURE=-r:Mono.Posix.dll
endif
-endif
if FULL_AOT_TESTS
TEST_DRIVER_DEPEND=TestDriver.dll$(PLATFORM_AOT_SUFFIX)
else
+if HYBRID_AOT_TESTS
+TEST_DRIVER_DEPEND=TestDriver.dll$(PLATFORM_AOT_SUFFIX)
+else
TEST_DRIVER_DEPEND=TestDriver.dll
endif
+endif
%.exe: %.cs $(TEST_DRIVER_DEPEND)
$(MCS) -r:System.dll -r:System.Xml.dll -r:System.Core.dll -r:TestDriver.dll $(TEST_DRIVER_HARD_KILL_FEATURE) -out:$@ $<
if FULL_AOT_TESTS
prereqs: $(PREREQSI_IL_AOT) $(PREREQSI_CS_AOT) $(AOT_EXTRA_LIBS)
else
+if HYBRID_AOT_TESTS
+prereqs: $(PREREQSI_IL_AOT) $(PREREQSI_CS_AOT) $(AOT_EXTRA_LIBS)
+else
prereqs: $(PREREQSI_IL) $(PREREQSI_CS)
endif
+endif
# Target to precompile the test executables
tests: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la prereqs $(GSHARED_TESTS)
if FULL_AOT_TESTS
$(MAKE) $(PREREQSI_IL_AOT) $(PREREQSI_CS_AOT) $(AOT_EXTRA_LIBS)
endif
+if HYBRID_AOT_TESTS
+ $(MAKE) $(PREREQSI_IL_AOT) $(PREREQSI_CS_AOT) $(AOT_EXTRA_LIBS)
+endif
# Remove empty .stdout and .stderr files for wrench
rm-empty-logs:
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
test-inline-call-stack.exe: $(TEST_DRIVER_DEPEND) test-inline-call-stack-library.dll $(srcdir)/test-inline-call-stack.cs
$(MCS) -r:TestDriver.dll -r:test-inline-call-stack-library.dll -out:test-inline-call-stack.exe $(srcdir)/test-inline-call-stack.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
EXTRA_DIST += bug-36848-a.cs
bug-36848.exe bug-36848-a.dll: $(srcdir)/bug-36848.cs $(srcdir)/bug-36848-a.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
EXTRA_DIST += bug-81691-a.cs bug-81691-b.cs
bug-81691.exe bug-81691-b.dll: $(srcdir)/bug-81691.cs $(srcdir)/bug-81691-a.cs $(srcdir)/bug-81691-b.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
bug-81466.exe: bug-81466.il bug-81466-lib.dll
$(ILASM) /exe /output:bug-81466.exe $(srcdir)/bug-81466.il
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
bug-324535.exe : bug-324535.cs bug-324535-il.dll
$(MCS) -r:bug-324535-il.dll -out:bug-324535.exe $(srcdir)/bug-324535.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
custom-modifiers.2.exe: custom-modifiers.2.cs custom-modifiers-lib.dll
$(MCS) -r:custom-modifiers-lib.dll -out:custom-modifiers.2.exe $(srcdir)/custom-modifiers.2.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
bug-382986.exe: bug-382986.cs bug-382986-lib.dll
$(MCS) -out:$@ -r:bug-382986-lib.dll $(srcdir)/bug-382986.cs
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
EXTRA_DIST += generic-boxing.2.il
generic-boxing.2.dll : generic-boxing.2.il generic-unboxing.2.dll
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
EXTRA_DIST += generic-unbox.2.cs
generic-unbox.2.exe : generic-unbox.2.cs generic-unboxing.2.dll
if FULL_AOT_TESTS
$(RUNTIME) $(AOT_BUILD_FLAGS) $@
endif
+if HYBRID_AOT_TESTS
+ $(RUNTIME) $(AOT_BUILD_FLAGS) $@
+endif
generic-delegate2.2.exe : generic-delegate2.2.cs generic-delegate2-lib.2.dll
$(MCS) -r:generic-delegate2-lib.2.dll -out:$@ $(srcdir)/generic-delegate2.2.cs
unhandled-exception-4.exe \
unhandled-exception-5.exe \
unhandled-exception-6.exe \
- unhandled-exception-7.exe
+ unhandled-exception-7.exe \
+ unhandled-exception-8.exe
test-unhandled-exception-2: $(UNHANDLED_EXCEPTION_1_TESTS) $(UNHANDLED_EXCEPTION_255_TESTS)
$(MAKE) test-unhandled-exception-2-1-with-managed-handler
--- /dev/null
+
+using System;
+using System.Threading;
+
+class CustomException : Exception
+{
+}
+
+class Driver
+{
+ /* expected exit code: 255 */
+ public static void Main ()
+ {
+ if (Environment.GetEnvironmentVariable ("TEST_UNHANDLED_EXCEPTION_HANDLER") != null)
+ AppDomain.CurrentDomain.UnhandledException += (s, e) => {};
+
+ ManualResetEvent mre = new ManualResetEvent(false);
+
+ ThreadPool.RegisterWaitForSingleObject (mre, (state, timedOut) => { throw new CustomException (); }, null, -1, true);
+ mre.Set();
+
+ Thread.Sleep (5000);
+ }
+}
\ No newline at end of file
./make_exception_overlap_test.sh exception_entry_overlap_try_over_filter invalid ".try TRY_BLOCK_1 to FILTER_BLOCK_3_A filter FILTER_BLOCK_3 handler CATCH_BLOCK_1 to CATCH_BLOCK_1_END" ".try TRY_BLOCK_2 to TRY_BLOCK_2_END catch [mscorlib]System.Exception handler CATCH_BLOCK_2 to CATCH_BLOCK_2_END" "yes"
-#blocks start in the middle of an intruction
+#blocks start in the middle of an instruction
./make_exception_overlap_test.sh try_block_start_in_the_middle_of_a_instruction invalid ".try AFTER_PREFIX_1 to TRY_BLOCK_1_END catch [mscorlib]System.Exception handler CATCH_BLOCK_1 to CATCH_BLOCK_1_END" ".try TRY_BLOCK_2 to TRY_BLOCK_2_END catch [mscorlib]System.Exception handler CATCH_BLOCK_2 to CATCH_BLOCK_2_END"
./make_exception_overlap_test.sh catch_block_start_in_the_middle_of_a_instruction invalid ".try TRY_BLOCK_1 to TRY_BLOCK_1_END catch [mscorlib]System.Exception handler AFTER_PREFIX_2 to CATCH_BLOCK_1_END" ".try TRY_BLOCK_2 to TRY_BLOCK_2_END catch [mscorlib]System.Exception handler CATCH_BLOCK_2 to CATCH_BLOCK_2_END"
#ifdef ENABLE_CHECKED_BUILD_GC
void
-assert_gc_safe_mode (void)
+assert_gc_safe_mode (const char *file, int lineno)
{
if (!mono_check_mode_enabled (MONO_CHECK_MODE_GC))
return;
int state;
if (!cur)
- mono_fatal_with_history ("Expected GC Safe mode but thread is not attached");
+ mono_fatal_with_history ("%s:%d: Expected GC Safe mode but thread is not attached", file, lineno);
switch (state = mono_thread_info_current_state (cur)) {
case STATE_BLOCKING:
case STATE_BLOCKING_AND_SUSPENDED:
break;
default:
- mono_fatal_with_history ("Expected GC Safe mode but was in %s state", mono_thread_state_name (state));
+ mono_fatal_with_history ("%s:%d: Expected GC Safe mode but was in %s state", file, lineno, mono_thread_state_name (state));
}
}
void
-assert_gc_unsafe_mode (void)
+assert_gc_unsafe_mode (const char *file, int lineno)
{
if (!mono_check_mode_enabled (MONO_CHECK_MODE_GC))
return;
int state;
if (!cur)
- mono_fatal_with_history ("Expected GC Unsafe mode but thread is not attached");
+ mono_fatal_with_history ("%s:%d: Expected GC Unsafe mode but thread is not attached", file, lineno);
switch (state = mono_thread_info_current_state (cur)) {
case STATE_RUNNING:
case STATE_SELF_SUSPEND_REQUESTED:
break;
default:
- mono_fatal_with_history ("Expected GC Unsafe mode but was in %s state", mono_thread_state_name (state));
+ mono_fatal_with_history ("%s:%d: Expected GC Unsafe mode but was in %s state", file, lineno, mono_thread_state_name (state));
}
}
void
-assert_gc_neutral_mode (void)
+assert_gc_neutral_mode (const char *file, int lineno)
{
if (!mono_check_mode_enabled (MONO_CHECK_MODE_GC))
return;
int state;
if (!cur)
- mono_fatal_with_history ("Expected GC Neutral mode but thread is not attached");
+ mono_fatal_with_history ("%s:%d: Expected GC Neutral mode but thread is not attached", file, lineno);
switch (state = mono_thread_info_current_state (cur)) {
case STATE_RUNNING:
case STATE_BLOCKING_AND_SUSPENDED:
break;
default:
- mono_fatal_with_history ("Expected GC Neutral mode but was in %s state", mono_thread_state_name (state));
+ mono_fatal_with_history ("%s:%d: Expected GC Neutral mode but was in %s state", file, lineno, mono_thread_state_name (state));
}
}
*/
#define MONO_REQ_GC_SAFE_MODE do { \
- assert_gc_safe_mode (); \
+ assert_gc_safe_mode (__FILE__, __LINE__); \
} while (0);
#define MONO_REQ_GC_UNSAFE_MODE do { \
- assert_gc_unsafe_mode (); \
+ assert_gc_unsafe_mode (__FILE__, __LINE__); \
} while (0);
#define MONO_REQ_GC_NEUTRAL_MODE do { \
- assert_gc_neutral_mode (); \
+ assert_gc_neutral_mode (__FILE__, __LINE__); \
} while (0);
/* In a GC critical region, the thread is not allowed to switch to GC safe mode.
assert_in_gc_critical_region(); \
} while(0)
-void assert_gc_safe_mode (void);
-void assert_gc_unsafe_mode (void);
-void assert_gc_neutral_mode (void);
+void assert_gc_safe_mode (const char *file, int lineno);
+void assert_gc_unsafe_mode (const char *file, int lineno);
+void assert_gc_neutral_mode (const char *file, int lineno);
void* critical_gc_region_begin(void);
void critical_gc_region_end(void* token);
} \
} while (0)
#else
-#define MONO_CONTEXT_GET_CURRENT(ctx) \
+
+#define MONO_CONTEXT_GET_CURRENT_GREGS(ctx) \
__asm__ __volatile__( \
"movl $0x0, %c[eax](%0)\n" \
"mov %%ebx, %c[ebx](%0)\n" \
[esi] MONO_CONTEXT_OFFSET (esi, 0, mgreg_t), \
[edi] MONO_CONTEXT_OFFSET (edi, 0, mgreg_t) \
: "memory")
+
+#ifdef UCONTEXT_REG_XMM
+#define MONO_CONTEXT_GET_CURRENT_FREGS(ctx) \
+ do { \
+ __asm__ __volatile__ ( \
+ "movups %%xmm0, %c[xmm0](%0)\n" \
+ "movups %%xmm1, %c[xmm1](%0)\n" \
+ "movups %%xmm2, %c[xmm2](%0)\n" \
+ "movups %%xmm3, %c[xmm3](%0)\n" \
+ "movups %%xmm4, %c[xmm4](%0)\n" \
+ "movups %%xmm5, %c[xmm5](%0)\n" \
+ "movups %%xmm6, %c[xmm6](%0)\n" \
+ "movups %%xmm7, %c[xmm7](%0)\n" \
+ : \
+ : "a" (&(ctx)), \
+ [xmm0] MONO_CONTEXT_OFFSET (fregs, X86_XMM0, MonoContextSimdReg), \
+ [xmm1] MONO_CONTEXT_OFFSET (fregs, X86_XMM1, MonoContextSimdReg), \
+ [xmm2] MONO_CONTEXT_OFFSET (fregs, X86_XMM2, MonoContextSimdReg), \
+ [xmm3] MONO_CONTEXT_OFFSET (fregs, X86_XMM3, MonoContextSimdReg), \
+ [xmm4] MONO_CONTEXT_OFFSET (fregs, X86_XMM4, MonoContextSimdReg), \
+ [xmm5] MONO_CONTEXT_OFFSET (fregs, X86_XMM5, MonoContextSimdReg), \
+ [xmm6] MONO_CONTEXT_OFFSET (fregs, X86_XMM6, MonoContextSimdReg), \
+ [xmm7] MONO_CONTEXT_OFFSET (fregs, X86_XMM7, MonoContextSimdReg), \
+ } while (0)
+#else
+#define MONO_CONTEXT_GET_CURRENT_FREGS(ctx)
+#endif
+
+#define MONO_CONTEXT_GET_CURRENT(ctx) \
+ do { \
+ MONO_CONTEXT_GET_CURRENT_GREGS(ctx); \
+ MONO_CONTEXT_GET_CURRENT_FREGS(ctx); \
+ } while (0)
+
#endif
#define MONO_ARCH_HAS_MONO_CONTEXT 1
MonoString *assembly_name = NULL, *type_name = NULL, *method_name = NULL, *field_name = NULL, *msg = NULL;
MonoDomain *domain = mono_domain_get ();
- mono_error_init (error_out);
+ error_init (error_out);
switch (error->error_code) {
case MONO_ERROR_NONE:
mono_error_move (MonoError *dest, MonoError *src)
{
memcpy (dest, src, sizeof (MonoErrorInternal));
- mono_error_init (src);
+ error_init (src);
}
/**
MONO_LAZY_INIT_STATUS_CLEANED,
};
-static inline void
+static inline gboolean
mono_lazy_initialize (mono_lazy_init_t *lazy_init, void (*initialize) (void))
{
gint32 status;
status = *lazy_init;
if (status >= MONO_LAZY_INIT_STATUS_INITIALIZED)
- return;
+ return status == MONO_LAZY_INIT_STATUS_INITIALIZED;
if (status == MONO_LAZY_INIT_STATUS_INITIALIZING
|| InterlockedCompareExchange (lazy_init, MONO_LAZY_INIT_STATUS_INITIALIZING, MONO_LAZY_INIT_STATUS_NOT_INITIALIZED)
!= MONO_LAZY_INIT_STATUS_NOT_INITIALIZED
while (*lazy_init == MONO_LAZY_INIT_STATUS_INITIALIZING)
mono_thread_info_yield ();
g_assert (InterlockedRead (lazy_init) >= MONO_LAZY_INIT_STATUS_INITIALIZED);
- return;
+ return status == MONO_LAZY_INIT_STATUS_INITIALIZED;
}
initialize ();
mono_atomic_store_release (lazy_init, MONO_LAZY_INIT_STATUS_INITIALIZED);
+ return TRUE;
}
static inline void
return 1;
}
#else
- if (fd > FD_SETSIZE) {
+ if (fd >= FD_SETSIZE) {
ufds [i].revents = MONO_POLLNVAL;
return 1;
}
{
MONO_WIN32_CRYPT_PROVIDER_HANDLE provider;
- mono_error_init (error);
+ error_init (error);
g_assert (handle);
provider = (MONO_WIN32_CRYPT_PROVIDER_HANDLE) *handle;
guint offset = 0;
int err = 0;
- mono_error_init (error);
+ error_init (error);
socket_fd = socket (PF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0) {
{
g_assert (handle);
- mono_error_init (error);
+ error_init (error);
if (use_egd) {
const char *socket_path = g_getenv ("MONO_EGD_SOCKET");
{
gint count = 0;
- mono_error_init (error);
+ error_init (error);
do {
if (buffer_size - count >= sizeof (gint32) && RAND_MAX >= 0xFFFFFFFF) {
default:
g_error ("Unknown thread state");
}
+
+ if (info->async_target) {
+ info->async_target (info->user_data);
+ info->async_target = NULL;
+ info->user_data = NULL;
+ }
}
void
g_error ("Unknown thread state");
}
+ if (info->async_target) {
+ info->async_target (info->user_data);
+ info->async_target = NULL;
+ info->user_data = NULL;
+ }
+
return info;
}
void
mono_thread_info_setup_async_call (MonoThreadInfo *info, void (*target_func)(void*), void *user_data)
{
- /* An async call can only be setup on an async suspended thread */
- g_assert (mono_thread_info_run_state (info) == STATE_ASYNC_SUSPENDED);
+ if (!mono_threads_is_coop_enabled ()) {
+ /* In non-coop mode, an async call can only be setup on an async suspended thread, but in coop mode, a thread
+ * may be in blocking state, and will execute the async call when leaving the safepoint, leaving a gc safe
+ * region or entering a gc unsafe region */
+ g_assert (mono_thread_info_run_state (info) == STATE_ASYNC_SUSPENDED);
+ }
/*FIXME this is a bad assert, we probably should do proper locking and fail if one is already set*/
g_assert (!info->async_target);
info->async_target = target_func;
for (i = 0; i < set->size / BITS_PER_CHUNK; ++i) {
d = set->data [i];
#ifdef __GNUC__
- if (sizeof (gsize) == sizeof (unsigned long))
- count += __builtin_popcountl (d);
- else
+ if (sizeof (gsize) == sizeof (unsigned int))
count += __builtin_popcount (d);
+ else
+ count += __builtin_popcountll (d);
#else
while (d) {
count ++;
</project>
<project dir="class/Microsoft.CSharp" library="Microsoft.CSharp-net_4_x">
<boot>false</boot>
- <flags>/codepage:65001 /nologo /noconfig /deterministic -d:NET_4_0 -d:NET_4_5 -d:NET_4_6 -d:MONO -d:WIN_PLATFORM -nowarn:1699 -nostdlib -r:./../../class/lib/net_4_x/mscorlib.dll /debug:portable -optimize -r:./../../class/lib/net_4_x/System.Core.dll -r:./../../class/lib/net_4_x/Mono.CSharp.dll</flags>
+ <flags>/codepage:65001 /nologo /noconfig /deterministic -d:NET_4_0 -d:NET_4_5 -d:NET_4_6 -d:MONO -d:WIN_PLATFORM -nowarn:1699 -nostdlib -r:./../../class/lib/net_4_x/mscorlib.dll /debug:portable -optimize -r:./../../class/lib/net_4_x/System.Core.dll -r:./../../class/lib/net_4_x/System.dll</flags>
<output>Microsoft.CSharp.dll</output>
<built_sources></built_sources>
<library_output>./../../class/lib/net_4_x/Microsoft.CSharp.dll</library_output>
--- /dev/null
+LINGUAS eol=lf
-es
-ja
-de
-pt_BR
\ No newline at end of file
+es ja de pt_BR
\ No newline at end of file
--- /dev/null
+monodis-wrapper.in crlf=input
+mono-wrapper.in crlf=input
+
mono-heapviz crlf=input
mono-package-runtime crlf=input
mono-test-install crlf=input
+csc.in crlf=input
+dmcs.in crlf=input
+gmcs.in crlf=input
+mcs.in crlf=input
+mod.in crlf=input
+mono-configuration-crypto.in crlf=input
+mono-find-provides.in crlf=input
+mono-find-requires.in crlf=input
+mono-service.in crlf=input
+mono-symbolicate.in crlf=input
+peverify.in crlf=input
+script.in crlf=input
+script_umask.in crlf=input
+xbuild.in crlf=input
EXTRA_CONF_FLAGS="$EXTRA_CONF_FLAGS --host=`/usr/bin/dpkg-architecture -qDEB_HOST_GNU_TYPE`"
#force build arch = dpkg arch, sometimes misdetected
mkdir -p ~/.config/.mono/
- wget -qO- http://download.mono-project.com/test/new-certs.tgz| tar zx -C ~/.config/.mono/
+ wget -qO- https://download.mono-project.com/test/new-certs.tgz| tar zx -C ~/.config/.mono/
fi
${TESTCMD} --label=configure --timeout=60m --fatal ./autogen.sh $EXTRA_CONF_FLAGS