Skip to content

Instantly share code, notes, and snippets.

@nasirhm
Created October 9, 2024 09:21
Show Gist options
  • Save nasirhm/65194ac118ee661d058cf457531b47a5 to your computer and use it in GitHub Desktop.
Save nasirhm/65194ac118ee661d058cf457531b47a5 to your computer and use it in GitHub Desktop.
ReposVul
This file has been truncated, but you can view the full file.
{
"index": 10,
"cve_id": "CVE-2011-0990",
"cwe_id": [
"CWE-362"
],
"cve_language": "C",
"cve_description": "Race condition in the FastCopy optimization in the Array.Copy method in metadata/icall.c in Mono, when Moonlight 2.x before 2.4.1 or 3.x before 3.99.3 is used, allows remote attackers to trigger a buffer overflow and modify internal data structures, and cause a denial of service (plugin crash) or corrupt the internal state of the security manager, via a crafted media file in which a thread makes a change after a type check but before a copy action.",
"cvss": "4.8",
"publish_date": "April 13, 2011",
"AV": "NETWORK",
"AC": "NETWORK",
"PR": "NONE",
"UI": "NONE",
"S": "UNCHANGED",
"C": "NONE",
"I": "LOW",
"A": "LOW",
"commit_id": "2f00e4bbb2137130845afb1b2a1e678552fc8e5c",
"commit_message": "Disable some of the FastCopy fast paths since they are racy.",
"commit_date": "2011-01-18T16:17:56Z",
"project": "mono/mono",
"url": "https://api.github.com/repos/mono/mono/commits/2f00e4bbb2137130845afb1b2a1e678552fc8e5c",
"html_url": "https://github.com/mono/mono/commit/2f00e4bbb2137130845afb1b2a1e678552fc8e5c",
"windows_before": [
{
"commit_id": "ee83bdd1f6bea90732c86a9621abcee63182ccbf",
"commit_date": "Tue Jan 18 17:16:40 2011 +0100",
"commit_message": "Disable some of the FastCopy fast paths since they are racy.",
"files_name": [
"mono/metadata/icall.c"
]
},
{
"commit_id": "27bef54a6f82af67dc435e9e1c2307d090f21162",
"commit_date": "Tue Jan 18 15:59:27 2011 +0000",
"commit_message": "Fix Task.Wait timeout regression",
"files_name": [
"mcs/class/corlib/System.Threading.Tasks/ThreadWorker.cs"
]
},
{
"commit_id": "4383deb00939fa6fcca92101957f444954662631",
"commit_date": "Tue Jan 18 15:28:07 2011 +0000",
"commit_message": "Expose ThreadWorker in Mono.Parallel",
"files_name": [
"mcs/class/Mono.Parallel/Documentation/en/Mono.Threading.Tasks/ThreadWorker.xml",
"mcs/class/Mono.Parallel/Documentation/en/index.xml",
"mcs/class/Mono.Parallel/Makefile",
"mcs/class/Mono.Parallel/Mono.Parallel.dll.sources",
"mcs/class/corlib/System.Threading.Tasks/Scheduler.cs",
"mcs/class/corlib/System.Threading.Tasks/ThreadWorker.cs"
]
},
{
"commit_id": "89ef327cd5ad9888894ee112c0c21c9bb8128068",
"commit_date": "Tue Jan 18 15:28:46 2011 +0000",
"commit_message": "Add doc for IMonoTaskScheduler extra behavior",
"files_name": [
"mcs/class/Mono.Parallel/Documentation/en/Mono.Threading.Tasks/IMonoTaskScheduler.xml",
"mcs/class/Mono.Parallel/Documentation/en/index.xml"
]
},
{
"commit_id": "1e9c83e031b9e624b0286f15fec22d424b487bff",
"commit_date": "Tue Jan 18 15:25:13 2011 +0000",
"commit_message": "Update MonoTaskExtensions doc",
"files_name": [
"mcs/class/Mono.Parallel/Documentation/en/Mono.Threading.Tasks/MonoTaskExtensions.xml"
]
},
{
"commit_id": "772d9cb780066f72578f4b8d51b90067201ef5fa",
"commit_date": "Tue Jan 18 15:23:08 2011 +0000",
"commit_message": "Further checks of ParticipateUntil mashalling",
"files_name": [
"mcs/class/Mono.Parallel/Test/Mono.Threading.Tasks/MonoTaskSchedulerTests.cs"
]
},
{
"commit_id": "6c271d651c777e6be9fec940d5ae9c1d4ba73766",
"commit_date": "Tue Jan 18 16:41:37 2011 +0100",
"commit_message": "Allow only primitive types/enums in RuntimeHelpers.InitializeArray ().",
"files_name": [
"mono/metadata/icall.c"
]
},
{
"commit_id": "3c06aa3b92d0ef22acf33d25db38ca68fa631b02",
"commit_date": "Tue Jan 18 13:30:51 2011 +0000",
"commit_message": "Remove devirtualization for Type members",
"files_name": [
"mcs/mcs/expression.cs"
]
},
{
"commit_id": "dfe41906506e2a9451fef44808d7f1807620878d",
"commit_date": "Tue Jan 18 13:17:27 2011 +0000",
"commit_message": "Simplify base type interface check",
"files_name": [
"mcs/mcs/import.cs"
]
},
{
"commit_id": "84c53cecc2b904602b4b11e8cbe24f6c40f34318",
"commit_date": "Tue Jan 18 12:49:41 2011 +0000",
"commit_message": "Update to the latest IKVM which now has support for missing types",
"files_name": [
"mcs/class/IKVM.Reflection/Assembly.cs",
"mcs/class/IKVM.Reflection/ConstructorInfo.cs",
"mcs/class/IKVM.Reflection/CustomAttributeData.cs",
"mcs/class/IKVM.Reflection/Emit/EnumBuilder.cs",
"mcs/class/IKVM.Reflection/Emit/ModuleBuilder.cs",
"mcs/class/IKVM.Reflection/Emit/OpCodes.cs",
"mcs/class/IKVM.Reflection/Emit/TypeBuilder.cs",
"mcs/class/IKVM.Reflection/EventInfo.cs",
"mcs/class/IKVM.Reflection/FieldInfo.cs",
"mcs/class/IKVM.Reflection/IKVM.Reflection.csproj",
"mcs/class/IKVM.Reflection/LocalVariableInfo.cs",
"mcs/class/IKVM.Reflection/ManifestResourceInfo.cs",
"mcs/class/IKVM.Reflection/MemberInfo.cs",
"mcs/class/IKVM.Reflection/MethodBase.cs",
"mcs/class/IKVM.Reflection/MethodInfo.cs",
"mcs/class/IKVM.Reflection/Missing.cs",
"mcs/class/IKVM.Reflection/Module.cs",
"mcs/class/IKVM.Reflection/ParameterInfo.cs",
"mcs/class/IKVM.Reflection/PropertyInfo.cs",
"mcs/class/IKVM.Reflection/Reader/Method.cs",
"mcs/class/IKVM.Reflection/Reader/ModuleReader.cs",
"mcs/class/IKVM.Reflection/Reader/TypeDefImpl.cs",
"mcs/class/IKVM.Reflection/Signature.cs",
"mcs/class/IKVM.Reflection/StrongNameKeyPair.cs",
"mcs/class/IKVM.Reflection/Type.cs",
"mcs/class/IKVM.Reflection/TypeNameParser.cs",
"mcs/class/IKVM.Reflection/Universe.cs",
"mcs/class/IKVM.Reflection/reflect.build",
"mcs/errors/CS0012-12-lib.il",
"mcs/errors/Makefile",
"mcs/errors/cs0012-12.cs",
"mcs/errors/cs1701.cs",
"mcs/errors/cs1702.cs",
"mcs/errors/cs1705.cs",
"mcs/mcs/class.cs",
"mcs/mcs/decl.cs",
"mcs/mcs/field.cs",
"mcs/mcs/generic.cs",
"mcs/mcs/ikvm.cs",
"mcs/mcs/import.cs",
"mcs/mcs/membercache.cs",
"mcs/mcs/method.cs",
"mcs/mcs/property.cs",
"mcs/mcs/typespec.cs"
]
},
{
"commit_id": "ef6a07d9d1757d55b6f2f99c07991c0d3742297b",
"commit_date": "Mon Jan 17 19:40:29 2011 +0000",
"commit_message": "Add support for external ParticipateUntil method call in user-made TaskScheduler",
"files_name": [
"mcs/class/Mono.Parallel/Mono.Parallel.dll.sources",
"mcs/class/Mono.Parallel/Mono.Parallel_test.dll.sources",
"mcs/class/Mono.Parallel/Mono.Threading.Tasks/MonoTaskScheduler.cs",
"mcs/class/Mono.Parallel/Test/Mono.Threading.Tasks/MonoTaskSchedulerTests.cs",
"mcs/class/corlib/System.Threading.Tasks/SchedulerProxy.cs"
]
},
{
"commit_id": "70df5f5a3dcae6933a047fe8b3590940d4b00780",
"commit_date": "Mon Jan 17 19:39:03 2011 +0000",
"commit_message": "Use static initializer for internal Execute binding",
"files_name": [
"mcs/class/Mono.Parallel/Mono.Threading.Tasks/MonoTaskExtensions.cs"
]
},
{
"commit_id": "b7f41b092a5e433c985c55d9e2a4493b00cda19a",
"commit_date": "Tue Jan 18 19:16:25 2011 +0900",
"commit_message": "XamlObjectReader does not return non-writable members. Fix Skip() to work with GetObject.",
"files_name": [
"mcs/class/System.Xaml/System.Xaml/XamlNode.cs",
"mcs/class/System.Xaml/System.Xaml/XamlObjectNodeIterator.cs",
"mcs/class/System.Xaml/System.Xaml/XamlReader.cs",
"mcs/class/System.Xaml/Test/System.Xaml/TestedTypes.cs",
"mcs/class/System.Xaml/Test/System.Xaml/XamlObjectReaderTest.cs",
"mcs/class/System.Xaml/Test/System.Xaml/XamlObjectWriterTest.cs",
"mcs/class/System.Xaml/Test/System.Xaml/XamlTypeTest.cs",
"mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs",
"mcs/class/System.Xaml/Test/System.Xaml/XamlXmlWriterTest.cs"
]
},
{
"commit_id": "9926e923d740027ca67c393e1cd8c8ece8d57868",
"commit_date": "Tue Jan 18 09:40:23 2011 +0100",
"commit_message": "[asp.net] Removed the /noconfig comment - it turns out this is what is supposed to be done",
"files_name": [
"mcs/class/System.Web/System.Web.Compilation/AssemblyBuilder.cs"
]
},
{
"commit_id": "694d59471fd63372f582223beb037c3841270d30",
"commit_date": "Tue Jan 18 08:46:13 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 4).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/KeyPressEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Keys.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/KeysConverter.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Label.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LabelEditEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LayoutEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LayoutSettings.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkArea.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkClickedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkConverter.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkLabel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkLabelLinkClickedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/LinkLabelLinkClickedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBindingHelper.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListControl.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListControlConvertEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListControlConvertEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewAlignment.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewGroup.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewGroupCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewHitTestInfo.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewHitTestLocations.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewInsertionMark.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItemMouseHoverEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItemMouseHoverEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItemSelectionChangedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItemSelectionChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItemStates.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewVirtualItemsSelectionRangeChangedEventArgs.cs"
]
},
{
"commit_id": "c63efd57c4a60935da533f6af7ef1c25d29a0541",
"commit_date": "Tue Jan 18 08:43:26 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 3).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementErrorEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementErrorEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElementInsertionOrientation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlHistory.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlWindow.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlWindowCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IBindableComponent.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IBounds.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ICurrencyManagerProvider.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IDataGridViewEditingCell.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IDataGridViewEditingControl.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IDropTarget.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/IToolStripData.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageKeyConverter.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageLayout.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageList.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImeMode.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/InsertKeyMode.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/InternalWindowManager.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemActivation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemBoundsPortion.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemCheckEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemCheckedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemCheckedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ItemDragEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/KeyEventArgs.cs"
]
},
{
"commit_id": "7f89bd25f16863052da5d8e7b44cd4629f6550ad",
"commit_date": "Tue Jan 18 08:41:06 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 2).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FlowDirection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FlowLayoutPanel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FlowLayoutSettings.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FontDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Form.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormBorderStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormClosedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormClosedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormClosingEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormClosingEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormStartPosition.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/FormWindowState.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GetChildAtPointSkip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridColumnStylesCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridEntry.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridItem.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridItemType.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridTableStylesCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GridTablesFactory.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GroupBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/GroupBoxRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HScrollBar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HScrollProperties.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HandledMouseEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HelpNavigator.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HelpProvider.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlDocument.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/HtmlElement.cs"
]
},
{
"commit_id": "9557c417b867132f1f5150038e209041b5acaa45",
"commit_date": "Tue Jan 18 08:38:07 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 1).",
"files_name": []
}
],
"windows_after": [
{
"commit_id": "bacdafc90bc5fadce95bb91b90ca570b53469691",
"commit_date": "Tue Jan 18 16:05:20 2011 +0000",
"commit_message": "Remove unused type",
"files_name": [
"mcs/mcs/reflection.cs"
]
},
{
"commit_id": "e6d7773566fb0b5fa7722af918b2656b4fcc3cac",
"commit_date": "Tue Jan 18 17:07:08 2011 +0000",
"commit_message": "Fix loading of same assembly when used with different reference aliases",
"files_name": [
"mcs/mcs/ikvm.cs",
"mcs/mcs/support.cs"
]
},
{
"commit_id": "86190c96d08a694016ef3e3e9f29de22e6045843",
"commit_date": "Tue Jan 18 17:07:47 2011 +0000",
"commit_message": "Checking skd path for is not enough, add check for mscorlib as well",
"files_name": [
"mcs/mcs/ikvm.cs"
]
},
{
"commit_id": "b81c4662c297aebf94da197fb4e20d7a56f3cbda",
"commit_date": "Tue Jan 18 18:10:34 2011 +0100",
"commit_message": "Make the stacks of aot image non-executable.",
"files_name": [
"mono/mini/aot-compiler.c",
"mono/mini/image-writer.c",
"mono/utils/freebsd-elf_common.h"
]
},
{
"commit_id": "11bf89d6d4ba98df6599ad9ab48bd2b62ed7c785",
"commit_date": "Tue Jan 18 17:34:04 2011 +0000",
"commit_message": "Build declared interface based on full type hierarchy",
"files_name": [
"mcs/mcs/import.cs"
]
},
{
"commit_id": "9ae3d21c17302268e8fbb3c5e56e01f1fec1c72d",
"commit_date": "Mon Jan 17 01:04:37 2011 -0500",
"commit_message": "[HttpWebRequest] Support 4.0 Host property.",
"files_name": [
"mcs/class/System/System.Net/HttpWebRequest.cs",
"mcs/class/System/Test/System.Net/HttpWebRequestTest.cs"
]
},
{
"commit_id": "7f146f9f07a1c65e34c5bc52ace0db3f4631aecd",
"commit_date": "Tue Jan 18 19:21:59 2011 +0000",
"commit_message": "Expose ThreadWorker fields",
"files_name": [
"mcs/class/corlib/System.Threading.Tasks/ThreadWorker.cs"
]
},
{
"commit_id": "082589b0f7260921c453b37b92a1bb355d78af81",
"commit_date": "Tue Jan 18 22:16:06 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 5).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewVirtualItemsSelectionRangeChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MainMenu.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MaskFormat.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MaskInputRejectedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MaskInputRejectedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MaskedTextBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MdiClient.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MdiControlStrip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MdiWindowManager.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MeasureItemEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Menu.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuItem.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuStrip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MergeAction.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Message.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MessageBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MethodInvoker.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Mime.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MonthCalendar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/MouseEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/NativeWindow.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/NotifyIcon.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDownAcceleration.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDownAccelerationCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/OSFeature.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/OpenFileDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/OwnerDrawPropertyBag.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Padding.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PaddingConverter.cs"
]
},
{
"commit_id": "839d595e2b86d00bd5161b98643161a24ffe76ca",
"commit_date": "Tue Jan 18 22:19:21 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 6).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PageSetupDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PaintEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PaintEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Panel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PictureBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PictureBoxSizeMode.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PopupEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PopupEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PowerLineStatus.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PowerState.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PowerStatus.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PreProcessControlState.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PreviewKeyDownEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PreviewKeyDownEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintControllerWithStatusDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewControl.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ProfessionalColorTable.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ProfessionalColors.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ProgressBar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ProgressBarRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ProgressBarStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyGrid.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyGridView.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyManager.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertySort.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyTabChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/PropertyValueChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/QuestionEventArgs.cs"
]
},
{
"commit_id": "d47d06a19c6863331c93f11861fea0a1b51b9441",
"commit_date": "Tue Jan 18 22:22:30 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 7).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/QuestionEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RadioButton.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RadioButtonRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RelatedImageListAttribute.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RetrieveVirtualItemEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RetrieveVirtualItemEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RichTextBoxLanguageOptions.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/RowStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Screen.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScreenOrientation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollBar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollBarRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollOrientation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollProperties.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollableControl.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SearchDirectionHint.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SearchForVirtualItemEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SearchForVirtualItemEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SelectedGridItemChangedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SelectionMode.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Shortcut.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SizeGrip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SizeGripStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SizeType.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SortOrder.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SplitContainer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Splitter.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SplitterCancelEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SplitterCancelEventHandler.cs"
]
},
{
"commit_id": "1b95c9e7aa166fb961701d0b809824f07f4cde5c",
"commit_date": "Tue Jan 18 22:26:25 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 8).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SplitterPanel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/StatusBar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/StatusBarPanel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/StatusStrip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/StructFormat.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SystemInformation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/SystemParameter.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControlAction.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControlCancelEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControlCancelEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControlEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControlEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabPage.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutCellPaintEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutCellPaintEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutColumnStyleCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutControlCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutPanel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutPanelCellBorderStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutPanelCellPosition.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutPanelGrowStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutRowStyleCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutSettings.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TableLayoutStyleCollection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextControl.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextDataFormat.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextFormatFlags.cs"
]
},
{
"commit_id": "fb13ef43ce54928ab4307409b571685eced0cc1e",
"commit_date": "Tue Jan 18 16:43:51 2011 -0500",
"commit_message": "[HttpWebRequest] Support 4.0 Date property.",
"files_name": [
"mcs/class/System/System.Net/HttpWebRequest.cs",
"mcs/class/System/System.Net/WebHeaderCollection.cs",
"mcs/class/System/Test/System.Net/HttpWebRequestTest.cs"
]
},
{
"commit_id": "68b93c5ec19481e860cd84f9a80d50589d8e0d48",
"commit_date": "Tue Jan 18 23:44:43 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 9).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextImageRelation.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextRenderer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeClearlooks.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeVisualStyles.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThreadExceptionDialog.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/Timer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBar.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBarAppearance.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBarButton.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBarButtonClickEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBarButtonStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBarTextAlign.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripArrowRenderEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripArrowRenderEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripButton.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripComboBox.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripContainer.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripContentPanel.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripContentPanelRenderEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripContentPanelRenderEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripControlHost.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDown.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownButton.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownCloseReason.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownClosedEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownClosedEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownClosingEventArgs.cs"
]
},
{
"commit_id": "1f6bdc7f36f1b48d6d64cb526dcef2eba71e954a",
"commit_date": "Tue Jan 18 23:52:59 2011 +0100",
"commit_message": "MWF: Remove #if NET_2_0 and #if ONLY_1_1 conditions (part 10).",
"files_name": [
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownClosingEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownDirection.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownItem.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownItemAccessibleObject.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownMenu.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripGripDisplayStyle.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripGripRenderEventArgs.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripGripRenderEventHandler.cs",
"mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripGripStyle.cs"
]
}
],
"parents": [
{
"commit_id_before": "035c8587c0d8d307e45f1b7171a0d337bb451f1e",
"url_before": "https://api.github.com/repos/mono/mono/commits/035c8587c0d8d307e45f1b7171a0d337bb451f1e",
"html_url_before": "https://github.com/mono/mono/commit/035c8587c0d8d307e45f1b7171a0d337bb451f1e"
}
],
"details": [
{
"raw_url": "https://github.com/mono/mono/raw/2f00e4bbb2137130845afb1b2a1e678552fc8e5c/mono%2Fmetadata%2Ficall.c",
"code": "/*\n * icall.c:\n *\n * Authors:\n * Dietmar Maurer ([email protected])\n * Paolo Molaro ([email protected])\n *\t Patrik Torstensson ([email protected])\n *\n * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)\n * Copyright 2004-2009 Novell, Inc (http://www.novell.com)\n */\n\n#include <config.h>\n#include <glib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <ctype.h>\n#ifdef HAVE_ALLOCA_H\n#include <alloca.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#if defined (PLATFORM_WIN32)\n#include <stdlib.h>\n#endif\n\n#include \"mono/utils/mono-membar.h\"\n#include <mono/metadata/object.h>\n#include <mono/metadata/threads.h>\n#include <mono/metadata/threads-types.h>\n#include <mono/metadata/threadpool.h>\n#include <mono/metadata/monitor.h>\n#include <mono/metadata/reflection.h>\n#include <mono/metadata/assembly.h>\n#include <mono/metadata/tabledefs.h>\n#include <mono/metadata/exception.h>\n#include <mono/metadata/file-io.h>\n#include <mono/metadata/console-io.h>\n#include <mono/metadata/socket-io.h>\n#include <mono/metadata/mono-endian.h>\n#include <mono/metadata/tokentype.h>\n#include <mono/metadata/domain-internals.h>\n#include <mono/metadata/metadata-internals.h>\n#include <mono/metadata/class-internals.h>\n#include <mono/metadata/marshal.h>\n#include <mono/metadata/gc-internal.h>\n#include <mono/metadata/mono-gc.h>\n#include <mono/metadata/rand.h>\n#include <mono/metadata/sysmath.h>\n#include <mono/metadata/string-icalls.h>\n#include <mono/metadata/debug-helpers.h>\n#include <mono/metadata/process.h>\n#include <mono/metadata/environment.h>\n#include <mono/metadata/profiler-private.h>\n#include <mono/metadata/locales.h>\n#include <mono/metadata/filewatcher.h>\n#include <mono/metadata/char-conversions.h>\n#include <mono/metadata/security.h>\n#include <mono/metadata/mono-config.h>\n#include <mono/metadata/cil-coff.h>\n#include <mono/metadata/number-formatter.h>\n#include <mono/metadata/security-manager.h>\n#include <mono/metadata/security-core-clr.h>\n#include <mono/metadata/mono-perfcounters.h>\n#include <mono/metadata/mono-debug.h>\n#include <mono/metadata/verify-internals.h>\n#include <mono/io-layer/io-layer.h>\n#include <mono/utils/strtod.h>\n#include <mono/utils/monobitset.h>\n#include <mono/utils/mono-time.h>\n#include <mono/utils/mono-proclib.h>\n#include <mono/utils/mono-string.h>\n#include <mono/utils/mono-error-internals.h>\n\n\n#if defined (PLATFORM_WIN32)\n#include <windows.h>\n#include <shlobj.h>\n#endif\n#include \"decimal.h\"\n\nstatic MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void);\n\nstatic MonoArray*\ntype_array_from_modifiers (MonoImage *image, MonoType *type, int optional);\n\n/* This is an implementation of a growable pointer array that avoids doing memory allocations for small sizes.\n * It works by allocating an initial small array on stack and only going to malloc'd memory if needed. \n */\ntypedef struct {\n\tvoid **data;\n\tint size;\n\tint capacity;\n} MonoPtrArray;\n\n#define MONO_PTR_ARRAY_MAX_ON_STACK (16)\n\n#define mono_ptr_array_init(ARRAY, INITIAL_SIZE) do {\\\n\t(ARRAY).size = 0; \\\n\t(ARRAY).capacity = MAX (INITIAL_SIZE, MONO_PTR_ARRAY_MAX_ON_STACK); \\\n\t(ARRAY).data = INITIAL_SIZE > MONO_PTR_ARRAY_MAX_ON_STACK ? mono_gc_alloc_fixed (sizeof (void*) * INITIAL_SIZE, NULL) : g_newa (void*, MONO_PTR_ARRAY_MAX_ON_STACK); \\\n} while (0)\n\n#define mono_ptr_array_destroy(ARRAY) do {\\\n\tif ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \\\n\t\tmono_gc_free_fixed ((ARRAY).data); \\\n} while (0)\n\n#define mono_ptr_array_append(ARRAY, VALUE) do { \\\n\tif ((ARRAY).size >= (ARRAY).capacity) {\\\n\t\tvoid *__tmp = mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, NULL); \\\n\t\tmemcpy (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \\\n\t\tif ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK)\t\\\n\t\t\tmono_gc_free_fixed ((ARRAY).data);\t\\\n\t\t(ARRAY).data = __tmp;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(ARRAY).capacity *= 2;\\\n\t}\\\n\t((ARRAY).data [(ARRAY).size++] = VALUE); \\\n} while (0)\n\n#define mono_ptr_array_set(ARRAY, IDX, VALUE) do { \\\n\t((ARRAY).data [(IDX)] = VALUE); \\\n} while (0)\n\t\n#define mono_ptr_array_get(ARRAY, IDX) ((ARRAY).data [(IDX)])\n\n#define mono_ptr_array_size(ARRAY) ((ARRAY).size)\n\n\nstatic inline MonoBoolean\nis_generic_parameter (MonoType *type)\n{\n\treturn !type->byref && (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR);\n}\n\n/*\n * We expect a pointer to a char, not a string\n */\nstatic gboolean\nmono_double_ParseImpl (char *ptr, double *result)\n{\n\tgchar *endptr = NULL;\n\t*result = 0.0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n#ifdef __arm__\n\tif (*ptr)\n\t\t*result = strtod (ptr, &endptr);\n#else\n\tif (*ptr){\n#ifdef _EGLIB_MAJOR\n\t\t/* Need to lock here because EGLIB (#464316) has locking defined as no-ops, and that breaks mono_strtod */\n\t\tEnterCriticalSection (&mono_strtod_mutex);\n\t\t*result = mono_strtod (ptr, &endptr);\n\t\tLeaveCriticalSection (&mono_strtod_mutex);\n#else\n\t\t*result = mono_strtod (ptr, &endptr);\n#endif\n\t}\n#endif\n\n\tif (!*ptr || (endptr && *endptr))\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\nstatic MonoObject *\nves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (ac->element_class->valuetype)\n\t\treturn mono_value_box (this->vtable->domain, ac->element_class, ea);\n\telse\n\t\treturn *ea;\n}\n\nstatic MonoObject *\nves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)\n{\n\tMonoClass *ac, *ic;\n\tMonoArray *ao, *io;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tio = (MonoArray *)idxs;\n\tic = (MonoClass *)io->obj.vtable->klass;\n\t\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (io->bounds != NULL || io->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)io->vector;\n\n\tif (ao->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= ao->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\treturn ves_icall_System_Array_GetValueImpl (this, *ind);\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < ao->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - ao->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos*ao->bounds [i].length + ind [i] - \n\t\t\tao->bounds [i].lower_bound;\n\n\treturn ves_icall_System_Array_GetValueImpl (this, pos);\n}\n\nstatic void\nves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)\n{\n\tMonoClass *ac, *vc, *ec;\n\tgint32 esize, vsize;\n\tgpointer *ea, *va;\n\tint et, vt;\n\n\tguint64 u64 = 0;\n\tgint64 i64 = 0;\n\tgdouble r64 = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (value)\n\t\tvc = value->vtable->klass;\n\telse\n\t\tvc = NULL;\n\n\tac = this->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)this->vector + (pos * esize));\n\tva = (gpointer*)((char*)value + sizeof (MonoObject));\n\n\tif (mono_class_is_nullable (ec)) {\n\t\tmono_nullable_init ((guint8*)ea, value, ec);\n\t\treturn;\n\t}\n\n\tif (!value) {\n\t\tmemset (ea, 0, esize);\n\t\treturn;\n\t}\n\n#define NO_WIDENING_CONVERSION G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\\\n\tif (esize < vsize + (extra)) \\\n\t\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define INVALID_CAST G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_invalid_cast ()); \\\n}G_STMT_END\n\n\t/* Check element (destination) type. */\n\tswitch (ec->byval_arg.type) {\n\tcase MONO_TYPE_STRING:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_STRING:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (!ec->valuetype) {\n\t\tif (!mono_object_isinst (value, ec))\n\t\t\tINVALID_CAST;\n\t\tmono_gc_wbarrier_set_arrayref (this, ea, (MonoObject*)value);\n\t\treturn;\n\t}\n\n\tif (mono_object_isinst (value, ec)) {\n\t\tif (ec->has_references)\n\t\t\tmono_value_copy (ea, (char*)value + sizeof (MonoObject), ec);\n\t\telse\n\t\t\tmemcpy (ea, (char *)value + sizeof (MonoObject), esize);\n\t\treturn;\n\t}\n\n\tif (!vc->valuetype)\n\t\tINVALID_CAST;\n\n\tvsize = mono_class_instance_size (vc) - sizeof (MonoObject);\n\n\tet = ec->byval_arg.type;\n\tif (et == MONO_TYPE_VALUETYPE && ec->byval_arg.data.klass->enumtype)\n\t\tet = mono_class_enum_basetype (ec->byval_arg.data.klass)->type;\n\n\tvt = vc->byval_arg.type;\n\tif (vt == MONO_TYPE_VALUETYPE && vc->byval_arg.data.klass->enumtype)\n\t\tvt = mono_class_enum_basetype (vc->byval_arg.data.klass)->type;\n\n#define ASSIGN_UNSIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a signed value to an unsigned array. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t} \\\n}G_STMT_END\n\n#define ASSIGN_SIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) i64; \\\n\t\treturn; \\\n\t/* You can assign an unsigned value to a signed array if the array's */ \\\n\t/* element size is larger than the value size. */ \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(1); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t} \\\n}G_STMT_END\n\n#define ASSIGN_REAL(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) r64; \\\n\t\treturn; \\\n\t/* All integer values fit into a floating point array, so we don't */ \\\n\t/* need to CHECK_WIDENING_CONVERSION here. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t\t*(etype *) ea = (etype) i64; \\\n\t\treturn; \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t} \\\n}G_STMT_END\n\n\tswitch (vt) {\n\tcase MONO_TYPE_U1:\n\t\tu64 = *(guint8 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U2:\n\t\tu64 = *(guint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U4:\n\t\tu64 = *(guint32 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U8:\n\t\tu64 = *(guint64 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I1:\n\t\ti64 = *(gint8 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I2:\n\t\ti64 = *(gint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\t\ti64 = *(gint32 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\t\ti64 = *(gint64 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_R4:\n\t\tr64 = *(gfloat *) va;\n\t\tbreak;\n\tcase MONO_TYPE_R8:\n\t\tr64 = *(gdouble *) va;\n\t\tbreak;\n\tcase MONO_TYPE_CHAR:\n\t\tu64 = *(guint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\t/* Boolean is only compatible with itself. */\n\t\tswitch (et) {\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\t/* If we can't do a direct copy, let's try a widening conversion. */\n\tswitch (et) {\n\tcase MONO_TYPE_CHAR:\n\t\tASSIGN_UNSIGNED (guint16);\n\tcase MONO_TYPE_U1:\n\t\tASSIGN_UNSIGNED (guint8);\n\tcase MONO_TYPE_U2:\n\t\tASSIGN_UNSIGNED (guint16);\n\tcase MONO_TYPE_U4:\n\t\tASSIGN_UNSIGNED (guint32);\n\tcase MONO_TYPE_U8:\n\t\tASSIGN_UNSIGNED (guint64);\n\tcase MONO_TYPE_I1:\n\t\tASSIGN_SIGNED (gint8);\n\tcase MONO_TYPE_I2:\n\t\tASSIGN_SIGNED (gint16);\n\tcase MONO_TYPE_I4:\n\t\tASSIGN_SIGNED (gint32);\n\tcase MONO_TYPE_I8:\n\t\tASSIGN_SIGNED (gint64);\n\tcase MONO_TYPE_R4:\n\t\tASSIGN_REAL (gfloat);\n\tcase MONO_TYPE_R8:\n\t\tASSIGN_REAL (gdouble);\n\t}\n\n\tINVALID_CAST;\n\t/* Not reached, INVALID_CAST does not return. Just to avoid a compiler warning ... */\n\treturn;\n\n#undef INVALID_CAST\n#undef NO_WIDENING_CONVERSION\n#undef CHECK_WIDENING_CONVERSION\n#undef ASSIGN_UNSIGNED\n#undef ASSIGN_SIGNED\n#undef ASSIGN_REAL\n}\n\nstatic void \nves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,\n\t\t\t\t MonoArray *idxs)\n{\n\tMonoClass *ac, *ic;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tic = idxs->obj.vtable->klass;\n\tac = this->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (idxs->bounds != NULL || idxs->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)idxs->vector;\n\n\tif (this->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= this->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\tves_icall_System_Array_SetValueImpl (this, value, *ind);\n\t\treturn;\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < this->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - this->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos * this->bounds [i].length + ind [i] - \n\t\t\tthis->bounds [i].lower_bound;\n\n\tves_icall_System_Array_SetValueImpl (this, value, pos);\n}\n\nstatic MonoArray *\nves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++)\n\t\tif (mono_array_get (lengths, gint32, i) < 0)\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint32, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}\n\nstatic MonoArray *\nves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++) \n\t\tif ((mono_array_get (lengths, gint64, i) < 0) ||\n\t\t (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX))\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint64, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = (mono_array_size_t) mono_array_get (bounds, guint64, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}\n\nstatic gint32 \nves_icall_System_Array_GetRank (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this->vtable->klass->rank;\n}\n\nstatic gint32\nves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\tmono_array_size_t length;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\tlength = this->max_length;\n\telse\n\t\tlength = this->bounds [dimension].length;\n\n#ifdef MONO_BIG_ARRAYS\n\tif (length > G_MAXINT32)\n\t mono_raise_exception (mono_get_exception_overflow ());\n#endif\n\treturn length;\n}\n\nstatic gint64\nves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n \t\treturn this->max_length;\n \t\n \treturn this->bounds [dimension].length;\n}\n\nstatic gint32\nves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\treturn 0;\n\t\n\treturn this->bounds [dimension].lower_bound;\n}\n\nstatic void\nves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)\n{\n\tint sz = mono_array_element_size (mono_object_class (arr));\n\tmemset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);\n}\n\nstatic gboolean\nves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)\n{\n\tint element_size;\n\tvoid * dest_addr;\n\tvoid * source_addr;\n\tMonoClass *src_class;\n\tMonoClass *dest_class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)\n\t\treturn FALSE;\n\n\tif (source->bounds || dest->bounds)\n\t\treturn FALSE;\n\n\t/* there's no integer overflow since mono_array_length returns an unsigned integer */\n\tif ((dest_idx + length > mono_array_length (dest)) ||\n\t\t(source_idx + length > mono_array_length (source)))\n\t\treturn FALSE;\n\n\tsrc_class = source->obj.vtable->klass->element_class;\n\tdest_class = dest->obj.vtable->klass->element_class;\n\n\t/*\n\t * Handle common cases.\n\t */\n\n\t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n\tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n\t\t// FIXME: This is racy\n\t\treturn FALSE;\n\t\t/*\n\t\t int i;\n\t\tint has_refs = dest_class->has_references;\n\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\treturn FALSE;\n\t\t}\n\n\t\telement_size = mono_array_element_size (dest->obj.vtable->klass);\n\t\tmemset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);\n\t\t\tvoid *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);\n\t\t\tif (!elem)\n\t\t\t\tcontinue;\n\t\t\tif (has_refs)\n\t\t\t\tmono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);\n\t\t\telse\n\t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n\t\t}\n\t\treturn TRUE;\n\t\t*/\n\t}\n\n\t/* Check if we're copying a char[] <==> (u)short[] */\n\tif (src_class != dest_class) {\n\t\tif (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)\n\t\t\treturn FALSE;\n\n\t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n\t\t\t;\n\t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {\n\t\t\t// FIXME: This is racy\n\t\t\treturn FALSE;\n\t\t\t/*\n\t\t\t int i;\n\t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t*/\n\t\t} else\n\t\t\treturn FALSE;\n\t}\n\n\tif (dest_class->valuetype) {\n\t\telement_size = mono_array_element_size (source->obj.vtable->klass);\n\t\tsource_addr = mono_array_addr_with_size (source, element_size, source_idx);\n\t\tif (dest_class->has_references) {\n\t\t\tmono_value_copy_array (dest, dest_idx, source_addr, length);\n\t\t} else {\n\t\t\tdest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);\n\t\t\tmemmove (dest_addr, source_addr, element_size * length);\n\t\t}\n\t} else {\n\t\tmono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);\n\t}\n\n\treturn TRUE;\n}\n\nstatic void\nves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tmemcpy (value, ea, esize);\n}\n\nstatic void\nves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac, *ec;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (MONO_TYPE_IS_REFERENCE (&ec->byval_arg)) {\n\t\tg_assert (esize == sizeof (gpointer));\n\t\tmono_gc_wbarrier_generic_store (ea, *(gpointer*)value);\n\t} else {\n\t\tg_assert (ec->inited);\n\t\tif (ec->has_references)\n\t\t\tmono_gc_wbarrier_value_copy (ea, value, 1, ec);\n\t\tmemcpy (ea, value, esize);\n\t}\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)\n{\n\tMonoClass *klass = array->obj.vtable->klass;\n\tguint32 size = mono_array_element_size (klass);\n\tMonoType *type = mono_type_get_underlying_type (&klass->element_class->byval_arg);\n\tint align;\n\tconst char *field_data;\n\n\tif (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {\n\t\tMonoException *exc = mono_get_exception_argument(\"array\",\n\t\t\t\"Cannot initialize array of non-primitive type.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field doesn't have an RVA\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tsize *= array->max_length;\n\tfield_data = mono_field_get_data (field_handle);\n\n\tif (size > mono_type_size (field_handle->type, &align)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field not large enough to fill array\");\n\t\tmono_raise_exception (exc);\n\t}\n\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n#define SWAP(n) {\\\n\tguint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \\\n\tguint ## n *src = (guint ## n *) field_data; \\\n\tguint ## n *end = (guint ## n *)((char*)src + size); \\\n\\\n\tfor (; src < end; data++, src++) { \\\n\t\t*data = read ## n (src); \\\n\t} \\\n}\n\n\t/* printf (\"Initialize array with elements of %s type\\n\", klass->element_class->name); */\n\n\tswitch (type->type) {\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\t\tSWAP (16);\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\tSWAP (32);\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\tSWAP (64);\n\t\tbreak;\n\tdefault:\n\t\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n\t\tbreak;\n\t}\n#else\n\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n#ifdef ARM_FPU_FPA\n\tif (klass->element_class->byval_arg.type == MONO_TYPE_R8) {\n\t\tgint i;\n\t\tdouble tmp;\n\t\tdouble *data = (double*)mono_array_addr (array, double, 0);\n\n\t\tfor (i = 0; i < size; i++, data++) {\n\t\t\treadr8 (data, &tmp);\n\t\t\t*data = tmp;\n\t\t}\n\t}\n#endif\n#endif\n}\n\nstatic gint\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn offsetof (MonoString, chars);\n}\n\nstatic MonoObject *\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((obj == NULL) || (! (obj->vtable->klass->valuetype)))\n\t\treturn obj;\n\telse\n\t\treturn mono_object_clone (obj);\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)\n{\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\n\tMONO_CHECK_ARG_NULL (handle);\n\n\tklass = mono_class_from_mono_type (handle);\n\tMONO_CHECK_ARG (handle, klass);\n\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\t/* This will call the type constructor */\n\tmono_runtime_class_init (vtable);\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (MonoImage *image)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_check_for_module_cctor (image);\n\tif (image->has_module_cctor) {\n\t\tMonoClass *module_klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | 1);\n\t\t/*It's fine to raise the exception here*/\n\t\tmono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE));\n\t}\n}\n\nstatic MonoObject *\nves_icall_System_Object_MemberwiseClone (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_object_clone (this);\n}\n\nstatic gint32\nves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tint count = 0;\n\tgint32 result = 0;\n\tMonoClassField* field;\n\tgpointer iter;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_object_class (this);\n\n\tif (mono_class_num_fields (klass) == 0)\n\t\treturn mono_object_hash (this);\n\n\t/*\n\t * Compute the starting value of the hashcode for fields of primitive\n\t * types, and return the remaining fields in an array to the managed side.\n\t * This way, we can avoid costly reflection operations in managed code.\n\t */\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_I4:\n\t\t\tresult ^= *(gint32*)((guint8*)this + field->offset);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s;\n\t\t\ts = *(MonoString**)((guint8*)this + field->offset);\n\t\t\tif (s != NULL)\n\t\t\t\tresult ^= mono_string_hash (s);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass));\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t}\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t} else {\n\t\t*fields = NULL;\n\t}\n\treturn result;\n}\n\nstatic MonoBoolean\nves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tMonoClassField* field;\n\tgpointer iter;\n\tint count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (that);\n\n\tif (this->vtable != that->vtable)\n\t\treturn FALSE;\n\n\tklass = mono_object_class (this);\n\n\tif (klass->enumtype && mono_class_enum_basetype (klass) && mono_class_enum_basetype (klass)->type == MONO_TYPE_I4)\n\t\treturn (*(gint32*)((guint8*)this + sizeof (MonoObject)) == *(gint32*)((guint8*)that + sizeof (MonoObject)));\n\n\t/*\n\t * Do the comparison for fields of primitive type and return a result if\n\t * possible. Otherwise, return the remaining fields in an array to the \n\t * managed side. This way, we can avoid costly reflection operations in \n\t * managed code.\n\t */\n\t*fields = NULL;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tif (*((guint8*)this + field->offset) != *((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\t\tif (*(gint16*)((guint8*)this + field->offset) != *(gint16*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tif (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tif (*(gint64*)((guint8*)this + field->offset) != *(gint64*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R4:\n\t\t\tif (*(float*)((guint8*)this + field->offset) != *(float*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R8:\n\t\t\tif (*(double*)((guint8*)this + field->offset) != *(double*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\n\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s1, *s2;\n\t\t\tguint32 s1len, s2len;\n\t\t\ts1 = *(MonoString**)((guint8*)this + field->offset);\n\t\t\ts2 = *(MonoString**)((guint8*)that + field->offset);\n\t\t\tif (s1 == s2)\n\t\t\t\tbreak;\n\t\t\tif ((s1 == NULL) || (s2 == NULL))\n\t\t\t\treturn FALSE;\n\t\t\ts1len = mono_string_length (s1);\n\t\t\ts2len = mono_string_length (s2);\n\t\t\tif (s1len != s2len)\n\t\t\t\treturn FALSE;\n\n\t\t\tif (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, that);\n\t\t\tvalues [count++] = o;\n\t\t}\n\n\t\tif (klass->enumtype)\n\t\t\t/* enums only have one non-static field */\n\t\t\tbreak;\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t\treturn FALSE;\n\t} else {\n\t\treturn TRUE;\n\t}\n}\n\nstatic MonoReflectionType *\nves_icall_System_Object_GetType (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (obj->vtable->klass != mono_defaults.transparent_proxy_class)\n\t\treturn mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);\n\telse\n\t\treturn mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);\n}\n\nstatic void\nmono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmtype->type = &obj->vtable->klass->byval_arg;\n\tg_assert (mtype->type->type);\n}\n\nstatic gint32\nves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tMONO_CHECK_ARG_NULL (obj);\n\t\n\treturn mono_image_create_token (mb->dynamic_image, obj, TRUE, TRUE);\n}\n\nstatic gint32\nves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,\n\t\t\t\t\tMonoReflectionMethod *method,\n\t\t\t\t\tMonoArray *opt_param_types)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (method);\n\t\n\treturn mono_image_create_method_token (\n\t\tmb->dynamic_image, (MonoObject *) method, opt_param_types);\n}\n\nstatic void\nves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_create_pefile (mb, file);\n}\n\nstatic void\nves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_build_metadata (mb);\n}\n\nstatic void\nves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_register_token (mb->dynamic_image, token, obj);\n}\n\nstatic gboolean\nget_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic gboolean\nget_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (!(*dest)) {\n\t\tif (!strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\t\treturn FALSE;\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic gboolean\nget_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m->wrapper_type != MONO_WRAPPER_NONE)\n\t\treturn FALSE;\n\n\tif (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic MonoReflectionType *\ntype_from_name (const char *str, MonoBoolean ignoreCase)\n{\n\tMonoType *type = NULL;\n\tMonoAssembly *assembly = NULL;\n\tMonoTypeNameParse info;\n\tchar *temp_str = g_strdup (str);\n\tgboolean type_resolve = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* mono_reflection_parse_type() mangles the string */\n\tif (!mono_reflection_parse_type (temp_str, &info)) {\n\t\tmono_reflection_free_type_info (&info);\n\t\tg_free (temp_str);\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tassembly = mono_assembly_load (&info.assembly, NULL, NULL);\n\t} else {\n\t\tMonoMethod *m = mono_method_get_last_managed ();\n\t\tMonoMethod *dest = m;\n\n\t\tmono_stack_walk_no_il (get_caller_no_reflection, &dest);\n\t\tif (!dest)\n\t\t\tdest = m;\n\n\t\t/*\n\t\t * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus\n\t\t * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()\n\t\t * to crash. This only seems to happen in some strange remoting\n\t\t * scenarios and I was unable to figure out what's happening there.\n\t\t * Dec 10, 2005 - Martin.\n\t\t */\n\n\t\tif (dest) {\n\t\t\tassembly = dest->klass->image->assembly;\n\t\t\ttype_resolve = TRUE;\n\t\t} else {\n\t\t\tg_warning (G_STRLOC);\n\t\t}\n\t}\n\n\tif (assembly) {\n\t\t/* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tif (!info.assembly.name && !type) /* try mscorlib */\n\t\ttype = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);\n\n\tif (assembly && !type && type_resolve) {\n\t\ttype_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tmono_reflection_free_type_info (&info);\n\tg_free (temp_str);\n\n\tif (!type) \n\t\treturn NULL;\n\n\treturn mono_type_get_object (mono_domain_get (), type);\n}\n\n#ifdef UNUSED\nMonoReflectionType *\nmono_type_get (const char *str)\n{\n\tchar *copy = g_strdup (str);\n\tMonoReflectionType *type = type_from_name (copy, FALSE);\n\n\tg_free (copy);\n\treturn type;\n}\n#endif\n\nstatic MonoReflectionType*\nves_icall_type_from_name (MonoString *name,\n\t\t\t MonoBoolean throwOnError,\n\t\t\t MonoBoolean ignoreCase)\n{\n\tchar *str = mono_string_to_utf8 (name);\n\tMonoReflectionType *type;\n\n\ttype = type_from_name (str, ignoreCase);\n\tg_free (str);\n\tif (type == NULL){\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tmono_loader_clear_error ();\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\t}\n\t\n\treturn type;\n}\n\n\nstatic MonoReflectionType*\nves_icall_type_from_handle (MonoType *handle)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *klass = mono_class_from_mono_type (handle);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_init (klass);\n\treturn mono_type_get_object (domain, handle);\n}\n\nstatic MonoBoolean\nves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (c && type->type && c->type)\n\t\treturn mono_metadata_type_equal (type->type, c->type);\n\telse\n\t\treturn (type == c) ? TRUE : FALSE;\n}\n\n/* System.TypeCode */\ntypedef enum {\n\tTYPECODE_EMPTY,\n\tTYPECODE_OBJECT,\n\tTYPECODE_DBNULL,\n\tTYPECODE_BOOLEAN,\n\tTYPECODE_CHAR,\n\tTYPECODE_SBYTE,\n\tTYPECODE_BYTE,\n\tTYPECODE_INT16,\n\tTYPECODE_UINT16,\n\tTYPECODE_INT32,\n\tTYPECODE_UINT32,\n\tTYPECODE_INT64,\n\tTYPECODE_UINT64,\n\tTYPECODE_SINGLE,\n\tTYPECODE_DOUBLE,\n\tTYPECODE_DECIMAL,\n\tTYPECODE_DATETIME,\n\tTYPECODE_STRING = 18\n} TypeCode;\n\nstatic guint32\nves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)\n{\n\tint t = type->type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn TYPECODE_OBJECT;\n\nhandle_enum:\n\tswitch (t) {\n\tcase MONO_TYPE_VOID:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn TYPECODE_BOOLEAN;\n\tcase MONO_TYPE_U1:\n\t\treturn TYPECODE_BYTE;\n\tcase MONO_TYPE_I1:\n\t\treturn TYPECODE_SBYTE;\n\tcase MONO_TYPE_U2:\n\t\treturn TYPECODE_UINT16;\n\tcase MONO_TYPE_I2:\n\t\treturn TYPECODE_INT16;\n\tcase MONO_TYPE_CHAR:\n\t\treturn TYPECODE_CHAR;\n\tcase MONO_TYPE_PTR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_U4:\n\t\treturn TYPECODE_UINT32;\n\tcase MONO_TYPE_I4:\n\t\treturn TYPECODE_INT32;\n\tcase MONO_TYPE_U8:\n\t\treturn TYPECODE_UINT64;\n\tcase MONO_TYPE_I8:\n\t\treturn TYPECODE_INT64;\n\tcase MONO_TYPE_R4:\n\t\treturn TYPECODE_SINGLE;\n\tcase MONO_TYPE_R8:\n\t\treturn TYPECODE_DOUBLE;\n\tcase MONO_TYPE_VALUETYPE:\n\t\tif (type->type->data.klass->enumtype) {\n\t\t\tt = mono_class_enum_basetype (type->type->data.klass)->type;\n\t\t\tgoto handle_enum;\n\t\t} else {\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"Decimal\") == 0)\n\t\t\t\t\treturn TYPECODE_DECIMAL;\n\t\t\t\telse if (strcmp (k->name, \"DateTime\") == 0)\n\t\t\t\t\treturn TYPECODE_DATETIME;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_STRING:\n\t\treturn TYPECODE_STRING;\n\tcase MONO_TYPE_SZARRAY:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_VAR:\n\tcase MONO_TYPE_MVAR:\n\tcase MONO_TYPE_TYPEDBYREF:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_CLASS:\n\t\t{\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"DBNull\") == 0)\n\t\t\t\t\treturn TYPECODE_DBNULL;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_GENERICINST:\n\t\treturn TYPECODE_OBJECT;\n\tdefault:\n\t\tg_error (\"type 0x%02x not handled in GetTypeCode()\", t);\n\t}\n\treturn 0;\n}\n\nstatic guint32\nves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tif (!c) /* FIXME: dont know what do do here */\n\t\treturn 0;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref)\n\t\treturn klassc == mono_defaults.object_class;\n\n\treturn mono_class_is_subclass_of (klass, klassc, check_interfaces);\n}\n\nstatic guint32\nves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref && !c->type->byref)\n\t\treturn FALSE;\n\n\treturn mono_class_is_assignable_from (klass, klassc);\n}\n\nstatic guint32\nves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\treturn mono_object_isinst (obj, klass) != NULL;\n}\n\nstatic guint32\nves_icall_get_attributes (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn klass->flags;\n}\n\nstatic MonoReflectionMarshal*\nves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)\n{\n\tMonoClass *klass = field->field->parent;\n\tMonoMarshalType *info;\n\tint i;\n\n\tif (klass->generic_container ||\n\t (klass->generic_class && klass->generic_class->context.class_inst->is_open))\n\t\treturn NULL;\n\n\tinfo = mono_marshal_load_type_info (klass);\n\n\tfor (i = 0; i < info->num_fields; ++i) {\n\t\tif (info->fields [i].field == field->field) {\n\t\t\tif (!info->fields [i].mspec)\n\t\t\t\treturn NULL;\n\t\t\telse\n\t\t\t\treturn mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nstatic MonoReflectionField*\nves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)\n{\n\tgboolean found = FALSE;\n\tMonoClass *klass;\n\tMonoClass *k;\n\n\tg_assert (handle);\n\n\tif (!type) {\n\t\tklass = handle->parent;\n\t} else {\n\t\tklass = mono_class_from_mono_type (type);\n\n\t\t/* Check that the field belongs to the class */\n\t\tfor (k = klass; k; k = k->parent) {\n\t\t\tif (k == handle->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found)\n\t\t\t/* The managed code will throw the exception */\n\t\t\treturn NULL;\n\t}\n\n\treturn mono_field_get_object (mono_domain_get (), klass, handle);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *field, MonoBoolean optional)\n{\n\tMonoType *type = field->field->type;\n\n\treturn type_array_from_modifiers (field->field->parent->image, type, optional);\n}\n\nstatic void\nves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoMethodSignature* sig;\n\tMONO_ARCH_SAVE_REGS;\n\n\tsig = mono_method_signature (method);\n\tif (!sig) {\n\t\tg_assert (mono_loader_get_last_error ());\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t}\n\n\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &method->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, ret, mono_type_get_object (domain, sig->ret));\n\tinfo->attrs = method->flags;\n\tinfo->implattrs = method->iflags;\n\tif (sig->call_convention == MONO_CALL_DEFAULT)\n\t\tinfo->callconv = sig->sentinelpos >= 0 ? 2 : 1;\n\telse {\n\t\tif (sig->call_convention == MONO_CALL_VARARG || sig->sentinelpos >= 0)\n\t\t\tinfo->callconv = 2;\n\t\telse\n\t\t\tinfo->callconv = 1;\n\t}\n\tinfo->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6); \n}\n\nstatic MonoArray*\nves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\n\treturn mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL);\n}\n\nstatic MonoReflectionMarshal*\nves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoReflectionMarshal* res = NULL;\n\tMonoMarshalSpec **mspecs;\n\tint i;\n\n\tmspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);\n\tmono_method_get_marshal_info (method, mspecs);\n\n\tif (mspecs [0])\n\t\tres = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);\n\t\t\n\tfor (i = mono_method_signature (method)->param_count; i >= 0; i--)\n\t\tif (mspecs [i])\n\t\t\tmono_metadata_free_marshal_spec (mspecs [i]);\n\tg_free (mspecs);\n\n\treturn res;\n}\n\nstatic gint32\nves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)\n{\n\treturn field->field->offset - sizeof (MonoObject);\n}\n\nstatic MonoReflectionType*\nves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)\n{\n\tMonoClass *parent;\n\tMONO_ARCH_SAVE_REGS;\n\n\tparent = declaring? field->field->parent: field->klass;\n\n\treturn mono_type_get_object (mono_object_domain (field), &parent->byval_arg);\n}\n\nstatic MonoObject *\nves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)\n{\t\n\tMonoObject *o;\n\tMonoClassField *cf = field->field;\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\tMonoType *t;\n\tMonoDomain *domain = mono_object_domain (field); \n\tgchar *v;\n\tgboolean is_static = FALSE;\n\tgboolean is_ref = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\t\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tmono_class_init (field->klass);\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\tis_static = TRUE;\n\n\tif (obj && !is_static) {\n\t\t/* Check that the field belongs to the object */\n\t\tgboolean found = FALSE;\n\t\tMonoClass *k;\n\n\t\tfor (k = obj->vtable->klass; k; k = k->parent) {\n\t\t\tif (k == cf->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tchar *msg = g_strdup_printf (\"Field '%s' defined on type '%s' is not a field on the target object which is of type '%s'.\", mono_field_get_name (cf), cf->parent->name, obj->vtable->klass->name);\n\t\t\tMonoException *ex = mono_get_exception_argument (NULL, msg);\n\t\t\tg_free (msg);\n\t\t\tmono_raise_exception (ex);\n\t\t}\n\t}\n\n\tt = mono_type_get_underlying_type (cf->type);\n\tswitch (t->type) {\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_CLASS:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_SZARRAY:\n\t\tis_ref = TRUE;\n\t\tbreak;\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8:\n\tcase MONO_TYPE_VALUETYPE:\n\t\tis_ref = t->byref;\n\t\tbreak;\n\tcase MONO_TYPE_GENERICINST:\n\t\tif (mono_type_generic_inst_is_valuetype (t)) {\n\t\t\tis_ref = t->byref;\n\t\t} else {\n\t\t\tis_ref = TRUE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t \"ves_icall_Monofield_GetValue\", t->type);\n\t\treturn NULL;\n\t}\n\n\tvtable = NULL;\n\tif (is_static) {\n\t\tvtable = mono_class_vtable_full (domain, cf->parent, TRUE);\n\t\tif (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))\n\t\t\tmono_runtime_class_init (vtable);\n\t}\n\t\n\tif (is_ref) {\n\t\tif (is_static) {\n\t\t\tmono_field_static_get_value (vtable, cf, &o);\n\t\t} else {\n\t\t\tmono_field_get_value (obj, cf, &o);\n\t\t}\n\t\treturn o;\n\t}\n\n\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\tguint8 *buf;\n\n\t\t/* Convert the Nullable structure into a boxed vtype */\n\t\tif (is_static)\n\t\t\tbuf = (guint8*)vtable->data + cf->offset;\n\t\telse\n\t\t\tbuf = (guint8*)obj + cf->offset;\n\n\t\treturn mono_nullable_box (buf, nklass);\n\t}\n\n\t/* boxed value type */\n\tklass = mono_class_from_mono_type (cf->type);\n\to = mono_object_new (domain, klass);\n\tv = ((gchar *) o) + sizeof (MonoObject);\n\tif (is_static) {\n\t\tmono_field_static_get_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_get_value (obj, cf, v);\n\t}\n\n\treturn o;\n}\n\nstatic void\nves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)\n{\n\tMonoClassField *cf = field->field;\n\tgchar *v;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tv = (gchar *) value;\n\tif (!cf->type->byref) {\n\t\tswitch (cf->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U:\n\t\tcase MONO_TYPE_I:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R8:\n\t\tcase MONO_TYPE_VALUETYPE:\n\t\t\tif (v != NULL)\n\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING:\n\t\tcase MONO_TYPE_OBJECT:\n\t\tcase MONO_TYPE_CLASS:\n\t\tcase MONO_TYPE_ARRAY:\n\t\tcase MONO_TYPE_SZARRAY:\n\t\t\t/* Do nothing */\n\t\t\tbreak;\n\t\tcase MONO_TYPE_GENERICINST: {\n\t\t\tMonoGenericClass *gclass = cf->type->data.generic_class;\n\t\t\tg_assert (!gclass->context.class_inst->is_open);\n\n\t\t\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\t\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\t\t\tMonoObject *nullable;\n\n\t\t\t\t/* \n\t\t\t\t * Convert the boxed vtype into a Nullable structure.\n\t\t\t\t * This is complicated by the fact that Nullables have\n\t\t\t\t * a variable structure.\n\t\t\t\t */\n\t\t\t\tnullable = mono_object_new (mono_domain_get (), nklass);\n\n\t\t\t\tmono_nullable_init (mono_object_unbox (nullable), value, nklass);\n\n\t\t\t\tv = mono_object_unbox (nullable);\n\t\t\t}\n\t\t\telse \n\t\t\t\tif (gclass->container_class->valuetype && (v != NULL))\n\t\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t\t \"ves_icall_FieldInfo_SetValueInternal\", cf->type->type);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\tMonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, TRUE);\n\t\tif (!vtable->initialized)\n\t\t\tmono_runtime_class_init (vtable);\n\t\tmono_field_static_set_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_set_value (obj, cf, v);\n\t}\n}\n\nstatic MonoObject *\nves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this)\n{\t\n\tMonoObject *o = NULL;\n\tMonoClassField *field = this->field;\n\tMonoClass *klass;\n\tMonoDomain *domain = mono_object_domain (this); \n\tgchar *v;\n\tMonoTypeEnum def_type;\n\tconst char *def_value;\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tmono_class_init (field->parent);\n\n\tif (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (NULL));\n\n\tif (field->parent->image->dynamic) {\n\t\t/* FIXME: */\n\t\tg_assert_not_reached ();\n\t}\n\n\tdef_value = mono_class_get_field_default_value (field, &def_type);\n\n\tswitch (def_type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8: {\n\t\tMonoType *t;\n\n\t\t/* boxed value type */\n\t\tt = g_new0 (MonoType, 1);\n\t\tt->type = def_type;\n\t\tklass = mono_class_from_mono_type (t);\n\t\tg_free (t);\n\t\to = mono_object_new (domain, klass);\n\t\tv = ((gchar *) o) + sizeof (MonoObject);\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, v);\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_CLASS:\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, &o);\n\t\tbreak;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\n\treturn o;\n}\n\nstatic MonoReflectionType*\nves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)\n{\n\tMonoMethod *method = rmethod->method.method;\n\n\treturn mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);\n}\n\n/* From MonoProperty.cs */\ntypedef enum {\n\tPInfo_Attributes = 1,\n\tPInfo_GetMethod = 1 << 1,\n\tPInfo_SetMethod = 1 << 2,\n\tPInfo_ReflectedType = 1 << 3,\n\tPInfo_DeclaringType = 1 << 4,\n\tPInfo_Name = 1 << 5\n} PInfo;\n\nstatic void\nves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)\n{\n\tMonoDomain *domain = mono_object_domain (property); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((req_info & PInfo_ReflectedType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg));\n\telse if ((req_info & PInfo_DeclaringType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->property->parent->byval_arg));\n\n\tif ((req_info & PInfo_Name) != 0)\n\t\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, property->property->name));\n\n\tif ((req_info & PInfo_Attributes) != 0)\n\t\tinfo->attrs = property->property->attrs;\n\n\tif ((req_info & PInfo_GetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, get, property->property->get ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->get, property->klass): NULL);\n\t\n\tif ((req_info & PInfo_SetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, set, property->property->set ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->set, property->klass): NULL);\n\t/* \n\t * There may be other methods defined for properties, though, it seems they are not exposed \n\t * in the reflection API \n\t */\n}\n\nstatic void\nves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (event); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg));\n\n\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));\n\tinfo->attrs = event->event->attrs;\n\tMONO_STRUCT_SETREF (info, add_method, event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, remove_method, event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, raise_method, event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL);\n\n\tif (event->event->other) {\n\t\tint i, n = 0;\n\t\twhile (event->event->other [n])\n\t\t\tn++;\n\t\tMONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));\n\n\t\tfor (i = 0; i < n; i++)\n\t\t\tmono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));\n\t}\t\t\n}\n\nstatic MonoArray*\nves_icall_Type_GetInterfaces (MonoReflectionType* type)\n{\n\tMonoError error;\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoArray *intf;\n\tGPtrArray *ifaces = NULL;\n\tint i;\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *parent;\n\tMonoBitSet *slots;\n\tMonoGenericContext *context = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->generic_class && class->generic_class->context.class_inst->is_open) {\n\t\tcontext = mono_class_get_context (class);\n\t\tclass = class->generic_class->container_class;\n\t}\n\n\tmono_class_setup_vtable (class);\n\n\tslots = mono_bitset_new (class->max_interface_id + 1, 0);\n\n\tfor (parent = class; parent; parent = parent->parent) {\n\t\tGPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error);\n\t\tif (!mono_error_ok (&error)) {\n\t\t\tmono_bitset_free (slots);\n\t\t\tmono_error_raise_exception (&error);\n\t\t\treturn NULL;\n\t\t} else if (tmp_ifaces) {\n\t\t\tfor (i = 0; i < tmp_ifaces->len; ++i) {\n\t\t\t\tMonoClass *ic = g_ptr_array_index (tmp_ifaces, i);\n\n\t\t\t\tif (mono_bitset_test (slots, ic->interface_id))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmono_bitset_set (slots, ic->interface_id);\n\t\t\t\tif (ifaces == NULL)\n\t\t\t\t\tifaces = g_ptr_array_new ();\n\t\t\t\tg_ptr_array_add (ifaces, ic);\n\t\t\t}\n\t\t\tg_ptr_array_free (tmp_ifaces, TRUE);\n\t\t}\n\t}\n\tmono_bitset_free (slots);\n\n\tif (!ifaces)\n\t\treturn mono_array_new_cached (domain, mono_defaults.monotype_class, 0);\n\t\t\n\tintf = mono_array_new_cached (domain, mono_defaults.monotype_class, ifaces->len);\n\tfor (i = 0; i < ifaces->len; ++i) {\n\t\tMonoClass *ic = g_ptr_array_index (ifaces, i);\n\t\tMonoType *ret = &ic->byval_arg, *inflated = NULL;\n\t\tif (context && ic->generic_class && ic->generic_class->context.class_inst->is_open)\n\t\t\tinflated = ret = mono_class_inflate_generic_type (ret, context);\n\t\t\n\t\tmono_array_setref (intf, i, mono_type_get_object (domain, ret));\n\t\tif (inflated)\n\t\t\tmono_metadata_free_type (inflated);\n\t}\n\tg_ptr_array_free (ifaces, TRUE);\n\n\treturn intf;\n}\n\nstatic void\nves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *iclass = mono_class_from_mono_type (iface->type);\n\tMonoReflectionMethod *member;\n\tMonoMethod* method;\n\tgpointer iter;\n\tint i = 0, len, ioffset;\n\tMonoDomain *domain;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_setup_vtable (class);\n\n\t/* type doesn't implement iface: the exception is thrown in managed code */\n\tif (! MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))\n\t\t\treturn;\n\n\tlen = mono_class_num_methods (iclass);\n\tioffset = mono_class_interface_offset (class, iclass);\n\tdomain = mono_object_domain (type);\n\tmono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\tmono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (iclass, &iter))) {\n\t\tmember = mono_method_get_object (domain, method, iclass);\n\t\tmono_array_setref (*methods, i, member);\n\t\tmember = mono_method_get_object (domain, class->vtable [i + ioffset], class);\n\t\tmono_array_setref (*targets, i, member);\n\t\t\n\t\ti ++;\n\t}\n}\n\nstatic void\nves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tif (klass->image->dynamic) {\n\t\tMonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type;\n\t\t*packing = tb->packing_size;\n\t\t*size = tb->class_size;\n\t} else {\n\t\tmono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);\n\t}\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_GetElementType (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY)\n\t\treturn mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg);\n\n\tclass = mono_class_from_mono_type (type->type);\n\n\t// GetElementType should only return a type for:\n\t// Array Pointer PassedByRef\n\tif (type->type->byref)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->byval_arg);\n\telse if (class->element_class && MONO_CLASS_IS_ARRAY (class))\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse if (class->element_class && type->type->type == MONO_TYPE_PTR)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_get_type_parent (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;\n}\n\nstatic MonoBoolean\nves_icall_type_ispointer (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->type == MONO_TYPE_PTR;\n}\n\nstatic MonoBoolean\nves_icall_type_isprimitive (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));\n}\n\nstatic MonoBoolean\nves_icall_type_isbyref (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->byref;\n}\n\nstatic MonoBoolean\nves_icall_type_iscomobject (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (klass && klass->is_com_object);\n}\n\nstatic MonoReflectionModule*\nves_icall_MonoType_get_Module (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_module_get_object (mono_object_domain (type), class->image);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_MonoType_get_Assembly (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_assembly_get_object (domain, class->image->assembly);\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\tif (type->type->type == MONO_TYPE_VAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.klass;\n\telse if (type->type->type == MONO_TYPE_MVAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.method->klass;\n\telse\n\t\tclass = mono_class_from_mono_type (type->type)->nested_in;\n\n\treturn class ? mono_type_get_object (domain, &class->byval_arg) : NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->enumtype && mono_class_enum_basetype (class)) /* types that are modified typebuilders may not have enum_basetype set */\n\t\treturn mono_type_get_object (domain, mono_class_enum_basetype (class));\n\telse if (class->element_class)\n\t\treturn mono_type_get_object (domain, &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoString*\nves_icall_MonoType_get_Name (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref) {\n\t\tchar *n = g_strdup_printf (\"%s&\", class->name);\n\t\tMonoString *res = mono_string_new (domain, n);\n\n\t\tg_free (n);\n\n\t\treturn res;\n\t} else {\n\t\treturn mono_string_new (domain, class->name);\n\t}\n}\n\nstatic MonoString*\nves_icall_MonoType_get_Namespace (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile (class->nested_in)\n\t\tclass = class->nested_in;\n\n\tif (class->name_space [0] == '\\0')\n\t\treturn NULL;\n\telse\n\t\treturn mono_string_new (domain, class->name_space);\n}\n\nstatic gint32\nves_icall_MonoType_GetArrayRank (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tif (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY)\n\t\tmono_raise_exception (mono_get_exception_argument (\"type\", \"Type must be an array type\"));\n\n\tclass = mono_class_from_mono_type (type->type);\n\treturn class->rank;\n}\n\nstatic MonoArray*\nves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)\n{\n\tMonoArray *res;\n\tMonoClass *klass, *pklass;\n\tMonoDomain *domain = mono_object_domain (type);\n\tMonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE);\n\tint i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->generic_container) {\n\t\tMonoGenericContainer *container = klass->generic_container;\n\t\tres = mono_array_new_specific (array_vtable, container->type_argc);\n\t\tfor (i = 0; i < container->type_argc; ++i) {\n\t\t\tpklass = mono_class_from_generic_parameter (mono_generic_container_get_param (container, i), klass->image, FALSE);\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, &pklass->byval_arg));\n\t\t}\n\t} else if (klass->generic_class) {\n\t\tMonoGenericInst *inst = klass->generic_class->context.class_inst;\n\t\tres = mono_array_new_specific (array_vtable, inst->type_argc);\n\t\tfor (i = 0; i < inst->type_argc; ++i)\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\t} else {\n\t\tres = mono_array_new_specific (array_vtable, 0);\n\t}\n\treturn res;\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\treturn klass->generic_container != NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->generic_container) {\n\t\treturn type; /* check this one */\n\t}\n\tif (klass->generic_class) {\n\t\tMonoClass *generic_class = klass->generic_class->container_class;\n\n\t\tif (generic_class->wastypebuilder && generic_class->reflection_info)\n\t\t\treturn generic_class->reflection_info;\n\t\telse\n\t\t\treturn mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);\n\t}\n\treturn NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)\n{\n\tMonoClass *class;\n\tMonoType *geninst, **types;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tcount = mono_array_length (type_array);\n\ttypes = g_new0 (MonoType *, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionType *t = mono_array_get (type_array, gpointer, i);\n\t\ttypes [i] = t->type;\n\t}\n\n\tgeninst = mono_reflection_bind_generic_parameters (type, count, types);\n\tg_free (types);\n\tif (!geninst)\n\t\treturn NULL;\n\n\tclass = mono_class_from_mono_type (geninst);\n\n\t/*we might inflate to the GTD*/\n\tif (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class))\n\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"Invalid generic arguments\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), geninst);\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL;\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericType (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL || klass->generic_container != NULL;\n}\n\nstatic gint32\nves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn -1;\n\n\tif (is_generic_parameter (type->type))\n\t\treturn mono_type_get_generic_param_num (type->type);\n\treturn -1;\n}\n\nstatic GenericParameterAttributes\nves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\tg_assert (is_generic_parameter (type->type));\n\treturn mono_generic_param_info (type->type->data.generic_param)->flags;\n}\n\nstatic MonoArray *\nves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)\n{\n\tMonoGenericParamInfo *param_info;\n\tMonoDomain *domain;\n\tMonoClass **ptr;\n\tMonoArray *res;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\n\tdomain = mono_object_domain (type);\n\tparam_info = mono_generic_param_info (type->type->data.generic_param);\n\tfor (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++)\n\t\t;\n\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\tfor (i = 0; i < count; i++)\n\t\tmono_array_setref (res, i, mono_type_get_object (domain, &param_info->constraints [i]->byval_arg));\n\n\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (type->type);\n}\n\nstatic MonoBoolean\nves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (tb->type.type);\n}\n\nstatic void\nves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,\n\t\t\t\t\t\t\t\t\t MonoReflectionType *t)\n{\n\tenumtype->type = t->type;\n}\n\nstatic MonoReflectionMethod*\nves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, \n MonoReflectionMethod* generic)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoMethod *method;\n\tgpointer iter;\n\t\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n if (method->token == generic->method->token)\n return mono_method_get_object (domain, method, klass);\n }\n\n return NULL;\n}\n\n\n\nstatic MonoReflectionMethod *\nves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)\n{\n\tMonoMethod *method;\n\tMonoType *type = ref_type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\"DeclaringMethod can only be used on generic arguments\"));\n\tif (type->type == MONO_TYPE_VAR)\n\t\treturn NULL;\n\n\tmethod = mono_type_get_generic_param_owner (type)->owner.method;\n\tg_assert (method);\n\treturn mono_method_get_object (mono_object_domain (ref_type), method, method->klass);\n}\n\nstatic MonoReflectionDllImportAttribute*\nves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)\n{\n\tstatic MonoClass *DllImportAttributeClass = NULL;\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoReflectionDllImportAttribute *attr;\n\tMonoImage *image = method->klass->image;\n\tMonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;\n\tMonoTableInfo *tables = image->tables;\n\tMonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];\n\tMonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];\n\tguint32 im_cols [MONO_IMPLMAP_SIZE];\n\tguint32 scope_token;\n\tconst char *import = NULL;\n\tconst char *scope = NULL;\n\tguint32 flags;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn NULL;\n\n\tif (!DllImportAttributeClass) {\n\t\tDllImportAttributeClass = \n\t\t\tmono_class_from_name (mono_defaults.corlib,\n\t\t\t\t\t\t\t\t \"System.Runtime.InteropServices\", \"DllImportAttribute\");\n\t\tg_assert (DllImportAttributeClass);\n\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tif (method->klass->image->dynamic) {\n\t\tMonoReflectionMethodAux *method_aux = \n\t\t\tg_hash_table_lookup (\n\t\t\t\t\t\t\t\t\t ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);\n\t\tif (method_aux) {\n\t\t\timport = method_aux->dllentry;\n\t\t\tscope = method_aux->dll;\n\t\t}\n\n\t\tif (!import || !scope) {\n\t\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"System.Reflection.Emit method with invalid pinvoke information\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (piinfo->implmap_idx) {\n\t\t\tmono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);\n\t\t\t\n\t\t\tpiinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];\n\t\t\timport = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);\n\t\t\tscope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);\n\t\t\tscope = mono_metadata_string_heap (image, scope_token);\n\t\t}\n\t}\n\tflags = piinfo->piflags;\n\t\n\tattr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);\n\n\tMONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));\n\tMONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, import));\n\tattr->call_conv = (flags & 0x700) >> 8;\n\tattr->charset = ((flags & 0x6) >> 1) + 1;\n\tif (attr->charset == 1)\n\t\tattr->charset = 2;\n\tattr->exact_spelling = (flags & 0x1) != 0;\n\tattr->set_last_error = (flags & 0x40) != 0;\n\tattr->best_fit_mapping = (flags & 0x30) == 0x10;\n\tattr->throw_on_unmappable = (flags & 0x3000) == 0x1000;\n\tattr->preserve_sig = FALSE;\n\n\treturn attr;\n}\n\nstatic MonoReflectionMethod *\nves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMonoMethodInflated *imethod;\n\tMonoMethod *result;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->method->is_generic)\n\t\treturn method;\n\n\tif (!method->method->is_inflated)\n\t\treturn NULL;\n\n\timethod = (MonoMethodInflated *) method->method;\n\n\tresult = imethod->declaring;\n\t/* Not a generic method. */\n\tif (!result->is_generic)\n\t\treturn NULL;\n\n\tif (method->method->klass->image->dynamic) {\n\t\tMonoDynamicImage *image = (MonoDynamicImage*)method->method->klass->image;\n\t\tMonoReflectionMethod *res;\n\n\t\t/*\n\t\t * FIXME: Why is this stuff needed at all ? Why can't the code below work for\n\t\t * the dynamic case as well ?\n\t\t */\n\t\tmono_loader_lock ();\n\t\tres = mono_g_hash_table_lookup (image->generic_def_objects, imethod);\n\t\tmono_loader_unlock ();\n\n\t\tif (res)\n\t\t\treturn res;\n\t}\n\n\tif (imethod->context.class_inst) {\n\t\tMonoClass *klass = ((MonoMethod *) imethod)->klass;\n\t\t/*Generic methods gets the context of the GTD.*/\n\t\tif (mono_class_get_context (klass))\n\t\t\tresult = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));\n\t}\n\n\treturn mono_method_get_object (mono_object_domain (method), result, NULL);\n}\n\nstatic gboolean\nves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_signature (method->method)->generic_param_count != 0;\n}\n\nstatic gboolean\nves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn method->method->is_generic;\n}\n\nstatic MonoArray*\nves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)\n{\n\tMonoArray *res;\n\tMonoDomain *domain;\n\tint count, i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (method);\n\n\tif (method->method->is_inflated) {\n\t\tMonoGenericInst *inst = mono_method_get_context (method->method)->method_inst;\n\n\t\tif (inst) {\n\t\t\tcount = inst->type_argc;\n\t\t\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\t\t\tfor (i = 0; i < count; i++)\n\t\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tcount = mono_method_signature (method->method)->generic_param_count;\n\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoGenericContainer *container = mono_method_get_generic_container (method->method);\n\t\tMonoGenericParam *param = mono_generic_container_get_param (container, i);\n\t\tMonoClass *pklass = mono_class_from_generic_parameter (\n\t\t\tparam, method->method->klass->image, TRUE);\n\t\tmono_array_setref (res, i,\n\t\t\t\tmono_type_get_object (domain, &pklass->byval_arg));\n\t}\n\n\treturn res;\n}\n\nstatic MonoObject *\nves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoException **exc) \n{\n\t/* \n\t * Invoke from reflection is supposed to always be a virtual call (the API\n\t * is stupid), mono_runtime_invoke_*() calls the provided method, allowing\n\t * greater flexibility.\n\t */\n\tMonoMethod *m = method->method;\n\tint pcount;\n\tvoid *obj = this;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*exc = NULL;\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_method (m);\n\n\tif (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {\n\t\tif (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (this) {\n\t\t\tif (!mono_object_isinst (this, m->klass)) {\n\t\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Object does not match target type.\"));\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tm = mono_object_get_virtual_method (this, m);\n\t\t\t/* must pass the pointer to the value for valuetype methods */\n\t\t\tif (m->klass->valuetype)\n\t\t\t\tobj = mono_object_unbox (this);\n\t\t} else if (strcmp (m->name, \".ctor\") && !m->wrapper_type) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Non-static method requires a target.\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tpcount = params? mono_array_length (params): 0;\n\tif (pcount != mono_method_signature (m)->param_count) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name (mono_defaults.corlib, \"System.Reflection\", \"TargetParameterCountException\"));\n\t\treturn NULL;\n\t}\n\n\tif ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, \".ctor\") && !this) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Cannot invoke constructor of an abstract class.\"));\n\t\treturn NULL;\n\t}\n\n\tif (m->klass->image->assembly->ref_only) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_get_exception_invalid_operation (\"It is illegal to invoke a method on a type loaded using the ReflectionOnly api.\"));\n\t\treturn NULL;\n\t}\n\t\n\tif (m->klass->rank && !strcmp (m->name, \".ctor\")) {\n\t\tint i;\n\t\tmono_array_size_t *lengths;\n\t\tmono_array_size_t *lower_bounds;\n\t\tpcount = mono_array_length (params);\n\t\tlengths = alloca (sizeof (mono_array_size_t) * pcount);\n\t\tfor (i = 0; i < pcount; ++i)\n\t\t\tlengths [i] = *(mono_array_size_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));\n\n\t\tif (m->klass->rank == pcount) {\n\t\t\t/* Only lengths provided. */\n\t\t\tlower_bounds = NULL;\n\t\t} else {\n\t\t\tg_assert (pcount == (m->klass->rank * 2));\n\t\t\t/* lower bounds are first. */\n\t\t\tlower_bounds = lengths;\n\t\t\tlengths += m->klass->rank;\n\t\t}\n\n\t\treturn (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);\n\t}\n\treturn mono_runtime_invoke_array (m, obj, params, NULL);\n}\n\nstatic MonoObject *\nves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs) \n{\n\tMonoDomain *domain = mono_object_domain (method); \n\tMonoMethod *m = method->method;\n\tMonoMethodSignature *sig = mono_method_signature (m);\n\tMonoArray *out_args;\n\tMonoObject *result;\n\tint i, j, outarg_count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (m->klass == mono_defaults.object_class) {\n\n\t\tif (!strcmp (m->name, \"FieldGetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tif (field_klass->valuetype)\n\t\t\t\t\t\tresult = mono_value_box (domain, field_klass, (char *)this + field->offset);\n\t\t\t\t\telse \n\t\t\t\t\t\tresult = *((gpointer *)((char *)this + field->offset));\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 1);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\t\t\t\t\tmono_array_setref (out_args, 0, result);\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t} else if (!strcmp (m->name, \"FieldSetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tguint32 size;\n\t\t\tgint32 align;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tMonoObject *val = mono_array_get (params, gpointer, 2);\n\n\t\t\t\t\tif (field_klass->valuetype) {\n\t\t\t\t\t\tsize = mono_type_size (field->type, &align);\n#ifdef HAVE_SGEN_GC\n\t\t\t\t\t\tmono_gc_wbarrier_value_copy ((char *)this + field->offset, (char*)val + sizeof (MonoObject), 1, field_klass);\n#endif\n\t\t\t\t\t\tmemcpy ((char *)this + field->offset, \n\t\t\t\t\t\t\t((char *)val) + sizeof (MonoObject), size);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmono_gc_wbarrier_set_field (this, (char*)this + field->offset, val);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 0);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t}\n\t}\n\n\tfor (i = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) \n\t\t\toutarg_count++;\n\t}\n\n\tout_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);\n\t\n\t/* handle constructors only for objects already allocated */\n\tif (!strcmp (method->method->name, \".ctor\"))\n\t\tg_assert (this);\n\n\t/* This can be called only on MBR objects, so no need to unbox for valuetypes. */\n\tg_assert (!method->method->klass->valuetype);\n\tresult = mono_runtime_invoke_array (method->method, this, params, NULL);\n\n\tfor (i = 0, j = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) {\n\t\t\tgpointer arg;\n\t\t\targ = mono_array_get (params, gpointer, i);\n\t\t\tmono_array_setref (out_args, j, arg);\n\t\t\tj++;\n\t\t}\n\t}\n\n\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\treturn result;\n}\n\nstatic guint64\nread_enum_value (char *mem, int type)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\t\treturn *(guint8*)mem;\n\tcase MONO_TYPE_I1:\n\t\treturn *(gint8*)mem;\n\tcase MONO_TYPE_U2:\n\t\treturn *(guint16*)mem;\n\tcase MONO_TYPE_I2:\n\t\treturn *(gint16*)mem;\n\tcase MONO_TYPE_U4:\n\t\treturn *(guint32*)mem;\n\tcase MONO_TYPE_I4:\n\t\treturn *(gint32*)mem;\n\tcase MONO_TYPE_U8:\n\t\treturn *(guint64*)mem;\n\tcase MONO_TYPE_I8:\n\t\treturn *(gint64*)mem;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn 0;\n}\n\nstatic void\nwrite_enum_value (char *mem, int type, guint64 value)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1: {\n\t\tguint8 *p = (guint8*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2: {\n\t\tguint16 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4: {\n\t\tguint32 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8: {\n\t\tguint64 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn;\n}\n\nstatic MonoObject *\nves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)\n{\n\tMonoDomain *domain; \n\tMonoClass *enumc, *objc;\n\tMonoObject *res;\n\tMonoType *etype;\n\tguint64 val;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (enumType);\n\tMONO_CHECK_ARG_NULL (value);\n\n\tdomain = mono_object_domain (enumType); \n\tenumc = mono_class_from_mono_type (enumType->type);\n\tobjc = value->vtable->klass;\n\n\tif (!enumc->enumtype)\n\t\tmono_raise_exception (mono_get_exception_argument (\"enumType\", \"Type provided must be an Enum.\"));\n\tif (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))\n\t\tmono_raise_exception (mono_get_exception_argument (\"value\", \"The value passed in must be an enum base or an underlying type for an enum, such as an Int32.\"));\n\n\tetype = mono_class_enum_basetype (enumc);\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\tres = mono_object_new (domain, enumc);\n\tval = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);\n\twrite_enum_value ((char *)res + sizeof (MonoObject), etype->type, val);\n\n\treturn res;\n}\n\nstatic MonoObject *\nves_icall_System_Enum_get_value (MonoObject *this)\n{\n\tMonoObject *res;\n\tMonoClass *enumc;\n\tgpointer dst;\n\tgpointer src;\n\tint size;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!this)\n\t\treturn NULL;\n\n\tg_assert (this->vtable->klass->enumtype);\n\t\n\tenumc = mono_class_from_mono_type (mono_class_enum_basetype (this->vtable->klass));\n\tres = mono_object_new (mono_object_domain (this), enumc);\n\tdst = (char *)res + sizeof (MonoObject);\n\tsrc = (char *)this + sizeof (MonoObject);\n\tsize = mono_class_value_size (enumc, NULL);\n\n\tmemcpy (dst, src, size);\n\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)\n{\n\tMonoType *etype;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tetype = mono_class_enum_basetype (mono_class_from_mono_type (type->type));\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), etype);\n}\n\nstatic int\nves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)\n{\n\tgpointer tdata = (char *)this + sizeof (MonoObject);\n\tgpointer odata = (char *)other + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n#define COMPARE_ENUM_VALUES(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me > other ? 1 : -1; \\\n\t} while (0)\n\n#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me - other; \\\n\t} while (0)\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_U1:\n\t\t\tCOMPARE_ENUM_VALUES (guint8);\n\t\tcase MONO_TYPE_I1:\n\t\t\tCOMPARE_ENUM_VALUES (gint8);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\tCOMPARE_ENUM_VALUES_RANGE (guint16);\n\t\tcase MONO_TYPE_I2:\n\t\t\tCOMPARE_ENUM_VALUES (gint16);\n\t\tcase MONO_TYPE_U4:\n\t\t\tCOMPARE_ENUM_VALUES (guint32);\n\t\tcase MONO_TYPE_I4:\n\t\t\tCOMPARE_ENUM_VALUES (gint32);\n\t\tcase MONO_TYPE_U8:\n\t\t\tCOMPARE_ENUM_VALUES (guint64);\n\t\tcase MONO_TYPE_I8:\n\t\t\tCOMPARE_ENUM_VALUES (gint64);\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n#undef COMPARE_ENUM_VALUES_RANGE\n#undef COMPARE_ENUM_VALUES\n\treturn 0;\n}\n\nstatic int\nves_icall_System_Enum_get_hashcode (MonoObject *this)\n{\n\tgpointer data = (char *)this + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_I1:\t\n\t\t\treturn *((gint8*)data);\n\t\tcase MONO_TYPE_U1:\n\t\t\treturn *((guint8*)data);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\treturn *((guint16*)data);\n\t\t\n\t\tcase MONO_TYPE_I2:\n\t\t\treturn *((gint16*)data);\n\t\tcase MONO_TYPE_U4:\n\t\t\treturn *((guint32*)data);\n\t\tcase MONO_TYPE_I4:\n\t\t\treturn *((gint32*)data);\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8: {\n\t\t\tgint64 value = *((gint64*)data);\n\t\t\treturn (gint)(value & 0xffffffff) ^ (int)(value >> 32);\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n\treturn 0;\n}\n\nstatic void\nves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoClass *enumc = mono_class_from_mono_type (type->type);\n\tguint j = 0, nvalues, crow;\n\tgpointer iter;\n\tMonoClassField *field;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc)));\n\tnvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;\n\tMONO_STRUCT_SETREF (info, names, mono_array_new (domain, mono_defaults.string_class, nvalues));\n\tMONO_STRUCT_SETREF (info, values, mono_array_new (domain, enumc, nvalues));\n\n\tcrow = -1;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (enumc, &iter))) {\n\t\tconst char *p;\n\t\tint len;\n\t\tMonoTypeEnum def_type;\n\t\t\n\t\tif (strcmp (\"value__\", mono_field_get_name (field)) == 0)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tmono_array_setref (info->names, j, mono_string_new (domain, mono_field_get_name (field)));\n\n\t\tp = mono_class_get_field_default_value (field, &def_type);\n\t\tlen = mono_metadata_decode_blob_size (p, &p);\n\t\tswitch (mono_class_enum_basetype (enumc)->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\t\tmono_array_set (info->values, gchar, j, *p);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\t\tmono_array_set (info->values, gint16, j, read16 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tmono_array_set (info->values, gint32, j, read32 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tmono_array_set (info->values, gint64, j, read64 (p));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_enum_info\", mono_class_enum_basetype (enumc)->type);\n\t\t}\n\t\t++j;\n\t}\n}\n\nenum {\n\tBFLAGS_IgnoreCase = 1,\n\tBFLAGS_DeclaredOnly = 2,\n\tBFLAGS_Instance = 4,\n\tBFLAGS_Static = 8,\n\tBFLAGS_Public = 0x10,\n\tBFLAGS_NonPublic = 0x20,\n\tBFLAGS_FlattenHierarchy = 0x40,\n\tBFLAGS_InvokeMethod = 0x100,\n\tBFLAGS_CreateInstance = 0x200,\n\tBFLAGS_GetField = 0x400,\n\tBFLAGS_SetField = 0x800,\n\tBFLAGS_GetProperty = 0x1000,\n\tBFLAGS_SetProperty = 0x2000,\n\tBFLAGS_ExactBinding = 0x10000,\n\tBFLAGS_SuppressChangeType = 0x20000,\n\tBFLAGS_OptionalParamBinding = 0x40000\n};\n\nstatic MonoReflectionField *\nves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass;\n\tint match;\n\tMonoClassField *field;\n\tgpointer iter;\n\tchar *utf8_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!name)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\nhandle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\n\t\tif (field->type == NULL)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\t\n\t\tutf8_name = mono_string_to_utf8 (name);\n\n\t\tif (compare_func (mono_field_get_name (field), utf8_name)) {\n\t\t\tg_free (utf8_name);\n\t\t\tcontinue;\n\t\t}\n\t\tg_free (utf8_name);\n\t\t\n\t\treturn mono_field_get_object (domain, klass, field);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter;\n\tMonoClassField *field;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.field_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tmono_ptr_array_init (tmp_array, 2);\n\t\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_field_get_object (domain, refklass, field);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic gboolean\nmethod_nonpublic (MonoMethod* method, gboolean start_klass)\n{\n\tswitch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) {\n\t\tcase METHOD_ATTRIBUTE_ASSEM:\n\t\t\treturn (start_klass || mono_defaults.generic_ilist_class);\n\t\tcase METHOD_ATTRIBUTE_PRIVATE:\n\t\t\treturn start_klass;\n\t\tcase METHOD_ATTRIBUTE_PUBLIC:\n\t\t\treturn FALSE;\n\t\tdefault:\n\t\t\treturn TRUE;\n\t}\n}\n\nstatic MonoArray*\nves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tstatic MonoClass *MethodInfo_array;\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tgpointer iter;\n\tMonoObject *member;\n\tint i, len, match, nslots;\n\t/*FIXME, use MonoBitSet*/\n\tguint32 method_slots_default [8];\n\tguint32 *method_slots = NULL;\n\tgchar *mname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMonoVTable *array_vtable;\n\tMonoException *ex;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!MethodInfo_array) {\n\t\tMonoClass *klass = mono_array_class_get (mono_defaults.method_info_class, 1);\n\t\tmono_memory_barrier ();\n\t\tMethodInfo_array = klass;\n\t}\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tarray_vtable = mono_class_vtable_full (domain, MethodInfo_array, TRUE);\n\tif (type->type->byref)\n\t\treturn mono_array_new_specific (array_vtable, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\tlen = 0;\n\tif (name != NULL) {\n\t\tmname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\t/* An optimization for calls made from Delegate:CreateDelegate () */\n\tif (klass->delegate && mname && !strcmp (mname, \"Invoke\") && (bflags == (BFLAGS_Public | BFLAGS_Static | BFLAGS_Instance))) {\n\t\tmethod = mono_get_delegate_invoke (klass);\n\t\tif (mono_loader_get_last_error ())\n\t\t\tgoto loader_error;\n\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tres = mono_array_new_specific (array_vtable, 1);\n\t\tmono_array_setref (res, 0, member);\n\t\tg_free (mname);\n\t\treturn res;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\n\n\tif (is_generic_parameter (type->type))\n\t\tnslots = mono_class_get_vtable_size (klass->parent);\n\telse\n\t\tnslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : mono_class_get_vtable_size (klass);\n\tif (nslots >= sizeof (method_slots_default) * 8) {\n\t\tmethod_slots = g_new0 (guint32, nslots / 32 + 1);\n\t} else {\n\t\tmethod_slots = method_slots_default;\n\t\tmemset (method_slots, 0, sizeof (method_slots_default));\n\t}\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\t\t\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (method->slot != -1) {\n\t\t\tg_assert (method->slot < nslots);\n\t\t\tif (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))\n\t\t\t\tcontinue;\n\t\t\tif (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT))\n\t\t\t\tmethod_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);\n\t\t}\n\n\t\tif (method->name [0] == '.' && (strcmp (method->name, \".ctor\") == 0 || strcmp (method->name, \".cctor\") == 0))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((bflags & BFLAGS_NonPublic) && method_nonpublic (method, (klass == startklass))) {\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (mname, method->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tmatch = 0;\n\t\t\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\t\t\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\n\tres = mono_array_new_specific (array_vtable, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\treturn res;\n\nloader_error:\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\tmono_ptr_array_destroy (tmp_array);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tex = mono_class_get_exception_for_failure (klass);\n\t} else {\n\t\tex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\t\tmono_loader_clear_error ();\n\t}\n\tmono_raise_exception (ex);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_ConstructorInfo;\n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter = NULL;\n\tMonoPtrArray tmp_array;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, mono_defaults.method_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\tif (!System_Reflection_ConstructorInfo)\n\t\tSystem_Reflection_ConstructorInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"ConstructorInfo\");\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (strcmp (method->name, \".ctor\") && strcmp (method->name, \".cctor\"))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, System_Reflection_ConstructorInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic guint\nproperty_hash (gconstpointer data)\n{\n\tMonoProperty *prop = (MonoProperty*)data;\n\n\treturn g_str_hash (prop->name);\n}\n\nstatic gboolean\nproperty_equal (MonoProperty *prop1, MonoProperty *prop2)\n{\n\t// Properties are hide-by-name-and-signature\n\tif (!g_str_equal (prop1->name, prop2->name))\n\t\treturn FALSE;\n\n\tif (prop1->get && prop2->get && !mono_metadata_signature_equal (mono_method_signature (prop1->get), mono_method_signature (prop2->get)))\n\t\treturn FALSE;\n\tif (prop1->set && prop2->set && !mono_metadata_signature_equal (mono_method_signature (prop1->set), mono_method_signature (prop2->set)))\n\t\treturn FALSE;\n\treturn TRUE;\n}\n\nstatic gboolean\nproperty_accessor_nonpublic (MonoMethod* accessor, gboolean start_klass)\n{\n\tif (!accessor)\n\t\treturn FALSE;\n\n\treturn method_nonpublic (accessor, start_klass);\n}\n\nstatic MonoArray*\nves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_PropertyInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoProperty *prop;\n\tint i, match;\n\tguint32 flags;\n\tgchar *propname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tgpointer iter;\n\tGHashTable *properties;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/\n\n\tif (!System_Reflection_PropertyInfo)\n\t\tSystem_Reflection_PropertyInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"PropertyInfo\");\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_PropertyInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tif (name != NULL) {\n\t\tpropname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\n\tproperties = g_hash_table_new (property_hash, (GEqualFunc)property_equal);\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tg_hash_table_destroy (properties);\n\t\tif (name != NULL)\n\t\t\tg_free (propname);\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\t}\n\n\titer = NULL;\n\twhile ((prop = mono_class_get_properties (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = prop->get;\n\t\tif (!method)\n\t\t\tmethod = prop->set;\n\t\tif (method)\n\t\t\tflags = method->flags;\n\t\telse\n\t\t\tflags = 0;\n\t\tif ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||\n\t\t\t(prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if (bflags & BFLAGS_NonPublic) {\n\t\t\tif (property_accessor_nonpublic(prop->get, startklass == klass) ||\n\t\t\t\tproperty_accessor_nonpublic(prop->set, startklass == klass)) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (propname, prop->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (g_hash_table_lookup (properties, prop))\n\t\t\tcontinue;\n\n\t\tmono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));\n\t\t\n\t\tg_hash_table_insert (properties, prop, prop);\n\t}\n\tif ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))\n\t\tgoto handle_parent;\n\n\tg_hash_table_destroy (properties);\n\tg_free (propname);\n\n\tres = mono_array_new_cached (domain, System_Reflection_PropertyInfo, mono_ptr_array_size (tmp_array));\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionEvent *\nves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain;\n\tMonoClass *klass, *startklass;\n\tgpointer iter;\n\tMonoEvent *event;\n\tMonoMethod *method;\n\tgchar *event_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\tevent_name = mono_string_to_utf8 (name);\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tdomain = mono_object_domain (type);\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tif (compare_func (event->name, event_name))\n\t\t\tcontinue;\n\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Public))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\t\tcontinue;\n\t\t\t\tif ((klass != startklass) && (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PRIVATE)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Static))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (!(bflags & BFLAGS_FlattenHierarchy) && (klass != startklass))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_Instance))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else \n\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\tcontinue;\n\t\t\n\t\tg_free (event_name);\n\t\treturn mono_event_get_object (domain, startklass, event);\n\t}\n\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (event_name);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_EventInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoEvent *event;\n\tint i, match;\n\tgpointer iter;\n\t\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!System_Reflection_EventInfo)\n\t\tSystem_Reflection_EventInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"EventInfo\");\n\n\tdomain = mono_object_domain (type);\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_EventInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\t\tmatch++;\n\t\t\t} else if ((klass == startklass) || (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) {\n\t\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method) {\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\t\tmatch++;\n\t\t\t} else {\n\t\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, System_Reflection_EventInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *nested;\n\tchar *str;\n\tgpointer iter;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = mono_class_from_mono_type (type->type);\n\tstr = mono_string_to_utf8 (name);\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially a\n\t * nested type of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tint match = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tif (strcmp (nested->name, str) == 0){\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (domain, &nested->byval_arg);\n\t\t}\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\tg_free (str);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tMonoClass *nested;\n\tgpointer iter;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.monotype_class, 0);\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially the set\n\t * of nested types of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\tmono_ptr_array_init (tmp_array, 1);\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionType*\nves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)\n{\n\tgchar *str;\n\tMonoType *type = NULL;\n\tMonoTypeNameParse info;\n\tgboolean type_resolve;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* On MS.NET, this does not fire a TypeResolve event */\n\ttype_resolve = TRUE;\n\tstr = mono_string_to_utf8 (name);\n\t/*g_print (\"requested type %s in %s\\n\", str, assembly->assembly->aname.name);*/\n\tif (!mono_reflection_parse_type (str, &info)) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) /* uhm: this is a parse error, though... */\n\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t/*g_print (\"failed parse\\n\");*/\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) {\n\t\t\t/* 1.0 and 2.0 throw different exceptions */\n\t\t\tif (mono_defaults.generic_ilist_class)\n\t\t\t\tmono_raise_exception (mono_get_exception_argument (NULL, \"Type names passed to Assembly.GetType() must not specify an assembly.\"));\n\t\t\telse\n\t\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tif (module != NULL) {\n\t\tif (module->image)\n\t\t\ttype = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);\n\t\telse\n\t\t\ttype = NULL;\n\t}\n\telse\n\t\tif (assembly->assembly->dynamic) {\n\t\t\t/* Enumerate all modules */\n\t\t\tMonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;\n\t\t\tint i;\n\n\t\t\ttype = NULL;\n\t\t\tif (abuilder->modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->modules); ++i) {\n\t\t\t\t\tMonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!type && abuilder->loaded_modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {\n\t\t\t\t\tMonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\ttype = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);\n\tg_free (str);\n\tmono_reflection_free_type_info (&info);\n\tif (!type) {\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tif (mono_loader_get_last_error () && mono_defaults.generic_ilist_class)\n\t\t\te = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\n\t\tmono_loader_clear_error ();\n\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\n\t\treturn NULL;\n\t}\n\n\tif (type->type == MONO_TYPE_CLASS) {\n\t\tMonoClass *klass = mono_type_get_class (type);\n\n\t\tif (mono_is_security_manager_active () && !klass->exception_type)\n\t\t\t/* Some security problems are detected during generic vtable construction */\n\t\t\tmono_class_setup_vtable (klass);\n\t\t/* need to report exceptions ? */\n\t\tif (throwOnError && klass->exception_type) {\n\t\t\t/* report SecurityException (or others) that occured when loading the assembly */\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (klass);\n\t\t\tmono_loader_clear_error ();\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\t/* g_print (\"got it\\n\"); */\n\treturn mono_type_get_object (mono_object_domain (assembly), type);\n}\n\nstatic gboolean\nreplace_shadow_path (MonoDomain *domain, gchar *dirname, gchar **filename)\n{\n\tgchar *content;\n\tgchar *shadow_ini_file;\n\tgsize len;\n\n\t/* Check for shadow-copied assembly */\n\tif (mono_is_shadow_copy_enabled (domain, dirname)) {\n\t\tshadow_ini_file = g_build_filename (dirname, \"__AssemblyInfo__.ini\", NULL);\n\t\tcontent = NULL;\n\t\tif (!g_file_get_contents (shadow_ini_file, &content, &len, NULL) ||\n\t\t\t!g_file_test (content, G_FILE_TEST_IS_REGULAR)) {\n\t\t\tif (content) {\n\t\t\t\tg_free (content);\n\t\t\t\tcontent = NULL;\n\t\t\t}\n\t\t}\n\t\tg_free (shadow_ini_file);\n\t\tif (content != NULL) {\n\t\t\tif (*filename)\n\t\t\t\tg_free (*filename);\n\t\t\t*filename = content;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res = NULL;\n\tgchar *uri;\n\tgchar *absolute;\n\tgchar *dirname;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tabsolute = g_strdup (mass->image->name);\n\t\tdirname = g_path_get_dirname (absolute);\n\t} else {\n\t\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\t\tdirname = g_strdup (mass->basedir);\n\t}\n\n\treplace_shadow_path (domain, dirname, &absolute);\n\tg_free (dirname);\n#if PLATFORM_WIN32\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (absolute) - 1; i >= 0; i--)\n\t\t\tif (absolute [i] == '\\\\')\n\t\t\t\tabsolute [i] = '/';\n\t}\n#endif\n\tif (escaped) {\n\t\turi = g_filename_to_uri (absolute, NULL, NULL);\n\t} else {\n\t\tconst char *prepend = \"file://\";\n#if PLATFORM_WIN32\n\t\tif (*absolute == '/' && *(absolute + 1) == '/') {\n\t\t\tprepend = \"file:\";\n\t\t} else {\n\t\t\tprepend = \"file:///\";\n\t\t}\n#endif\n\t\turi = g_strconcat (prepend, absolute, NULL);\n\t}\n\n\tif (uri) {\n\t\tres = mono_string_new (domain, uri);\n\t\tg_free (uri);\n\t}\n\tg_free (absolute);\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)\n{\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mass->in_gac;\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)\n{\n\tgchar *name;\n\tMonoAssembly *res;\n\tMonoImageOpenStatus status;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tname = mono_string_to_utf8 (mname);\n\tres = mono_assembly_load_with_partial_name (name, &status);\n\n\tg_free (name);\n\n\tif (res == NULL)\n\t\treturn NULL;\n\treturn mono_assembly_get_object (mono_domain_get (), res);\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoString *res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));\n\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn assembly->assembly->ref_only;\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (domain, assembly->assembly->image->version);\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) \n{\n\tguint32 token = mono_image_get_entry_point (assembly->assembly->image);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!token)\n\t\treturn NULL;\n\treturn mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);\n}\n\nstatic MonoReflectionModule*\nves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly) \n{\n\treturn mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tMonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);\n\tint i;\n\tconst char *val;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));\n\t\tmono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));\n\t}\n\treturn result;\n}\n\nstatic MonoObject*\ncreate_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)\n{\n\tstatic MonoClass *System_Version = NULL;\n\tstatic MonoMethod *create_version = NULL;\n\tMonoObject *result;\n\tgpointer args [4];\n\t\n\tif (!System_Version) {\n\t\tSystem_Version = mono_class_from_name (mono_defaults.corlib, \"System\", \"Version\");\n\t\tg_assert (System_Version);\n\t}\n\n\tif (!create_version) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\":.ctor(int,int,int,int)\", FALSE);\n\t\tcreate_version = mono_method_desc_search_in_class (desc, System_Version);\n\t\tg_assert (create_version);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\targs [0] = &major;\n\targs [1] = &minor;\n\targs [2] = &build;\n\targs [3] = &revision;\n\tresult = mono_object_new (domain, System_Version);\n\tmono_runtime_invoke (create_version, result, args, NULL);\n\n\treturn result;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly) \n{\n\tstatic MonoClass *System_Reflection_AssemblyName;\n\tMonoArray *result;\n\tMonoDomain *domain = mono_object_domain (assembly);\n\tint i, count = 0;\n\tstatic MonoMethod *create_culture = NULL;\n\tMonoImage *image = assembly->assembly->image;\n\tMonoTableInfo *t;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!System_Reflection_AssemblyName)\n\t\tSystem_Reflection_AssemblyName = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"AssemblyName\");\n\n\tt = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];\n\tcount = t->rows;\n\n\tresult = mono_array_new (domain, System_Reflection_AssemblyName, count);\n\n\tif (count > 0 && !create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\n\t\t\t\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionAssemblyName *aname;\n\t\tguint32 cols [MONO_ASSEMBLYREF_SIZE];\n\n\t\tmono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);\n\n\t\taname = (MonoReflectionAssemblyName *) mono_object_new (\n\t\t\tdomain, System_Reflection_AssemblyName);\n\n\t\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));\n\n\t\taname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];\n\t\taname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];\n\t\taname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];\n\t\taname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];\n\t\taname->flags = cols [MONO_ASSEMBLYREF_FLAGS];\n\t\taname->versioncompat = 1; /* SameMachine (default) */\n\t\taname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));\n\n\t\tif (create_culture) {\n\t\t\tgpointer args [2];\n\t\t\tMonoBoolean assembly_ref = 1;\n\t\t\targs [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));\n\t\t\targs [1] = &assembly_ref;\n\t\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t\t}\n\t\t\n\t\tif (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {\n\t\t\tconst gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);\n\t\t\tguint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\t\tif ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {\n\t\t\t\t/* public key token isn't copied - the class library will \n\t\t \t\tautomatically generate it from the public key if required */\n\t\t\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t} else {\n\t\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t}\n\t\t} else {\n\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\t}\n\t\t\n\t\t/* note: this function doesn't return the codebase on purpose (i.e. it can\n\t\t be used under partial trust as path information isn't present). */\n\n\t\tmono_array_setref (result, i, aname);\n\t}\n\treturn result;\n}\n\ntypedef struct {\n\tMonoArray *res;\n\tint idx;\n} NameSpaceInfo;\n\nstatic void\nforeach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)\n{\n\tMonoString *name = mono_string_new (mono_object_domain (info->res), key);\n\n\tmono_array_setref (info->res, info->idx, name);\n\tinfo->idx++;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly) \n{\n\tMonoImage *img = assembly->assembly->image;\n\tMonoArray *res;\n\tNameSpaceInfo info;\n\tint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_lock (img);\n\tmono_image_init_name_cache (img);\n\nRETRY_LEN:\n\tlen = g_hash_table_size (img->name_cache);\n\tmono_image_unlock (img);\n\n\t/*we can't create objects holding the image lock */\n\tres = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, len);\n\n\tmono_image_lock (img);\n\t/*len might have changed, create a new array*/\n\tif (len != g_hash_table_size (img->name_cache))\n\t\tgoto RETRY_LEN;\n\n\tinfo.res = res;\n\tinfo.idx = 0;\n\tg_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);\n\tmono_image_unlock (img);\n\n\treturn res;\n}\n\n/* move this in some file in mono/util/ */\nstatic char *\ng_concat_dir_and_file (const char *dir, const char *file)\n{\n\tg_return_val_if_fail (dir != NULL, NULL);\n\tg_return_val_if_fail (file != NULL, NULL);\n\n /*\n\t * If the directory name doesn't have a / on the end, we need\n\t * to add one so we get a proper path to the file\n\t */\n\tif (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)\n\t\treturn g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);\n\telse\n\t\treturn g_strconcat (dir, file, NULL);\n}\n\nstatic void *\nves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module) \n{\n\tchar *n = mono_string_to_utf8 (name);\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tguint32 i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 impl, file_idx;\n\tconst char *val;\n\tMonoImage *module;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn NULL;\n\t/* FIXME */\n\timpl = cols [MONO_MANIFEST_IMPLEMENTATION];\n\tif (impl) {\n\t\t/*\n\t\t * this code should only be called after obtaining the \n\t\t * ResourceInfo and handling the other cases.\n\t\t */\n\t\tg_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);\n\t\tfile_idx = impl >> MONO_IMPLEMENTATION_BITS;\n\n\t\tmodule = mono_image_load_file_for_image (assembly->assembly->image, file_idx);\n\t\tif (!module)\n\t\t\treturn NULL;\n\t}\n\telse\n\t\tmodule = assembly->assembly->image;\n\n\tmono_gc_wbarrier_generic_store (ref_module, (MonoObject*) mono_module_get_object (mono_domain_get (), module));\n\n\treturn (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);\n}\n\nstatic gboolean\nves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)\n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tint i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 file_cols [MONO_FILE_SIZE];\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = mono_string_to_utf8 (name);\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn FALSE;\n\n\tif (!cols [MONO_MANIFEST_IMPLEMENTATION]) {\n\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;\n\t}\n\telse {\n\t\tswitch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {\n\t\tcase MONO_IMPLEMENTATION_FILE:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\ttable = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\t\t\tmono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);\n\t\t\tMONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));\n\t\t\tif (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\t\tinfo->location = 0;\n\t\t\telse\n\t\t\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_ASSEMBLYREF:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\tmono_assembly_load_reference (assembly->assembly->image, i - 1);\n\t\t\tif (assembly->assembly->image->references [i - 1] == (gpointer)-1) {\n\t\t\t\tchar *msg = g_strdup_printf (\"Assembly %d referenced from assembly %s not found \", i - 1, assembly->assembly->image->name);\n\t\t\t\tMonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);\n\t\t\t\tg_free (msg);\n\t\t\t\tmono_raise_exception (ex);\n\t\t\t}\n\t\t\tMONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));\n\n\t\t\t/* Obtain info recursively */\n\t\t\tves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);\n\t\t\tinfo->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_EXP_TYPE:\n\t\t\tg_assert_not_reached ();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nstatic MonoObject*\nves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\tMonoArray *result = NULL;\n\tint i, count;\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* check hash if needed */\n\tif (name) {\n\t\tn = mono_string_to_utf8 (name);\n\t\tfor (i = 0; i < table->rows; ++i) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tif (strcmp (val, n) == 0) {\n\t\t\t\tMonoString *fn;\n\t\t\t\tg_free (n);\n\t\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\t\tfn = mono_string_new (mono_object_domain (assembly), n);\n\t\t\t\tg_free (n);\n\t\t\t\treturn (MonoObject*)fn;\n\t\t\t}\n\t\t}\n\t\tg_free (n);\n\t\treturn NULL;\n\t}\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))\n\t\t\tcount ++;\n\t}\n\n\tresult = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\tmono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));\n\t\t\tg_free (n);\n\t\t\tcount ++;\n\t\t}\n\t}\n\treturn (MonoObject*)result;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_domain_get();\n\tMonoArray *res;\n\tMonoClass *klass;\n\tint i, j, file_count = 0;\n\tMonoImage **modules;\n\tguint32 module_count, real_module_count;\n\tMonoTableInfo *table;\n\tguint32 cols [MONO_FILE_SIZE];\n\tMonoImage *image = assembly->assembly->image;\n\n\tg_assert (image != NULL);\n\tg_assert (!assembly->assembly->dynamic);\n\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tfile_count = table->rows;\n\n\tmodules = image->modules;\n\tmodule_count = image->module_count;\n\n\treal_module_count = 0;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i])\n\t\t\treal_module_count ++;\n\n\tklass = mono_class_from_name (mono_defaults.corlib, \"System.Reflection\", \"Module\");\n\tres = mono_array_new (domain, klass, 1 + real_module_count + file_count);\n\n\tmono_array_setref (res, 0, mono_module_get_object (domain, image));\n\tj = 1;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i]) {\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, modules[i]));\n\t\t\t++j;\n\t\t}\n\n\tfor (i = 0; i < file_count; ++i, ++j) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);\n\t\tif (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\tmono_array_setref (res, j, mono_module_file_get_object (domain, image, i));\n\t\telse {\n\t\t\tMonoImage *m = mono_image_load_file_for_image (image, i + 1);\n\t\t\tif (!m) {\n\t\t\t\tMonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME]));\n\t\t\t\tmono_raise_exception (mono_get_exception_file_not_found2 (NULL, fname));\n\t\t\t}\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, m));\n\t\t}\n\t}\n\n\treturn res;\n}\n\nstatic MonoReflectionMethod*\nves_icall_GetCurrentMethod (void) \n{\n\tMonoMethod *m = mono_method_get_last_managed ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_get_object (mono_domain_get (), m, NULL);\n}\n\n\nstatic MonoMethod*\nmono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)\n{\n\tint offset = -1, i;\n\tif (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {\n\t\tMonoMethodInflated *inflated = (MonoMethodInflated*)method;\n\t\t//method is inflated, we should inflate it on the other class\n\t\tMonoGenericContext ctx;\n\t\tctx.method_inst = inflated->context.method_inst;\n\t\tctx.class_inst = inflated->context.class_inst;\n\t\tif (klass->generic_class)\n\t\t\tctx.class_inst = klass->generic_class->context.class_inst;\n\t\telse if (klass->generic_container)\n\t\t\tctx.class_inst = klass->generic_container->context.class_inst;\n\t\treturn mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx);\n\t}\n\n\tmono_class_setup_methods (method->klass);\n\tif (method->klass->exception_type)\n\t\treturn NULL;\n\tfor (i = 0; i < method->klass->method.count; ++i) {\n\t\tif (method->klass->methods [i] == method) {\n\t\t\toffset = i;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\tmono_class_setup_methods (klass);\n\tif (klass->exception_type)\n\t\treturn NULL;\n\tg_assert (offset >= 0 && offset < klass->method.count);\n\treturn klass->methods [offset];\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMethod *method, MonoType *type)\n{\n\tMonoClass *klass;\n\tif (type) {\n\t\tklass = mono_class_from_mono_type (type);\n\t\tif (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass)) \n\t\t\treturn NULL;\n\t\tif (method->klass != klass) {\n\t\t\tmethod = mono_method_get_equivalent_method (method, klass);\n\t\t\tif (!method)\n\t\t\t\treturn NULL;\n\t\t}\n\t} else\n\t\tklass = method->klass;\n\treturn mono_method_get_object (mono_domain_get (), method, klass);\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)\n{\n\treturn mono_method_get_object (mono_domain_get (), method, NULL);\n}\n\nstatic MonoReflectionMethodBody*\nves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)\n{\n\treturn mono_method_body_get_object (mono_domain_get (), method);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)\n{\n\tMonoMethod *dest = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_stack_walk_no_il (get_executing, &dest);\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}\n\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetEntryAssembly (void)\n{\n\tMonoDomain* domain = mono_domain_get ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!domain->entry_assembly)\n\t\treturn NULL;\n\n\treturn mono_assembly_get_object (domain, domain->entry_assembly);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetCallingAssembly (void)\n{\n\tMonoMethod *m;\n\tMonoMethod *dest;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdest = NULL;\n\tmono_stack_walk_no_il (get_executing, &dest);\n\tm = dest;\n\tmono_stack_walk_no_il (get_caller, &dest);\n\tif (!dest)\n\t\tdest = m;\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}\n\nstatic MonoString *\nves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,\n\t\t\t\t gboolean assembly_qualified)\n{\n\tMonoDomain *domain = mono_object_domain (object); \n\tMonoTypeNameFormat format;\n\tMonoString *res;\n\tgchar *name;\n\n\tMONO_ARCH_SAVE_REGS;\n\tif (full_name)\n\t\tformat = assembly_qualified ?\n\t\t\tMONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :\n\t\t\tMONO_TYPE_NAME_FORMAT_FULL_NAME;\n\telse\n\t\tformat = MONO_TYPE_NAME_FORMAT_REFLECTION;\n \n\tname = mono_type_get_name_full (object->type, format);\n\tif (!name)\n\t\treturn NULL;\n\n\tif (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR)) {\n\t\tg_free (name);\n\t\treturn NULL;\n\t}\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}\n\nstatic void\nfill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)\n{\n\tstatic MonoMethod *create_culture = NULL;\n\tgpointer args [2];\n\tguint32 pkey_len;\n\tconst char *pkey_ptr;\n\tgchar *codebase;\n\tMonoBoolean assembly_ref = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));\n\taname->major = name->major;\n\taname->minor = name->minor;\n\taname->build = name->build;\n\taname->flags = name->flags;\n\taname->revision = name->revision;\n\taname->hashalg = name->hash_alg;\n\taname->versioncompat = 1; /* SameMachine (default) */\n\n\tif (by_default_version)\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));\n\n\tcodebase = NULL;\n\tif (absolute != NULL && *absolute != '\\0') {\n\t\tconst gchar *prepend = \"file://\";\n\t\tgchar *result;\n\n\t\tcodebase = g_strdup (absolute);\n\n#if PLATFORM_WIN32\n\t\t{\n\t\t\tgint i;\n\t\t\tfor (i = strlen (codebase) - 1; i >= 0; i--)\n\t\t\t\tif (codebase [i] == '\\\\')\n\t\t\t\t\tcodebase [i] = '/';\n\n\t\t\tif (*codebase == '/' && *(codebase + 1) == '/') {\n\t\t\t\tprepend = \"file:\";\n\t\t\t} else {\n\t\t\t\tprepend = \"file:///\";\n\t\t\t}\n\t\t}\n#endif\n\t\tresult = g_strconcat (prepend, codebase, NULL);\n\t\tg_free (codebase);\n\t\tcodebase = result;\n\t}\n\n\tif (codebase) {\n\t\tMONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));\n\t\tg_free (codebase);\n\t}\n\n\tif (!create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tif (name->culture) {\n\t\targs [0] = mono_string_new (domain, name->culture);\n\t\targs [1] = &assembly_ref;\n\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t}\n\n\tif (name->public_key) {\n\t\tpkey_ptr = (char*)name->public_key;\n\t\tpkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t} else if (default_publickey) {\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t}\n\n\t/* MonoAssemblyName keeps the public key token as an hexadecimal string */\n\tif (name->public_key_token [0]) {\n\t\tint i, j;\n\t\tchar *p;\n\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));\n\t\tp = mono_array_addr (aname->keyToken, char, 0);\n\n\t\tfor (i = 0, j = 0; i < 8; i++) {\n\t\t\t*p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;\n\t\t\t*p |= g_ascii_xdigit_value (name->public_key_token [j++]);\n\t\t\tp++;\n\t\t}\n\t} else if (default_token) {\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t}\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res;\n\tgchar *name;\n\n\tname = g_strdup_printf (\n\t\t\"%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s\",\n\t\tmass->aname.name,\n\t\tmass->aname.major, mass->aname.minor, mass->aname.build, mass->aname.revision,\n\t\tmass->aname.culture && *mass->aname.culture? mass->aname.culture: \"neutral\",\n\t\tmass->aname.public_key_token [0] ? (char *)mass->aname.public_key_token : \"null\",\n\t\t(mass->aname.flags & ASSEMBLYREF_RETARGETABLE_FLAG) ? \", Retargetable=Yes\" : \"\");\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}\n\nstatic void\nves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)\n{\n\tgchar *absolute;\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\t\taname, &mass->aname, mass->image->name, TRUE,\n\t\t\tTRUE, mono_framework_version () >= 2);\n\t\treturn;\n\t}\n\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\n\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\taname, &mass->aname, absolute, TRUE, TRUE,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (absolute);\n}\n\nstatic void\nves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)\n{\n\tchar *filename;\n\tMonoImageOpenStatus status = MONO_IMAGE_OK;\n\tgboolean res;\n\tMonoImage *image;\n\tMonoAssemblyName name;\n\tchar *dirname\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfilename = mono_string_to_utf8 (fname);\n\n\tdirname = g_path_get_dirname (filename);\n\treplace_shadow_path (mono_domain_get (), dirname, &filename);\n\tg_free (dirname);\n\n\timage = mono_image_open (filename, &status);\n\n\tif (!image){\n\t\tMonoException *exc;\n\n\t\tg_free (filename);\n\t\tif (status == MONO_IMAGE_IMAGE_INVALID)\n\t\t\texc = mono_get_exception_bad_image_format2 (NULL, fname);\n\t\telse\n\t\t\texc = mono_get_exception_file_not_found2 (NULL, fname);\n\t\tmono_raise_exception (exc);\n\t}\n\n\tres = mono_assembly_fill_assembly_name (image, &name);\n\tif (!res) {\n\t\tmono_image_close (image);\n\t\tg_free (filename);\n\t\tmono_raise_exception (mono_get_exception_argument (\"assemblyFile\", \"The file does not contain a manifest\"));\n\t}\n\n\tfill_reflection_assembly_name (mono_domain_get (), aname, &name, filename,\n\t\tTRUE, mono_framework_version () == 1,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (filename);\n\tmono_image_close (image);\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,\n\tchar **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)\n{\n\tMonoBoolean result = FALSE;\n\tMonoDeclSecurityEntry entry;\n\n\t/* SecurityAction.RequestMinimum */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {\n\t\t*minimum = entry.blob;\n\t\t*minLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestOptional */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {\n\t\t*optional = entry.blob;\n\t\t*optLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestRefuse */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {\n\t\t*refused = entry.blob;\n\t\t*refLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\n\treturn result;\t\n}\n\nstatic MonoArray*\nmono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly)\n{\n\tMonoArray *res;\n\tMonoClass *klass;\n\tMonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];\n\tint i, count;\n\tguint32 attrs, visibility;\n\n\t/* we start the count from 1 because we skip the special type <Module> */\n\tif (exportedOnly) {\n\t\tcount = 0;\n\t\tfor (i = 1; i < tdef->rows; ++i) {\n\t\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\t\tif (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)\n\t\t\t\tcount++;\n\t\t}\n\t} else {\n\t\tcount = tdef->rows - 1;\n\t}\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\t*exceptions = mono_array_new (domain, mono_defaults.exception_class, count);\n\tcount = 0;\n\tfor (i = 1; i < tdef->rows; ++i) {\n\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\tif (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {\n\t\t\tklass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);\n\t\t\tif (klass) {\n\t\t\t\tmono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));\n\t\t\t} else {\n\t\t\t\tMonoLoaderError *error;\n\t\t\t\tMonoException *ex;\n\t\t\t\t\n\t\t\t\terror = mono_loader_get_last_error ();\n\t\t\t\tg_assert (error != NULL);\n\t\n\t\t\t\tex = mono_loader_error_prepare_exception (error);\n\t\t\t\tmono_array_setref (*exceptions, count, ex);\n\t\t\t}\n\t\t\tif (mono_loader_get_last_error ())\n\t\t\t\tmono_loader_clear_error ();\n\t\t\tcount++;\n\t\t}\n\t}\n\t\n\treturn res;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)\n{\n\tMonoArray *res = NULL;\n\tMonoArray *exceptions = NULL;\n\tMonoImage *image = NULL;\n\tMonoTableInfo *table = NULL;\n\tMonoDomain *domain;\n\tGList *list = NULL;\n\tint i, len, ex_count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (assembly);\n\n\tg_assert (!assembly->assembly->dynamic);\n\timage = assembly->assembly->image;\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tres = mono_module_get_types (domain, image, &exceptions, exportedOnly);\n\n\t/* Append data from all modules in the assembly */\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tMonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);\n\t\t\tif (loaded_image) {\n\t\t\t\tMonoArray *ex2;\n\t\t\t\tMonoArray *res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly);\n\t\t\t\t/* Append the new types to the end of the array */\n\t\t\t\tif (mono_array_length (res2) > 0) {\n\t\t\t\t\tguint32 len1, len2;\n\t\t\t\t\tMonoArray *res3, *ex3;\n\n\t\t\t\t\tlen1 = mono_array_length (res);\n\t\t\t\t\tlen2 = mono_array_length (res2);\n\n\t\t\t\t\tres3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (res3, 0, res, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (res3, len1, res2, 0, len2);\n\t\t\t\t\tres = res3;\n\n\t\t\t\t\tex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, len1, ex2, 0, len2);\n\t\t\t\t\texceptions = ex3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* the ReflectionTypeLoadException must have all the types (Types property), \n\t * NULL replacing types which throws an exception. The LoaderException must\n\t * contain all exceptions for NULL items.\n\t */\n\n\tlen = mono_array_length (res);\n\n\tex_count = 0;\n\tfor (i = 0; i < len; i++) {\n\t\tMonoReflectionType *t = mono_array_get (res, gpointer, i);\n\t\tMonoClass *klass;\n\n\t\tif (t) {\n\t\t\tklass = mono_type_get_class (t->type);\n\t\t\tif ((klass != NULL) && klass->exception_type) {\n\t\t\t\t/* keep the class in the list */\n\t\t\t\tlist = g_list_append (list, klass);\n\t\t\t\t/* and replace Type with NULL */\n\t\t\t\tmono_array_setref (res, i, NULL);\n\t\t\t}\n\t\t} else {\n\t\t\tex_count ++;\n\t\t}\n\t}\n\n\tif (list || ex_count) {\n\t\tGList *tmp = NULL;\n\t\tMonoException *exc = NULL;\n\t\tMonoArray *exl = NULL;\n\t\tint j, length = g_list_length (list) + ex_count;\n\n\t\tmono_loader_clear_error ();\n\n\t\texl = mono_array_new (domain, mono_defaults.exception_class, length);\n\t\t/* Types for which mono_class_get () succeeded */\n\t\tfor (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (tmp->data);\n\t\t\tmono_array_setref (exl, i, exc);\n\t\t}\n\t\t/* Types for which it don't */\n\t\tfor (j = 0; j < mono_array_length (exceptions); ++j) {\n\t\t\tMonoException *exc = mono_array_get (exceptions, MonoException*, j);\n\t\t\tif (exc) {\n\t\t\t\tg_assert (i < length);\n\t\t\t\tmono_array_setref (exl, i, exc);\n\t\t\t\ti ++;\n\t\t\t}\n\t\t}\n\t\tg_list_free (list);\n\t\tlist = NULL;\n\n\t\texc = mono_get_exception_reflection_type_load (res, exl);\n\t\tmono_loader_clear_error ();\n\t\tmono_raise_exception (exc);\n\t}\n\t\t\n\treturn res;\n}\n\nstatic gboolean\nves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)\n{\n\tMonoAssemblyName aname;\n\tMonoDomain *domain = mono_object_domain (name);\n\tchar *val;\n\tgboolean is_version_defined;\n\tgboolean is_token_defined;\n\n\taname.public_key = NULL;\n\tval = mono_string_to_utf8 (assname);\n\tif (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined, &is_token_defined)) {\n\t\tg_free ((guint8*) aname.public_key);\n\t\tg_free (val);\n\t\treturn FALSE;\n\t}\n\t\n\tfill_reflection_assembly_name (domain, name, &aname, \"\", is_version_defined,\n\t\tFALSE, is_token_defined);\n\n\tmono_assembly_name_free (&aname);\n\tg_free ((guint8*) aname.public_key);\n\tg_free (val);\n\n\treturn TRUE;\n}\n\nstatic MonoReflectionType*\nves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\n\tif (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)\n\t\t/* These images do not have a global type */\n\t\treturn NULL;\n\n\tklass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);\n\treturn mono_type_get_object (domain, &klass->byval_arg);\n}\n\nstatic void\nves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)\n{\n\t/*if (module->image)\n\t\tmono_image_close (module->image);*/\n}\n\nstatic MonoString*\nves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\treturn mono_string_new (domain, module->image->guid);\n}\n\nstatic gpointer\nves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModule *module)\n{\n#ifdef PLATFORM_WIN32\n\tif (module->image && module->image->is_module_handle)\n\t\treturn module->image->raw_data;\n#endif\n\n\treturn (gpointer) (-1);\n}\n\nstatic void\nves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)\n{\n\tif (image->dynamic) {\n\t\tMonoDynamicImage *dyn = (MonoDynamicImage*)image;\n\t\t*pe_kind = dyn->pe_kind;\n\t\t*machine = dyn->machine;\n\t}\n\telse {\n\t\t*pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;\n\t\t*machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;\n\t}\n}\n\nstatic gint32\nves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)\n{\n\treturn (image->md_version_major << 16) | (image->md_version_minor);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)\n{\n\tMonoArray *exceptions;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!module->image)\n\t\treturn mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);\n\telse {\n\t\tMonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE);\n\t\tfor (i = 0; i < mono_array_length (exceptions); ++i) {\n\t\t\tMonoException *ex = mono_array_get (exceptions, MonoException *, i);\n\t\t\tif (ex)\n\t\t\t\tmono_raise_exception (ex);\n\t\t}\n\t\treturn res;\n\t}\n}\n\nstatic gboolean\nmono_metadata_memberref_is_method (MonoImage *image, guint32 token)\n{\n\tguint32 cols [MONO_MEMBERREF_SIZE];\n\tconst char *sig;\n\tmono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);\n\tsig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);\n\tmono_metadata_decode_blob_size (sig, &sig);\n\treturn (*sig != 0x6);\n}\n\nstatic void\ninit_generic_context_from_args (MonoGenericContext *context, MonoArray *type_args, MonoArray *method_args)\n{\n\tif (type_args)\n\t\tcontext->class_inst = mono_metadata_get_generic_inst (mono_array_length (type_args),\n\t\t\t\t\t\t\t\t mono_array_addr (type_args, MonoType*, 0));\n\telse\n\t\tcontext->class_inst = NULL;\n\tif (method_args)\n\t\tcontext->method_inst = mono_metadata_get_generic_inst (mono_array_length (method_args),\n\t\t\t\t\t\t\t\t mono_array_addr (method_args, MonoType*, 0));\n\telse\n\t\tcontext->method_inst = NULL;\n}\n\nstatic MonoType*\nves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && \n\t\t(table != MONO_TABLE_TYPESPEC)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\tklass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t\tif (!klass)\n\t\t\treturn NULL;\n\t\treturn &klass->byval_arg;\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tklass = mono_class_get_full (image, token, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\tif (klass)\n\t\treturn &klass->byval_arg;\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoMethod*\nves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoMethod *method;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && \n\t\t(table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tmethod = mono_get_method_full (image, token, NULL, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\treturn method;\n}\n\nstatic MonoString*\nves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint index = mono_metadata_token_index (token);\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic)\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\n\tif ((index <= 0) || (index >= image->heap_us.size)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\t/* FIXME: What to do if the index points into the middle of a string ? */\n\n\treturn mono_ldstr (mono_domain_get (), image, index);\n}\n\nstatic MonoClassField*\nves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoClassField *field;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tfield = mono_field_from_token (image, token, &klass, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\n\treturn field;\n}\n\n\nstatic MonoObject*\nves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\n\t*error = ResolveTokenError_Other;\n\n\tswitch (table) {\n\tcase MONO_TABLE_TYPEDEF:\n\tcase MONO_TABLE_TYPEREF:\n\tcase MONO_TABLE_TYPESPEC: {\n\t\tMonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);\n\t\tif (t)\n\t\t\treturn (MonoObject*)mono_type_get_object (mono_domain_get (), t);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_METHOD:\n\tcase MONO_TABLE_METHODSPEC: {\n\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\tif (m)\n\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\telse\n\t\t\treturn NULL;\n\t}\t\t\n\tcase MONO_TABLE_FIELD: {\n\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\tif (f)\n\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_MEMBERREF:\n\t\tif (mono_metadata_memberref_is_method (image, token)) {\n\t\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\t\tif (m)\n\t\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse {\n\t\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\t\tif (f)\n\t\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\t*error = ResolveTokenError_BadTable;\n\t}\n\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint idx = mono_metadata_token_index (token);\n\tMonoTableInfo *tables = image->tables;\n\tguint32 sig, len;\n\tconst char *ptr;\n\tMonoArray *res;\n\n\t*error = ResolveTokenError_OutOfRange;\n\n\t/* FIXME: Support other tables ? */\n\tif (table != MONO_TABLE_STANDALONESIG)\n\t\treturn NULL;\n\n\tif (image->dynamic)\n\t\treturn NULL;\n\n\tif ((idx == 0) || (idx > tables [MONO_TABLE_STANDALONESIG].rows))\n\t\treturn NULL;\n\n\tsig = mono_metadata_decode_row_col (&tables [MONO_TABLE_STANDALONESIG], idx - 1, 0);\n\n\tptr = mono_metadata_blob_heap (image, sig);\n\tlen = mono_metadata_decode_blob_size (ptr, &ptr);\n\n\tres = mono_array_new (mono_domain_get (), mono_defaults.byte_class, len);\n\tmemcpy (mono_array_addr (res, guint8, 0), ptr, len);\n\treturn res;\n}\n\nstatic MonoReflectionType*\nves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)\n{\n\tMonoClass *klass;\n\tint isbyref = 0, rank;\n\tchar *str = mono_string_to_utf8 (smodifiers);\n\tchar *p;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (tb->type.type);\n\tp = str;\n\t/* logic taken from mono_reflection_parse_type(): keep in sync */\n\twhile (*p) {\n\t\tswitch (*p) {\n\t\tcase '&':\n\t\t\tif (isbyref) { /* only one level allowed by the spec */\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tisbyref = 1;\n\t\t\tp++;\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (mono_object_domain (tb), &klass->this_arg);\n\t\t\tbreak;\n\t\tcase '*':\n\t\t\tklass = mono_ptr_class_get (&klass->byval_arg);\n\t\t\tmono_class_init (klass);\n\t\t\tp++;\n\t\t\tbreak;\n\t\tcase '[':\n\t\t\trank = 1;\n\t\t\tp++;\n\t\t\twhile (*p) {\n\t\t\t\tif (*p == ']')\n\t\t\t\t\tbreak;\n\t\t\t\tif (*p == ',')\n\t\t\t\t\trank++;\n\t\t\t\telse if (*p != '*') { /* '*' means unknown lower bound */\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t++p;\n\t\t\t}\n\t\t\tif (*p != ']') {\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tp++;\n\t\t\tklass = mono_array_class_get (klass, rank);\n\t\t\tmono_class_init (klass);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\tg_free (str);\n\treturn mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);\n}\n\nstatic MonoBoolean\nves_icall_Type_IsArrayImpl (MonoReflectionType *t)\n{\n\tMonoType *type;\n\tMonoBoolean res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\ttype = t->type;\n\tres = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);\n\n\treturn res;\n}\n\nstatic void\ncheck_for_invalid_type (MonoClass *klass)\n{\n\tchar *name;\n\tMonoString *str;\n\tif (klass->byval_arg.type != MONO_TYPE_TYPEDBYREF)\n\t\treturn;\n\n\tname = mono_type_get_full_name (klass);\n\tstr = mono_string_new (mono_domain_get (), name);\n\tg_free (name);\n\tmono_raise_exception ((MonoException*)mono_get_exception_type_load (str, NULL));\n\n}\nstatic MonoReflectionType *\nves_icall_Type_make_array_type (MonoReflectionType *type, int rank)\n{\n\tMonoClass *klass, *aklass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tif (rank == 0) //single dimentional array\n\t\taklass = mono_array_class_get (klass, 1);\n\telse\n\t\taklass = mono_bounded_array_class_get (klass, rank, TRUE);\n\n\treturn mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);\n}\n\nstatic MonoReflectionType *\nves_icall_Type_make_byref_type (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\treturn mono_type_get_object (mono_object_domain (type), &klass->this_arg);\n}\n\nstatic MonoReflectionType *\nves_icall_Type_MakePointerType (MonoReflectionType *type)\n{\n\tMonoClass *klass, *pklass;\n\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tpklass = mono_ptr_class_get (type->type);\n\n\treturn mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);\n}\n\nstatic MonoObject *\nves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,\n\t\t\t\t\t\t MonoReflectionMethod *info, MonoBoolean throwOnBindFailure)\n{\n\tMonoClass *delegate_class = mono_class_from_mono_type (type->type);\n\tMonoObject *delegate;\n\tgpointer func;\n\tMonoMethod *method = info->method;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR) {\n\t\tif (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure))\n\t\t\treturn NULL;\n\t}\n\n\tdelegate = mono_object_new (mono_object_domain (type), delegate_class);\n\n\tif (method->dynamic) {\n\t\t/* Creating a trampoline would leak memory */\n\t\tfunc = mono_compile_method (method);\n\t} else {\n\t\tfunc = mono_create_ftnptr (mono_domain_get (),\n\t\t\tmono_runtime_create_jump_trampoline (mono_domain_get (), method, TRUE));\n\t}\n\n\tmono_delegate_ctor_with_method (delegate, target, func, method);\n\n\treturn delegate;\n}\n\nstatic void\nves_icall_System_Delegate_SetMulticastInvoke (MonoDelegate *this)\n{\n\t/* Reset the invoke impl to the default one */\n\tthis->invoke_impl = mono_runtime_create_delegate_trampoline (this->object.vtable->klass);\n}\n\n/*\n * Magic number to convert a time which is relative to\n * Jan 1, 1970 into a value which is relative to Jan 1, 0001.\n */\n#define\tEPOCH_ADJUST\t((guint64)62135596800LL)\n\n/*\n * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001\n */\n#define FILETIME_ADJUST ((guint64)504911232000000000LL)\n\n#ifdef PLATFORM_WIN32\n/* convert a SYSTEMTIME which is of the form \"last thursday in october\" to a real date */\nstatic void\nconvert_to_absolute_date(SYSTEMTIME *date)\n{\n#define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))\n\tstatic int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n\tstatic int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n\t/* from the calendar FAQ */\n\tint a = (14 - date->wMonth) / 12;\n\tint y = date->wYear - a;\n\tint m = date->wMonth + 12 * a - 2;\n\tint d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;\n\n\t/* d is now the day of the week for the first of the month (0 == Sunday) */\n\n\tint day_of_week = date->wDayOfWeek;\n\n\t/* set day_in_month to the first day in the month which falls on day_of_week */ \n\tint day_in_month = 1 + (day_of_week - d);\n\tif (day_in_month <= 0)\n\t\tday_in_month += 7;\n\n\t/* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */\n\tdate->wDay = day_in_month + (date->wDay - 1) * 7;\n\tif (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))\n\t\tdate->wDay -= 7;\n}\n#endif\n\n#ifndef PLATFORM_WIN32\n/*\n * Return's the offset from GMT of a local time.\n * \n * tm is a local time\n * t is the same local time as seconds.\n */\nstatic int \ngmt_offset(struct tm *tm, time_t t)\n{\n#if defined (HAVE_TM_GMTOFF)\n\treturn tm->tm_gmtoff;\n#else\n\tstruct tm g;\n\ttime_t t2;\n\tg = *gmtime(&t);\n\tg.tm_isdst = tm->tm_isdst;\n\tt2 = mktime(&g);\n\treturn (int)difftime(t, t2);\n#endif\n}\n#endif\n/*\n * This is heavily based on zdump.c from glibc 2.2.\n *\n * * data[0]: start of daylight saving time (in DateTime ticks).\n * * data[1]: end of daylight saving time (in DateTime ticks).\n * * data[2]: utcoffset (in TimeSpan ticks).\n * * data[3]: additional offset when daylight saving (in TimeSpan ticks).\n * * name[0]: name of this timezone when not daylight saving.\n * * name[1]: name of this timezone when daylight saving.\n *\n * FIXME: This only works with \"standard\" Unix dates (years between 1900 and 2100) while\n * the class library allows years between 1 and 9999.\n *\n * Returns true on success and zero on failure.\n */\nstatic guint32\nves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)\n{\n#ifndef PLATFORM_WIN32\n\tMonoDomain *domain = mono_domain_get ();\n\tstruct tm start, tt;\n\ttime_t t;\n\n\tlong int gmtoff;\n\tint is_daylight = 0, day;\n\tchar tzone [64];\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, (MonoObject*) mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, (MonoObject*) mono_array_new (domain, mono_defaults.string_class, 2));\n\n\t/* \n\t * no info is better than crashing: we'll need our own tz data\n\t * to make this work properly, anyway. The range is probably\n\t * reduced to 1970 .. 2037 because that is what mktime is\n\t * guaranteed to support (we get into an infinite loop\n\t * otherwise).\n\t */\n\n\tmemset (&start, 0, sizeof (start));\n\n\tstart.tm_mday = 1;\n\tstart.tm_year = year-1900;\n\n\tt = mktime (&start);\n\n\tif ((year < 1970) || (year > 2037) || (t == -1)) {\n\t\tt = time (NULL);\n\t\ttt = *localtime (&t);\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\treturn 1;\n\t}\n\n\tgmtoff = gmt_offset (&start, t);\n\n\t/* For each day of the year, calculate the tm_gmtoff. */\n\tfor (day = 0; day < 365; day++) {\n\n\t\tt += 3600*24;\n\t\ttt = *localtime (&t);\n\n\t\t/* Daylight saving starts or ends here. */\n\t\tif (gmt_offset (&tt, t) != gmtoff) {\n\t\t\tstruct tm tt1;\n\t\t\ttime_t t1;\n\n\t\t\t/* Try to find the exact hour when daylight saving starts/ends. */\n\t\t\tt1 = t;\n\t\t\tdo {\n\t\t\t\tt1 -= 3600;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) != gmtoff);\n\n\t\t\t/* Try to find the exact minute when daylight saving starts/ends. */\n\t\t\tdo {\n\t\t\t\tt1 += 60;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) == gmtoff);\n\t\t\tt1+=gmtoff;\n\t\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\t\t\n\t\t\t/* Write data, if we're already in daylight saving, we're done. */\n\t\t\tif (is_daylight) {\n\t\t\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\tis_daylight = 1;\n\t\t\t}\n\n\t\t\t/* This is only set once when we enter daylight saving. */\n\t\t\tmono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);\n\t\t\tmono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);\n\n\t\t\tgmtoff = gmt_offset (&tt, t);\n\t\t}\n\t}\n\n\tif (!is_daylight) {\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\tmono_array_set ((*data), gint64, 0, 0);\n\t\tmono_array_set ((*data), gint64, 1, 0);\n\t\tmono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);\n\t\tmono_array_set ((*data), gint64, 3, 0);\n\t}\n\n\treturn 1;\n#else\n\tMonoDomain *domain = mono_domain_get ();\n\tTIME_ZONE_INFORMATION tz_info;\n\tFILETIME ft;\n\tint i;\n\tint err, tz_id;\n\n\ttz_id = GetTimeZoneInformation (&tz_info);\n\tif (tz_id == TIME_ZONE_ID_INVALID)\n\t\treturn 0;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, mono_array_new (domain, mono_defaults.string_class, 2));\n\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.DaylightName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.StandardName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));\n\n\tif ((year <= 1601) || (year > 30827)) {\n\t\t/*\n\t\t * According to MSDN, the MS time functions can't handle dates outside\n\t\t * this interval.\n\t\t */\n\t\treturn 1;\n\t}\n\n\t/* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */\n\tif (tz_id != TIME_ZONE_ID_UNKNOWN) {\n\t\ttz_info.StandardDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.StandardDate);\n\t\terr = SystemTimeToFileTime (&tz_info.StandardDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t\ttz_info.DaylightDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.DaylightDate);\n\t\terr = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t}\n\tmono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);\n\tmono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);\n\n\treturn 1;\n#endif\n}\n\nstatic gpointer\nves_icall_System_Object_obj_address (MonoObject *this) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this;\n}\n\n/* System.Buffer */\n\nstatic inline gint32 \nmono_array_get_byte_length (MonoArray *array)\n{\n\tMonoClass *klass;\n\tint length;\n\tint i;\n\n\tklass = array->obj.vtable->klass;\n\n\tif (array->bounds == NULL)\n\t\tlength = array->max_length;\n\telse {\n\t\tlength = 1;\n\t\tfor (i = 0; i < klass->rank; ++ i)\n\t\t\tlength *= array->bounds [i].length;\n\t}\n\n\tswitch (klass->element_class->byval_arg.type) {\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn length;\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_CHAR:\n\t\treturn length << 1;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\treturn length << 2;\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U:\n\t\treturn length * sizeof (gpointer);\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\treturn length << 3;\n\tdefault:\n\t\treturn -1;\n\t}\n}\n\nstatic gint32 \nves_icall_System_Buffer_ByteLengthInternal (MonoArray *array) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get_byte_length (array);\n}\n\nstatic gint8 \nves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get (array, gint8, idx);\n}\n\nstatic void \nves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_array_set (array, gint8, idx, value);\n}\n\nstatic MonoBoolean\nves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count) \n{\n\tguint8 *src_buf, *dest_buf;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* watch out for integer overflow */\n\tif ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))\n\t\treturn FALSE;\n\n\tsrc_buf = (guint8 *)src->vector + src_offset;\n\tdest_buf = (guint8 *)dest->vector + dest_offset;\n\n\tif (src != dest)\n\t\tmemcpy (dest_buf, src_buf, count);\n\telse\n\t\tmemmove (dest_buf, src_buf, count); /* Source and dest are the same array */\n\n\treturn TRUE;\n}\n\nstatic MonoObject *\nves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)\n{\n\tMonoDomain *domain = mono_object_domain (this); \n\tMonoObject *res;\n\tMonoRealProxy *rp = ((MonoRealProxy *)this);\n\tMonoTransparentProxy *tp;\n\tMonoType *type;\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_object_new (domain, mono_defaults.transparent_proxy_class);\n\ttp = (MonoTransparentProxy*) res;\n\t\n\tMONO_OBJECT_SETREF (tp, rp, rp);\n\ttype = ((MonoReflectionType *)rp->class_to_proxy)->type;\n\tklass = mono_class_from_mono_type (type);\n\n\ttp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);\n\ttp->remote_class = mono_remote_class (domain, class_name, klass);\n\n\tres->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)\n{\n\treturn mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);\n}\n\n/* System.Environment */\n\nMonoString*\nves_icall_System_Environment_get_UserName (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* using glib is more portable */\n\treturn mono_string_new (mono_domain_get (), g_get_user_name ());\n}\n\n\nstatic MonoString *\nves_icall_System_Environment_get_MachineName (void)\n{\n#if defined (PLATFORM_WIN32)\n\tgunichar2 *buf;\n\tguint32 len;\n\tMonoString *result;\n\n\tlen = MAX_COMPUTERNAME_LENGTH + 1;\n\tbuf = g_new (gunichar2, len);\n\n\tresult = NULL;\n\tif (GetComputerName (buf, (PDWORD) &len))\n\t\tresult = mono_string_new_utf16 (mono_domain_get (), buf, len);\n\n\tg_free (buf);\n\treturn result;\n#elif !defined(DISABLE_SOCKETS)\n\tgchar buf [256];\n\tMonoString *result;\n\n\tif (gethostname (buf, sizeof (buf)) == 0)\n\t\tresult = mono_string_new (mono_domain_get (), buf);\n\telse\n\t\tresult = NULL;\n\t\n\treturn result;\n#else\n\treturn mono_string_new (mono_domain_get (), \"mono\");\n#endif\n}\n\nstatic int\nves_icall_System_Environment_get_Platform (void)\n{\n#if defined (PLATFORM_WIN32)\n\t/* Win32NT */\n\treturn 2;\n#elif defined(__MACH__)\n\t/* OSX */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\n\t//\n\t// For compatibility with our client code, this will be 4 for a while.\n\t// We will eventually move to 6 to match .NET, but it requires all client\n\t// code to be updated and the documentation everywhere to be updated \n\t// first.\n\t//\n\treturn 4;\n#else\n\t/* Unix */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\treturn 4;\n#endif\n}\n\nstatic MonoString *\nves_icall_System_Environment_get_NewLine (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n#if defined (PLATFORM_WIN32)\n\treturn mono_string_new (mono_domain_get (), \"\\r\\n\");\n#else\n\treturn mono_string_new (mono_domain_get (), \"\\n\");\n#endif\n}\n\nstatic MonoString *\nves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)\n{\n\tconst gchar *value;\n\tgchar *utf8_name;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\treturn NULL;\n\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\tvalue = g_getenv (utf8_name);\n\n\tg_free (utf8_name);\n\n\tif (value == 0)\n\t\treturn NULL;\n\t\n\treturn mono_string_new (mono_domain_get (), value);\n}\n\n/*\n * There is no standard way to get at environ.\n */\n#ifndef _MSC_VER\n#ifndef __MINGW32_VERSION\n#ifdef __APPLE__\n/* Apple defines this in crt_externs.h but doesn't provide that header for \n * arm-apple-darwin9. We'll manually define the symbol on Apple as it does\n * in fact exist on all implementations (so far) \n */\ngchar ***_NSGetEnviron(void);\n#define environ (*_NSGetEnviron())\n#else\nextern\nchar **environ;\n#endif\n#endif\n#endif\n\nstatic MonoArray *\nves_icall_System_Environment_GetEnvironmentVariableNames (void)\n{\n#ifdef PLATFORM_WIN32\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tWCHAR* env_strings;\n\tWCHAR* env_string;\n\tWCHAR* equal_str;\n\tint n = 0;\n\n\tenv_strings = GetEnvironmentStrings();\n\n\tif (env_strings) {\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=')\n\t\t\t\tn++;\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\t}\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tif (env_strings) {\n\t\tn = 0;\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=') {\n\t\t\t\tequal_str = wcschr(env_string, '=');\n\t\t\t\tg_assert(equal_str);\n\t\t\t\tstr = mono_string_new_utf16 (domain, env_string, equal_str-env_string);\n\t\t\t\tmono_array_setref (names, n, str);\n\t\t\t\tn++;\n\t\t\t}\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\n\t\tFreeEnvironmentStrings (env_strings);\n\t}\n\n\treturn names;\n\n#else\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tgchar **e, **parts;\n\tint n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e)\n\t\t++ n;\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e) {\n\t\tparts = g_strsplit (*e, \"=\", 2);\n\t\tif (*parts != 0) {\n\t\t\tstr = mono_string_new (domain, *parts);\n\t\t\tmono_array_setref (names, n, str);\n\t\t}\n\n\t\tg_strfreev (parts);\n\n\t\t++ n;\n\t}\n\n\treturn names;\n#endif\n}\n\n/*\n * If your platform lacks setenv/unsetenv, you must upgrade your glib.\n */\n#if !GLIB_CHECK_VERSION(2,4,0)\n#define g_setenv(a,b,c) setenv(a,b,c)\n#define g_unsetenv(a) unsetenv(a)\n#endif\n\nstatic void\nves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, MonoString *value)\n{\n\tMonoError error;\n\n#ifdef PLATFORM_WIN32\n\tgunichar2 *utf16_name, *utf16_value;\n#else\n\tgchar *utf8_name, *utf8_value;\n#endif\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n#ifdef PLATFORM_WIN32\n\tutf16_name = mono_string_to_utf16 (name);\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tSetEnvironmentVariable (utf16_name, NULL);\n\t\tg_free (utf16_name);\n\t\treturn;\n\t}\n\n\tutf16_value = mono_string_to_utf16 (value);\n\n\tSetEnvironmentVariable (utf16_name, utf16_value);\n\n\tg_free (utf16_name);\n\tg_free (utf16_value);\n#else\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tg_unsetenv (utf8_name);\n\t\tg_free (utf8_name);\n\t\treturn;\n\t}\n\n\tutf8_value = mono_string_to_utf8_checked (value, &error);\n\tif (!mono_error_ok (&error)) {\n\t\tg_free (utf8_name);\n\t\tmono_error_raise_exception (&error);\n\t}\n\tg_setenv (utf8_name, utf8_value, TRUE);\n\n\tg_free (utf8_name);\n\tg_free (utf8_value);\n#endif\n}\n\nstatic void\nves_icall_System_Environment_Exit (int result)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_threads_set_shutting_down ();\n\n\tmono_runtime_set_shutting_down ();\n\n\t/* This will kill the tp threads which cannot be suspended */\n\tmono_thread_pool_cleanup ();\n\n\t/* Suspend all managed threads since the runtime is going away */\n\tmono_thread_suspend_all_other_threads ();\n\n\tmono_runtime_quit ();\n\n\t/* we may need to do some cleanup here... */\n\texit (result);\n}\n\nstatic MonoString*\nves_icall_System_Environment_GetGacPath (void)\n{\n\treturn mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());\n}\n\nstatic MonoString*\nves_icall_System_Environment_GetWindowsFolderPath (int folder)\n{\n#if defined (PLATFORM_WIN32)\n\t#ifndef CSIDL_FLAG_CREATE\n\t\t#define CSIDL_FLAG_CREATE\t0x8000\n\t#endif\n\n\tWCHAR path [MAX_PATH];\n\t/* Create directory if no existing */\n\tif (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {\n\t\tint len = 0;\n\t\twhile (path [len])\n\t\t\t++ len;\n\t\treturn mono_string_new_utf16 (mono_domain_get (), path, len);\n\t}\n#else\n\tg_warning (\"ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!\");\n#endif\n\treturn mono_string_new (mono_domain_get (), \"\");\n}\n\nstatic MonoArray *\nves_icall_System_Environment_GetLogicalDrives (void)\n{\n gunichar2 buf [256], *ptr, *dname;\n\tgunichar2 *u16;\n\tguint initial_size = 127, size = 128;\n\tgint ndrives;\n\tMonoArray *result;\n\tMonoString *drivestr;\n\tMonoDomain *domain = mono_domain_get ();\n\tgint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n buf [0] = '\\0';\n\tptr = buf;\n\n\twhile (size > initial_size) {\n\t\tsize = (guint) GetLogicalDriveStrings (initial_size, ptr);\n\t\tif (size > initial_size) {\n\t\t\tif (ptr != buf)\n\t\t\t\tg_free (ptr);\n\t\t\tptr = g_malloc0 ((size + 1) * sizeof (gunichar2));\n\t\t\tinitial_size = size;\n\t\t\tsize++;\n\t\t}\n\t}\n\n\t/* Count strings */\n\tdname = ptr;\n\tndrives = 0;\n\tdo {\n\t\twhile (*dname++);\n\t\tndrives++;\n\t} while (*dname);\n\n\tdname = ptr;\n\tresult = mono_array_new (domain, mono_defaults.string_class, ndrives);\n\tndrives = 0;\n\tdo {\n\t\tlen = 0;\n\t\tu16 = dname;\n\t\twhile (*u16) { u16++; len ++; }\n\t\tdrivestr = mono_string_new_utf16 (domain, dname, len);\n\t\tmono_array_setref (result, ndrives++, drivestr);\n\t\twhile (*dname++);\n\t} while (*dname);\n\n\tif (ptr != buf)\n\t\tg_free (ptr);\n\n\treturn result;\n}\n\nstatic MonoString *\nves_icall_System_Environment_InternalGetHome (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_home_dir ());\n}\n\nstatic const char *encodings [] = {\n\t(char *) 1,\n\t\t\"ascii\", \"us_ascii\", \"us\", \"ansi_x3.4_1968\",\n\t\t\"ansi_x3.4_1986\", \"cp367\", \"csascii\", \"ibm367\",\n\t\t\"iso_ir_6\", \"iso646_us\", \"iso_646.irv:1991\",\n\t(char *) 2,\n\t\t\"utf_7\", \"csunicode11utf7\", \"unicode_1_1_utf_7\",\n\t\t\"unicode_2_0_utf_7\", \"x_unicode_1_1_utf_7\",\n\t\t\"x_unicode_2_0_utf_7\",\n\t(char *) 3,\n\t\t\"utf_8\", \"unicode_1_1_utf_8\", \"unicode_2_0_utf_8\",\n\t\t\"x_unicode_1_1_utf_8\", \"x_unicode_2_0_utf_8\",\n\t(char *) 4,\n\t\t\"utf_16\", \"UTF_16LE\", \"ucs_2\", \"unicode\",\n\t\t\"iso_10646_ucs2\",\n\t(char *) 5,\n\t\t\"unicodefffe\", \"utf_16be\",\n\t(char *) 6,\n\t\t\"iso_8859_1\",\n\t(char *) 0\n};\n\n/*\n * Returns the internal codepage, if the value of \"int_code_page\" is\n * 1 at entry, and we can not compute a suitable code page number,\n * returns the code page as a string\n */\nstatic MonoString*\nves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) \n{\n\tconst char *cset;\n\tconst char *p;\n\tchar *c;\n\tchar *codepage = NULL;\n\tint code;\n\tint want_name = *int_code_page;\n\tint i;\n\t\n\t*int_code_page = -1;\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_get_charset (&cset);\n\tc = codepage = strdup (cset);\n\tfor (c = codepage; *c; c++){\n\t\tif (isascii (*c) && isalpha (*c))\n\t\t\t*c = tolower (*c);\n\t\tif (*c == '-')\n\t\t\t*c = '_';\n\t}\n\t/* g_print (\"charset: %s\\n\", cset); */\n\t\n\t/* handle some common aliases */\n\tp = encodings [0];\n\tcode = 0;\n\tfor (i = 0; p != 0; ){\n\t\tif ((gssize) p < 7){\n\t\t\tcode = (gssize) p;\n\t\t\tp = encodings [++i];\n\t\t\tcontinue;\n\t\t}\n\t\tif (strcmp (p, codepage) == 0){\n\t\t\t*int_code_page = code;\n\t\t\tbreak;\n\t\t}\n\t\tp = encodings [++i];\n\t}\n\t\n\tif (strstr (codepage, \"utf_8\") != NULL)\n\t\t*int_code_page |= 0x10000000;\n\tfree (codepage);\n\t\n\tif (want_name && *int_code_page == -1)\n\t\treturn mono_string_new (mono_domain_get (), cset);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoBoolean\nves_icall_System_Environment_get_HasShutdownStarted (void)\n{\n\tif (mono_runtime_is_shutting_down ())\n\t\treturn TRUE;\n\n\tif (mono_domain_is_unloading (mono_domain_get ()))\n\t\treturn TRUE;\n\n\treturn FALSE;\n}\n\nstatic void\nves_icall_System_Environment_BroadcastSettingChange (void)\n{\n#ifdef PLATFORM_WIN32\n\tSendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, NULL, L\"Environment\", SMTO_ABORTIFHUNG, 2000, 0);\n#endif\n}\n\nstatic void\nves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, \n\t\t\t\t\t MonoReflectionMethod *method,\n\t\t\t\t\t MonoArray *out_args)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_message_init (mono_object_domain (this), this, method, out_args);\n}\n\nstatic MonoBoolean\nves_icall_IsTransparentProxy (MonoObject *proxy)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!proxy)\n\t\treturn 0;\n\n\tif (proxy->vtable->klass == mono_defaults.transparent_proxy_class)\n\t\treturn 1;\n\n\treturn 0;\n}\n\nstatic MonoReflectionMethod *\nves_icall_Remoting_RemotingServices_GetVirtualMethod (\n\tMonoReflectionType *rtype, MonoReflectionMethod *rmethod)\n{\n\tMonoClass *klass;\n\tMonoMethod *method;\n\tMonoMethod **vtable;\n\tMonoMethod *res = NULL;\n\n\tMONO_CHECK_ARG_NULL (rtype);\n\tMONO_CHECK_ARG_NULL (rmethod);\n\n\tmethod = rmethod->method;\n\tklass = mono_class_from_mono_type (rtype->type);\n\n\tif (MONO_CLASS_IS_INTERFACE (klass))\n\t\treturn NULL;\n\n\tif (method->flags & METHOD_ATTRIBUTE_STATIC)\n\t\treturn NULL;\n\n\tif ((method->flags & METHOD_ATTRIBUTE_FINAL) || !(method->flags & METHOD_ATTRIBUTE_VIRTUAL)) {\n\t\tif (klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE))\n\t\t\treturn rmethod;\n\t\telse\n\t\t\treturn NULL;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tvtable = klass->vtable;\n\n\tif (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {\n\t\tint offs = mono_class_interface_offset (klass, method->klass);\n\t\tif (offs >= 0)\n\t\t\tres = vtable [offs + method->slot];\n\t} else {\n\t\tif (!(klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE)))\n\t\t\treturn NULL;\n\n\t\tif (method->slot != -1)\n\t\t\tres = vtable [method->slot];\n\t}\n\n\tif (!res)\n\t\treturn NULL;\n\n\treturn mono_method_get_object (mono_domain_get (), res, NULL);\n}\n\nstatic void\nves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)\n{\n\tMonoClass *klass;\n\tMonoVTable* vtable;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\tif (enable) vtable->remote = 1;\n\telse vtable->remote = 0;\n}\n\nstatic MonoObject *\nves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->rank >= 1) {\n\t\tg_assert (klass->rank == 1);\n\t\treturn (MonoObject *) mono_array_new (domain, klass->element_class, 0);\n\t} else {\n\t\t/* Bypass remoting object creation check */\n\t\treturn mono_object_new_alloc_specific (mono_class_vtable_full (domain, klass, TRUE));\n\t}\n}\n\nstatic MonoString *\nves_icall_System_IO_get_temp_path (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_tmp_dir ());\n}\n\n#ifndef PLATFORM_NO_DRIVEINFO\nstatic MonoBoolean\nves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 *free_bytes_avail,\n\t\t\t\t\t\tguint64 *total_number_of_bytes, guint64 *total_number_of_free_bytes,\n\t\t\t\t\t\tgint32 *error)\n{\n\tgboolean result;\n\tULARGE_INTEGER wapi_free_bytes_avail;\n\tULARGE_INTEGER wapi_total_number_of_bytes;\n\tULARGE_INTEGER wapi_total_number_of_free_bytes;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*error = ERROR_SUCCESS;\n\tresult = GetDiskFreeSpaceEx (mono_string_chars (path_name), &wapi_free_bytes_avail, &wapi_total_number_of_bytes,\n\t\t\t\t &wapi_total_number_of_free_bytes);\n\n\tif (result) {\n\t\t*free_bytes_avail = wapi_free_bytes_avail.QuadPart;\n\t\t*total_number_of_bytes = wapi_total_number_of_bytes.QuadPart;\n\t\t*total_number_of_free_bytes = wapi_total_number_of_free_bytes.QuadPart;\n\t} else {\n\t\t*free_bytes_avail = 0;\n\t\t*total_number_of_bytes = 0;\n\t\t*total_number_of_free_bytes = 0;\n\t\t*error = GetLastError ();\n\t}\n\n\treturn result;\n}\n\nstatic guint32\nves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn GetDriveType (mono_string_chars (root_path_name));\n}\n#endif\n\nstatic gpointer\nves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_compile_method (method);\n}\n\nstatic MonoString *\nves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)\n{\n\tMonoString *mcpath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), \"mono\", mono_get_runtime_info ()->framework_version, \"machine.config\", NULL);\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tmcpath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn mcpath;\n}\n\nstatic MonoString *\nget_bundled_machine_config (void)\n{\n\tconst gchar *machine_config;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmachine_config = mono_get_machine_config ();\n\n\tif (!machine_config)\n\t\treturn NULL;\n\n\treturn mono_string_new (mono_domain_get (), machine_config);\n}\n\nstatic MonoString *\nves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)\n{\n\tMonoString *ipath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_path_get_dirname (mono_get_config_dir ());\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tipath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn ipath;\n}\n\nstatic gboolean\nves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, gint32 *size)\n{\n\tMonoPEResourceDataEntry *entry;\n\tMonoImage *image;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!assembly || !result || !size)\n\t\treturn FALSE;\n\n\t*result = NULL;\n\t*size = 0;\n\timage = assembly->assembly->image;\n\tentry = mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);\n\tif (!entry)\n\t\treturn FALSE;\n\n\t*result = mono_image_rva_map (image, entry->rde_data_offset);\n\tif (!(*result)) {\n\t\tg_free (entry);\n\t\treturn FALSE;\n\t}\n\t*size = entry->rde_size;\n\tg_free (entry);\n\treturn TRUE;\n}\n\nstatic MonoBoolean\nves_icall_System_Diagnostics_Debugger_IsAttached_internal (void)\n{\n\treturn mono_debug_using_mono_debugger () || mono_is_debugger_attached ();\n}\n\nstatic void\nves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)\n{\n#if defined (PLATFORM_WIN32)\n\tOutputDebugString (mono_string_chars (message));\n#else\n\tg_warning (\"WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\\n\");\n#endif\n}\n\n/* Only used for value types */\nstatic MonoObject *\nves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (mono_class_is_nullable (klass))\n\t\t/* No arguments -> null */\n\t\treturn NULL;\n\n\treturn mono_object_new (domain, klass);\n}\n\nstatic MonoReflectionMethod *\nves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)\n{\n\tMonoClass *klass, *parent;\n\tMonoMethod *method = m->method;\n\tMonoMethod *result = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->klass == NULL)\n\t\treturn m;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||\n\t MONO_CLASS_IS_INTERFACE (method->klass) ||\n\t method->flags & METHOD_ATTRIBUTE_NEW_SLOT)\n\t\treturn m;\n\n\tklass = method->klass;\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\t/* At the end of the loop, klass points to the eldest class that has this virtual function slot. */\n\tfor (parent = klass->parent; parent != NULL; parent = parent->parent) {\n\t\tmono_class_setup_vtable (parent);\n\t\tif (parent->vtable_size <= method->slot)\n\t\t\tbreak;\n\t\tklass = parent;\n\t}\t\t\n\n\tif (klass == method->klass)\n\t\treturn m;\n\n\tresult = klass->vtable [method->slot];\n\tif (result == NULL) {\n\t\t/* It is an abstract method */\n\t\tgpointer iter = NULL;\n\t\twhile ((result = mono_class_get_methods (klass, &iter)))\n\t\t\tif (result->slot == method->slot)\n\t\t\t\tbreak;\n\t}\n\n\tif (result == NULL)\n\t\treturn m;\n\n\treturn mono_method_get_object (mono_domain_get (), result, NULL);\n}\n\nstatic MonoString*\nves_icall_MonoMethod_get_name (MonoReflectionMethod *m)\n{\n\tMonoMethod *method = m->method;\n\n\tMONO_OBJECT_SETREF (m, name, mono_string_new (mono_object_domain (m), method->name));\n\treturn m->name;\n}\n\nstatic void\nmono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\titer->sig = *(MonoMethodSignature**)argsp;\n\t\n\tg_assert (iter->sig->sentinelpos <= iter->sig->param_count);\n\tg_assert (iter->sig->call_convention == MONO_CALL_VARARG);\n\n\titer->next_arg = 0;\n\t/* FIXME: it's not documented what start is exactly... */\n\tif (start) {\n\t\titer->args = start;\n\t} else {\n\t\titer->args = argsp + sizeof (gpointer);\n#ifndef MONO_ARCH_REGPARMS\n\t\t{\n\t\tguint32 i, arg_size;\n\t\tgint32 align;\n\t\tfor (i = 0; i < iter->sig->sentinelpos; ++i) {\n\t\t\targ_size = mono_type_stack_size (iter->sig->params [i], &align);\n\t\t\titer->args = (char*)iter->args + arg_size;\n\t\t}\n\t\t}\n#endif\n\t}\n\titer->num_args = iter->sig->param_count - iter->sig->sentinelpos;\n\n\t/* g_print (\"sig %p, param_count: %d, sent: %d\\n\", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */\n}\n\nstatic MonoTypedRef\nmono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\tres.type = iter->sig->params [i];\n\tres.klass = mono_class_from_mono_type (res.type);\n\tres.value = iter->args;\n\targ_size = mono_type_stack_size (res.type, &align);\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n\tif (arg_size <= sizeof (gpointer)) {\n\t\tint dummy;\n\t\tint padding = arg_size - mono_type_size (res.type, &dummy);\n\t\tres.value = (guint8*)res.value + padding;\n\t}\n#endif\n\titer->args = (char*)iter->args + arg_size;\n\titer->next_arg++;\n\n\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\n\treturn res;\n}\n\nstatic MonoTypedRef\nmono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\twhile (i < iter->sig->param_count) {\n\t\tif (!mono_metadata_type_equal (type, iter->sig->params [i]))\n\t\t\tcontinue;\n\t\tres.type = iter->sig->params [i];\n\t\tres.klass = mono_class_from_mono_type (res.type);\n\t\t/* FIXME: endianess issue... */\n\t\tres.value = iter->args;\n\t\targ_size = mono_type_stack_size (res.type, &align);\n\t\titer->args = (char*)iter->args + arg_size;\n\t\titer->next_arg++;\n\t\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\t\treturn res;\n\t}\n\t/* g_print (\"arg type 0x%02x not found\\n\", res.type->type); */\n\n\tres.type = NULL;\n\tres.value = NULL;\n\tres.klass = NULL;\n\treturn res;\n}\n\nstatic MonoType*\nmono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)\n{\n\tgint i;\n\tMONO_ARCH_SAVE_REGS;\n\t\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\treturn iter->sig->params [i];\n}\n\nstatic MonoObject*\nmono_TypedReference_ToObject (MonoTypedRef tref)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (tref.type)) {\n\t\tMonoObject** objp = tref.value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), tref.klass, tref.value);\n}\n\nstatic MonoObject*\nmono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (type)) {\n\t\tMonoObject** objp = value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), klass, value);\n}\n\nstatic void\nprelink_method (MonoMethod *method)\n{\n\tconst char *exc_class, *exc_arg;\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn;\n\tmono_lookup_pinvoke_call (method, &exc_class, &exc_arg);\n\tif (exc_class) {\n\t\tmono_raise_exception( \n\t\t\tmono_exception_from_name_msg (mono_defaults.corlib, \"System\", exc_class, exc_arg ) );\n\t}\n\t/* create the wrapper, too? */\n}\n\nstatic void\nves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\tprelink_method (method->method);\n}\n\nstatic void\nves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMonoMethod* m;\n\tgpointer iter = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile ((m = mono_class_get_methods (klass, &iter)))\n\t\tprelink_method (m);\n}\n\n/* These parameters are \"readonly\" in corlib/System/NumberFormatter.cs */\nstatic void\nves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas,\n\t\t\t\t\t gint32 const **exponents,\n\t\t\t\t\t gunichar2 const **digitLowerTable,\n\t\t\t\t\t gunichar2 const **digitUpperTable,\n\t\t\t\t\t gint64 const **tenPowersList,\n\t\t\t\t\t gint32 const **decHexDigits)\n{\n\t*mantissas = Formatter_MantissaBitsTable;\n\t*exponents = Formatter_TensExponentTable;\n\t*digitLowerTable = Formatter_DigitLowerTable;\n\t*digitUpperTable = Formatter_DigitUpperTable;\n\t*tenPowersList = Formatter_TenPowersList;\n\t*decHexDigits = Formatter_DecHexDigits;\n}\n\n/* These parameters are \"readonly\" in corlib/System/Char.cs */\nstatic void\nves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,\n\t\t\t\t\t guint8 const **numeric_data,\n\t\t\t\t\t gdouble const **numeric_data_values,\n\t\t\t\t\t guint16 const **to_lower_data_low,\n\t\t\t\t\t guint16 const **to_lower_data_high,\n\t\t\t\t\t guint16 const **to_upper_data_low,\n\t\t\t\t\t guint16 const **to_upper_data_high)\n{\n\t*category_data = CategoryData;\n\t*numeric_data = NumericData;\n\t*numeric_data_values = NumericDataValues;\n\t*to_lower_data_low = ToLowerDataLow;\n\t*to_lower_data_high = ToLowerDataHigh;\n\t*to_upper_data_low = ToUpperDataLow;\n\t*to_upper_data_high = ToUpperDataHigh;\n}\n\nstatic gint32\nves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method)\n{\n\treturn method->method->token;\n}\n\n/*\n * We return NULL for no modifiers so the corlib code can return Type.EmptyTypes\n * and avoid useless allocations.\n */\nstatic MonoArray*\ntype_array_from_modifiers (MonoImage *image, MonoType *type, int optional)\n{\n\tMonoArray *res;\n\tint i, count = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required))\n\t\t\tcount++;\n\t}\n\tif (!count)\n\t\treturn NULL;\n\tres = mono_array_new (mono_domain_get (), mono_defaults.systemtype_class, count);\n\tcount = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {\n\t\t\tMonoClass *klass = mono_class_get (image, type->modifiers [i].token);\n\t\t\tmono_array_setref (res, count, mono_type_get_object (mono_domain_get (), &klass->byval_arg));\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn res;\n}\n\nstatic MonoArray*\nparam_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optional)\n{\n\tMonoType *type = param->ClassImpl->type;\n\tMonoClass *member_class = mono_object_class (param->MemberImpl);\n\tMonoMethod *method = NULL;\n\tMonoImage *image;\n\tint pos;\n\tMonoMethodSignature *sig;\n\n\tif (mono_class_is_reflection_method_or_constructor (member_class)) {\n\t\tMonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;\n\t\tmethod = rmethod->method;\n\t} else if (member_class->image == mono_defaults.corlib && !strcmp (\"MonoProperty\", member_class->name)) {\n\t\tMonoReflectionProperty *prop = (MonoReflectionProperty *)param->MemberImpl;\n\t\tif (!(method = prop->property->get))\n\t\t\tmethod = prop->property->set;\n\t\tg_assert (method);\t\n\t} else {\n\t\tchar *type_name = mono_type_get_full_name (member_class);\n\t\tchar *msg = g_strdup_printf (\"Custom modifiers on a ParamInfo with member %s are not supported\", type_name);\n\t\tMonoException *ex = mono_get_exception_not_supported (msg);\n\t\tg_free (type_name);\n\t\tg_free (msg);\n\t\tmono_raise_exception (ex);\n\t}\n\n\timage = method->klass->image;\n\tpos = param->PositionImpl;\n\tsig = mono_method_signature (method);\n\tif (pos == -1)\n\t\ttype = sig->ret;\n\telse\n\t\ttype = sig->params [pos];\n\n\treturn type_array_from_modifiers (image, type, optional);\n}\n\nstatic MonoType*\nget_property_type (MonoProperty *prop)\n{\n\tMonoMethodSignature *sig;\n\tif (prop->get) {\n\t\tsig = mono_method_signature (prop->get);\n\t\treturn sig->ret;\n\t} else if (prop->set) {\n\t\tsig = mono_method_signature (prop->set);\n\t\treturn sig->params [sig->param_count - 1];\n\t}\n\treturn NULL;\n}\n\nstatic MonoArray*\nproperty_info_get_type_modifiers (MonoReflectionProperty *property, MonoBoolean optional)\n{\n\tMonoType *type = get_property_type (property->property);\n\tMonoImage *image = property->klass->image;\n\n\tif (!type)\n\t\treturn NULL;\n\treturn type_array_from_modifiers (image, type, optional);\n}\n\nstatic MonoBoolean\ncustom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoCustomAttrInfo *cinfo;\n\tgboolean found;\n\n\tcinfo = mono_reflection_get_custom_attrs_info (obj);\n\tif (!cinfo)\n\t\treturn FALSE;\n\tfound = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));\n\tif (!cinfo->cached)\n\t\tmono_custom_attrs_free (cinfo);\n\treturn found;\n}\n\nstatic MonoArray*\ncustom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoArray *res = mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL);\n\n\tif (mono_loader_get_last_error ()) {\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\tg_assert_not_reached ();\n\t\t/* Not reached */\n\t\treturn NULL;\n\t} else {\n\t\treturn res;\n\t}\n}\n\nstatic MonoString*\nves_icall_Mono_Runtime_GetDisplayName (void)\n{\n\tchar *info;\n\tMonoString *display_name;\n\n\tinfo = mono_get_runtime_callbacks ()->get_runtime_build_info ();\n\tdisplay_name = mono_string_new (mono_domain_get (), info);\n\tg_free (info);\n\treturn display_name;\n}\n\nstatic MonoString*\nves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)\n{\n\tMonoString *message;\n\tguint32 ret;\n\tgunichar2 buf[256];\n\t\n\tret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |\n\t\t\t FORMAT_MESSAGE_IGNORE_INSERTS, NULL, code, 0,\n\t\t\t buf, 255, NULL);\n\tif (ret == 0) {\n\t\tmessage = mono_string_new (mono_domain_get (), \"Error looking up error string\");\n\t} else {\n\t\tmessage = mono_string_new_utf16 (mono_domain_get (), buf, ret);\n\t}\n\t\n\treturn message;\n}\n\nconst static guchar\ndbase64 [] = {\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,\n\t52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,\n\t128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n\t15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,\n\t128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n\t41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n};\n\nstatic MonoArray *\nbase64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)\n{\n\tgint ignored;\n\tgint i;\n\tgunichar2 c;\n\tgunichar2 last, prev_last, prev2_last;\n\tgint olength;\n\tMonoArray *result;\n\tguchar *res_ptr;\n\tgint a [4], b [4];\n\tMonoException *exc;\n\n\tignored = 0;\n\tlast = prev_last = 0, prev2_last = 0;\n\tfor (i = 0; i < ilength; i++) {\n\t\tc = start [i];\n\t\tif (c >= sizeof (dbase64)) {\n\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\"Invalid character found.\");\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (isspace (c)) {\n\t\t\tignored++;\n\t\t} else {\n\t\t\tprev2_last = prev_last;\n\t\t\tprev_last = last;\n\t\t\tlast = c;\n\t\t}\n\t}\n\n\tolength = ilength - ignored;\n\n\tif (allowWhitespaceOnly && olength == 0) {\n\t\treturn mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0);\n\t}\n\n\tif ((olength & 3) != 0 || olength <= 0) {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\",\n\t\t\t\t\t\"FormatException\", \"Invalid length.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (prev2_last == '=') {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\", \"FormatException\", \"Invalid format.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tolength = (olength * 3) / 4;\n\tif (last == '=')\n\t\tolength--;\n\n\tif (prev_last == '=')\n\t\tolength--;\n\n\tresult = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);\n\tres_ptr = mono_array_addr (result, guchar, 0);\n\tfor (i = 0; i < ilength; ) {\n\t\tint k;\n\n\t\tfor (k = 0; k < 4 && i < ilength;) {\n\t\t\tc = start [i++];\n\t\t\tif (isspace (c))\n\t\t\t\tcontinue;\n\n\t\t\ta [k] = (guchar) c;\n\t\t\tif (((b [k] = dbase64 [c]) & 0x80) != 0) {\n\t\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\t\"Invalid character found.\");\n\t\t\t\tmono_raise_exception (exc);\n\t\t\t}\n\t\t\tk++;\n\t\t}\n\n\t\t*res_ptr++ = (b [0] << 2) | (b [1] >> 4);\n\t\tif (a [2] != '=')\n\t\t\t*res_ptr++ = (b [1] << 4) | (b [2] >> 2);\n\t\tif (a [3] != '=')\n\t\t\t*res_ptr++ = (b [2] << 6) | b [3];\n\n\t\twhile (i < ilength && isspace (start [i]))\n\t\t\ti++;\n\t}\n\n\treturn result;\n}\n\nstatic MonoArray *\nInternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_string_chars (str), \n\t\tmono_string_length (str), allowWhitespaceOnly);\n}\n\nstatic MonoArray *\nInternalFromBase64CharArray (MonoArray *input, gint offset, gint length)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_array_addr (input, gunichar2, offset),\n\t\tlength, FALSE);\n}\n\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) Icall_ ## id,\n\nenum {\n#include \"metadata/icall-def.h\"\n\tIcall_last\n};\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first) Icall_type_ ## id,\n#define ICALL(id,name,func)\nenum {\n#include \"metadata/icall-def.h\"\n\tIcall_type_num\n};\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,firstic) {(Icall_ ## firstic)},\n#define ICALL(id,name,func)\ntypedef struct {\n\tguint16 first_icall;\n} IcallTypeDesc;\n\nstatic const IcallTypeDesc\nicall_type_descs [] = {\n#include \"metadata/icall-def.h\"\n\t{Icall_last}\n};\n\n#define icall_desc_num_icalls(desc) ((desc) [1].first_icall - (desc) [0].first_icall)\n\n#undef ICALL_TYPE\n#define ICALL_TYPE(id,name,first)\n#undef ICALL\n\n#ifdef HAVE_ARRAY_ELEM_INIT\n#define MSGSTRFIELD(line) MSGSTRFIELD1(line)\n#define MSGSTRFIELD1(line) str##line\n\nstatic const struct msgstrtn_t {\n#define ICALL(id,name,func)\n#undef ICALL_TYPE\n#define ICALL_TYPE(id,name,first) char MSGSTRFIELD(__LINE__) [sizeof (name)];\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n} icall_type_names_str = {\n#define ICALL_TYPE(id,name,first) (name),\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n};\nstatic const guint16 icall_type_names_idx [] = {\n#define ICALL_TYPE(id,name,first) [Icall_type_ ## id] = offsetof (struct msgstrtn_t, MSGSTRFIELD(__LINE__)),\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n};\n#define icall_type_name_get(id) ((const char*)&icall_type_names_str + icall_type_names_idx [(id)])\n\nstatic const struct msgstr_t {\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) char MSGSTRFIELD(__LINE__) [sizeof (name)];\n#include \"metadata/icall-def.h\"\n#undef ICALL\n} icall_names_str = {\n#define ICALL(id,name,func) (name),\n#include \"metadata/icall-def.h\"\n#undef ICALL\n};\nstatic const guint16 icall_names_idx [] = {\n#define ICALL(id,name,func) [Icall_ ## id] = offsetof (struct msgstr_t, MSGSTRFIELD(__LINE__)),\n#include \"metadata/icall-def.h\"\n#undef ICALL\n};\n#define icall_name_get(id) ((const char*)&icall_names_str + icall_names_idx [(id)])\n\n#else\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first) name,\n#define ICALL(id,name,func)\nstatic const char* const\nicall_type_names [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n\n#define icall_type_name_get(id) (icall_type_names [(id)])\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) name,\nstatic const char* const\nicall_names [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n#define icall_name_get(id) icall_names [(id)]\n\n#endif /* !HAVE_ARRAY_ELEM_INIT */\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) func,\nstatic const gconstpointer\nicall_functions [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n\nstatic GHashTable *icall_hash = NULL;\nstatic GHashTable *jit_icall_hash_name = NULL;\nstatic GHashTable *jit_icall_hash_addr = NULL;\n\nvoid\nmono_icall_init (void)\n{\n\tint i = 0;\n\n\t/* check that tables are sorted: disable in release */\n\tif (TRUE) {\n\t\tint j;\n\t\tconst char *prev_class = NULL;\n\t\tconst char *prev_method;\n\t\t\n\t\tfor (i = 0; i < Icall_type_num; ++i) {\n\t\t\tconst IcallTypeDesc *desc;\n\t\t\tint num_icalls;\n\t\t\tprev_method = NULL;\n\t\t\tif (prev_class && strcmp (prev_class, icall_type_name_get (i)) >= 0)\n\t\t\t\tg_print (\"class %s should come before class %s\\n\", icall_type_name_get (i), prev_class);\n\t\t\tprev_class = icall_type_name_get (i);\n\t\t\tdesc = &icall_type_descs [i];\n\t\t\tnum_icalls = icall_desc_num_icalls (desc);\n\t\t\t/*g_print (\"class %s has %d icalls starting at %d\\n\", prev_class, num_icalls, desc->first_icall);*/\n\t\t\tfor (j = 0; j < num_icalls; ++j) {\n\t\t\t\tconst char *methodn = icall_name_get (desc->first_icall + j);\n\t\t\t\tif (prev_method && strcmp (prev_method, methodn) >= 0)\n\t\t\t\t\tg_print (\"method %s should come before method %s\\n\", methodn, prev_method);\n\t\t\t\tprev_method = methodn;\n\t\t\t}\n\t\t}\n\t}\n\n\ticall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);\n}\n\nvoid\nmono_icall_cleanup (void)\n{\n\tg_hash_table_destroy (icall_hash);\n\tg_hash_table_destroy (jit_icall_hash_name);\n\tg_hash_table_destroy (jit_icall_hash_addr);\n}\n\nvoid\nmono_add_internal_call (const char *name, gconstpointer method)\n{\n\tmono_loader_lock ();\n\n\tg_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);\n\n\tmono_loader_unlock ();\n}\n\n#ifdef HAVE_ARRAY_ELEM_INIT\nstatic int\ncompare_method_imap (const void *key, const void *elem)\n{\n\tconst char* method_name = (const char*)&icall_names_str + (*(guint16*)elem);\n\treturn strcmp (key, method_name);\n}\n\nstatic gpointer\nfind_method_icall (const IcallTypeDesc *imap, const char *name)\n{\n\tconst guint16 *nameslot = bsearch (name, icall_names_idx + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names_idx [0]), compare_method_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn (gpointer)icall_functions [(nameslot - &icall_names_idx [0])];\n}\n\nstatic int\ncompare_class_imap (const void *key, const void *elem)\n{\n\tconst char* class_name = (const char*)&icall_type_names_str + (*(guint16*)elem);\n\treturn strcmp (key, class_name);\n}\n\nstatic const IcallTypeDesc*\nfind_class_icalls (const char *name)\n{\n\tconst guint16 *nameslot = bsearch (name, icall_type_names_idx, Icall_type_num, sizeof (icall_type_names_idx [0]), compare_class_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn &icall_type_descs [nameslot - &icall_type_names_idx [0]];\n}\n\n#else\nstatic int\ncompare_method_imap (const void *key, const void *elem)\n{\n\tconst char** method_name = (const char**)elem;\n\treturn strcmp (key, *method_name);\n}\n\nstatic gpointer\nfind_method_icall (const IcallTypeDesc *imap, const char *name)\n{\n\tconst char **nameslot = bsearch (name, icall_names + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names [0]), compare_method_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn (gpointer)icall_functions [(nameslot - icall_names)];\n}\n\nstatic int\ncompare_class_imap (const void *key, const void *elem)\n{\n\tconst char** class_name = (const char**)elem;\n\treturn strcmp (key, *class_name);\n}\n\nstatic const IcallTypeDesc*\nfind_class_icalls (const char *name)\n{\n\tconst char **nameslot = bsearch (name, icall_type_names, Icall_type_num, sizeof (icall_type_names [0]), compare_class_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn &icall_type_descs [nameslot - icall_type_names];\n}\n\n#endif\n\n/* \n * we should probably export this as an helper (handle nested types).\n * Returns the number of chars written in buf.\n */\nstatic int\nconcat_class_name (char *buf, int bufsize, MonoClass *klass)\n{\n\tint nspacelen, cnamelen;\n\tnspacelen = strlen (klass->name_space);\n\tcnamelen = strlen (klass->name);\n\tif (nspacelen + cnamelen + 2 > bufsize)\n\t\treturn 0;\n\tif (nspacelen) {\n\t\tmemcpy (buf, klass->name_space, nspacelen);\n\t\tbuf [nspacelen ++] = '.';\n\t}\n\tmemcpy (buf + nspacelen, klass->name, cnamelen);\n\tbuf [nspacelen + cnamelen] = 0;\n\treturn nspacelen + cnamelen;\n}\n\ngpointer\nmono_lookup_internal_call (MonoMethod *method)\n{\n\tchar *sigstart;\n\tchar *tmpsig;\n\tchar mname [2048];\n\tint typelen = 0, mlen, siglen;\n\tgpointer res;\n\tconst IcallTypeDesc *imap;\n\n\tg_assert (method != NULL);\n\n\tif (method->is_inflated)\n\t\tmethod = ((MonoMethodInflated *) method)->declaring;\n\n\tif (method->klass->nested_in) {\n\t\tint pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);\n\t\tif (!pos)\n\t\t\treturn NULL;\n\n\t\tmname [pos++] = '/';\n\t\tmname [pos] = 0;\n\n\t\ttypelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\n\t\ttypelen += pos;\n\t} else {\n\t\ttypelen = concat_class_name (mname, sizeof (mname), method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\t}\n\n\timap = find_class_icalls (mname);\n\n\tmname [typelen] = ':';\n\tmname [typelen + 1] = ':';\n\n\tmlen = strlen (method->name);\n\tmemcpy (mname + typelen + 2, method->name, mlen);\n\tsigstart = mname + typelen + 2 + mlen;\n\t*sigstart = 0;\n\n\ttmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);\n\tsiglen = strlen (tmpsig);\n\tif (typelen + mlen + siglen + 6 > sizeof (mname))\n\t\treturn NULL;\n\tsigstart [0] = '(';\n\tmemcpy (sigstart + 1, tmpsig, siglen);\n\tsigstart [siglen + 1] = ')';\n\tsigstart [siglen + 2] = 0;\n\tg_free (tmpsig);\n\t\n\tmono_loader_lock ();\n\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try without signature */\n\t*sigstart = 0;\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\t/* it wasn't found in the static call tables */\n\tif (!imap) {\n\t\tmono_loader_unlock ();\n\t\treturn NULL;\n\t}\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try _with_ signature */\n\t*sigstart = '(';\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tg_warning (\"cant resolve internal call to \\\"%s\\\" (tested without signature also)\", mname);\n\tg_print (\"\\nYour mono runtime and class libraries are out of sync.\\n\");\n\tg_print (\"The out of sync library is: %s\\n\", method->klass->image->name);\n\tg_print (\"\\nWhen you update one from svn you need to update, compile and install\\nthe other too.\\n\");\n\tg_print (\"Do not report this as a bug unless you're sure you have updated correctly:\\nyou probably have a broken mono install.\\n\");\n\tg_print (\"If you see other errors or faults after this message they are probably related\\n\");\n\tg_print (\"and you need to fix your mono install first.\\n\");\n\n\tmono_loader_unlock ();\n\n\treturn NULL;\n}\n\nstatic MonoType*\ntype_from_typename (char *typename)\n{\n\tMonoClass *klass = NULL;\t/* assignment to shut GCC warning up */\n\n\tif (!strcmp (typename, \"int\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"ptr\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"void\"))\n\t\tklass = mono_defaults.void_class;\n\telse if (!strcmp (typename, \"int32\"))\n\t\tklass = mono_defaults.int32_class;\n\telse if (!strcmp (typename, \"uint32\"))\n\t\tklass = mono_defaults.uint32_class;\n\telse if (!strcmp (typename, \"int8\"))\n\t\tklass = mono_defaults.sbyte_class;\n\telse if (!strcmp (typename, \"uint8\"))\n\t\tklass = mono_defaults.byte_class;\n\telse if (!strcmp (typename, \"int16\"))\n\t\tklass = mono_defaults.int16_class;\n\telse if (!strcmp (typename, \"uint16\"))\n\t\tklass = mono_defaults.uint16_class;\n\telse if (!strcmp (typename, \"long\"))\n\t\tklass = mono_defaults.int64_class;\n\telse if (!strcmp (typename, \"ulong\"))\n\t\tklass = mono_defaults.uint64_class;\n\telse if (!strcmp (typename, \"float\"))\n\t\tklass = mono_defaults.single_class;\n\telse if (!strcmp (typename, \"double\"))\n\t\tklass = mono_defaults.double_class;\n\telse if (!strcmp (typename, \"object\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"obj\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"string\"))\n\t\tklass = mono_defaults.string_class;\n\telse if (!strcmp (typename, \"bool\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse if (!strcmp (typename, \"boolean\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse {\n\t\tg_error (\"%s\", typename);\n\t\tg_assert_not_reached ();\n\t}\n\treturn &klass->byval_arg;\n}\n\nMonoMethodSignature*\nmono_create_icall_signature (const char *sigstr)\n{\n\tgchar **parts;\n\tint i, len;\n\tgchar **tmp;\n\tMonoMethodSignature *res;\n\n\tmono_loader_lock ();\n\tres = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tparts = g_strsplit (sigstr, \" \", 256);\n\n\ttmp = parts;\n\tlen = 0;\n\twhile (*tmp) {\n\t\tlen ++;\n\t\ttmp ++;\n\t}\n\n\tres = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);\n\tres->pinvoke = 1;\n\n#ifdef PLATFORM_WIN32\n\t/* \n\t * Under windows, the default pinvoke calling convention is STDCALL but\n\t * we need CDECL.\n\t */\n\tres->call_convention = MONO_CALL_C;\n#endif\n\n\tres->ret = type_from_typename (parts [0]);\n\tfor (i = 1; i < len; ++i) {\n\t\tres->params [i - 1] = type_from_typename (parts [i]);\n\t}\n\n\tg_strfreev (parts);\n\n\tg_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);\n\n\tmono_loader_unlock ();\n\n\treturn res;\n}\n\nMonoJitICallInfo *\nmono_find_jit_icall_by_name (const char *name)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_name);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_name, name);\n\tmono_loader_unlock ();\n\treturn info;\n}\n\nMonoJitICallInfo *\nmono_find_jit_icall_by_addr (gconstpointer addr)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_addr);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);\n\tmono_loader_unlock ();\n\n\treturn info;\n}\n\n/*\n * mono_get_jit_icall_info:\n *\n * Return the hashtable mapping JIT icall names to MonoJitICallInfo structures. The\n * caller should access it while holding the loader lock.\n */\nGHashTable*\nmono_get_jit_icall_info (void)\n{\n\treturn jit_icall_hash_name;\n}\n\nvoid\nmono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)\n{\n\tmono_loader_lock ();\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)wrapper, info);\n\tmono_loader_unlock ();\n}\n\nMonoJitICallInfo *\nmono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)\n{\n\tMonoJitICallInfo *info;\n\t\n\tg_assert (func);\n\tg_assert (name);\n\n\tmono_loader_lock ();\n\n\tif (!jit_icall_hash_name) {\n\t\tjit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);\n\t\tjit_icall_hash_addr = g_hash_table_new (NULL, NULL);\n\t}\n\n\tif (g_hash_table_lookup (jit_icall_hash_name, name)) {\n\t\tg_warning (\"jit icall already defined \\\"%s\\\"\\n\", name);\n\t\tg_assert_not_reached ();\n\t}\n\n\tinfo = g_new0 (MonoJitICallInfo, 1);\n\t\n\tinfo->name = name;\n\tinfo->func = func;\n\tinfo->sig = sig;\n\n\tif (is_save) {\n\t\tinfo->wrapper = func;\n\t} else {\n\t\tinfo->wrapper = NULL;\n\t}\n\n\tg_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);\n\n\tmono_loader_unlock ();\n\treturn info;\n}\n",
"code_before": "/*\n * icall.c:\n *\n * Authors:\n * Dietmar Maurer ([email protected])\n * Paolo Molaro ([email protected])\n *\t Patrik Torstensson ([email protected])\n *\n * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)\n * Copyright 2004-2009 Novell, Inc (http://www.novell.com)\n */\n\n#include <config.h>\n#include <glib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <ctype.h>\n#ifdef HAVE_ALLOCA_H\n#include <alloca.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#if defined (PLATFORM_WIN32)\n#include <stdlib.h>\n#endif\n\n#include \"mono/utils/mono-membar.h\"\n#include <mono/metadata/object.h>\n#include <mono/metadata/threads.h>\n#include <mono/metadata/threads-types.h>\n#include <mono/metadata/threadpool.h>\n#include <mono/metadata/monitor.h>\n#include <mono/metadata/reflection.h>\n#include <mono/metadata/assembly.h>\n#include <mono/metadata/tabledefs.h>\n#include <mono/metadata/exception.h>\n#include <mono/metadata/file-io.h>\n#include <mono/metadata/console-io.h>\n#include <mono/metadata/socket-io.h>\n#include <mono/metadata/mono-endian.h>\n#include <mono/metadata/tokentype.h>\n#include <mono/metadata/domain-internals.h>\n#include <mono/metadata/metadata-internals.h>\n#include <mono/metadata/class-internals.h>\n#include <mono/metadata/marshal.h>\n#include <mono/metadata/gc-internal.h>\n#include <mono/metadata/mono-gc.h>\n#include <mono/metadata/rand.h>\n#include <mono/metadata/sysmath.h>\n#include <mono/metadata/string-icalls.h>\n#include <mono/metadata/debug-helpers.h>\n#include <mono/metadata/process.h>\n#include <mono/metadata/environment.h>\n#include <mono/metadata/profiler-private.h>\n#include <mono/metadata/locales.h>\n#include <mono/metadata/filewatcher.h>\n#include <mono/metadata/char-conversions.h>\n#include <mono/metadata/security.h>\n#include <mono/metadata/mono-config.h>\n#include <mono/metadata/cil-coff.h>\n#include <mono/metadata/number-formatter.h>\n#include <mono/metadata/security-manager.h>\n#include <mono/metadata/security-core-clr.h>\n#include <mono/metadata/mono-perfcounters.h>\n#include <mono/metadata/mono-debug.h>\n#include <mono/metadata/verify-internals.h>\n#include <mono/io-layer/io-layer.h>\n#include <mono/utils/strtod.h>\n#include <mono/utils/monobitset.h>\n#include <mono/utils/mono-time.h>\n#include <mono/utils/mono-proclib.h>\n#include <mono/utils/mono-string.h>\n#include <mono/utils/mono-error-internals.h>\n\n\n#if defined (PLATFORM_WIN32)\n#include <windows.h>\n#include <shlobj.h>\n#endif\n#include \"decimal.h\"\n\nstatic MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void);\n\nstatic MonoArray*\ntype_array_from_modifiers (MonoImage *image, MonoType *type, int optional);\n\n/* This is an implementation of a growable pointer array that avoids doing memory allocations for small sizes.\n * It works by allocating an initial small array on stack and only going to malloc'd memory if needed. \n */\ntypedef struct {\n\tvoid **data;\n\tint size;\n\tint capacity;\n} MonoPtrArray;\n\n#define MONO_PTR_ARRAY_MAX_ON_STACK (16)\n\n#define mono_ptr_array_init(ARRAY, INITIAL_SIZE) do {\\\n\t(ARRAY).size = 0; \\\n\t(ARRAY).capacity = MAX (INITIAL_SIZE, MONO_PTR_ARRAY_MAX_ON_STACK); \\\n\t(ARRAY).data = INITIAL_SIZE > MONO_PTR_ARRAY_MAX_ON_STACK ? mono_gc_alloc_fixed (sizeof (void*) * INITIAL_SIZE, NULL) : g_newa (void*, MONO_PTR_ARRAY_MAX_ON_STACK); \\\n} while (0)\n\n#define mono_ptr_array_destroy(ARRAY) do {\\\n\tif ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \\\n\t\tmono_gc_free_fixed ((ARRAY).data); \\\n} while (0)\n\n#define mono_ptr_array_append(ARRAY, VALUE) do { \\\n\tif ((ARRAY).size >= (ARRAY).capacity) {\\\n\t\tvoid *__tmp = mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, NULL); \\\n\t\tmemcpy (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \\\n\t\tif ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK)\t\\\n\t\t\tmono_gc_free_fixed ((ARRAY).data);\t\\\n\t\t(ARRAY).data = __tmp;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t(ARRAY).capacity *= 2;\\\n\t}\\\n\t((ARRAY).data [(ARRAY).size++] = VALUE); \\\n} while (0)\n\n#define mono_ptr_array_set(ARRAY, IDX, VALUE) do { \\\n\t((ARRAY).data [(IDX)] = VALUE); \\\n} while (0)\n\t\n#define mono_ptr_array_get(ARRAY, IDX) ((ARRAY).data [(IDX)])\n\n#define mono_ptr_array_size(ARRAY) ((ARRAY).size)\n\n\nstatic inline MonoBoolean\nis_generic_parameter (MonoType *type)\n{\n\treturn !type->byref && (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR);\n}\n\n/*\n * We expect a pointer to a char, not a string\n */\nstatic gboolean\nmono_double_ParseImpl (char *ptr, double *result)\n{\n\tgchar *endptr = NULL;\n\t*result = 0.0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n#ifdef __arm__\n\tif (*ptr)\n\t\t*result = strtod (ptr, &endptr);\n#else\n\tif (*ptr){\n#ifdef _EGLIB_MAJOR\n\t\t/* Need to lock here because EGLIB (#464316) has locking defined as no-ops, and that breaks mono_strtod */\n\t\tEnterCriticalSection (&mono_strtod_mutex);\n\t\t*result = mono_strtod (ptr, &endptr);\n\t\tLeaveCriticalSection (&mono_strtod_mutex);\n#else\n\t\t*result = mono_strtod (ptr, &endptr);\n#endif\n\t}\n#endif\n\n\tif (!*ptr || (endptr && *endptr))\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\nstatic MonoObject *\nves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (ac->element_class->valuetype)\n\t\treturn mono_value_box (this->vtable->domain, ac->element_class, ea);\n\telse\n\t\treturn *ea;\n}\n\nstatic MonoObject *\nves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)\n{\n\tMonoClass *ac, *ic;\n\tMonoArray *ao, *io;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tio = (MonoArray *)idxs;\n\tic = (MonoClass *)io->obj.vtable->klass;\n\t\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (io->bounds != NULL || io->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)io->vector;\n\n\tif (ao->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= ao->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\treturn ves_icall_System_Array_GetValueImpl (this, *ind);\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < ao->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - ao->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos*ao->bounds [i].length + ind [i] - \n\t\t\tao->bounds [i].lower_bound;\n\n\treturn ves_icall_System_Array_GetValueImpl (this, pos);\n}\n\nstatic void\nves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)\n{\n\tMonoClass *ac, *vc, *ec;\n\tgint32 esize, vsize;\n\tgpointer *ea, *va;\n\tint et, vt;\n\n\tguint64 u64 = 0;\n\tgint64 i64 = 0;\n\tgdouble r64 = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (value)\n\t\tvc = value->vtable->klass;\n\telse\n\t\tvc = NULL;\n\n\tac = this->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)this->vector + (pos * esize));\n\tva = (gpointer*)((char*)value + sizeof (MonoObject));\n\n\tif (mono_class_is_nullable (ec)) {\n\t\tmono_nullable_init ((guint8*)ea, value, ec);\n\t\treturn;\n\t}\n\n\tif (!value) {\n\t\tmemset (ea, 0, esize);\n\t\treturn;\n\t}\n\n#define NO_WIDENING_CONVERSION G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\\\n\tif (esize < vsize + (extra)) \\\n\t\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define INVALID_CAST G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_invalid_cast ()); \\\n}G_STMT_END\n\n\t/* Check element (destination) type. */\n\tswitch (ec->byval_arg.type) {\n\tcase MONO_TYPE_STRING:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_STRING:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (!ec->valuetype) {\n\t\tif (!mono_object_isinst (value, ec))\n\t\t\tINVALID_CAST;\n\t\tmono_gc_wbarrier_set_arrayref (this, ea, (MonoObject*)value);\n\t\treturn;\n\t}\n\n\tif (mono_object_isinst (value, ec)) {\n\t\tif (ec->has_references)\n\t\t\tmono_value_copy (ea, (char*)value + sizeof (MonoObject), ec);\n\t\telse\n\t\t\tmemcpy (ea, (char *)value + sizeof (MonoObject), esize);\n\t\treturn;\n\t}\n\n\tif (!vc->valuetype)\n\t\tINVALID_CAST;\n\n\tvsize = mono_class_instance_size (vc) - sizeof (MonoObject);\n\n\tet = ec->byval_arg.type;\n\tif (et == MONO_TYPE_VALUETYPE && ec->byval_arg.data.klass->enumtype)\n\t\tet = mono_class_enum_basetype (ec->byval_arg.data.klass)->type;\n\n\tvt = vc->byval_arg.type;\n\tif (vt == MONO_TYPE_VALUETYPE && vc->byval_arg.data.klass->enumtype)\n\t\tvt = mono_class_enum_basetype (vc->byval_arg.data.klass)->type;\n\n#define ASSIGN_UNSIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a signed value to an unsigned array. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t} \\\n}G_STMT_END\n\n#define ASSIGN_SIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) i64; \\\n\t\treturn; \\\n\t/* You can assign an unsigned value to a signed array if the array's */ \\\n\t/* element size is larger than the value size. */ \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(1); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t} \\\n}G_STMT_END\n\n#define ASSIGN_REAL(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) r64; \\\n\t\treturn; \\\n\t/* All integer values fit into a floating point array, so we don't */ \\\n\t/* need to CHECK_WIDENING_CONVERSION here. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t\t*(etype *) ea = (etype) i64; \\\n\t\treturn; \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t} \\\n}G_STMT_END\n\n\tswitch (vt) {\n\tcase MONO_TYPE_U1:\n\t\tu64 = *(guint8 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U2:\n\t\tu64 = *(guint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U4:\n\t\tu64 = *(guint32 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_U8:\n\t\tu64 = *(guint64 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I1:\n\t\ti64 = *(gint8 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I2:\n\t\ti64 = *(gint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\t\ti64 = *(gint32 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\t\ti64 = *(gint64 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_R4:\n\t\tr64 = *(gfloat *) va;\n\t\tbreak;\n\tcase MONO_TYPE_R8:\n\t\tr64 = *(gdouble *) va;\n\t\tbreak;\n\tcase MONO_TYPE_CHAR:\n\t\tu64 = *(guint16 *) va;\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\t/* Boolean is only compatible with itself. */\n\t\tswitch (et) {\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\t/* If we can't do a direct copy, let's try a widening conversion. */\n\tswitch (et) {\n\tcase MONO_TYPE_CHAR:\n\t\tASSIGN_UNSIGNED (guint16);\n\tcase MONO_TYPE_U1:\n\t\tASSIGN_UNSIGNED (guint8);\n\tcase MONO_TYPE_U2:\n\t\tASSIGN_UNSIGNED (guint16);\n\tcase MONO_TYPE_U4:\n\t\tASSIGN_UNSIGNED (guint32);\n\tcase MONO_TYPE_U8:\n\t\tASSIGN_UNSIGNED (guint64);\n\tcase MONO_TYPE_I1:\n\t\tASSIGN_SIGNED (gint8);\n\tcase MONO_TYPE_I2:\n\t\tASSIGN_SIGNED (gint16);\n\tcase MONO_TYPE_I4:\n\t\tASSIGN_SIGNED (gint32);\n\tcase MONO_TYPE_I8:\n\t\tASSIGN_SIGNED (gint64);\n\tcase MONO_TYPE_R4:\n\t\tASSIGN_REAL (gfloat);\n\tcase MONO_TYPE_R8:\n\t\tASSIGN_REAL (gdouble);\n\t}\n\n\tINVALID_CAST;\n\t/* Not reached, INVALID_CAST does not return. Just to avoid a compiler warning ... */\n\treturn;\n\n#undef INVALID_CAST\n#undef NO_WIDENING_CONVERSION\n#undef CHECK_WIDENING_CONVERSION\n#undef ASSIGN_UNSIGNED\n#undef ASSIGN_SIGNED\n#undef ASSIGN_REAL\n}\n\nstatic void \nves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,\n\t\t\t\t MonoArray *idxs)\n{\n\tMonoClass *ac, *ic;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tic = idxs->obj.vtable->klass;\n\tac = this->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (idxs->bounds != NULL || idxs->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)idxs->vector;\n\n\tif (this->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= this->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\tves_icall_System_Array_SetValueImpl (this, value, *ind);\n\t\treturn;\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < this->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - this->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos * this->bounds [i].length + ind [i] - \n\t\t\tthis->bounds [i].lower_bound;\n\n\tves_icall_System_Array_SetValueImpl (this, value, pos);\n}\n\nstatic MonoArray *\nves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++)\n\t\tif (mono_array_get (lengths, gint32, i) < 0)\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint32, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}\n\nstatic MonoArray *\nves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++) \n\t\tif ((mono_array_get (lengths, gint64, i) < 0) ||\n\t\t (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX))\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint64, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = (mono_array_size_t) mono_array_get (bounds, guint64, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}\n\nstatic gint32 \nves_icall_System_Array_GetRank (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this->vtable->klass->rank;\n}\n\nstatic gint32\nves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\tmono_array_size_t length;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\tlength = this->max_length;\n\telse\n\t\tlength = this->bounds [dimension].length;\n\n#ifdef MONO_BIG_ARRAYS\n\tif (length > G_MAXINT32)\n\t mono_raise_exception (mono_get_exception_overflow ());\n#endif\n\treturn length;\n}\n\nstatic gint64\nves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n \t\treturn this->max_length;\n \t\n \treturn this->bounds [dimension].length;\n}\n\nstatic gint32\nves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\treturn 0;\n\t\n\treturn this->bounds [dimension].lower_bound;\n}\n\nstatic void\nves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)\n{\n\tint sz = mono_array_element_size (mono_object_class (arr));\n\tmemset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);\n}\n\nstatic gboolean\nves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)\n{\n\tint element_size;\n\tvoid * dest_addr;\n\tvoid * source_addr;\n\tMonoClass *src_class;\n\tMonoClass *dest_class;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)\n\t\treturn FALSE;\n\n\tif (source->bounds || dest->bounds)\n\t\treturn FALSE;\n\n\t/* there's no integer overflow since mono_array_length returns an unsigned integer */\n\tif ((dest_idx + length > mono_array_length (dest)) ||\n\t\t(source_idx + length > mono_array_length (source)))\n\t\treturn FALSE;\n\n\tsrc_class = source->obj.vtable->klass->element_class;\n\tdest_class = dest->obj.vtable->klass->element_class;\n\n\t/*\n\t * Handle common cases.\n\t */\n\n\t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n\tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n\t\tint has_refs = dest_class->has_references;\n\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\treturn FALSE;\n\t\t}\n\n\t\telement_size = mono_array_element_size (dest->obj.vtable->klass);\n\t\tmemset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);\n\t\t\tvoid *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);\n\t\t\tif (!elem)\n\t\t\t\tcontinue;\n\t\t\tif (has_refs)\n\t\t\t\tmono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);\n\t\t\telse\n\t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\t/* Check if we're copying a char[] <==> (u)short[] */\n\tif (src_class != dest_class) {\n\t\tif (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)\n\t\t\treturn FALSE;\n\n\t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n\t\t\t;\n\t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE))\n\t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\tif (dest_class->valuetype) {\n\t\telement_size = mono_array_element_size (source->obj.vtable->klass);\n\t\tsource_addr = mono_array_addr_with_size (source, element_size, source_idx);\n\t\tif (dest_class->has_references) {\n\t\t\tmono_value_copy_array (dest, dest_idx, source_addr, length);\n\t\t} else {\n\t\t\tdest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);\n\t\t\tmemmove (dest_addr, source_addr, element_size * length);\n\t\t}\n\t} else {\n\t\tmono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);\n\t}\n\n\treturn TRUE;\n}\n\nstatic void\nves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tmemcpy (value, ea, esize);\n}\n\nstatic void\nves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac, *ec;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (MONO_TYPE_IS_REFERENCE (&ec->byval_arg)) {\n\t\tg_assert (esize == sizeof (gpointer));\n\t\tmono_gc_wbarrier_generic_store (ea, *(gpointer*)value);\n\t} else {\n\t\tg_assert (ec->inited);\n\t\tif (ec->has_references)\n\t\t\tmono_gc_wbarrier_value_copy (ea, value, 1, ec);\n\t\tmemcpy (ea, value, esize);\n\t}\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)\n{\n\tMonoClass *klass = array->obj.vtable->klass;\n\tguint32 size = mono_array_element_size (klass);\n\tMonoType *type = mono_type_get_underlying_type (&klass->element_class->byval_arg);\n\tint align;\n\tconst char *field_data;\n\n\tif (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {\n\t\tMonoException *exc = mono_get_exception_argument(\"array\",\n\t\t\t\"Cannot initialize array of non-primitive type.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field doesn't have an RVA\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tsize *= array->max_length;\n\tfield_data = mono_field_get_data (field_handle);\n\n\tif (size > mono_type_size (field_handle->type, &align)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field not large enough to fill array\");\n\t\tmono_raise_exception (exc);\n\t}\n\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n#define SWAP(n) {\\\n\tguint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \\\n\tguint ## n *src = (guint ## n *) field_data; \\\n\tguint ## n *end = (guint ## n *)((char*)src + size); \\\n\\\n\tfor (; src < end; data++, src++) { \\\n\t\t*data = read ## n (src); \\\n\t} \\\n}\n\n\t/* printf (\"Initialize array with elements of %s type\\n\", klass->element_class->name); */\n\n\tswitch (type->type) {\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\t\tSWAP (16);\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\tSWAP (32);\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\tSWAP (64);\n\t\tbreak;\n\tdefault:\n\t\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n\t\tbreak;\n\t}\n#else\n\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n#ifdef ARM_FPU_FPA\n\tif (klass->element_class->byval_arg.type == MONO_TYPE_R8) {\n\t\tgint i;\n\t\tdouble tmp;\n\t\tdouble *data = (double*)mono_array_addr (array, double, 0);\n\n\t\tfor (i = 0; i < size; i++, data++) {\n\t\t\treadr8 (data, &tmp);\n\t\t\t*data = tmp;\n\t\t}\n\t}\n#endif\n#endif\n}\n\nstatic gint\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn offsetof (MonoString, chars);\n}\n\nstatic MonoObject *\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((obj == NULL) || (! (obj->vtable->klass->valuetype)))\n\t\treturn obj;\n\telse\n\t\treturn mono_object_clone (obj);\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)\n{\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\n\tMONO_CHECK_ARG_NULL (handle);\n\n\tklass = mono_class_from_mono_type (handle);\n\tMONO_CHECK_ARG (handle, klass);\n\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\t/* This will call the type constructor */\n\tmono_runtime_class_init (vtable);\n}\n\nstatic void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (MonoImage *image)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_check_for_module_cctor (image);\n\tif (image->has_module_cctor) {\n\t\tMonoClass *module_klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | 1);\n\t\t/*It's fine to raise the exception here*/\n\t\tmono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE));\n\t}\n}\n\nstatic MonoObject *\nves_icall_System_Object_MemberwiseClone (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_object_clone (this);\n}\n\nstatic gint32\nves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tint count = 0;\n\tgint32 result = 0;\n\tMonoClassField* field;\n\tgpointer iter;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_object_class (this);\n\n\tif (mono_class_num_fields (klass) == 0)\n\t\treturn mono_object_hash (this);\n\n\t/*\n\t * Compute the starting value of the hashcode for fields of primitive\n\t * types, and return the remaining fields in an array to the managed side.\n\t * This way, we can avoid costly reflection operations in managed code.\n\t */\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_I4:\n\t\t\tresult ^= *(gint32*)((guint8*)this + field->offset);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s;\n\t\t\ts = *(MonoString**)((guint8*)this + field->offset);\n\t\t\tif (s != NULL)\n\t\t\t\tresult ^= mono_string_hash (s);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass));\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t}\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t} else {\n\t\t*fields = NULL;\n\t}\n\treturn result;\n}\n\nstatic MonoBoolean\nves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tMonoClassField* field;\n\tgpointer iter;\n\tint count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (that);\n\n\tif (this->vtable != that->vtable)\n\t\treturn FALSE;\n\n\tklass = mono_object_class (this);\n\n\tif (klass->enumtype && mono_class_enum_basetype (klass) && mono_class_enum_basetype (klass)->type == MONO_TYPE_I4)\n\t\treturn (*(gint32*)((guint8*)this + sizeof (MonoObject)) == *(gint32*)((guint8*)that + sizeof (MonoObject)));\n\n\t/*\n\t * Do the comparison for fields of primitive type and return a result if\n\t * possible. Otherwise, return the remaining fields in an array to the \n\t * managed side. This way, we can avoid costly reflection operations in \n\t * managed code.\n\t */\n\t*fields = NULL;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tif (*((guint8*)this + field->offset) != *((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\t\tif (*(gint16*)((guint8*)this + field->offset) != *(gint16*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tif (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tif (*(gint64*)((guint8*)this + field->offset) != *(gint64*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R4:\n\t\t\tif (*(float*)((guint8*)this + field->offset) != *(float*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R8:\n\t\t\tif (*(double*)((guint8*)this + field->offset) != *(double*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\n\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s1, *s2;\n\t\t\tguint32 s1len, s2len;\n\t\t\ts1 = *(MonoString**)((guint8*)this + field->offset);\n\t\t\ts2 = *(MonoString**)((guint8*)that + field->offset);\n\t\t\tif (s1 == s2)\n\t\t\t\tbreak;\n\t\t\tif ((s1 == NULL) || (s2 == NULL))\n\t\t\t\treturn FALSE;\n\t\t\ts1len = mono_string_length (s1);\n\t\t\ts2len = mono_string_length (s2);\n\t\t\tif (s1len != s2len)\n\t\t\t\treturn FALSE;\n\n\t\t\tif (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, that);\n\t\t\tvalues [count++] = o;\n\t\t}\n\n\t\tif (klass->enumtype)\n\t\t\t/* enums only have one non-static field */\n\t\t\tbreak;\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t\treturn FALSE;\n\t} else {\n\t\treturn TRUE;\n\t}\n}\n\nstatic MonoReflectionType *\nves_icall_System_Object_GetType (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (obj->vtable->klass != mono_defaults.transparent_proxy_class)\n\t\treturn mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);\n\telse\n\t\treturn mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);\n}\n\nstatic void\nmono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmtype->type = &obj->vtable->klass->byval_arg;\n\tg_assert (mtype->type->type);\n}\n\nstatic gint32\nves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tMONO_CHECK_ARG_NULL (obj);\n\t\n\treturn mono_image_create_token (mb->dynamic_image, obj, TRUE, TRUE);\n}\n\nstatic gint32\nves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,\n\t\t\t\t\tMonoReflectionMethod *method,\n\t\t\t\t\tMonoArray *opt_param_types)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (method);\n\t\n\treturn mono_image_create_method_token (\n\t\tmb->dynamic_image, (MonoObject *) method, opt_param_types);\n}\n\nstatic void\nves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_create_pefile (mb, file);\n}\n\nstatic void\nves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_build_metadata (mb);\n}\n\nstatic void\nves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_register_token (mb->dynamic_image, token, obj);\n}\n\nstatic gboolean\nget_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic gboolean\nget_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (!(*dest)) {\n\t\tif (!strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\t\treturn FALSE;\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic gboolean\nget_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m->wrapper_type != MONO_WRAPPER_NONE)\n\t\treturn FALSE;\n\n\tif (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}\n\nstatic MonoReflectionType *\ntype_from_name (const char *str, MonoBoolean ignoreCase)\n{\n\tMonoType *type = NULL;\n\tMonoAssembly *assembly = NULL;\n\tMonoTypeNameParse info;\n\tchar *temp_str = g_strdup (str);\n\tgboolean type_resolve = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* mono_reflection_parse_type() mangles the string */\n\tif (!mono_reflection_parse_type (temp_str, &info)) {\n\t\tmono_reflection_free_type_info (&info);\n\t\tg_free (temp_str);\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tassembly = mono_assembly_load (&info.assembly, NULL, NULL);\n\t} else {\n\t\tMonoMethod *m = mono_method_get_last_managed ();\n\t\tMonoMethod *dest = m;\n\n\t\tmono_stack_walk_no_il (get_caller_no_reflection, &dest);\n\t\tif (!dest)\n\t\t\tdest = m;\n\n\t\t/*\n\t\t * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus\n\t\t * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()\n\t\t * to crash. This only seems to happen in some strange remoting\n\t\t * scenarios and I was unable to figure out what's happening there.\n\t\t * Dec 10, 2005 - Martin.\n\t\t */\n\n\t\tif (dest) {\n\t\t\tassembly = dest->klass->image->assembly;\n\t\t\ttype_resolve = TRUE;\n\t\t} else {\n\t\t\tg_warning (G_STRLOC);\n\t\t}\n\t}\n\n\tif (assembly) {\n\t\t/* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tif (!info.assembly.name && !type) /* try mscorlib */\n\t\ttype = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);\n\n\tif (assembly && !type && type_resolve) {\n\t\ttype_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tmono_reflection_free_type_info (&info);\n\tg_free (temp_str);\n\n\tif (!type) \n\t\treturn NULL;\n\n\treturn mono_type_get_object (mono_domain_get (), type);\n}\n\n#ifdef UNUSED\nMonoReflectionType *\nmono_type_get (const char *str)\n{\n\tchar *copy = g_strdup (str);\n\tMonoReflectionType *type = type_from_name (copy, FALSE);\n\n\tg_free (copy);\n\treturn type;\n}\n#endif\n\nstatic MonoReflectionType*\nves_icall_type_from_name (MonoString *name,\n\t\t\t MonoBoolean throwOnError,\n\t\t\t MonoBoolean ignoreCase)\n{\n\tchar *str = mono_string_to_utf8 (name);\n\tMonoReflectionType *type;\n\n\ttype = type_from_name (str, ignoreCase);\n\tg_free (str);\n\tif (type == NULL){\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tmono_loader_clear_error ();\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\t}\n\t\n\treturn type;\n}\n\n\nstatic MonoReflectionType*\nves_icall_type_from_handle (MonoType *handle)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *klass = mono_class_from_mono_type (handle);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_init (klass);\n\treturn mono_type_get_object (domain, handle);\n}\n\nstatic MonoBoolean\nves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (c && type->type && c->type)\n\t\treturn mono_metadata_type_equal (type->type, c->type);\n\telse\n\t\treturn (type == c) ? TRUE : FALSE;\n}\n\n/* System.TypeCode */\ntypedef enum {\n\tTYPECODE_EMPTY,\n\tTYPECODE_OBJECT,\n\tTYPECODE_DBNULL,\n\tTYPECODE_BOOLEAN,\n\tTYPECODE_CHAR,\n\tTYPECODE_SBYTE,\n\tTYPECODE_BYTE,\n\tTYPECODE_INT16,\n\tTYPECODE_UINT16,\n\tTYPECODE_INT32,\n\tTYPECODE_UINT32,\n\tTYPECODE_INT64,\n\tTYPECODE_UINT64,\n\tTYPECODE_SINGLE,\n\tTYPECODE_DOUBLE,\n\tTYPECODE_DECIMAL,\n\tTYPECODE_DATETIME,\n\tTYPECODE_STRING = 18\n} TypeCode;\n\nstatic guint32\nves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)\n{\n\tint t = type->type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn TYPECODE_OBJECT;\n\nhandle_enum:\n\tswitch (t) {\n\tcase MONO_TYPE_VOID:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn TYPECODE_BOOLEAN;\n\tcase MONO_TYPE_U1:\n\t\treturn TYPECODE_BYTE;\n\tcase MONO_TYPE_I1:\n\t\treturn TYPECODE_SBYTE;\n\tcase MONO_TYPE_U2:\n\t\treturn TYPECODE_UINT16;\n\tcase MONO_TYPE_I2:\n\t\treturn TYPECODE_INT16;\n\tcase MONO_TYPE_CHAR:\n\t\treturn TYPECODE_CHAR;\n\tcase MONO_TYPE_PTR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_U4:\n\t\treturn TYPECODE_UINT32;\n\tcase MONO_TYPE_I4:\n\t\treturn TYPECODE_INT32;\n\tcase MONO_TYPE_U8:\n\t\treturn TYPECODE_UINT64;\n\tcase MONO_TYPE_I8:\n\t\treturn TYPECODE_INT64;\n\tcase MONO_TYPE_R4:\n\t\treturn TYPECODE_SINGLE;\n\tcase MONO_TYPE_R8:\n\t\treturn TYPECODE_DOUBLE;\n\tcase MONO_TYPE_VALUETYPE:\n\t\tif (type->type->data.klass->enumtype) {\n\t\t\tt = mono_class_enum_basetype (type->type->data.klass)->type;\n\t\t\tgoto handle_enum;\n\t\t} else {\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"Decimal\") == 0)\n\t\t\t\t\treturn TYPECODE_DECIMAL;\n\t\t\t\telse if (strcmp (k->name, \"DateTime\") == 0)\n\t\t\t\t\treturn TYPECODE_DATETIME;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_STRING:\n\t\treturn TYPECODE_STRING;\n\tcase MONO_TYPE_SZARRAY:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_VAR:\n\tcase MONO_TYPE_MVAR:\n\tcase MONO_TYPE_TYPEDBYREF:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_CLASS:\n\t\t{\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"DBNull\") == 0)\n\t\t\t\t\treturn TYPECODE_DBNULL;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_GENERICINST:\n\t\treturn TYPECODE_OBJECT;\n\tdefault:\n\t\tg_error (\"type 0x%02x not handled in GetTypeCode()\", t);\n\t}\n\treturn 0;\n}\n\nstatic guint32\nves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tif (!c) /* FIXME: dont know what do do here */\n\t\treturn 0;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref)\n\t\treturn klassc == mono_defaults.object_class;\n\n\treturn mono_class_is_subclass_of (klass, klassc, check_interfaces);\n}\n\nstatic guint32\nves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref && !c->type->byref)\n\t\treturn FALSE;\n\n\treturn mono_class_is_assignable_from (klass, klassc);\n}\n\nstatic guint32\nves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\treturn mono_object_isinst (obj, klass) != NULL;\n}\n\nstatic guint32\nves_icall_get_attributes (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn klass->flags;\n}\n\nstatic MonoReflectionMarshal*\nves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)\n{\n\tMonoClass *klass = field->field->parent;\n\tMonoMarshalType *info;\n\tint i;\n\n\tif (klass->generic_container ||\n\t (klass->generic_class && klass->generic_class->context.class_inst->is_open))\n\t\treturn NULL;\n\n\tinfo = mono_marshal_load_type_info (klass);\n\n\tfor (i = 0; i < info->num_fields; ++i) {\n\t\tif (info->fields [i].field == field->field) {\n\t\t\tif (!info->fields [i].mspec)\n\t\t\t\treturn NULL;\n\t\t\telse\n\t\t\t\treturn mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nstatic MonoReflectionField*\nves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)\n{\n\tgboolean found = FALSE;\n\tMonoClass *klass;\n\tMonoClass *k;\n\n\tg_assert (handle);\n\n\tif (!type) {\n\t\tklass = handle->parent;\n\t} else {\n\t\tklass = mono_class_from_mono_type (type);\n\n\t\t/* Check that the field belongs to the class */\n\t\tfor (k = klass; k; k = k->parent) {\n\t\t\tif (k == handle->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found)\n\t\t\t/* The managed code will throw the exception */\n\t\t\treturn NULL;\n\t}\n\n\treturn mono_field_get_object (mono_domain_get (), klass, handle);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *field, MonoBoolean optional)\n{\n\tMonoType *type = field->field->type;\n\n\treturn type_array_from_modifiers (field->field->parent->image, type, optional);\n}\n\nstatic void\nves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoMethodSignature* sig;\n\tMONO_ARCH_SAVE_REGS;\n\n\tsig = mono_method_signature (method);\n\tif (!sig) {\n\t\tg_assert (mono_loader_get_last_error ());\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t}\n\n\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &method->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, ret, mono_type_get_object (domain, sig->ret));\n\tinfo->attrs = method->flags;\n\tinfo->implattrs = method->iflags;\n\tif (sig->call_convention == MONO_CALL_DEFAULT)\n\t\tinfo->callconv = sig->sentinelpos >= 0 ? 2 : 1;\n\telse {\n\t\tif (sig->call_convention == MONO_CALL_VARARG || sig->sentinelpos >= 0)\n\t\t\tinfo->callconv = 2;\n\t\telse\n\t\t\tinfo->callconv = 1;\n\t}\n\tinfo->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6); \n}\n\nstatic MonoArray*\nves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\n\treturn mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL);\n}\n\nstatic MonoReflectionMarshal*\nves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoReflectionMarshal* res = NULL;\n\tMonoMarshalSpec **mspecs;\n\tint i;\n\n\tmspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);\n\tmono_method_get_marshal_info (method, mspecs);\n\n\tif (mspecs [0])\n\t\tres = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);\n\t\t\n\tfor (i = mono_method_signature (method)->param_count; i >= 0; i--)\n\t\tif (mspecs [i])\n\t\t\tmono_metadata_free_marshal_spec (mspecs [i]);\n\tg_free (mspecs);\n\n\treturn res;\n}\n\nstatic gint32\nves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)\n{\n\treturn field->field->offset - sizeof (MonoObject);\n}\n\nstatic MonoReflectionType*\nves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)\n{\n\tMonoClass *parent;\n\tMONO_ARCH_SAVE_REGS;\n\n\tparent = declaring? field->field->parent: field->klass;\n\n\treturn mono_type_get_object (mono_object_domain (field), &parent->byval_arg);\n}\n\nstatic MonoObject *\nves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)\n{\t\n\tMonoObject *o;\n\tMonoClassField *cf = field->field;\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\tMonoType *t;\n\tMonoDomain *domain = mono_object_domain (field); \n\tgchar *v;\n\tgboolean is_static = FALSE;\n\tgboolean is_ref = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\t\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tmono_class_init (field->klass);\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\tis_static = TRUE;\n\n\tif (obj && !is_static) {\n\t\t/* Check that the field belongs to the object */\n\t\tgboolean found = FALSE;\n\t\tMonoClass *k;\n\n\t\tfor (k = obj->vtable->klass; k; k = k->parent) {\n\t\t\tif (k == cf->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tchar *msg = g_strdup_printf (\"Field '%s' defined on type '%s' is not a field on the target object which is of type '%s'.\", mono_field_get_name (cf), cf->parent->name, obj->vtable->klass->name);\n\t\t\tMonoException *ex = mono_get_exception_argument (NULL, msg);\n\t\t\tg_free (msg);\n\t\t\tmono_raise_exception (ex);\n\t\t}\n\t}\n\n\tt = mono_type_get_underlying_type (cf->type);\n\tswitch (t->type) {\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_CLASS:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_SZARRAY:\n\t\tis_ref = TRUE;\n\t\tbreak;\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8:\n\tcase MONO_TYPE_VALUETYPE:\n\t\tis_ref = t->byref;\n\t\tbreak;\n\tcase MONO_TYPE_GENERICINST:\n\t\tif (mono_type_generic_inst_is_valuetype (t)) {\n\t\t\tis_ref = t->byref;\n\t\t} else {\n\t\t\tis_ref = TRUE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t \"ves_icall_Monofield_GetValue\", t->type);\n\t\treturn NULL;\n\t}\n\n\tvtable = NULL;\n\tif (is_static) {\n\t\tvtable = mono_class_vtable_full (domain, cf->parent, TRUE);\n\t\tif (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))\n\t\t\tmono_runtime_class_init (vtable);\n\t}\n\t\n\tif (is_ref) {\n\t\tif (is_static) {\n\t\t\tmono_field_static_get_value (vtable, cf, &o);\n\t\t} else {\n\t\t\tmono_field_get_value (obj, cf, &o);\n\t\t}\n\t\treturn o;\n\t}\n\n\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\tguint8 *buf;\n\n\t\t/* Convert the Nullable structure into a boxed vtype */\n\t\tif (is_static)\n\t\t\tbuf = (guint8*)vtable->data + cf->offset;\n\t\telse\n\t\t\tbuf = (guint8*)obj + cf->offset;\n\n\t\treturn mono_nullable_box (buf, nklass);\n\t}\n\n\t/* boxed value type */\n\tklass = mono_class_from_mono_type (cf->type);\n\to = mono_object_new (domain, klass);\n\tv = ((gchar *) o) + sizeof (MonoObject);\n\tif (is_static) {\n\t\tmono_field_static_get_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_get_value (obj, cf, v);\n\t}\n\n\treturn o;\n}\n\nstatic void\nves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)\n{\n\tMonoClassField *cf = field->field;\n\tgchar *v;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tv = (gchar *) value;\n\tif (!cf->type->byref) {\n\t\tswitch (cf->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U:\n\t\tcase MONO_TYPE_I:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R8:\n\t\tcase MONO_TYPE_VALUETYPE:\n\t\t\tif (v != NULL)\n\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING:\n\t\tcase MONO_TYPE_OBJECT:\n\t\tcase MONO_TYPE_CLASS:\n\t\tcase MONO_TYPE_ARRAY:\n\t\tcase MONO_TYPE_SZARRAY:\n\t\t\t/* Do nothing */\n\t\t\tbreak;\n\t\tcase MONO_TYPE_GENERICINST: {\n\t\t\tMonoGenericClass *gclass = cf->type->data.generic_class;\n\t\t\tg_assert (!gclass->context.class_inst->is_open);\n\n\t\t\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\t\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\t\t\tMonoObject *nullable;\n\n\t\t\t\t/* \n\t\t\t\t * Convert the boxed vtype into a Nullable structure.\n\t\t\t\t * This is complicated by the fact that Nullables have\n\t\t\t\t * a variable structure.\n\t\t\t\t */\n\t\t\t\tnullable = mono_object_new (mono_domain_get (), nklass);\n\n\t\t\t\tmono_nullable_init (mono_object_unbox (nullable), value, nklass);\n\n\t\t\t\tv = mono_object_unbox (nullable);\n\t\t\t}\n\t\t\telse \n\t\t\t\tif (gclass->container_class->valuetype && (v != NULL))\n\t\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t\t \"ves_icall_FieldInfo_SetValueInternal\", cf->type->type);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\tMonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, TRUE);\n\t\tif (!vtable->initialized)\n\t\t\tmono_runtime_class_init (vtable);\n\t\tmono_field_static_set_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_set_value (obj, cf, v);\n\t}\n}\n\nstatic MonoObject *\nves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this)\n{\t\n\tMonoObject *o = NULL;\n\tMonoClassField *field = this->field;\n\tMonoClass *klass;\n\tMonoDomain *domain = mono_object_domain (this); \n\tgchar *v;\n\tMonoTypeEnum def_type;\n\tconst char *def_value;\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tmono_class_init (field->parent);\n\n\tif (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (NULL));\n\n\tif (field->parent->image->dynamic) {\n\t\t/* FIXME: */\n\t\tg_assert_not_reached ();\n\t}\n\n\tdef_value = mono_class_get_field_default_value (field, &def_type);\n\n\tswitch (def_type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8: {\n\t\tMonoType *t;\n\n\t\t/* boxed value type */\n\t\tt = g_new0 (MonoType, 1);\n\t\tt->type = def_type;\n\t\tklass = mono_class_from_mono_type (t);\n\t\tg_free (t);\n\t\to = mono_object_new (domain, klass);\n\t\tv = ((gchar *) o) + sizeof (MonoObject);\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, v);\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_CLASS:\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, &o);\n\t\tbreak;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\n\treturn o;\n}\n\nstatic MonoReflectionType*\nves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)\n{\n\tMonoMethod *method = rmethod->method.method;\n\n\treturn mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);\n}\n\n/* From MonoProperty.cs */\ntypedef enum {\n\tPInfo_Attributes = 1,\n\tPInfo_GetMethod = 1 << 1,\n\tPInfo_SetMethod = 1 << 2,\n\tPInfo_ReflectedType = 1 << 3,\n\tPInfo_DeclaringType = 1 << 4,\n\tPInfo_Name = 1 << 5\n} PInfo;\n\nstatic void\nves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)\n{\n\tMonoDomain *domain = mono_object_domain (property); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((req_info & PInfo_ReflectedType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg));\n\telse if ((req_info & PInfo_DeclaringType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->property->parent->byval_arg));\n\n\tif ((req_info & PInfo_Name) != 0)\n\t\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, property->property->name));\n\n\tif ((req_info & PInfo_Attributes) != 0)\n\t\tinfo->attrs = property->property->attrs;\n\n\tif ((req_info & PInfo_GetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, get, property->property->get ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->get, property->klass): NULL);\n\t\n\tif ((req_info & PInfo_SetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, set, property->property->set ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->set, property->klass): NULL);\n\t/* \n\t * There may be other methods defined for properties, though, it seems they are not exposed \n\t * in the reflection API \n\t */\n}\n\nstatic void\nves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (event); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg));\n\n\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));\n\tinfo->attrs = event->event->attrs;\n\tMONO_STRUCT_SETREF (info, add_method, event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, remove_method, event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, raise_method, event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL);\n\n\tif (event->event->other) {\n\t\tint i, n = 0;\n\t\twhile (event->event->other [n])\n\t\t\tn++;\n\t\tMONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));\n\n\t\tfor (i = 0; i < n; i++)\n\t\t\tmono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));\n\t}\t\t\n}\n\nstatic MonoArray*\nves_icall_Type_GetInterfaces (MonoReflectionType* type)\n{\n\tMonoError error;\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoArray *intf;\n\tGPtrArray *ifaces = NULL;\n\tint i;\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *parent;\n\tMonoBitSet *slots;\n\tMonoGenericContext *context = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->generic_class && class->generic_class->context.class_inst->is_open) {\n\t\tcontext = mono_class_get_context (class);\n\t\tclass = class->generic_class->container_class;\n\t}\n\n\tmono_class_setup_vtable (class);\n\n\tslots = mono_bitset_new (class->max_interface_id + 1, 0);\n\n\tfor (parent = class; parent; parent = parent->parent) {\n\t\tGPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error);\n\t\tif (!mono_error_ok (&error)) {\n\t\t\tmono_bitset_free (slots);\n\t\t\tmono_error_raise_exception (&error);\n\t\t\treturn NULL;\n\t\t} else if (tmp_ifaces) {\n\t\t\tfor (i = 0; i < tmp_ifaces->len; ++i) {\n\t\t\t\tMonoClass *ic = g_ptr_array_index (tmp_ifaces, i);\n\n\t\t\t\tif (mono_bitset_test (slots, ic->interface_id))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmono_bitset_set (slots, ic->interface_id);\n\t\t\t\tif (ifaces == NULL)\n\t\t\t\t\tifaces = g_ptr_array_new ();\n\t\t\t\tg_ptr_array_add (ifaces, ic);\n\t\t\t}\n\t\t\tg_ptr_array_free (tmp_ifaces, TRUE);\n\t\t}\n\t}\n\tmono_bitset_free (slots);\n\n\tif (!ifaces)\n\t\treturn mono_array_new_cached (domain, mono_defaults.monotype_class, 0);\n\t\t\n\tintf = mono_array_new_cached (domain, mono_defaults.monotype_class, ifaces->len);\n\tfor (i = 0; i < ifaces->len; ++i) {\n\t\tMonoClass *ic = g_ptr_array_index (ifaces, i);\n\t\tMonoType *ret = &ic->byval_arg, *inflated = NULL;\n\t\tif (context && ic->generic_class && ic->generic_class->context.class_inst->is_open)\n\t\t\tinflated = ret = mono_class_inflate_generic_type (ret, context);\n\t\t\n\t\tmono_array_setref (intf, i, mono_type_get_object (domain, ret));\n\t\tif (inflated)\n\t\t\tmono_metadata_free_type (inflated);\n\t}\n\tg_ptr_array_free (ifaces, TRUE);\n\n\treturn intf;\n}\n\nstatic void\nves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *iclass = mono_class_from_mono_type (iface->type);\n\tMonoReflectionMethod *member;\n\tMonoMethod* method;\n\tgpointer iter;\n\tint i = 0, len, ioffset;\n\tMonoDomain *domain;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_setup_vtable (class);\n\n\t/* type doesn't implement iface: the exception is thrown in managed code */\n\tif (! MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))\n\t\t\treturn;\n\n\tlen = mono_class_num_methods (iclass);\n\tioffset = mono_class_interface_offset (class, iclass);\n\tdomain = mono_object_domain (type);\n\tmono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\tmono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (iclass, &iter))) {\n\t\tmember = mono_method_get_object (domain, method, iclass);\n\t\tmono_array_setref (*methods, i, member);\n\t\tmember = mono_method_get_object (domain, class->vtable [i + ioffset], class);\n\t\tmono_array_setref (*targets, i, member);\n\t\t\n\t\ti ++;\n\t}\n}\n\nstatic void\nves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tif (klass->image->dynamic) {\n\t\tMonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type;\n\t\t*packing = tb->packing_size;\n\t\t*size = tb->class_size;\n\t} else {\n\t\tmono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);\n\t}\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_GetElementType (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY)\n\t\treturn mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg);\n\n\tclass = mono_class_from_mono_type (type->type);\n\n\t// GetElementType should only return a type for:\n\t// Array Pointer PassedByRef\n\tif (type->type->byref)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->byval_arg);\n\telse if (class->element_class && MONO_CLASS_IS_ARRAY (class))\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse if (class->element_class && type->type->type == MONO_TYPE_PTR)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_get_type_parent (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;\n}\n\nstatic MonoBoolean\nves_icall_type_ispointer (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->type == MONO_TYPE_PTR;\n}\n\nstatic MonoBoolean\nves_icall_type_isprimitive (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));\n}\n\nstatic MonoBoolean\nves_icall_type_isbyref (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->byref;\n}\n\nstatic MonoBoolean\nves_icall_type_iscomobject (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (klass && klass->is_com_object);\n}\n\nstatic MonoReflectionModule*\nves_icall_MonoType_get_Module (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_module_get_object (mono_object_domain (type), class->image);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_MonoType_get_Assembly (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_assembly_get_object (domain, class->image->assembly);\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\tif (type->type->type == MONO_TYPE_VAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.klass;\n\telse if (type->type->type == MONO_TYPE_MVAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.method->klass;\n\telse\n\t\tclass = mono_class_from_mono_type (type->type)->nested_in;\n\n\treturn class ? mono_type_get_object (domain, &class->byval_arg) : NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->enumtype && mono_class_enum_basetype (class)) /* types that are modified typebuilders may not have enum_basetype set */\n\t\treturn mono_type_get_object (domain, mono_class_enum_basetype (class));\n\telse if (class->element_class)\n\t\treturn mono_type_get_object (domain, &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoString*\nves_icall_MonoType_get_Name (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref) {\n\t\tchar *n = g_strdup_printf (\"%s&\", class->name);\n\t\tMonoString *res = mono_string_new (domain, n);\n\n\t\tg_free (n);\n\n\t\treturn res;\n\t} else {\n\t\treturn mono_string_new (domain, class->name);\n\t}\n}\n\nstatic MonoString*\nves_icall_MonoType_get_Namespace (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile (class->nested_in)\n\t\tclass = class->nested_in;\n\n\tif (class->name_space [0] == '\\0')\n\t\treturn NULL;\n\telse\n\t\treturn mono_string_new (domain, class->name_space);\n}\n\nstatic gint32\nves_icall_MonoType_GetArrayRank (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tif (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY)\n\t\tmono_raise_exception (mono_get_exception_argument (\"type\", \"Type must be an array type\"));\n\n\tclass = mono_class_from_mono_type (type->type);\n\treturn class->rank;\n}\n\nstatic MonoArray*\nves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)\n{\n\tMonoArray *res;\n\tMonoClass *klass, *pklass;\n\tMonoDomain *domain = mono_object_domain (type);\n\tMonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE);\n\tint i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->generic_container) {\n\t\tMonoGenericContainer *container = klass->generic_container;\n\t\tres = mono_array_new_specific (array_vtable, container->type_argc);\n\t\tfor (i = 0; i < container->type_argc; ++i) {\n\t\t\tpklass = mono_class_from_generic_parameter (mono_generic_container_get_param (container, i), klass->image, FALSE);\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, &pklass->byval_arg));\n\t\t}\n\t} else if (klass->generic_class) {\n\t\tMonoGenericInst *inst = klass->generic_class->context.class_inst;\n\t\tres = mono_array_new_specific (array_vtable, inst->type_argc);\n\t\tfor (i = 0; i < inst->type_argc; ++i)\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\t} else {\n\t\tres = mono_array_new_specific (array_vtable, 0);\n\t}\n\treturn res;\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\treturn klass->generic_container != NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->generic_container) {\n\t\treturn type; /* check this one */\n\t}\n\tif (klass->generic_class) {\n\t\tMonoClass *generic_class = klass->generic_class->container_class;\n\n\t\tif (generic_class->wastypebuilder && generic_class->reflection_info)\n\t\t\treturn generic_class->reflection_info;\n\t\telse\n\t\t\treturn mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);\n\t}\n\treturn NULL;\n}\n\nstatic MonoReflectionType*\nves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)\n{\n\tMonoClass *class;\n\tMonoType *geninst, **types;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tcount = mono_array_length (type_array);\n\ttypes = g_new0 (MonoType *, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionType *t = mono_array_get (type_array, gpointer, i);\n\t\ttypes [i] = t->type;\n\t}\n\n\tgeninst = mono_reflection_bind_generic_parameters (type, count, types);\n\tg_free (types);\n\tif (!geninst)\n\t\treturn NULL;\n\n\tclass = mono_class_from_mono_type (geninst);\n\n\t/*we might inflate to the GTD*/\n\tif (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class))\n\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"Invalid generic arguments\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), geninst);\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL;\n}\n\nstatic gboolean\nves_icall_Type_get_IsGenericType (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL || klass->generic_container != NULL;\n}\n\nstatic gint32\nves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn -1;\n\n\tif (is_generic_parameter (type->type))\n\t\treturn mono_type_get_generic_param_num (type->type);\n\treturn -1;\n}\n\nstatic GenericParameterAttributes\nves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\tg_assert (is_generic_parameter (type->type));\n\treturn mono_generic_param_info (type->type->data.generic_param)->flags;\n}\n\nstatic MonoArray *\nves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)\n{\n\tMonoGenericParamInfo *param_info;\n\tMonoDomain *domain;\n\tMonoClass **ptr;\n\tMonoArray *res;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\n\tdomain = mono_object_domain (type);\n\tparam_info = mono_generic_param_info (type->type->data.generic_param);\n\tfor (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++)\n\t\t;\n\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\tfor (i = 0; i < count; i++)\n\t\tmono_array_setref (res, i, mono_type_get_object (domain, &param_info->constraints [i]->byval_arg));\n\n\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (type->type);\n}\n\nstatic MonoBoolean\nves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (tb->type.type);\n}\n\nstatic void\nves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,\n\t\t\t\t\t\t\t\t\t MonoReflectionType *t)\n{\n\tenumtype->type = t->type;\n}\n\nstatic MonoReflectionMethod*\nves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, \n MonoReflectionMethod* generic)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoMethod *method;\n\tgpointer iter;\n\t\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n if (method->token == generic->method->token)\n return mono_method_get_object (domain, method, klass);\n }\n\n return NULL;\n}\n\n\n\nstatic MonoReflectionMethod *\nves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)\n{\n\tMonoMethod *method;\n\tMonoType *type = ref_type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\"DeclaringMethod can only be used on generic arguments\"));\n\tif (type->type == MONO_TYPE_VAR)\n\t\treturn NULL;\n\n\tmethod = mono_type_get_generic_param_owner (type)->owner.method;\n\tg_assert (method);\n\treturn mono_method_get_object (mono_object_domain (ref_type), method, method->klass);\n}\n\nstatic MonoReflectionDllImportAttribute*\nves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)\n{\n\tstatic MonoClass *DllImportAttributeClass = NULL;\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoReflectionDllImportAttribute *attr;\n\tMonoImage *image = method->klass->image;\n\tMonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;\n\tMonoTableInfo *tables = image->tables;\n\tMonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];\n\tMonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];\n\tguint32 im_cols [MONO_IMPLMAP_SIZE];\n\tguint32 scope_token;\n\tconst char *import = NULL;\n\tconst char *scope = NULL;\n\tguint32 flags;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn NULL;\n\n\tif (!DllImportAttributeClass) {\n\t\tDllImportAttributeClass = \n\t\t\tmono_class_from_name (mono_defaults.corlib,\n\t\t\t\t\t\t\t\t \"System.Runtime.InteropServices\", \"DllImportAttribute\");\n\t\tg_assert (DllImportAttributeClass);\n\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tif (method->klass->image->dynamic) {\n\t\tMonoReflectionMethodAux *method_aux = \n\t\t\tg_hash_table_lookup (\n\t\t\t\t\t\t\t\t\t ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);\n\t\tif (method_aux) {\n\t\t\timport = method_aux->dllentry;\n\t\t\tscope = method_aux->dll;\n\t\t}\n\n\t\tif (!import || !scope) {\n\t\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"System.Reflection.Emit method with invalid pinvoke information\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (piinfo->implmap_idx) {\n\t\t\tmono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);\n\t\t\t\n\t\t\tpiinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];\n\t\t\timport = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);\n\t\t\tscope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);\n\t\t\tscope = mono_metadata_string_heap (image, scope_token);\n\t\t}\n\t}\n\tflags = piinfo->piflags;\n\t\n\tattr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);\n\n\tMONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));\n\tMONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, import));\n\tattr->call_conv = (flags & 0x700) >> 8;\n\tattr->charset = ((flags & 0x6) >> 1) + 1;\n\tif (attr->charset == 1)\n\t\tattr->charset = 2;\n\tattr->exact_spelling = (flags & 0x1) != 0;\n\tattr->set_last_error = (flags & 0x40) != 0;\n\tattr->best_fit_mapping = (flags & 0x30) == 0x10;\n\tattr->throw_on_unmappable = (flags & 0x3000) == 0x1000;\n\tattr->preserve_sig = FALSE;\n\n\treturn attr;\n}\n\nstatic MonoReflectionMethod *\nves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMonoMethodInflated *imethod;\n\tMonoMethod *result;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->method->is_generic)\n\t\treturn method;\n\n\tif (!method->method->is_inflated)\n\t\treturn NULL;\n\n\timethod = (MonoMethodInflated *) method->method;\n\n\tresult = imethod->declaring;\n\t/* Not a generic method. */\n\tif (!result->is_generic)\n\t\treturn NULL;\n\n\tif (method->method->klass->image->dynamic) {\n\t\tMonoDynamicImage *image = (MonoDynamicImage*)method->method->klass->image;\n\t\tMonoReflectionMethod *res;\n\n\t\t/*\n\t\t * FIXME: Why is this stuff needed at all ? Why can't the code below work for\n\t\t * the dynamic case as well ?\n\t\t */\n\t\tmono_loader_lock ();\n\t\tres = mono_g_hash_table_lookup (image->generic_def_objects, imethod);\n\t\tmono_loader_unlock ();\n\n\t\tif (res)\n\t\t\treturn res;\n\t}\n\n\tif (imethod->context.class_inst) {\n\t\tMonoClass *klass = ((MonoMethod *) imethod)->klass;\n\t\t/*Generic methods gets the context of the GTD.*/\n\t\tif (mono_class_get_context (klass))\n\t\t\tresult = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));\n\t}\n\n\treturn mono_method_get_object (mono_object_domain (method), result, NULL);\n}\n\nstatic gboolean\nves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_signature (method->method)->generic_param_count != 0;\n}\n\nstatic gboolean\nves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn method->method->is_generic;\n}\n\nstatic MonoArray*\nves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)\n{\n\tMonoArray *res;\n\tMonoDomain *domain;\n\tint count, i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (method);\n\n\tif (method->method->is_inflated) {\n\t\tMonoGenericInst *inst = mono_method_get_context (method->method)->method_inst;\n\n\t\tif (inst) {\n\t\t\tcount = inst->type_argc;\n\t\t\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\t\t\tfor (i = 0; i < count; i++)\n\t\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tcount = mono_method_signature (method->method)->generic_param_count;\n\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoGenericContainer *container = mono_method_get_generic_container (method->method);\n\t\tMonoGenericParam *param = mono_generic_container_get_param (container, i);\n\t\tMonoClass *pklass = mono_class_from_generic_parameter (\n\t\t\tparam, method->method->klass->image, TRUE);\n\t\tmono_array_setref (res, i,\n\t\t\t\tmono_type_get_object (domain, &pklass->byval_arg));\n\t}\n\n\treturn res;\n}\n\nstatic MonoObject *\nves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoException **exc) \n{\n\t/* \n\t * Invoke from reflection is supposed to always be a virtual call (the API\n\t * is stupid), mono_runtime_invoke_*() calls the provided method, allowing\n\t * greater flexibility.\n\t */\n\tMonoMethod *m = method->method;\n\tint pcount;\n\tvoid *obj = this;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*exc = NULL;\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_method (m);\n\n\tif (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {\n\t\tif (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (this) {\n\t\t\tif (!mono_object_isinst (this, m->klass)) {\n\t\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Object does not match target type.\"));\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tm = mono_object_get_virtual_method (this, m);\n\t\t\t/* must pass the pointer to the value for valuetype methods */\n\t\t\tif (m->klass->valuetype)\n\t\t\t\tobj = mono_object_unbox (this);\n\t\t} else if (strcmp (m->name, \".ctor\") && !m->wrapper_type) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Non-static method requires a target.\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tpcount = params? mono_array_length (params): 0;\n\tif (pcount != mono_method_signature (m)->param_count) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name (mono_defaults.corlib, \"System.Reflection\", \"TargetParameterCountException\"));\n\t\treturn NULL;\n\t}\n\n\tif ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, \".ctor\") && !this) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Cannot invoke constructor of an abstract class.\"));\n\t\treturn NULL;\n\t}\n\n\tif (m->klass->image->assembly->ref_only) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_get_exception_invalid_operation (\"It is illegal to invoke a method on a type loaded using the ReflectionOnly api.\"));\n\t\treturn NULL;\n\t}\n\t\n\tif (m->klass->rank && !strcmp (m->name, \".ctor\")) {\n\t\tint i;\n\t\tmono_array_size_t *lengths;\n\t\tmono_array_size_t *lower_bounds;\n\t\tpcount = mono_array_length (params);\n\t\tlengths = alloca (sizeof (mono_array_size_t) * pcount);\n\t\tfor (i = 0; i < pcount; ++i)\n\t\t\tlengths [i] = *(mono_array_size_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));\n\n\t\tif (m->klass->rank == pcount) {\n\t\t\t/* Only lengths provided. */\n\t\t\tlower_bounds = NULL;\n\t\t} else {\n\t\t\tg_assert (pcount == (m->klass->rank * 2));\n\t\t\t/* lower bounds are first. */\n\t\t\tlower_bounds = lengths;\n\t\t\tlengths += m->klass->rank;\n\t\t}\n\n\t\treturn (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);\n\t}\n\treturn mono_runtime_invoke_array (m, obj, params, NULL);\n}\n\nstatic MonoObject *\nves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs) \n{\n\tMonoDomain *domain = mono_object_domain (method); \n\tMonoMethod *m = method->method;\n\tMonoMethodSignature *sig = mono_method_signature (m);\n\tMonoArray *out_args;\n\tMonoObject *result;\n\tint i, j, outarg_count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (m->klass == mono_defaults.object_class) {\n\n\t\tif (!strcmp (m->name, \"FieldGetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tif (field_klass->valuetype)\n\t\t\t\t\t\tresult = mono_value_box (domain, field_klass, (char *)this + field->offset);\n\t\t\t\t\telse \n\t\t\t\t\t\tresult = *((gpointer *)((char *)this + field->offset));\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 1);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\t\t\t\t\tmono_array_setref (out_args, 0, result);\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t} else if (!strcmp (m->name, \"FieldSetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tguint32 size;\n\t\t\tgint32 align;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tMonoObject *val = mono_array_get (params, gpointer, 2);\n\n\t\t\t\t\tif (field_klass->valuetype) {\n\t\t\t\t\t\tsize = mono_type_size (field->type, &align);\n#ifdef HAVE_SGEN_GC\n\t\t\t\t\t\tmono_gc_wbarrier_value_copy ((char *)this + field->offset, (char*)val + sizeof (MonoObject), 1, field_klass);\n#endif\n\t\t\t\t\t\tmemcpy ((char *)this + field->offset, \n\t\t\t\t\t\t\t((char *)val) + sizeof (MonoObject), size);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmono_gc_wbarrier_set_field (this, (char*)this + field->offset, val);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 0);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t}\n\t}\n\n\tfor (i = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) \n\t\t\toutarg_count++;\n\t}\n\n\tout_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);\n\t\n\t/* handle constructors only for objects already allocated */\n\tif (!strcmp (method->method->name, \".ctor\"))\n\t\tg_assert (this);\n\n\t/* This can be called only on MBR objects, so no need to unbox for valuetypes. */\n\tg_assert (!method->method->klass->valuetype);\n\tresult = mono_runtime_invoke_array (method->method, this, params, NULL);\n\n\tfor (i = 0, j = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) {\n\t\t\tgpointer arg;\n\t\t\targ = mono_array_get (params, gpointer, i);\n\t\t\tmono_array_setref (out_args, j, arg);\n\t\t\tj++;\n\t\t}\n\t}\n\n\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\treturn result;\n}\n\nstatic guint64\nread_enum_value (char *mem, int type)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\t\treturn *(guint8*)mem;\n\tcase MONO_TYPE_I1:\n\t\treturn *(gint8*)mem;\n\tcase MONO_TYPE_U2:\n\t\treturn *(guint16*)mem;\n\tcase MONO_TYPE_I2:\n\t\treturn *(gint16*)mem;\n\tcase MONO_TYPE_U4:\n\t\treturn *(guint32*)mem;\n\tcase MONO_TYPE_I4:\n\t\treturn *(gint32*)mem;\n\tcase MONO_TYPE_U8:\n\t\treturn *(guint64*)mem;\n\tcase MONO_TYPE_I8:\n\t\treturn *(gint64*)mem;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn 0;\n}\n\nstatic void\nwrite_enum_value (char *mem, int type, guint64 value)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1: {\n\t\tguint8 *p = (guint8*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2: {\n\t\tguint16 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4: {\n\t\tguint32 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8: {\n\t\tguint64 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn;\n}\n\nstatic MonoObject *\nves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)\n{\n\tMonoDomain *domain; \n\tMonoClass *enumc, *objc;\n\tMonoObject *res;\n\tMonoType *etype;\n\tguint64 val;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (enumType);\n\tMONO_CHECK_ARG_NULL (value);\n\n\tdomain = mono_object_domain (enumType); \n\tenumc = mono_class_from_mono_type (enumType->type);\n\tobjc = value->vtable->klass;\n\n\tif (!enumc->enumtype)\n\t\tmono_raise_exception (mono_get_exception_argument (\"enumType\", \"Type provided must be an Enum.\"));\n\tif (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))\n\t\tmono_raise_exception (mono_get_exception_argument (\"value\", \"The value passed in must be an enum base or an underlying type for an enum, such as an Int32.\"));\n\n\tetype = mono_class_enum_basetype (enumc);\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\tres = mono_object_new (domain, enumc);\n\tval = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);\n\twrite_enum_value ((char *)res + sizeof (MonoObject), etype->type, val);\n\n\treturn res;\n}\n\nstatic MonoObject *\nves_icall_System_Enum_get_value (MonoObject *this)\n{\n\tMonoObject *res;\n\tMonoClass *enumc;\n\tgpointer dst;\n\tgpointer src;\n\tint size;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!this)\n\t\treturn NULL;\n\n\tg_assert (this->vtable->klass->enumtype);\n\t\n\tenumc = mono_class_from_mono_type (mono_class_enum_basetype (this->vtable->klass));\n\tres = mono_object_new (mono_object_domain (this), enumc);\n\tdst = (char *)res + sizeof (MonoObject);\n\tsrc = (char *)this + sizeof (MonoObject);\n\tsize = mono_class_value_size (enumc, NULL);\n\n\tmemcpy (dst, src, size);\n\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)\n{\n\tMonoType *etype;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tetype = mono_class_enum_basetype (mono_class_from_mono_type (type->type));\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), etype);\n}\n\nstatic int\nves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)\n{\n\tgpointer tdata = (char *)this + sizeof (MonoObject);\n\tgpointer odata = (char *)other + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n#define COMPARE_ENUM_VALUES(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me > other ? 1 : -1; \\\n\t} while (0)\n\n#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me - other; \\\n\t} while (0)\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_U1:\n\t\t\tCOMPARE_ENUM_VALUES (guint8);\n\t\tcase MONO_TYPE_I1:\n\t\t\tCOMPARE_ENUM_VALUES (gint8);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\tCOMPARE_ENUM_VALUES_RANGE (guint16);\n\t\tcase MONO_TYPE_I2:\n\t\t\tCOMPARE_ENUM_VALUES (gint16);\n\t\tcase MONO_TYPE_U4:\n\t\t\tCOMPARE_ENUM_VALUES (guint32);\n\t\tcase MONO_TYPE_I4:\n\t\t\tCOMPARE_ENUM_VALUES (gint32);\n\t\tcase MONO_TYPE_U8:\n\t\t\tCOMPARE_ENUM_VALUES (guint64);\n\t\tcase MONO_TYPE_I8:\n\t\t\tCOMPARE_ENUM_VALUES (gint64);\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n#undef COMPARE_ENUM_VALUES_RANGE\n#undef COMPARE_ENUM_VALUES\n\treturn 0;\n}\n\nstatic int\nves_icall_System_Enum_get_hashcode (MonoObject *this)\n{\n\tgpointer data = (char *)this + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_I1:\t\n\t\t\treturn *((gint8*)data);\n\t\tcase MONO_TYPE_U1:\n\t\t\treturn *((guint8*)data);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\treturn *((guint16*)data);\n\t\t\n\t\tcase MONO_TYPE_I2:\n\t\t\treturn *((gint16*)data);\n\t\tcase MONO_TYPE_U4:\n\t\t\treturn *((guint32*)data);\n\t\tcase MONO_TYPE_I4:\n\t\t\treturn *((gint32*)data);\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8: {\n\t\t\tgint64 value = *((gint64*)data);\n\t\t\treturn (gint)(value & 0xffffffff) ^ (int)(value >> 32);\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n\treturn 0;\n}\n\nstatic void\nves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoClass *enumc = mono_class_from_mono_type (type->type);\n\tguint j = 0, nvalues, crow;\n\tgpointer iter;\n\tMonoClassField *field;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc)));\n\tnvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;\n\tMONO_STRUCT_SETREF (info, names, mono_array_new (domain, mono_defaults.string_class, nvalues));\n\tMONO_STRUCT_SETREF (info, values, mono_array_new (domain, enumc, nvalues));\n\n\tcrow = -1;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (enumc, &iter))) {\n\t\tconst char *p;\n\t\tint len;\n\t\tMonoTypeEnum def_type;\n\t\t\n\t\tif (strcmp (\"value__\", mono_field_get_name (field)) == 0)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tmono_array_setref (info->names, j, mono_string_new (domain, mono_field_get_name (field)));\n\n\t\tp = mono_class_get_field_default_value (field, &def_type);\n\t\tlen = mono_metadata_decode_blob_size (p, &p);\n\t\tswitch (mono_class_enum_basetype (enumc)->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\t\tmono_array_set (info->values, gchar, j, *p);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\t\tmono_array_set (info->values, gint16, j, read16 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tmono_array_set (info->values, gint32, j, read32 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tmono_array_set (info->values, gint64, j, read64 (p));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_enum_info\", mono_class_enum_basetype (enumc)->type);\n\t\t}\n\t\t++j;\n\t}\n}\n\nenum {\n\tBFLAGS_IgnoreCase = 1,\n\tBFLAGS_DeclaredOnly = 2,\n\tBFLAGS_Instance = 4,\n\tBFLAGS_Static = 8,\n\tBFLAGS_Public = 0x10,\n\tBFLAGS_NonPublic = 0x20,\n\tBFLAGS_FlattenHierarchy = 0x40,\n\tBFLAGS_InvokeMethod = 0x100,\n\tBFLAGS_CreateInstance = 0x200,\n\tBFLAGS_GetField = 0x400,\n\tBFLAGS_SetField = 0x800,\n\tBFLAGS_GetProperty = 0x1000,\n\tBFLAGS_SetProperty = 0x2000,\n\tBFLAGS_ExactBinding = 0x10000,\n\tBFLAGS_SuppressChangeType = 0x20000,\n\tBFLAGS_OptionalParamBinding = 0x40000\n};\n\nstatic MonoReflectionField *\nves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass;\n\tint match;\n\tMonoClassField *field;\n\tgpointer iter;\n\tchar *utf8_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!name)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\nhandle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\n\t\tif (field->type == NULL)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\t\n\t\tutf8_name = mono_string_to_utf8 (name);\n\n\t\tif (compare_func (mono_field_get_name (field), utf8_name)) {\n\t\t\tg_free (utf8_name);\n\t\t\tcontinue;\n\t\t}\n\t\tg_free (utf8_name);\n\t\t\n\t\treturn mono_field_get_object (domain, klass, field);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter;\n\tMonoClassField *field;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.field_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tmono_ptr_array_init (tmp_array, 2);\n\t\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_field_get_object (domain, refklass, field);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic gboolean\nmethod_nonpublic (MonoMethod* method, gboolean start_klass)\n{\n\tswitch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) {\n\t\tcase METHOD_ATTRIBUTE_ASSEM:\n\t\t\treturn (start_klass || mono_defaults.generic_ilist_class);\n\t\tcase METHOD_ATTRIBUTE_PRIVATE:\n\t\t\treturn start_klass;\n\t\tcase METHOD_ATTRIBUTE_PUBLIC:\n\t\t\treturn FALSE;\n\t\tdefault:\n\t\t\treturn TRUE;\n\t}\n}\n\nstatic MonoArray*\nves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tstatic MonoClass *MethodInfo_array;\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tgpointer iter;\n\tMonoObject *member;\n\tint i, len, match, nslots;\n\t/*FIXME, use MonoBitSet*/\n\tguint32 method_slots_default [8];\n\tguint32 *method_slots = NULL;\n\tgchar *mname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMonoVTable *array_vtable;\n\tMonoException *ex;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!MethodInfo_array) {\n\t\tMonoClass *klass = mono_array_class_get (mono_defaults.method_info_class, 1);\n\t\tmono_memory_barrier ();\n\t\tMethodInfo_array = klass;\n\t}\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tarray_vtable = mono_class_vtable_full (domain, MethodInfo_array, TRUE);\n\tif (type->type->byref)\n\t\treturn mono_array_new_specific (array_vtable, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\tlen = 0;\n\tif (name != NULL) {\n\t\tmname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\t/* An optimization for calls made from Delegate:CreateDelegate () */\n\tif (klass->delegate && mname && !strcmp (mname, \"Invoke\") && (bflags == (BFLAGS_Public | BFLAGS_Static | BFLAGS_Instance))) {\n\t\tmethod = mono_get_delegate_invoke (klass);\n\t\tif (mono_loader_get_last_error ())\n\t\t\tgoto loader_error;\n\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tres = mono_array_new_specific (array_vtable, 1);\n\t\tmono_array_setref (res, 0, member);\n\t\tg_free (mname);\n\t\treturn res;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\n\n\tif (is_generic_parameter (type->type))\n\t\tnslots = mono_class_get_vtable_size (klass->parent);\n\telse\n\t\tnslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : mono_class_get_vtable_size (klass);\n\tif (nslots >= sizeof (method_slots_default) * 8) {\n\t\tmethod_slots = g_new0 (guint32, nslots / 32 + 1);\n\t} else {\n\t\tmethod_slots = method_slots_default;\n\t\tmemset (method_slots, 0, sizeof (method_slots_default));\n\t}\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\t\t\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (method->slot != -1) {\n\t\t\tg_assert (method->slot < nslots);\n\t\t\tif (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))\n\t\t\t\tcontinue;\n\t\t\tif (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT))\n\t\t\t\tmethod_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);\n\t\t}\n\n\t\tif (method->name [0] == '.' && (strcmp (method->name, \".ctor\") == 0 || strcmp (method->name, \".cctor\") == 0))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((bflags & BFLAGS_NonPublic) && method_nonpublic (method, (klass == startklass))) {\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (mname, method->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tmatch = 0;\n\t\t\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\t\t\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\n\tres = mono_array_new_specific (array_vtable, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\treturn res;\n\nloader_error:\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\tmono_ptr_array_destroy (tmp_array);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tex = mono_class_get_exception_for_failure (klass);\n\t} else {\n\t\tex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\t\tmono_loader_clear_error ();\n\t}\n\tmono_raise_exception (ex);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_ConstructorInfo;\n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter = NULL;\n\tMonoPtrArray tmp_array;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, mono_defaults.method_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\tif (!System_Reflection_ConstructorInfo)\n\t\tSystem_Reflection_ConstructorInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"ConstructorInfo\");\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (strcmp (method->name, \".ctor\") && strcmp (method->name, \".cctor\"))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, System_Reflection_ConstructorInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic guint\nproperty_hash (gconstpointer data)\n{\n\tMonoProperty *prop = (MonoProperty*)data;\n\n\treturn g_str_hash (prop->name);\n}\n\nstatic gboolean\nproperty_equal (MonoProperty *prop1, MonoProperty *prop2)\n{\n\t// Properties are hide-by-name-and-signature\n\tif (!g_str_equal (prop1->name, prop2->name))\n\t\treturn FALSE;\n\n\tif (prop1->get && prop2->get && !mono_metadata_signature_equal (mono_method_signature (prop1->get), mono_method_signature (prop2->get)))\n\t\treturn FALSE;\n\tif (prop1->set && prop2->set && !mono_metadata_signature_equal (mono_method_signature (prop1->set), mono_method_signature (prop2->set)))\n\t\treturn FALSE;\n\treturn TRUE;\n}\n\nstatic gboolean\nproperty_accessor_nonpublic (MonoMethod* accessor, gboolean start_klass)\n{\n\tif (!accessor)\n\t\treturn FALSE;\n\n\treturn method_nonpublic (accessor, start_klass);\n}\n\nstatic MonoArray*\nves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_PropertyInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoProperty *prop;\n\tint i, match;\n\tguint32 flags;\n\tgchar *propname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tgpointer iter;\n\tGHashTable *properties;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/\n\n\tif (!System_Reflection_PropertyInfo)\n\t\tSystem_Reflection_PropertyInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"PropertyInfo\");\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_PropertyInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tif (name != NULL) {\n\t\tpropname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\n\tproperties = g_hash_table_new (property_hash, (GEqualFunc)property_equal);\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tg_hash_table_destroy (properties);\n\t\tif (name != NULL)\n\t\t\tg_free (propname);\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\t}\n\n\titer = NULL;\n\twhile ((prop = mono_class_get_properties (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = prop->get;\n\t\tif (!method)\n\t\t\tmethod = prop->set;\n\t\tif (method)\n\t\t\tflags = method->flags;\n\t\telse\n\t\t\tflags = 0;\n\t\tif ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||\n\t\t\t(prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if (bflags & BFLAGS_NonPublic) {\n\t\t\tif (property_accessor_nonpublic(prop->get, startklass == klass) ||\n\t\t\t\tproperty_accessor_nonpublic(prop->set, startklass == klass)) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (propname, prop->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (g_hash_table_lookup (properties, prop))\n\t\t\tcontinue;\n\n\t\tmono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));\n\t\t\n\t\tg_hash_table_insert (properties, prop, prop);\n\t}\n\tif ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))\n\t\tgoto handle_parent;\n\n\tg_hash_table_destroy (properties);\n\tg_free (propname);\n\n\tres = mono_array_new_cached (domain, System_Reflection_PropertyInfo, mono_ptr_array_size (tmp_array));\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionEvent *\nves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain;\n\tMonoClass *klass, *startklass;\n\tgpointer iter;\n\tMonoEvent *event;\n\tMonoMethod *method;\n\tgchar *event_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\tevent_name = mono_string_to_utf8 (name);\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tdomain = mono_object_domain (type);\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tif (compare_func (event->name, event_name))\n\t\t\tcontinue;\n\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Public))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\t\tcontinue;\n\t\t\t\tif ((klass != startklass) && (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PRIVATE)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Static))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (!(bflags & BFLAGS_FlattenHierarchy) && (klass != startklass))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_Instance))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else \n\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\tcontinue;\n\t\t\n\t\tg_free (event_name);\n\t\treturn mono_event_get_object (domain, startklass, event);\n\t}\n\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (event_name);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_EventInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoEvent *event;\n\tint i, match;\n\tgpointer iter;\n\t\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!System_Reflection_EventInfo)\n\t\tSystem_Reflection_EventInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"EventInfo\");\n\n\tdomain = mono_object_domain (type);\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_EventInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\t\tmatch++;\n\t\t\t} else if ((klass == startklass) || (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) {\n\t\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method) {\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\t\tmatch++;\n\t\t\t} else {\n\t\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, System_Reflection_EventInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *nested;\n\tchar *str;\n\tgpointer iter;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = mono_class_from_mono_type (type->type);\n\tstr = mono_string_to_utf8 (name);\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially a\n\t * nested type of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tint match = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tif (strcmp (nested->name, str) == 0){\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (domain, &nested->byval_arg);\n\t\t}\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\tg_free (str);\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tMonoClass *nested;\n\tgpointer iter;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.monotype_class, 0);\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially the set\n\t * of nested types of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\tmono_ptr_array_init (tmp_array, 1);\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}\n\nstatic MonoReflectionType*\nves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)\n{\n\tgchar *str;\n\tMonoType *type = NULL;\n\tMonoTypeNameParse info;\n\tgboolean type_resolve;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* On MS.NET, this does not fire a TypeResolve event */\n\ttype_resolve = TRUE;\n\tstr = mono_string_to_utf8 (name);\n\t/*g_print (\"requested type %s in %s\\n\", str, assembly->assembly->aname.name);*/\n\tif (!mono_reflection_parse_type (str, &info)) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) /* uhm: this is a parse error, though... */\n\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t/*g_print (\"failed parse\\n\");*/\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) {\n\t\t\t/* 1.0 and 2.0 throw different exceptions */\n\t\t\tif (mono_defaults.generic_ilist_class)\n\t\t\t\tmono_raise_exception (mono_get_exception_argument (NULL, \"Type names passed to Assembly.GetType() must not specify an assembly.\"));\n\t\t\telse\n\t\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tif (module != NULL) {\n\t\tif (module->image)\n\t\t\ttype = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);\n\t\telse\n\t\t\ttype = NULL;\n\t}\n\telse\n\t\tif (assembly->assembly->dynamic) {\n\t\t\t/* Enumerate all modules */\n\t\t\tMonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;\n\t\t\tint i;\n\n\t\t\ttype = NULL;\n\t\t\tif (abuilder->modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->modules); ++i) {\n\t\t\t\t\tMonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!type && abuilder->loaded_modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {\n\t\t\t\t\tMonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\ttype = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);\n\tg_free (str);\n\tmono_reflection_free_type_info (&info);\n\tif (!type) {\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tif (mono_loader_get_last_error () && mono_defaults.generic_ilist_class)\n\t\t\te = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\n\t\tmono_loader_clear_error ();\n\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\n\t\treturn NULL;\n\t}\n\n\tif (type->type == MONO_TYPE_CLASS) {\n\t\tMonoClass *klass = mono_type_get_class (type);\n\n\t\tif (mono_is_security_manager_active () && !klass->exception_type)\n\t\t\t/* Some security problems are detected during generic vtable construction */\n\t\t\tmono_class_setup_vtable (klass);\n\t\t/* need to report exceptions ? */\n\t\tif (throwOnError && klass->exception_type) {\n\t\t\t/* report SecurityException (or others) that occured when loading the assembly */\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (klass);\n\t\t\tmono_loader_clear_error ();\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\t/* g_print (\"got it\\n\"); */\n\treturn mono_type_get_object (mono_object_domain (assembly), type);\n}\n\nstatic gboolean\nreplace_shadow_path (MonoDomain *domain, gchar *dirname, gchar **filename)\n{\n\tgchar *content;\n\tgchar *shadow_ini_file;\n\tgsize len;\n\n\t/* Check for shadow-copied assembly */\n\tif (mono_is_shadow_copy_enabled (domain, dirname)) {\n\t\tshadow_ini_file = g_build_filename (dirname, \"__AssemblyInfo__.ini\", NULL);\n\t\tcontent = NULL;\n\t\tif (!g_file_get_contents (shadow_ini_file, &content, &len, NULL) ||\n\t\t\t!g_file_test (content, G_FILE_TEST_IS_REGULAR)) {\n\t\t\tif (content) {\n\t\t\t\tg_free (content);\n\t\t\t\tcontent = NULL;\n\t\t\t}\n\t\t}\n\t\tg_free (shadow_ini_file);\n\t\tif (content != NULL) {\n\t\t\tif (*filename)\n\t\t\t\tg_free (*filename);\n\t\t\t*filename = content;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res = NULL;\n\tgchar *uri;\n\tgchar *absolute;\n\tgchar *dirname;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tabsolute = g_strdup (mass->image->name);\n\t\tdirname = g_path_get_dirname (absolute);\n\t} else {\n\t\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\t\tdirname = g_strdup (mass->basedir);\n\t}\n\n\treplace_shadow_path (domain, dirname, &absolute);\n\tg_free (dirname);\n#if PLATFORM_WIN32\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (absolute) - 1; i >= 0; i--)\n\t\t\tif (absolute [i] == '\\\\')\n\t\t\t\tabsolute [i] = '/';\n\t}\n#endif\n\tif (escaped) {\n\t\turi = g_filename_to_uri (absolute, NULL, NULL);\n\t} else {\n\t\tconst char *prepend = \"file://\";\n#if PLATFORM_WIN32\n\t\tif (*absolute == '/' && *(absolute + 1) == '/') {\n\t\t\tprepend = \"file:\";\n\t\t} else {\n\t\t\tprepend = \"file:///\";\n\t\t}\n#endif\n\t\turi = g_strconcat (prepend, absolute, NULL);\n\t}\n\n\tif (uri) {\n\t\tres = mono_string_new (domain, uri);\n\t\tg_free (uri);\n\t}\n\tg_free (absolute);\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)\n{\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mass->in_gac;\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)\n{\n\tgchar *name;\n\tMonoAssembly *res;\n\tMonoImageOpenStatus status;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tname = mono_string_to_utf8 (mname);\n\tres = mono_assembly_load_with_partial_name (name, &status);\n\n\tg_free (name);\n\n\tif (res == NULL)\n\t\treturn NULL;\n\treturn mono_assembly_get_object (mono_domain_get (), res);\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoString *res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));\n\n\treturn res;\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn assembly->assembly->ref_only;\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (domain, assembly->assembly->image->version);\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) \n{\n\tguint32 token = mono_image_get_entry_point (assembly->assembly->image);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!token)\n\t\treturn NULL;\n\treturn mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);\n}\n\nstatic MonoReflectionModule*\nves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly) \n{\n\treturn mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tMonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);\n\tint i;\n\tconst char *val;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));\n\t\tmono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));\n\t}\n\treturn result;\n}\n\nstatic MonoObject*\ncreate_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)\n{\n\tstatic MonoClass *System_Version = NULL;\n\tstatic MonoMethod *create_version = NULL;\n\tMonoObject *result;\n\tgpointer args [4];\n\t\n\tif (!System_Version) {\n\t\tSystem_Version = mono_class_from_name (mono_defaults.corlib, \"System\", \"Version\");\n\t\tg_assert (System_Version);\n\t}\n\n\tif (!create_version) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\":.ctor(int,int,int,int)\", FALSE);\n\t\tcreate_version = mono_method_desc_search_in_class (desc, System_Version);\n\t\tg_assert (create_version);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\targs [0] = &major;\n\targs [1] = &minor;\n\targs [2] = &build;\n\targs [3] = &revision;\n\tresult = mono_object_new (domain, System_Version);\n\tmono_runtime_invoke (create_version, result, args, NULL);\n\n\treturn result;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly) \n{\n\tstatic MonoClass *System_Reflection_AssemblyName;\n\tMonoArray *result;\n\tMonoDomain *domain = mono_object_domain (assembly);\n\tint i, count = 0;\n\tstatic MonoMethod *create_culture = NULL;\n\tMonoImage *image = assembly->assembly->image;\n\tMonoTableInfo *t;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!System_Reflection_AssemblyName)\n\t\tSystem_Reflection_AssemblyName = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"AssemblyName\");\n\n\tt = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];\n\tcount = t->rows;\n\n\tresult = mono_array_new (domain, System_Reflection_AssemblyName, count);\n\n\tif (count > 0 && !create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\n\t\t\t\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionAssemblyName *aname;\n\t\tguint32 cols [MONO_ASSEMBLYREF_SIZE];\n\n\t\tmono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);\n\n\t\taname = (MonoReflectionAssemblyName *) mono_object_new (\n\t\t\tdomain, System_Reflection_AssemblyName);\n\n\t\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));\n\n\t\taname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];\n\t\taname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];\n\t\taname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];\n\t\taname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];\n\t\taname->flags = cols [MONO_ASSEMBLYREF_FLAGS];\n\t\taname->versioncompat = 1; /* SameMachine (default) */\n\t\taname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));\n\n\t\tif (create_culture) {\n\t\t\tgpointer args [2];\n\t\t\tMonoBoolean assembly_ref = 1;\n\t\t\targs [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));\n\t\t\targs [1] = &assembly_ref;\n\t\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t\t}\n\t\t\n\t\tif (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {\n\t\t\tconst gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);\n\t\t\tguint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\t\tif ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {\n\t\t\t\t/* public key token isn't copied - the class library will \n\t\t \t\tautomatically generate it from the public key if required */\n\t\t\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t} else {\n\t\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t}\n\t\t} else {\n\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\t}\n\t\t\n\t\t/* note: this function doesn't return the codebase on purpose (i.e. it can\n\t\t be used under partial trust as path information isn't present). */\n\n\t\tmono_array_setref (result, i, aname);\n\t}\n\treturn result;\n}\n\ntypedef struct {\n\tMonoArray *res;\n\tint idx;\n} NameSpaceInfo;\n\nstatic void\nforeach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)\n{\n\tMonoString *name = mono_string_new (mono_object_domain (info->res), key);\n\n\tmono_array_setref (info->res, info->idx, name);\n\tinfo->idx++;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly) \n{\n\tMonoImage *img = assembly->assembly->image;\n\tMonoArray *res;\n\tNameSpaceInfo info;\n\tint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_lock (img);\n\tmono_image_init_name_cache (img);\n\nRETRY_LEN:\n\tlen = g_hash_table_size (img->name_cache);\n\tmono_image_unlock (img);\n\n\t/*we can't create objects holding the image lock */\n\tres = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, len);\n\n\tmono_image_lock (img);\n\t/*len might have changed, create a new array*/\n\tif (len != g_hash_table_size (img->name_cache))\n\t\tgoto RETRY_LEN;\n\n\tinfo.res = res;\n\tinfo.idx = 0;\n\tg_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);\n\tmono_image_unlock (img);\n\n\treturn res;\n}\n\n/* move this in some file in mono/util/ */\nstatic char *\ng_concat_dir_and_file (const char *dir, const char *file)\n{\n\tg_return_val_if_fail (dir != NULL, NULL);\n\tg_return_val_if_fail (file != NULL, NULL);\n\n /*\n\t * If the directory name doesn't have a / on the end, we need\n\t * to add one so we get a proper path to the file\n\t */\n\tif (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)\n\t\treturn g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);\n\telse\n\t\treturn g_strconcat (dir, file, NULL);\n}\n\nstatic void *\nves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module) \n{\n\tchar *n = mono_string_to_utf8 (name);\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tguint32 i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 impl, file_idx;\n\tconst char *val;\n\tMonoImage *module;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn NULL;\n\t/* FIXME */\n\timpl = cols [MONO_MANIFEST_IMPLEMENTATION];\n\tif (impl) {\n\t\t/*\n\t\t * this code should only be called after obtaining the \n\t\t * ResourceInfo and handling the other cases.\n\t\t */\n\t\tg_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);\n\t\tfile_idx = impl >> MONO_IMPLEMENTATION_BITS;\n\n\t\tmodule = mono_image_load_file_for_image (assembly->assembly->image, file_idx);\n\t\tif (!module)\n\t\t\treturn NULL;\n\t}\n\telse\n\t\tmodule = assembly->assembly->image;\n\n\tmono_gc_wbarrier_generic_store (ref_module, (MonoObject*) mono_module_get_object (mono_domain_get (), module));\n\n\treturn (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);\n}\n\nstatic gboolean\nves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)\n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tint i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 file_cols [MONO_FILE_SIZE];\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = mono_string_to_utf8 (name);\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn FALSE;\n\n\tif (!cols [MONO_MANIFEST_IMPLEMENTATION]) {\n\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;\n\t}\n\telse {\n\t\tswitch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {\n\t\tcase MONO_IMPLEMENTATION_FILE:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\ttable = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\t\t\tmono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);\n\t\t\tMONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));\n\t\t\tif (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\t\tinfo->location = 0;\n\t\t\telse\n\t\t\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_ASSEMBLYREF:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\tmono_assembly_load_reference (assembly->assembly->image, i - 1);\n\t\t\tif (assembly->assembly->image->references [i - 1] == (gpointer)-1) {\n\t\t\t\tchar *msg = g_strdup_printf (\"Assembly %d referenced from assembly %s not found \", i - 1, assembly->assembly->image->name);\n\t\t\t\tMonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);\n\t\t\t\tg_free (msg);\n\t\t\t\tmono_raise_exception (ex);\n\t\t\t}\n\t\t\tMONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));\n\n\t\t\t/* Obtain info recursively */\n\t\t\tves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);\n\t\t\tinfo->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_EXP_TYPE:\n\t\t\tg_assert_not_reached ();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}\n\nstatic MonoObject*\nves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\tMonoArray *result = NULL;\n\tint i, count;\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* check hash if needed */\n\tif (name) {\n\t\tn = mono_string_to_utf8 (name);\n\t\tfor (i = 0; i < table->rows; ++i) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tif (strcmp (val, n) == 0) {\n\t\t\t\tMonoString *fn;\n\t\t\t\tg_free (n);\n\t\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\t\tfn = mono_string_new (mono_object_domain (assembly), n);\n\t\t\t\tg_free (n);\n\t\t\t\treturn (MonoObject*)fn;\n\t\t\t}\n\t\t}\n\t\tg_free (n);\n\t\treturn NULL;\n\t}\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))\n\t\t\tcount ++;\n\t}\n\n\tresult = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\tmono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));\n\t\t\tg_free (n);\n\t\t\tcount ++;\n\t\t}\n\t}\n\treturn (MonoObject*)result;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_domain_get();\n\tMonoArray *res;\n\tMonoClass *klass;\n\tint i, j, file_count = 0;\n\tMonoImage **modules;\n\tguint32 module_count, real_module_count;\n\tMonoTableInfo *table;\n\tguint32 cols [MONO_FILE_SIZE];\n\tMonoImage *image = assembly->assembly->image;\n\n\tg_assert (image != NULL);\n\tg_assert (!assembly->assembly->dynamic);\n\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tfile_count = table->rows;\n\n\tmodules = image->modules;\n\tmodule_count = image->module_count;\n\n\treal_module_count = 0;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i])\n\t\t\treal_module_count ++;\n\n\tklass = mono_class_from_name (mono_defaults.corlib, \"System.Reflection\", \"Module\");\n\tres = mono_array_new (domain, klass, 1 + real_module_count + file_count);\n\n\tmono_array_setref (res, 0, mono_module_get_object (domain, image));\n\tj = 1;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i]) {\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, modules[i]));\n\t\t\t++j;\n\t\t}\n\n\tfor (i = 0; i < file_count; ++i, ++j) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);\n\t\tif (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\tmono_array_setref (res, j, mono_module_file_get_object (domain, image, i));\n\t\telse {\n\t\t\tMonoImage *m = mono_image_load_file_for_image (image, i + 1);\n\t\t\tif (!m) {\n\t\t\t\tMonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME]));\n\t\t\t\tmono_raise_exception (mono_get_exception_file_not_found2 (NULL, fname));\n\t\t\t}\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, m));\n\t\t}\n\t}\n\n\treturn res;\n}\n\nstatic MonoReflectionMethod*\nves_icall_GetCurrentMethod (void) \n{\n\tMonoMethod *m = mono_method_get_last_managed ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_get_object (mono_domain_get (), m, NULL);\n}\n\n\nstatic MonoMethod*\nmono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)\n{\n\tint offset = -1, i;\n\tif (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {\n\t\tMonoMethodInflated *inflated = (MonoMethodInflated*)method;\n\t\t//method is inflated, we should inflate it on the other class\n\t\tMonoGenericContext ctx;\n\t\tctx.method_inst = inflated->context.method_inst;\n\t\tctx.class_inst = inflated->context.class_inst;\n\t\tif (klass->generic_class)\n\t\t\tctx.class_inst = klass->generic_class->context.class_inst;\n\t\telse if (klass->generic_container)\n\t\t\tctx.class_inst = klass->generic_container->context.class_inst;\n\t\treturn mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx);\n\t}\n\n\tmono_class_setup_methods (method->klass);\n\tif (method->klass->exception_type)\n\t\treturn NULL;\n\tfor (i = 0; i < method->klass->method.count; ++i) {\n\t\tif (method->klass->methods [i] == method) {\n\t\t\toffset = i;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\tmono_class_setup_methods (klass);\n\tif (klass->exception_type)\n\t\treturn NULL;\n\tg_assert (offset >= 0 && offset < klass->method.count);\n\treturn klass->methods [offset];\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMethod *method, MonoType *type)\n{\n\tMonoClass *klass;\n\tif (type) {\n\t\tklass = mono_class_from_mono_type (type);\n\t\tif (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass)) \n\t\t\treturn NULL;\n\t\tif (method->klass != klass) {\n\t\t\tmethod = mono_method_get_equivalent_method (method, klass);\n\t\t\tif (!method)\n\t\t\t\treturn NULL;\n\t\t}\n\t} else\n\t\tklass = method->klass;\n\treturn mono_method_get_object (mono_domain_get (), method, klass);\n}\n\nstatic MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)\n{\n\treturn mono_method_get_object (mono_domain_get (), method, NULL);\n}\n\nstatic MonoReflectionMethodBody*\nves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)\n{\n\treturn mono_method_body_get_object (mono_domain_get (), method);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)\n{\n\tMonoMethod *dest = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_stack_walk_no_il (get_executing, &dest);\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}\n\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetEntryAssembly (void)\n{\n\tMonoDomain* domain = mono_domain_get ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!domain->entry_assembly)\n\t\treturn NULL;\n\n\treturn mono_assembly_get_object (domain, domain->entry_assembly);\n}\n\nstatic MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetCallingAssembly (void)\n{\n\tMonoMethod *m;\n\tMonoMethod *dest;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdest = NULL;\n\tmono_stack_walk_no_il (get_executing, &dest);\n\tm = dest;\n\tmono_stack_walk_no_il (get_caller, &dest);\n\tif (!dest)\n\t\tdest = m;\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}\n\nstatic MonoString *\nves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,\n\t\t\t\t gboolean assembly_qualified)\n{\n\tMonoDomain *domain = mono_object_domain (object); \n\tMonoTypeNameFormat format;\n\tMonoString *res;\n\tgchar *name;\n\n\tMONO_ARCH_SAVE_REGS;\n\tif (full_name)\n\t\tformat = assembly_qualified ?\n\t\t\tMONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :\n\t\t\tMONO_TYPE_NAME_FORMAT_FULL_NAME;\n\telse\n\t\tformat = MONO_TYPE_NAME_FORMAT_REFLECTION;\n \n\tname = mono_type_get_name_full (object->type, format);\n\tif (!name)\n\t\treturn NULL;\n\n\tif (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR)) {\n\t\tg_free (name);\n\t\treturn NULL;\n\t}\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}\n\nstatic void\nfill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)\n{\n\tstatic MonoMethod *create_culture = NULL;\n\tgpointer args [2];\n\tguint32 pkey_len;\n\tconst char *pkey_ptr;\n\tgchar *codebase;\n\tMonoBoolean assembly_ref = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));\n\taname->major = name->major;\n\taname->minor = name->minor;\n\taname->build = name->build;\n\taname->flags = name->flags;\n\taname->revision = name->revision;\n\taname->hashalg = name->hash_alg;\n\taname->versioncompat = 1; /* SameMachine (default) */\n\n\tif (by_default_version)\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));\n\n\tcodebase = NULL;\n\tif (absolute != NULL && *absolute != '\\0') {\n\t\tconst gchar *prepend = \"file://\";\n\t\tgchar *result;\n\n\t\tcodebase = g_strdup (absolute);\n\n#if PLATFORM_WIN32\n\t\t{\n\t\t\tgint i;\n\t\t\tfor (i = strlen (codebase) - 1; i >= 0; i--)\n\t\t\t\tif (codebase [i] == '\\\\')\n\t\t\t\t\tcodebase [i] = '/';\n\n\t\t\tif (*codebase == '/' && *(codebase + 1) == '/') {\n\t\t\t\tprepend = \"file:\";\n\t\t\t} else {\n\t\t\t\tprepend = \"file:///\";\n\t\t\t}\n\t\t}\n#endif\n\t\tresult = g_strconcat (prepend, codebase, NULL);\n\t\tg_free (codebase);\n\t\tcodebase = result;\n\t}\n\n\tif (codebase) {\n\t\tMONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));\n\t\tg_free (codebase);\n\t}\n\n\tif (!create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tif (name->culture) {\n\t\targs [0] = mono_string_new (domain, name->culture);\n\t\targs [1] = &assembly_ref;\n\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t}\n\n\tif (name->public_key) {\n\t\tpkey_ptr = (char*)name->public_key;\n\t\tpkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t} else if (default_publickey) {\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t}\n\n\t/* MonoAssemblyName keeps the public key token as an hexadecimal string */\n\tif (name->public_key_token [0]) {\n\t\tint i, j;\n\t\tchar *p;\n\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));\n\t\tp = mono_array_addr (aname->keyToken, char, 0);\n\n\t\tfor (i = 0, j = 0; i < 8; i++) {\n\t\t\t*p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;\n\t\t\t*p |= g_ascii_xdigit_value (name->public_key_token [j++]);\n\t\t\tp++;\n\t\t}\n\t} else if (default_token) {\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t}\n}\n\nstatic MonoString *\nves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res;\n\tgchar *name;\n\n\tname = g_strdup_printf (\n\t\t\"%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s\",\n\t\tmass->aname.name,\n\t\tmass->aname.major, mass->aname.minor, mass->aname.build, mass->aname.revision,\n\t\tmass->aname.culture && *mass->aname.culture? mass->aname.culture: \"neutral\",\n\t\tmass->aname.public_key_token [0] ? (char *)mass->aname.public_key_token : \"null\",\n\t\t(mass->aname.flags & ASSEMBLYREF_RETARGETABLE_FLAG) ? \", Retargetable=Yes\" : \"\");\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}\n\nstatic void\nves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)\n{\n\tgchar *absolute;\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\t\taname, &mass->aname, mass->image->name, TRUE,\n\t\t\tTRUE, mono_framework_version () >= 2);\n\t\treturn;\n\t}\n\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\n\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\taname, &mass->aname, absolute, TRUE, TRUE,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (absolute);\n}\n\nstatic void\nves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)\n{\n\tchar *filename;\n\tMonoImageOpenStatus status = MONO_IMAGE_OK;\n\tgboolean res;\n\tMonoImage *image;\n\tMonoAssemblyName name;\n\tchar *dirname\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfilename = mono_string_to_utf8 (fname);\n\n\tdirname = g_path_get_dirname (filename);\n\treplace_shadow_path (mono_domain_get (), dirname, &filename);\n\tg_free (dirname);\n\n\timage = mono_image_open (filename, &status);\n\n\tif (!image){\n\t\tMonoException *exc;\n\n\t\tg_free (filename);\n\t\tif (status == MONO_IMAGE_IMAGE_INVALID)\n\t\t\texc = mono_get_exception_bad_image_format2 (NULL, fname);\n\t\telse\n\t\t\texc = mono_get_exception_file_not_found2 (NULL, fname);\n\t\tmono_raise_exception (exc);\n\t}\n\n\tres = mono_assembly_fill_assembly_name (image, &name);\n\tif (!res) {\n\t\tmono_image_close (image);\n\t\tg_free (filename);\n\t\tmono_raise_exception (mono_get_exception_argument (\"assemblyFile\", \"The file does not contain a manifest\"));\n\t}\n\n\tfill_reflection_assembly_name (mono_domain_get (), aname, &name, filename,\n\t\tTRUE, mono_framework_version () == 1,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (filename);\n\tmono_image_close (image);\n}\n\nstatic MonoBoolean\nves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,\n\tchar **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)\n{\n\tMonoBoolean result = FALSE;\n\tMonoDeclSecurityEntry entry;\n\n\t/* SecurityAction.RequestMinimum */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {\n\t\t*minimum = entry.blob;\n\t\t*minLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestOptional */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {\n\t\t*optional = entry.blob;\n\t\t*optLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestRefuse */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {\n\t\t*refused = entry.blob;\n\t\t*refLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\n\treturn result;\t\n}\n\nstatic MonoArray*\nmono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly)\n{\n\tMonoArray *res;\n\tMonoClass *klass;\n\tMonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];\n\tint i, count;\n\tguint32 attrs, visibility;\n\n\t/* we start the count from 1 because we skip the special type <Module> */\n\tif (exportedOnly) {\n\t\tcount = 0;\n\t\tfor (i = 1; i < tdef->rows; ++i) {\n\t\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\t\tif (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)\n\t\t\t\tcount++;\n\t\t}\n\t} else {\n\t\tcount = tdef->rows - 1;\n\t}\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\t*exceptions = mono_array_new (domain, mono_defaults.exception_class, count);\n\tcount = 0;\n\tfor (i = 1; i < tdef->rows; ++i) {\n\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\tif (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {\n\t\t\tklass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);\n\t\t\tif (klass) {\n\t\t\t\tmono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));\n\t\t\t} else {\n\t\t\t\tMonoLoaderError *error;\n\t\t\t\tMonoException *ex;\n\t\t\t\t\n\t\t\t\terror = mono_loader_get_last_error ();\n\t\t\t\tg_assert (error != NULL);\n\t\n\t\t\t\tex = mono_loader_error_prepare_exception (error);\n\t\t\t\tmono_array_setref (*exceptions, count, ex);\n\t\t\t}\n\t\t\tif (mono_loader_get_last_error ())\n\t\t\t\tmono_loader_clear_error ();\n\t\t\tcount++;\n\t\t}\n\t}\n\t\n\treturn res;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)\n{\n\tMonoArray *res = NULL;\n\tMonoArray *exceptions = NULL;\n\tMonoImage *image = NULL;\n\tMonoTableInfo *table = NULL;\n\tMonoDomain *domain;\n\tGList *list = NULL;\n\tint i, len, ex_count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (assembly);\n\n\tg_assert (!assembly->assembly->dynamic);\n\timage = assembly->assembly->image;\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tres = mono_module_get_types (domain, image, &exceptions, exportedOnly);\n\n\t/* Append data from all modules in the assembly */\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tMonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);\n\t\t\tif (loaded_image) {\n\t\t\t\tMonoArray *ex2;\n\t\t\t\tMonoArray *res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly);\n\t\t\t\t/* Append the new types to the end of the array */\n\t\t\t\tif (mono_array_length (res2) > 0) {\n\t\t\t\t\tguint32 len1, len2;\n\t\t\t\t\tMonoArray *res3, *ex3;\n\n\t\t\t\t\tlen1 = mono_array_length (res);\n\t\t\t\t\tlen2 = mono_array_length (res2);\n\n\t\t\t\t\tres3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (res3, 0, res, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (res3, len1, res2, 0, len2);\n\t\t\t\t\tres = res3;\n\n\t\t\t\t\tex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, len1, ex2, 0, len2);\n\t\t\t\t\texceptions = ex3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* the ReflectionTypeLoadException must have all the types (Types property), \n\t * NULL replacing types which throws an exception. The LoaderException must\n\t * contain all exceptions for NULL items.\n\t */\n\n\tlen = mono_array_length (res);\n\n\tex_count = 0;\n\tfor (i = 0; i < len; i++) {\n\t\tMonoReflectionType *t = mono_array_get (res, gpointer, i);\n\t\tMonoClass *klass;\n\n\t\tif (t) {\n\t\t\tklass = mono_type_get_class (t->type);\n\t\t\tif ((klass != NULL) && klass->exception_type) {\n\t\t\t\t/* keep the class in the list */\n\t\t\t\tlist = g_list_append (list, klass);\n\t\t\t\t/* and replace Type with NULL */\n\t\t\t\tmono_array_setref (res, i, NULL);\n\t\t\t}\n\t\t} else {\n\t\t\tex_count ++;\n\t\t}\n\t}\n\n\tif (list || ex_count) {\n\t\tGList *tmp = NULL;\n\t\tMonoException *exc = NULL;\n\t\tMonoArray *exl = NULL;\n\t\tint j, length = g_list_length (list) + ex_count;\n\n\t\tmono_loader_clear_error ();\n\n\t\texl = mono_array_new (domain, mono_defaults.exception_class, length);\n\t\t/* Types for which mono_class_get () succeeded */\n\t\tfor (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (tmp->data);\n\t\t\tmono_array_setref (exl, i, exc);\n\t\t}\n\t\t/* Types for which it don't */\n\t\tfor (j = 0; j < mono_array_length (exceptions); ++j) {\n\t\t\tMonoException *exc = mono_array_get (exceptions, MonoException*, j);\n\t\t\tif (exc) {\n\t\t\t\tg_assert (i < length);\n\t\t\t\tmono_array_setref (exl, i, exc);\n\t\t\t\ti ++;\n\t\t\t}\n\t\t}\n\t\tg_list_free (list);\n\t\tlist = NULL;\n\n\t\texc = mono_get_exception_reflection_type_load (res, exl);\n\t\tmono_loader_clear_error ();\n\t\tmono_raise_exception (exc);\n\t}\n\t\t\n\treturn res;\n}\n\nstatic gboolean\nves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)\n{\n\tMonoAssemblyName aname;\n\tMonoDomain *domain = mono_object_domain (name);\n\tchar *val;\n\tgboolean is_version_defined;\n\tgboolean is_token_defined;\n\n\taname.public_key = NULL;\n\tval = mono_string_to_utf8 (assname);\n\tif (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined, &is_token_defined)) {\n\t\tg_free ((guint8*) aname.public_key);\n\t\tg_free (val);\n\t\treturn FALSE;\n\t}\n\t\n\tfill_reflection_assembly_name (domain, name, &aname, \"\", is_version_defined,\n\t\tFALSE, is_token_defined);\n\n\tmono_assembly_name_free (&aname);\n\tg_free ((guint8*) aname.public_key);\n\tg_free (val);\n\n\treturn TRUE;\n}\n\nstatic MonoReflectionType*\nves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\n\tif (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)\n\t\t/* These images do not have a global type */\n\t\treturn NULL;\n\n\tklass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);\n\treturn mono_type_get_object (domain, &klass->byval_arg);\n}\n\nstatic void\nves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)\n{\n\t/*if (module->image)\n\t\tmono_image_close (module->image);*/\n}\n\nstatic MonoString*\nves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\treturn mono_string_new (domain, module->image->guid);\n}\n\nstatic gpointer\nves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModule *module)\n{\n#ifdef PLATFORM_WIN32\n\tif (module->image && module->image->is_module_handle)\n\t\treturn module->image->raw_data;\n#endif\n\n\treturn (gpointer) (-1);\n}\n\nstatic void\nves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)\n{\n\tif (image->dynamic) {\n\t\tMonoDynamicImage *dyn = (MonoDynamicImage*)image;\n\t\t*pe_kind = dyn->pe_kind;\n\t\t*machine = dyn->machine;\n\t}\n\telse {\n\t\t*pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;\n\t\t*machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;\n\t}\n}\n\nstatic gint32\nves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)\n{\n\treturn (image->md_version_major << 16) | (image->md_version_minor);\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)\n{\n\tMonoArray *exceptions;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!module->image)\n\t\treturn mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);\n\telse {\n\t\tMonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE);\n\t\tfor (i = 0; i < mono_array_length (exceptions); ++i) {\n\t\t\tMonoException *ex = mono_array_get (exceptions, MonoException *, i);\n\t\t\tif (ex)\n\t\t\t\tmono_raise_exception (ex);\n\t\t}\n\t\treturn res;\n\t}\n}\n\nstatic gboolean\nmono_metadata_memberref_is_method (MonoImage *image, guint32 token)\n{\n\tguint32 cols [MONO_MEMBERREF_SIZE];\n\tconst char *sig;\n\tmono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);\n\tsig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);\n\tmono_metadata_decode_blob_size (sig, &sig);\n\treturn (*sig != 0x6);\n}\n\nstatic void\ninit_generic_context_from_args (MonoGenericContext *context, MonoArray *type_args, MonoArray *method_args)\n{\n\tif (type_args)\n\t\tcontext->class_inst = mono_metadata_get_generic_inst (mono_array_length (type_args),\n\t\t\t\t\t\t\t\t mono_array_addr (type_args, MonoType*, 0));\n\telse\n\t\tcontext->class_inst = NULL;\n\tif (method_args)\n\t\tcontext->method_inst = mono_metadata_get_generic_inst (mono_array_length (method_args),\n\t\t\t\t\t\t\t\t mono_array_addr (method_args, MonoType*, 0));\n\telse\n\t\tcontext->method_inst = NULL;\n}\n\nstatic MonoType*\nves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && \n\t\t(table != MONO_TABLE_TYPESPEC)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\tklass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t\tif (!klass)\n\t\t\treturn NULL;\n\t\treturn &klass->byval_arg;\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tklass = mono_class_get_full (image, token, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\tif (klass)\n\t\treturn &klass->byval_arg;\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoMethod*\nves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoMethod *method;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && \n\t\t(table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tmethod = mono_get_method_full (image, token, NULL, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\treturn method;\n}\n\nstatic MonoString*\nves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint index = mono_metadata_token_index (token);\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic)\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\n\tif ((index <= 0) || (index >= image->heap_us.size)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\t/* FIXME: What to do if the index points into the middle of a string ? */\n\n\treturn mono_ldstr (mono_domain_get (), image, index);\n}\n\nstatic MonoClassField*\nves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoClassField *field;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tfield = mono_field_from_token (image, token, &klass, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\n\treturn field;\n}\n\n\nstatic MonoObject*\nves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\n\t*error = ResolveTokenError_Other;\n\n\tswitch (table) {\n\tcase MONO_TABLE_TYPEDEF:\n\tcase MONO_TABLE_TYPEREF:\n\tcase MONO_TABLE_TYPESPEC: {\n\t\tMonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);\n\t\tif (t)\n\t\t\treturn (MonoObject*)mono_type_get_object (mono_domain_get (), t);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_METHOD:\n\tcase MONO_TABLE_METHODSPEC: {\n\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\tif (m)\n\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\telse\n\t\t\treturn NULL;\n\t}\t\t\n\tcase MONO_TABLE_FIELD: {\n\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\tif (f)\n\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_MEMBERREF:\n\t\tif (mono_metadata_memberref_is_method (image, token)) {\n\t\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\t\tif (m)\n\t\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse {\n\t\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\t\tif (f)\n\t\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\t*error = ResolveTokenError_BadTable;\n\t}\n\n\treturn NULL;\n}\n\nstatic MonoArray*\nves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint idx = mono_metadata_token_index (token);\n\tMonoTableInfo *tables = image->tables;\n\tguint32 sig, len;\n\tconst char *ptr;\n\tMonoArray *res;\n\n\t*error = ResolveTokenError_OutOfRange;\n\n\t/* FIXME: Support other tables ? */\n\tif (table != MONO_TABLE_STANDALONESIG)\n\t\treturn NULL;\n\n\tif (image->dynamic)\n\t\treturn NULL;\n\n\tif ((idx == 0) || (idx > tables [MONO_TABLE_STANDALONESIG].rows))\n\t\treturn NULL;\n\n\tsig = mono_metadata_decode_row_col (&tables [MONO_TABLE_STANDALONESIG], idx - 1, 0);\n\n\tptr = mono_metadata_blob_heap (image, sig);\n\tlen = mono_metadata_decode_blob_size (ptr, &ptr);\n\n\tres = mono_array_new (mono_domain_get (), mono_defaults.byte_class, len);\n\tmemcpy (mono_array_addr (res, guint8, 0), ptr, len);\n\treturn res;\n}\n\nstatic MonoReflectionType*\nves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)\n{\n\tMonoClass *klass;\n\tint isbyref = 0, rank;\n\tchar *str = mono_string_to_utf8 (smodifiers);\n\tchar *p;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (tb->type.type);\n\tp = str;\n\t/* logic taken from mono_reflection_parse_type(): keep in sync */\n\twhile (*p) {\n\t\tswitch (*p) {\n\t\tcase '&':\n\t\t\tif (isbyref) { /* only one level allowed by the spec */\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tisbyref = 1;\n\t\t\tp++;\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (mono_object_domain (tb), &klass->this_arg);\n\t\t\tbreak;\n\t\tcase '*':\n\t\t\tklass = mono_ptr_class_get (&klass->byval_arg);\n\t\t\tmono_class_init (klass);\n\t\t\tp++;\n\t\t\tbreak;\n\t\tcase '[':\n\t\t\trank = 1;\n\t\t\tp++;\n\t\t\twhile (*p) {\n\t\t\t\tif (*p == ']')\n\t\t\t\t\tbreak;\n\t\t\t\tif (*p == ',')\n\t\t\t\t\trank++;\n\t\t\t\telse if (*p != '*') { /* '*' means unknown lower bound */\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t++p;\n\t\t\t}\n\t\t\tif (*p != ']') {\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tp++;\n\t\t\tklass = mono_array_class_get (klass, rank);\n\t\t\tmono_class_init (klass);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\tg_free (str);\n\treturn mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);\n}\n\nstatic MonoBoolean\nves_icall_Type_IsArrayImpl (MonoReflectionType *t)\n{\n\tMonoType *type;\n\tMonoBoolean res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\ttype = t->type;\n\tres = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);\n\n\treturn res;\n}\n\nstatic void\ncheck_for_invalid_type (MonoClass *klass)\n{\n\tchar *name;\n\tMonoString *str;\n\tif (klass->byval_arg.type != MONO_TYPE_TYPEDBYREF)\n\t\treturn;\n\n\tname = mono_type_get_full_name (klass);\n\tstr = mono_string_new (mono_domain_get (), name);\n\tg_free (name);\n\tmono_raise_exception ((MonoException*)mono_get_exception_type_load (str, NULL));\n\n}\nstatic MonoReflectionType *\nves_icall_Type_make_array_type (MonoReflectionType *type, int rank)\n{\n\tMonoClass *klass, *aklass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tif (rank == 0) //single dimentional array\n\t\taklass = mono_array_class_get (klass, 1);\n\telse\n\t\taklass = mono_bounded_array_class_get (klass, rank, TRUE);\n\n\treturn mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);\n}\n\nstatic MonoReflectionType *\nves_icall_Type_make_byref_type (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\treturn mono_type_get_object (mono_object_domain (type), &klass->this_arg);\n}\n\nstatic MonoReflectionType *\nves_icall_Type_MakePointerType (MonoReflectionType *type)\n{\n\tMonoClass *klass, *pklass;\n\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tpklass = mono_ptr_class_get (type->type);\n\n\treturn mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);\n}\n\nstatic MonoObject *\nves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,\n\t\t\t\t\t\t MonoReflectionMethod *info, MonoBoolean throwOnBindFailure)\n{\n\tMonoClass *delegate_class = mono_class_from_mono_type (type->type);\n\tMonoObject *delegate;\n\tgpointer func;\n\tMonoMethod *method = info->method;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR) {\n\t\tif (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure))\n\t\t\treturn NULL;\n\t}\n\n\tdelegate = mono_object_new (mono_object_domain (type), delegate_class);\n\n\tif (method->dynamic) {\n\t\t/* Creating a trampoline would leak memory */\n\t\tfunc = mono_compile_method (method);\n\t} else {\n\t\tfunc = mono_create_ftnptr (mono_domain_get (),\n\t\t\tmono_runtime_create_jump_trampoline (mono_domain_get (), method, TRUE));\n\t}\n\n\tmono_delegate_ctor_with_method (delegate, target, func, method);\n\n\treturn delegate;\n}\n\nstatic void\nves_icall_System_Delegate_SetMulticastInvoke (MonoDelegate *this)\n{\n\t/* Reset the invoke impl to the default one */\n\tthis->invoke_impl = mono_runtime_create_delegate_trampoline (this->object.vtable->klass);\n}\n\n/*\n * Magic number to convert a time which is relative to\n * Jan 1, 1970 into a value which is relative to Jan 1, 0001.\n */\n#define\tEPOCH_ADJUST\t((guint64)62135596800LL)\n\n/*\n * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001\n */\n#define FILETIME_ADJUST ((guint64)504911232000000000LL)\n\n#ifdef PLATFORM_WIN32\n/* convert a SYSTEMTIME which is of the form \"last thursday in october\" to a real date */\nstatic void\nconvert_to_absolute_date(SYSTEMTIME *date)\n{\n#define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))\n\tstatic int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n\tstatic int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n\t/* from the calendar FAQ */\n\tint a = (14 - date->wMonth) / 12;\n\tint y = date->wYear - a;\n\tint m = date->wMonth + 12 * a - 2;\n\tint d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;\n\n\t/* d is now the day of the week for the first of the month (0 == Sunday) */\n\n\tint day_of_week = date->wDayOfWeek;\n\n\t/* set day_in_month to the first day in the month which falls on day_of_week */ \n\tint day_in_month = 1 + (day_of_week - d);\n\tif (day_in_month <= 0)\n\t\tday_in_month += 7;\n\n\t/* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */\n\tdate->wDay = day_in_month + (date->wDay - 1) * 7;\n\tif (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))\n\t\tdate->wDay -= 7;\n}\n#endif\n\n#ifndef PLATFORM_WIN32\n/*\n * Return's the offset from GMT of a local time.\n * \n * tm is a local time\n * t is the same local time as seconds.\n */\nstatic int \ngmt_offset(struct tm *tm, time_t t)\n{\n#if defined (HAVE_TM_GMTOFF)\n\treturn tm->tm_gmtoff;\n#else\n\tstruct tm g;\n\ttime_t t2;\n\tg = *gmtime(&t);\n\tg.tm_isdst = tm->tm_isdst;\n\tt2 = mktime(&g);\n\treturn (int)difftime(t, t2);\n#endif\n}\n#endif\n/*\n * This is heavily based on zdump.c from glibc 2.2.\n *\n * * data[0]: start of daylight saving time (in DateTime ticks).\n * * data[1]: end of daylight saving time (in DateTime ticks).\n * * data[2]: utcoffset (in TimeSpan ticks).\n * * data[3]: additional offset when daylight saving (in TimeSpan ticks).\n * * name[0]: name of this timezone when not daylight saving.\n * * name[1]: name of this timezone when daylight saving.\n *\n * FIXME: This only works with \"standard\" Unix dates (years between 1900 and 2100) while\n * the class library allows years between 1 and 9999.\n *\n * Returns true on success and zero on failure.\n */\nstatic guint32\nves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)\n{\n#ifndef PLATFORM_WIN32\n\tMonoDomain *domain = mono_domain_get ();\n\tstruct tm start, tt;\n\ttime_t t;\n\n\tlong int gmtoff;\n\tint is_daylight = 0, day;\n\tchar tzone [64];\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, (MonoObject*) mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, (MonoObject*) mono_array_new (domain, mono_defaults.string_class, 2));\n\n\t/* \n\t * no info is better than crashing: we'll need our own tz data\n\t * to make this work properly, anyway. The range is probably\n\t * reduced to 1970 .. 2037 because that is what mktime is\n\t * guaranteed to support (we get into an infinite loop\n\t * otherwise).\n\t */\n\n\tmemset (&start, 0, sizeof (start));\n\n\tstart.tm_mday = 1;\n\tstart.tm_year = year-1900;\n\n\tt = mktime (&start);\n\n\tif ((year < 1970) || (year > 2037) || (t == -1)) {\n\t\tt = time (NULL);\n\t\ttt = *localtime (&t);\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\treturn 1;\n\t}\n\n\tgmtoff = gmt_offset (&start, t);\n\n\t/* For each day of the year, calculate the tm_gmtoff. */\n\tfor (day = 0; day < 365; day++) {\n\n\t\tt += 3600*24;\n\t\ttt = *localtime (&t);\n\n\t\t/* Daylight saving starts or ends here. */\n\t\tif (gmt_offset (&tt, t) != gmtoff) {\n\t\t\tstruct tm tt1;\n\t\t\ttime_t t1;\n\n\t\t\t/* Try to find the exact hour when daylight saving starts/ends. */\n\t\t\tt1 = t;\n\t\t\tdo {\n\t\t\t\tt1 -= 3600;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) != gmtoff);\n\n\t\t\t/* Try to find the exact minute when daylight saving starts/ends. */\n\t\t\tdo {\n\t\t\t\tt1 += 60;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) == gmtoff);\n\t\t\tt1+=gmtoff;\n\t\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\t\t\n\t\t\t/* Write data, if we're already in daylight saving, we're done. */\n\t\t\tif (is_daylight) {\n\t\t\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\tis_daylight = 1;\n\t\t\t}\n\n\t\t\t/* This is only set once when we enter daylight saving. */\n\t\t\tmono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);\n\t\t\tmono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);\n\n\t\t\tgmtoff = gmt_offset (&tt, t);\n\t\t}\n\t}\n\n\tif (!is_daylight) {\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\tmono_array_set ((*data), gint64, 0, 0);\n\t\tmono_array_set ((*data), gint64, 1, 0);\n\t\tmono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);\n\t\tmono_array_set ((*data), gint64, 3, 0);\n\t}\n\n\treturn 1;\n#else\n\tMonoDomain *domain = mono_domain_get ();\n\tTIME_ZONE_INFORMATION tz_info;\n\tFILETIME ft;\n\tint i;\n\tint err, tz_id;\n\n\ttz_id = GetTimeZoneInformation (&tz_info);\n\tif (tz_id == TIME_ZONE_ID_INVALID)\n\t\treturn 0;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, mono_array_new (domain, mono_defaults.string_class, 2));\n\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.DaylightName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.StandardName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));\n\n\tif ((year <= 1601) || (year > 30827)) {\n\t\t/*\n\t\t * According to MSDN, the MS time functions can't handle dates outside\n\t\t * this interval.\n\t\t */\n\t\treturn 1;\n\t}\n\n\t/* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */\n\tif (tz_id != TIME_ZONE_ID_UNKNOWN) {\n\t\ttz_info.StandardDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.StandardDate);\n\t\terr = SystemTimeToFileTime (&tz_info.StandardDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t\ttz_info.DaylightDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.DaylightDate);\n\t\terr = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t}\n\tmono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);\n\tmono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);\n\n\treturn 1;\n#endif\n}\n\nstatic gpointer\nves_icall_System_Object_obj_address (MonoObject *this) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this;\n}\n\n/* System.Buffer */\n\nstatic inline gint32 \nmono_array_get_byte_length (MonoArray *array)\n{\n\tMonoClass *klass;\n\tint length;\n\tint i;\n\n\tklass = array->obj.vtable->klass;\n\n\tif (array->bounds == NULL)\n\t\tlength = array->max_length;\n\telse {\n\t\tlength = 1;\n\t\tfor (i = 0; i < klass->rank; ++ i)\n\t\t\tlength *= array->bounds [i].length;\n\t}\n\n\tswitch (klass->element_class->byval_arg.type) {\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn length;\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_CHAR:\n\t\treturn length << 1;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\treturn length << 2;\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U:\n\t\treturn length * sizeof (gpointer);\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\treturn length << 3;\n\tdefault:\n\t\treturn -1;\n\t}\n}\n\nstatic gint32 \nves_icall_System_Buffer_ByteLengthInternal (MonoArray *array) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get_byte_length (array);\n}\n\nstatic gint8 \nves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get (array, gint8, idx);\n}\n\nstatic void \nves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_array_set (array, gint8, idx, value);\n}\n\nstatic MonoBoolean\nves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count) \n{\n\tguint8 *src_buf, *dest_buf;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* watch out for integer overflow */\n\tif ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))\n\t\treturn FALSE;\n\n\tsrc_buf = (guint8 *)src->vector + src_offset;\n\tdest_buf = (guint8 *)dest->vector + dest_offset;\n\n\tif (src != dest)\n\t\tmemcpy (dest_buf, src_buf, count);\n\telse\n\t\tmemmove (dest_buf, src_buf, count); /* Source and dest are the same array */\n\n\treturn TRUE;\n}\n\nstatic MonoObject *\nves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)\n{\n\tMonoDomain *domain = mono_object_domain (this); \n\tMonoObject *res;\n\tMonoRealProxy *rp = ((MonoRealProxy *)this);\n\tMonoTransparentProxy *tp;\n\tMonoType *type;\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_object_new (domain, mono_defaults.transparent_proxy_class);\n\ttp = (MonoTransparentProxy*) res;\n\t\n\tMONO_OBJECT_SETREF (tp, rp, rp);\n\ttype = ((MonoReflectionType *)rp->class_to_proxy)->type;\n\tklass = mono_class_from_mono_type (type);\n\n\ttp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);\n\ttp->remote_class = mono_remote_class (domain, class_name, klass);\n\n\tres->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);\n\treturn res;\n}\n\nstatic MonoReflectionType *\nves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)\n{\n\treturn mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);\n}\n\n/* System.Environment */\n\nMonoString*\nves_icall_System_Environment_get_UserName (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* using glib is more portable */\n\treturn mono_string_new (mono_domain_get (), g_get_user_name ());\n}\n\n\nstatic MonoString *\nves_icall_System_Environment_get_MachineName (void)\n{\n#if defined (PLATFORM_WIN32)\n\tgunichar2 *buf;\n\tguint32 len;\n\tMonoString *result;\n\n\tlen = MAX_COMPUTERNAME_LENGTH + 1;\n\tbuf = g_new (gunichar2, len);\n\n\tresult = NULL;\n\tif (GetComputerName (buf, (PDWORD) &len))\n\t\tresult = mono_string_new_utf16 (mono_domain_get (), buf, len);\n\n\tg_free (buf);\n\treturn result;\n#elif !defined(DISABLE_SOCKETS)\n\tgchar buf [256];\n\tMonoString *result;\n\n\tif (gethostname (buf, sizeof (buf)) == 0)\n\t\tresult = mono_string_new (mono_domain_get (), buf);\n\telse\n\t\tresult = NULL;\n\t\n\treturn result;\n#else\n\treturn mono_string_new (mono_domain_get (), \"mono\");\n#endif\n}\n\nstatic int\nves_icall_System_Environment_get_Platform (void)\n{\n#if defined (PLATFORM_WIN32)\n\t/* Win32NT */\n\treturn 2;\n#elif defined(__MACH__)\n\t/* OSX */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\n\t//\n\t// For compatibility with our client code, this will be 4 for a while.\n\t// We will eventually move to 6 to match .NET, but it requires all client\n\t// code to be updated and the documentation everywhere to be updated \n\t// first.\n\t//\n\treturn 4;\n#else\n\t/* Unix */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\treturn 4;\n#endif\n}\n\nstatic MonoString *\nves_icall_System_Environment_get_NewLine (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n#if defined (PLATFORM_WIN32)\n\treturn mono_string_new (mono_domain_get (), \"\\r\\n\");\n#else\n\treturn mono_string_new (mono_domain_get (), \"\\n\");\n#endif\n}\n\nstatic MonoString *\nves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)\n{\n\tconst gchar *value;\n\tgchar *utf8_name;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\treturn NULL;\n\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\tvalue = g_getenv (utf8_name);\n\n\tg_free (utf8_name);\n\n\tif (value == 0)\n\t\treturn NULL;\n\t\n\treturn mono_string_new (mono_domain_get (), value);\n}\n\n/*\n * There is no standard way to get at environ.\n */\n#ifndef _MSC_VER\n#ifndef __MINGW32_VERSION\n#ifdef __APPLE__\n/* Apple defines this in crt_externs.h but doesn't provide that header for \n * arm-apple-darwin9. We'll manually define the symbol on Apple as it does\n * in fact exist on all implementations (so far) \n */\ngchar ***_NSGetEnviron(void);\n#define environ (*_NSGetEnviron())\n#else\nextern\nchar **environ;\n#endif\n#endif\n#endif\n\nstatic MonoArray *\nves_icall_System_Environment_GetEnvironmentVariableNames (void)\n{\n#ifdef PLATFORM_WIN32\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tWCHAR* env_strings;\n\tWCHAR* env_string;\n\tWCHAR* equal_str;\n\tint n = 0;\n\n\tenv_strings = GetEnvironmentStrings();\n\n\tif (env_strings) {\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=')\n\t\t\t\tn++;\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\t}\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tif (env_strings) {\n\t\tn = 0;\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=') {\n\t\t\t\tequal_str = wcschr(env_string, '=');\n\t\t\t\tg_assert(equal_str);\n\t\t\t\tstr = mono_string_new_utf16 (domain, env_string, equal_str-env_string);\n\t\t\t\tmono_array_setref (names, n, str);\n\t\t\t\tn++;\n\t\t\t}\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\n\t\tFreeEnvironmentStrings (env_strings);\n\t}\n\n\treturn names;\n\n#else\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tgchar **e, **parts;\n\tint n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e)\n\t\t++ n;\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e) {\n\t\tparts = g_strsplit (*e, \"=\", 2);\n\t\tif (*parts != 0) {\n\t\t\tstr = mono_string_new (domain, *parts);\n\t\t\tmono_array_setref (names, n, str);\n\t\t}\n\n\t\tg_strfreev (parts);\n\n\t\t++ n;\n\t}\n\n\treturn names;\n#endif\n}\n\n/*\n * If your platform lacks setenv/unsetenv, you must upgrade your glib.\n */\n#if !GLIB_CHECK_VERSION(2,4,0)\n#define g_setenv(a,b,c) setenv(a,b,c)\n#define g_unsetenv(a) unsetenv(a)\n#endif\n\nstatic void\nves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, MonoString *value)\n{\n\tMonoError error;\n\n#ifdef PLATFORM_WIN32\n\tgunichar2 *utf16_name, *utf16_value;\n#else\n\tgchar *utf8_name, *utf8_value;\n#endif\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n#ifdef PLATFORM_WIN32\n\tutf16_name = mono_string_to_utf16 (name);\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tSetEnvironmentVariable (utf16_name, NULL);\n\t\tg_free (utf16_name);\n\t\treturn;\n\t}\n\n\tutf16_value = mono_string_to_utf16 (value);\n\n\tSetEnvironmentVariable (utf16_name, utf16_value);\n\n\tg_free (utf16_name);\n\tg_free (utf16_value);\n#else\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tg_unsetenv (utf8_name);\n\t\tg_free (utf8_name);\n\t\treturn;\n\t}\n\n\tutf8_value = mono_string_to_utf8_checked (value, &error);\n\tif (!mono_error_ok (&error)) {\n\t\tg_free (utf8_name);\n\t\tmono_error_raise_exception (&error);\n\t}\n\tg_setenv (utf8_name, utf8_value, TRUE);\n\n\tg_free (utf8_name);\n\tg_free (utf8_value);\n#endif\n}\n\nstatic void\nves_icall_System_Environment_Exit (int result)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_threads_set_shutting_down ();\n\n\tmono_runtime_set_shutting_down ();\n\n\t/* This will kill the tp threads which cannot be suspended */\n\tmono_thread_pool_cleanup ();\n\n\t/* Suspend all managed threads since the runtime is going away */\n\tmono_thread_suspend_all_other_threads ();\n\n\tmono_runtime_quit ();\n\n\t/* we may need to do some cleanup here... */\n\texit (result);\n}\n\nstatic MonoString*\nves_icall_System_Environment_GetGacPath (void)\n{\n\treturn mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());\n}\n\nstatic MonoString*\nves_icall_System_Environment_GetWindowsFolderPath (int folder)\n{\n#if defined (PLATFORM_WIN32)\n\t#ifndef CSIDL_FLAG_CREATE\n\t\t#define CSIDL_FLAG_CREATE\t0x8000\n\t#endif\n\n\tWCHAR path [MAX_PATH];\n\t/* Create directory if no existing */\n\tif (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {\n\t\tint len = 0;\n\t\twhile (path [len])\n\t\t\t++ len;\n\t\treturn mono_string_new_utf16 (mono_domain_get (), path, len);\n\t}\n#else\n\tg_warning (\"ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!\");\n#endif\n\treturn mono_string_new (mono_domain_get (), \"\");\n}\n\nstatic MonoArray *\nves_icall_System_Environment_GetLogicalDrives (void)\n{\n gunichar2 buf [256], *ptr, *dname;\n\tgunichar2 *u16;\n\tguint initial_size = 127, size = 128;\n\tgint ndrives;\n\tMonoArray *result;\n\tMonoString *drivestr;\n\tMonoDomain *domain = mono_domain_get ();\n\tgint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n buf [0] = '\\0';\n\tptr = buf;\n\n\twhile (size > initial_size) {\n\t\tsize = (guint) GetLogicalDriveStrings (initial_size, ptr);\n\t\tif (size > initial_size) {\n\t\t\tif (ptr != buf)\n\t\t\t\tg_free (ptr);\n\t\t\tptr = g_malloc0 ((size + 1) * sizeof (gunichar2));\n\t\t\tinitial_size = size;\n\t\t\tsize++;\n\t\t}\n\t}\n\n\t/* Count strings */\n\tdname = ptr;\n\tndrives = 0;\n\tdo {\n\t\twhile (*dname++);\n\t\tndrives++;\n\t} while (*dname);\n\n\tdname = ptr;\n\tresult = mono_array_new (domain, mono_defaults.string_class, ndrives);\n\tndrives = 0;\n\tdo {\n\t\tlen = 0;\n\t\tu16 = dname;\n\t\twhile (*u16) { u16++; len ++; }\n\t\tdrivestr = mono_string_new_utf16 (domain, dname, len);\n\t\tmono_array_setref (result, ndrives++, drivestr);\n\t\twhile (*dname++);\n\t} while (*dname);\n\n\tif (ptr != buf)\n\t\tg_free (ptr);\n\n\treturn result;\n}\n\nstatic MonoString *\nves_icall_System_Environment_InternalGetHome (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_home_dir ());\n}\n\nstatic const char *encodings [] = {\n\t(char *) 1,\n\t\t\"ascii\", \"us_ascii\", \"us\", \"ansi_x3.4_1968\",\n\t\t\"ansi_x3.4_1986\", \"cp367\", \"csascii\", \"ibm367\",\n\t\t\"iso_ir_6\", \"iso646_us\", \"iso_646.irv:1991\",\n\t(char *) 2,\n\t\t\"utf_7\", \"csunicode11utf7\", \"unicode_1_1_utf_7\",\n\t\t\"unicode_2_0_utf_7\", \"x_unicode_1_1_utf_7\",\n\t\t\"x_unicode_2_0_utf_7\",\n\t(char *) 3,\n\t\t\"utf_8\", \"unicode_1_1_utf_8\", \"unicode_2_0_utf_8\",\n\t\t\"x_unicode_1_1_utf_8\", \"x_unicode_2_0_utf_8\",\n\t(char *) 4,\n\t\t\"utf_16\", \"UTF_16LE\", \"ucs_2\", \"unicode\",\n\t\t\"iso_10646_ucs2\",\n\t(char *) 5,\n\t\t\"unicodefffe\", \"utf_16be\",\n\t(char *) 6,\n\t\t\"iso_8859_1\",\n\t(char *) 0\n};\n\n/*\n * Returns the internal codepage, if the value of \"int_code_page\" is\n * 1 at entry, and we can not compute a suitable code page number,\n * returns the code page as a string\n */\nstatic MonoString*\nves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) \n{\n\tconst char *cset;\n\tconst char *p;\n\tchar *c;\n\tchar *codepage = NULL;\n\tint code;\n\tint want_name = *int_code_page;\n\tint i;\n\t\n\t*int_code_page = -1;\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_get_charset (&cset);\n\tc = codepage = strdup (cset);\n\tfor (c = codepage; *c; c++){\n\t\tif (isascii (*c) && isalpha (*c))\n\t\t\t*c = tolower (*c);\n\t\tif (*c == '-')\n\t\t\t*c = '_';\n\t}\n\t/* g_print (\"charset: %s\\n\", cset); */\n\t\n\t/* handle some common aliases */\n\tp = encodings [0];\n\tcode = 0;\n\tfor (i = 0; p != 0; ){\n\t\tif ((gssize) p < 7){\n\t\t\tcode = (gssize) p;\n\t\t\tp = encodings [++i];\n\t\t\tcontinue;\n\t\t}\n\t\tif (strcmp (p, codepage) == 0){\n\t\t\t*int_code_page = code;\n\t\t\tbreak;\n\t\t}\n\t\tp = encodings [++i];\n\t}\n\t\n\tif (strstr (codepage, \"utf_8\") != NULL)\n\t\t*int_code_page |= 0x10000000;\n\tfree (codepage);\n\t\n\tif (want_name && *int_code_page == -1)\n\t\treturn mono_string_new (mono_domain_get (), cset);\n\telse\n\t\treturn NULL;\n}\n\nstatic MonoBoolean\nves_icall_System_Environment_get_HasShutdownStarted (void)\n{\n\tif (mono_runtime_is_shutting_down ())\n\t\treturn TRUE;\n\n\tif (mono_domain_is_unloading (mono_domain_get ()))\n\t\treturn TRUE;\n\n\treturn FALSE;\n}\n\nstatic void\nves_icall_System_Environment_BroadcastSettingChange (void)\n{\n#ifdef PLATFORM_WIN32\n\tSendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, NULL, L\"Environment\", SMTO_ABORTIFHUNG, 2000, 0);\n#endif\n}\n\nstatic void\nves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, \n\t\t\t\t\t MonoReflectionMethod *method,\n\t\t\t\t\t MonoArray *out_args)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_message_init (mono_object_domain (this), this, method, out_args);\n}\n\nstatic MonoBoolean\nves_icall_IsTransparentProxy (MonoObject *proxy)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!proxy)\n\t\treturn 0;\n\n\tif (proxy->vtable->klass == mono_defaults.transparent_proxy_class)\n\t\treturn 1;\n\n\treturn 0;\n}\n\nstatic MonoReflectionMethod *\nves_icall_Remoting_RemotingServices_GetVirtualMethod (\n\tMonoReflectionType *rtype, MonoReflectionMethod *rmethod)\n{\n\tMonoClass *klass;\n\tMonoMethod *method;\n\tMonoMethod **vtable;\n\tMonoMethod *res = NULL;\n\n\tMONO_CHECK_ARG_NULL (rtype);\n\tMONO_CHECK_ARG_NULL (rmethod);\n\n\tmethod = rmethod->method;\n\tklass = mono_class_from_mono_type (rtype->type);\n\n\tif (MONO_CLASS_IS_INTERFACE (klass))\n\t\treturn NULL;\n\n\tif (method->flags & METHOD_ATTRIBUTE_STATIC)\n\t\treturn NULL;\n\n\tif ((method->flags & METHOD_ATTRIBUTE_FINAL) || !(method->flags & METHOD_ATTRIBUTE_VIRTUAL)) {\n\t\tif (klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE))\n\t\t\treturn rmethod;\n\t\telse\n\t\t\treturn NULL;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tvtable = klass->vtable;\n\n\tif (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {\n\t\tint offs = mono_class_interface_offset (klass, method->klass);\n\t\tif (offs >= 0)\n\t\t\tres = vtable [offs + method->slot];\n\t} else {\n\t\tif (!(klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE)))\n\t\t\treturn NULL;\n\n\t\tif (method->slot != -1)\n\t\t\tres = vtable [method->slot];\n\t}\n\n\tif (!res)\n\t\treturn NULL;\n\n\treturn mono_method_get_object (mono_domain_get (), res, NULL);\n}\n\nstatic void\nves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)\n{\n\tMonoClass *klass;\n\tMonoVTable* vtable;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\tif (enable) vtable->remote = 1;\n\telse vtable->remote = 0;\n}\n\nstatic MonoObject *\nves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->rank >= 1) {\n\t\tg_assert (klass->rank == 1);\n\t\treturn (MonoObject *) mono_array_new (domain, klass->element_class, 0);\n\t} else {\n\t\t/* Bypass remoting object creation check */\n\t\treturn mono_object_new_alloc_specific (mono_class_vtable_full (domain, klass, TRUE));\n\t}\n}\n\nstatic MonoString *\nves_icall_System_IO_get_temp_path (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_tmp_dir ());\n}\n\n#ifndef PLATFORM_NO_DRIVEINFO\nstatic MonoBoolean\nves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 *free_bytes_avail,\n\t\t\t\t\t\tguint64 *total_number_of_bytes, guint64 *total_number_of_free_bytes,\n\t\t\t\t\t\tgint32 *error)\n{\n\tgboolean result;\n\tULARGE_INTEGER wapi_free_bytes_avail;\n\tULARGE_INTEGER wapi_total_number_of_bytes;\n\tULARGE_INTEGER wapi_total_number_of_free_bytes;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*error = ERROR_SUCCESS;\n\tresult = GetDiskFreeSpaceEx (mono_string_chars (path_name), &wapi_free_bytes_avail, &wapi_total_number_of_bytes,\n\t\t\t\t &wapi_total_number_of_free_bytes);\n\n\tif (result) {\n\t\t*free_bytes_avail = wapi_free_bytes_avail.QuadPart;\n\t\t*total_number_of_bytes = wapi_total_number_of_bytes.QuadPart;\n\t\t*total_number_of_free_bytes = wapi_total_number_of_free_bytes.QuadPart;\n\t} else {\n\t\t*free_bytes_avail = 0;\n\t\t*total_number_of_bytes = 0;\n\t\t*total_number_of_free_bytes = 0;\n\t\t*error = GetLastError ();\n\t}\n\n\treturn result;\n}\n\nstatic guint32\nves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn GetDriveType (mono_string_chars (root_path_name));\n}\n#endif\n\nstatic gpointer\nves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_compile_method (method);\n}\n\nstatic MonoString *\nves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)\n{\n\tMonoString *mcpath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), \"mono\", mono_get_runtime_info ()->framework_version, \"machine.config\", NULL);\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tmcpath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn mcpath;\n}\n\nstatic MonoString *\nget_bundled_machine_config (void)\n{\n\tconst gchar *machine_config;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmachine_config = mono_get_machine_config ();\n\n\tif (!machine_config)\n\t\treturn NULL;\n\n\treturn mono_string_new (mono_domain_get (), machine_config);\n}\n\nstatic MonoString *\nves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)\n{\n\tMonoString *ipath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_path_get_dirname (mono_get_config_dir ());\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tipath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn ipath;\n}\n\nstatic gboolean\nves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, gint32 *size)\n{\n\tMonoPEResourceDataEntry *entry;\n\tMonoImage *image;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!assembly || !result || !size)\n\t\treturn FALSE;\n\n\t*result = NULL;\n\t*size = 0;\n\timage = assembly->assembly->image;\n\tentry = mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);\n\tif (!entry)\n\t\treturn FALSE;\n\n\t*result = mono_image_rva_map (image, entry->rde_data_offset);\n\tif (!(*result)) {\n\t\tg_free (entry);\n\t\treturn FALSE;\n\t}\n\t*size = entry->rde_size;\n\tg_free (entry);\n\treturn TRUE;\n}\n\nstatic MonoBoolean\nves_icall_System_Diagnostics_Debugger_IsAttached_internal (void)\n{\n\treturn mono_debug_using_mono_debugger () || mono_is_debugger_attached ();\n}\n\nstatic void\nves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)\n{\n#if defined (PLATFORM_WIN32)\n\tOutputDebugString (mono_string_chars (message));\n#else\n\tg_warning (\"WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\\n\");\n#endif\n}\n\n/* Only used for value types */\nstatic MonoObject *\nves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (mono_class_is_nullable (klass))\n\t\t/* No arguments -> null */\n\t\treturn NULL;\n\n\treturn mono_object_new (domain, klass);\n}\n\nstatic MonoReflectionMethod *\nves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)\n{\n\tMonoClass *klass, *parent;\n\tMonoMethod *method = m->method;\n\tMonoMethod *result = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->klass == NULL)\n\t\treturn m;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||\n\t MONO_CLASS_IS_INTERFACE (method->klass) ||\n\t method->flags & METHOD_ATTRIBUTE_NEW_SLOT)\n\t\treturn m;\n\n\tklass = method->klass;\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\t/* At the end of the loop, klass points to the eldest class that has this virtual function slot. */\n\tfor (parent = klass->parent; parent != NULL; parent = parent->parent) {\n\t\tmono_class_setup_vtable (parent);\n\t\tif (parent->vtable_size <= method->slot)\n\t\t\tbreak;\n\t\tklass = parent;\n\t}\t\t\n\n\tif (klass == method->klass)\n\t\treturn m;\n\n\tresult = klass->vtable [method->slot];\n\tif (result == NULL) {\n\t\t/* It is an abstract method */\n\t\tgpointer iter = NULL;\n\t\twhile ((result = mono_class_get_methods (klass, &iter)))\n\t\t\tif (result->slot == method->slot)\n\t\t\t\tbreak;\n\t}\n\n\tif (result == NULL)\n\t\treturn m;\n\n\treturn mono_method_get_object (mono_domain_get (), result, NULL);\n}\n\nstatic MonoString*\nves_icall_MonoMethod_get_name (MonoReflectionMethod *m)\n{\n\tMonoMethod *method = m->method;\n\n\tMONO_OBJECT_SETREF (m, name, mono_string_new (mono_object_domain (m), method->name));\n\treturn m->name;\n}\n\nstatic void\nmono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\titer->sig = *(MonoMethodSignature**)argsp;\n\t\n\tg_assert (iter->sig->sentinelpos <= iter->sig->param_count);\n\tg_assert (iter->sig->call_convention == MONO_CALL_VARARG);\n\n\titer->next_arg = 0;\n\t/* FIXME: it's not documented what start is exactly... */\n\tif (start) {\n\t\titer->args = start;\n\t} else {\n\t\titer->args = argsp + sizeof (gpointer);\n#ifndef MONO_ARCH_REGPARMS\n\t\t{\n\t\tguint32 i, arg_size;\n\t\tgint32 align;\n\t\tfor (i = 0; i < iter->sig->sentinelpos; ++i) {\n\t\t\targ_size = mono_type_stack_size (iter->sig->params [i], &align);\n\t\t\titer->args = (char*)iter->args + arg_size;\n\t\t}\n\t\t}\n#endif\n\t}\n\titer->num_args = iter->sig->param_count - iter->sig->sentinelpos;\n\n\t/* g_print (\"sig %p, param_count: %d, sent: %d\\n\", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */\n}\n\nstatic MonoTypedRef\nmono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\tres.type = iter->sig->params [i];\n\tres.klass = mono_class_from_mono_type (res.type);\n\tres.value = iter->args;\n\targ_size = mono_type_stack_size (res.type, &align);\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n\tif (arg_size <= sizeof (gpointer)) {\n\t\tint dummy;\n\t\tint padding = arg_size - mono_type_size (res.type, &dummy);\n\t\tres.value = (guint8*)res.value + padding;\n\t}\n#endif\n\titer->args = (char*)iter->args + arg_size;\n\titer->next_arg++;\n\n\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\n\treturn res;\n}\n\nstatic MonoTypedRef\nmono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\twhile (i < iter->sig->param_count) {\n\t\tif (!mono_metadata_type_equal (type, iter->sig->params [i]))\n\t\t\tcontinue;\n\t\tres.type = iter->sig->params [i];\n\t\tres.klass = mono_class_from_mono_type (res.type);\n\t\t/* FIXME: endianess issue... */\n\t\tres.value = iter->args;\n\t\targ_size = mono_type_stack_size (res.type, &align);\n\t\titer->args = (char*)iter->args + arg_size;\n\t\titer->next_arg++;\n\t\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\t\treturn res;\n\t}\n\t/* g_print (\"arg type 0x%02x not found\\n\", res.type->type); */\n\n\tres.type = NULL;\n\tres.value = NULL;\n\tres.klass = NULL;\n\treturn res;\n}\n\nstatic MonoType*\nmono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)\n{\n\tgint i;\n\tMONO_ARCH_SAVE_REGS;\n\t\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\treturn iter->sig->params [i];\n}\n\nstatic MonoObject*\nmono_TypedReference_ToObject (MonoTypedRef tref)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (tref.type)) {\n\t\tMonoObject** objp = tref.value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), tref.klass, tref.value);\n}\n\nstatic MonoObject*\nmono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (type)) {\n\t\tMonoObject** objp = value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), klass, value);\n}\n\nstatic void\nprelink_method (MonoMethod *method)\n{\n\tconst char *exc_class, *exc_arg;\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn;\n\tmono_lookup_pinvoke_call (method, &exc_class, &exc_arg);\n\tif (exc_class) {\n\t\tmono_raise_exception( \n\t\t\tmono_exception_from_name_msg (mono_defaults.corlib, \"System\", exc_class, exc_arg ) );\n\t}\n\t/* create the wrapper, too? */\n}\n\nstatic void\nves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\tprelink_method (method->method);\n}\n\nstatic void\nves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMonoMethod* m;\n\tgpointer iter = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile ((m = mono_class_get_methods (klass, &iter)))\n\t\tprelink_method (m);\n}\n\n/* These parameters are \"readonly\" in corlib/System/NumberFormatter.cs */\nstatic void\nves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas,\n\t\t\t\t\t gint32 const **exponents,\n\t\t\t\t\t gunichar2 const **digitLowerTable,\n\t\t\t\t\t gunichar2 const **digitUpperTable,\n\t\t\t\t\t gint64 const **tenPowersList,\n\t\t\t\t\t gint32 const **decHexDigits)\n{\n\t*mantissas = Formatter_MantissaBitsTable;\n\t*exponents = Formatter_TensExponentTable;\n\t*digitLowerTable = Formatter_DigitLowerTable;\n\t*digitUpperTable = Formatter_DigitUpperTable;\n\t*tenPowersList = Formatter_TenPowersList;\n\t*decHexDigits = Formatter_DecHexDigits;\n}\n\n/* These parameters are \"readonly\" in corlib/System/Char.cs */\nstatic void\nves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,\n\t\t\t\t\t guint8 const **numeric_data,\n\t\t\t\t\t gdouble const **numeric_data_values,\n\t\t\t\t\t guint16 const **to_lower_data_low,\n\t\t\t\t\t guint16 const **to_lower_data_high,\n\t\t\t\t\t guint16 const **to_upper_data_low,\n\t\t\t\t\t guint16 const **to_upper_data_high)\n{\n\t*category_data = CategoryData;\n\t*numeric_data = NumericData;\n\t*numeric_data_values = NumericDataValues;\n\t*to_lower_data_low = ToLowerDataLow;\n\t*to_lower_data_high = ToLowerDataHigh;\n\t*to_upper_data_low = ToUpperDataLow;\n\t*to_upper_data_high = ToUpperDataHigh;\n}\n\nstatic gint32\nves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method)\n{\n\treturn method->method->token;\n}\n\n/*\n * We return NULL for no modifiers so the corlib code can return Type.EmptyTypes\n * and avoid useless allocations.\n */\nstatic MonoArray*\ntype_array_from_modifiers (MonoImage *image, MonoType *type, int optional)\n{\n\tMonoArray *res;\n\tint i, count = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required))\n\t\t\tcount++;\n\t}\n\tif (!count)\n\t\treturn NULL;\n\tres = mono_array_new (mono_domain_get (), mono_defaults.systemtype_class, count);\n\tcount = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {\n\t\t\tMonoClass *klass = mono_class_get (image, type->modifiers [i].token);\n\t\t\tmono_array_setref (res, count, mono_type_get_object (mono_domain_get (), &klass->byval_arg));\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn res;\n}\n\nstatic MonoArray*\nparam_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optional)\n{\n\tMonoType *type = param->ClassImpl->type;\n\tMonoClass *member_class = mono_object_class (param->MemberImpl);\n\tMonoMethod *method = NULL;\n\tMonoImage *image;\n\tint pos;\n\tMonoMethodSignature *sig;\n\n\tif (mono_class_is_reflection_method_or_constructor (member_class)) {\n\t\tMonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;\n\t\tmethod = rmethod->method;\n\t} else if (member_class->image == mono_defaults.corlib && !strcmp (\"MonoProperty\", member_class->name)) {\n\t\tMonoReflectionProperty *prop = (MonoReflectionProperty *)param->MemberImpl;\n\t\tif (!(method = prop->property->get))\n\t\t\tmethod = prop->property->set;\n\t\tg_assert (method);\t\n\t} else {\n\t\tchar *type_name = mono_type_get_full_name (member_class);\n\t\tchar *msg = g_strdup_printf (\"Custom modifiers on a ParamInfo with member %s are not supported\", type_name);\n\t\tMonoException *ex = mono_get_exception_not_supported (msg);\n\t\tg_free (type_name);\n\t\tg_free (msg);\n\t\tmono_raise_exception (ex);\n\t}\n\n\timage = method->klass->image;\n\tpos = param->PositionImpl;\n\tsig = mono_method_signature (method);\n\tif (pos == -1)\n\t\ttype = sig->ret;\n\telse\n\t\ttype = sig->params [pos];\n\n\treturn type_array_from_modifiers (image, type, optional);\n}\n\nstatic MonoType*\nget_property_type (MonoProperty *prop)\n{\n\tMonoMethodSignature *sig;\n\tif (prop->get) {\n\t\tsig = mono_method_signature (prop->get);\n\t\treturn sig->ret;\n\t} else if (prop->set) {\n\t\tsig = mono_method_signature (prop->set);\n\t\treturn sig->params [sig->param_count - 1];\n\t}\n\treturn NULL;\n}\n\nstatic MonoArray*\nproperty_info_get_type_modifiers (MonoReflectionProperty *property, MonoBoolean optional)\n{\n\tMonoType *type = get_property_type (property->property);\n\tMonoImage *image = property->klass->image;\n\n\tif (!type)\n\t\treturn NULL;\n\treturn type_array_from_modifiers (image, type, optional);\n}\n\nstatic MonoBoolean\ncustom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoCustomAttrInfo *cinfo;\n\tgboolean found;\n\n\tcinfo = mono_reflection_get_custom_attrs_info (obj);\n\tif (!cinfo)\n\t\treturn FALSE;\n\tfound = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));\n\tif (!cinfo->cached)\n\t\tmono_custom_attrs_free (cinfo);\n\treturn found;\n}\n\nstatic MonoArray*\ncustom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoArray *res = mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL);\n\n\tif (mono_loader_get_last_error ()) {\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\tg_assert_not_reached ();\n\t\t/* Not reached */\n\t\treturn NULL;\n\t} else {\n\t\treturn res;\n\t}\n}\n\nstatic MonoString*\nves_icall_Mono_Runtime_GetDisplayName (void)\n{\n\tchar *info;\n\tMonoString *display_name;\n\n\tinfo = mono_get_runtime_callbacks ()->get_runtime_build_info ();\n\tdisplay_name = mono_string_new (mono_domain_get (), info);\n\tg_free (info);\n\treturn display_name;\n}\n\nstatic MonoString*\nves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)\n{\n\tMonoString *message;\n\tguint32 ret;\n\tgunichar2 buf[256];\n\t\n\tret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |\n\t\t\t FORMAT_MESSAGE_IGNORE_INSERTS, NULL, code, 0,\n\t\t\t buf, 255, NULL);\n\tif (ret == 0) {\n\t\tmessage = mono_string_new (mono_domain_get (), \"Error looking up error string\");\n\t} else {\n\t\tmessage = mono_string_new_utf16 (mono_domain_get (), buf, ret);\n\t}\n\t\n\treturn message;\n}\n\nconst static guchar\ndbase64 [] = {\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,\n\t128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,\n\t52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,\n\t128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n\t15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,\n\t128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n\t41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n};\n\nstatic MonoArray *\nbase64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)\n{\n\tgint ignored;\n\tgint i;\n\tgunichar2 c;\n\tgunichar2 last, prev_last, prev2_last;\n\tgint olength;\n\tMonoArray *result;\n\tguchar *res_ptr;\n\tgint a [4], b [4];\n\tMonoException *exc;\n\n\tignored = 0;\n\tlast = prev_last = 0, prev2_last = 0;\n\tfor (i = 0; i < ilength; i++) {\n\t\tc = start [i];\n\t\tif (c >= sizeof (dbase64)) {\n\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\"Invalid character found.\");\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (isspace (c)) {\n\t\t\tignored++;\n\t\t} else {\n\t\t\tprev2_last = prev_last;\n\t\t\tprev_last = last;\n\t\t\tlast = c;\n\t\t}\n\t}\n\n\tolength = ilength - ignored;\n\n\tif (allowWhitespaceOnly && olength == 0) {\n\t\treturn mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0);\n\t}\n\n\tif ((olength & 3) != 0 || olength <= 0) {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\",\n\t\t\t\t\t\"FormatException\", \"Invalid length.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (prev2_last == '=') {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\", \"FormatException\", \"Invalid format.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tolength = (olength * 3) / 4;\n\tif (last == '=')\n\t\tolength--;\n\n\tif (prev_last == '=')\n\t\tolength--;\n\n\tresult = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);\n\tres_ptr = mono_array_addr (result, guchar, 0);\n\tfor (i = 0; i < ilength; ) {\n\t\tint k;\n\n\t\tfor (k = 0; k < 4 && i < ilength;) {\n\t\t\tc = start [i++];\n\t\t\tif (isspace (c))\n\t\t\t\tcontinue;\n\n\t\t\ta [k] = (guchar) c;\n\t\t\tif (((b [k] = dbase64 [c]) & 0x80) != 0) {\n\t\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\t\"Invalid character found.\");\n\t\t\t\tmono_raise_exception (exc);\n\t\t\t}\n\t\t\tk++;\n\t\t}\n\n\t\t*res_ptr++ = (b [0] << 2) | (b [1] >> 4);\n\t\tif (a [2] != '=')\n\t\t\t*res_ptr++ = (b [1] << 4) | (b [2] >> 2);\n\t\tif (a [3] != '=')\n\t\t\t*res_ptr++ = (b [2] << 6) | b [3];\n\n\t\twhile (i < ilength && isspace (start [i]))\n\t\t\ti++;\n\t}\n\n\treturn result;\n}\n\nstatic MonoArray *\nInternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_string_chars (str), \n\t\tmono_string_length (str), allowWhitespaceOnly);\n}\n\nstatic MonoArray *\nInternalFromBase64CharArray (MonoArray *input, gint offset, gint length)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_array_addr (input, gunichar2, offset),\n\t\tlength, FALSE);\n}\n\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) Icall_ ## id,\n\nenum {\n#include \"metadata/icall-def.h\"\n\tIcall_last\n};\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first) Icall_type_ ## id,\n#define ICALL(id,name,func)\nenum {\n#include \"metadata/icall-def.h\"\n\tIcall_type_num\n};\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,firstic) {(Icall_ ## firstic)},\n#define ICALL(id,name,func)\ntypedef struct {\n\tguint16 first_icall;\n} IcallTypeDesc;\n\nstatic const IcallTypeDesc\nicall_type_descs [] = {\n#include \"metadata/icall-def.h\"\n\t{Icall_last}\n};\n\n#define icall_desc_num_icalls(desc) ((desc) [1].first_icall - (desc) [0].first_icall)\n\n#undef ICALL_TYPE\n#define ICALL_TYPE(id,name,first)\n#undef ICALL\n\n#ifdef HAVE_ARRAY_ELEM_INIT\n#define MSGSTRFIELD(line) MSGSTRFIELD1(line)\n#define MSGSTRFIELD1(line) str##line\n\nstatic const struct msgstrtn_t {\n#define ICALL(id,name,func)\n#undef ICALL_TYPE\n#define ICALL_TYPE(id,name,first) char MSGSTRFIELD(__LINE__) [sizeof (name)];\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n} icall_type_names_str = {\n#define ICALL_TYPE(id,name,first) (name),\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n};\nstatic const guint16 icall_type_names_idx [] = {\n#define ICALL_TYPE(id,name,first) [Icall_type_ ## id] = offsetof (struct msgstrtn_t, MSGSTRFIELD(__LINE__)),\n#include \"metadata/icall-def.h\"\n#undef ICALL_TYPE\n};\n#define icall_type_name_get(id) ((const char*)&icall_type_names_str + icall_type_names_idx [(id)])\n\nstatic const struct msgstr_t {\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) char MSGSTRFIELD(__LINE__) [sizeof (name)];\n#include \"metadata/icall-def.h\"\n#undef ICALL\n} icall_names_str = {\n#define ICALL(id,name,func) (name),\n#include \"metadata/icall-def.h\"\n#undef ICALL\n};\nstatic const guint16 icall_names_idx [] = {\n#define ICALL(id,name,func) [Icall_ ## id] = offsetof (struct msgstr_t, MSGSTRFIELD(__LINE__)),\n#include \"metadata/icall-def.h\"\n#undef ICALL\n};\n#define icall_name_get(id) ((const char*)&icall_names_str + icall_names_idx [(id)])\n\n#else\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first) name,\n#define ICALL(id,name,func)\nstatic const char* const\nicall_type_names [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n\n#define icall_type_name_get(id) (icall_type_names [(id)])\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) name,\nstatic const char* const\nicall_names [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n#define icall_name_get(id) icall_names [(id)]\n\n#endif /* !HAVE_ARRAY_ELEM_INIT */\n\n#undef ICALL_TYPE\n#undef ICALL\n#define ICALL_TYPE(id,name,first)\n#define ICALL(id,name,func) func,\nstatic const gconstpointer\nicall_functions [] = {\n#include \"metadata/icall-def.h\"\n\tNULL\n};\n\nstatic GHashTable *icall_hash = NULL;\nstatic GHashTable *jit_icall_hash_name = NULL;\nstatic GHashTable *jit_icall_hash_addr = NULL;\n\nvoid\nmono_icall_init (void)\n{\n\tint i = 0;\n\n\t/* check that tables are sorted: disable in release */\n\tif (TRUE) {\n\t\tint j;\n\t\tconst char *prev_class = NULL;\n\t\tconst char *prev_method;\n\t\t\n\t\tfor (i = 0; i < Icall_type_num; ++i) {\n\t\t\tconst IcallTypeDesc *desc;\n\t\t\tint num_icalls;\n\t\t\tprev_method = NULL;\n\t\t\tif (prev_class && strcmp (prev_class, icall_type_name_get (i)) >= 0)\n\t\t\t\tg_print (\"class %s should come before class %s\\n\", icall_type_name_get (i), prev_class);\n\t\t\tprev_class = icall_type_name_get (i);\n\t\t\tdesc = &icall_type_descs [i];\n\t\t\tnum_icalls = icall_desc_num_icalls (desc);\n\t\t\t/*g_print (\"class %s has %d icalls starting at %d\\n\", prev_class, num_icalls, desc->first_icall);*/\n\t\t\tfor (j = 0; j < num_icalls; ++j) {\n\t\t\t\tconst char *methodn = icall_name_get (desc->first_icall + j);\n\t\t\t\tif (prev_method && strcmp (prev_method, methodn) >= 0)\n\t\t\t\t\tg_print (\"method %s should come before method %s\\n\", methodn, prev_method);\n\t\t\t\tprev_method = methodn;\n\t\t\t}\n\t\t}\n\t}\n\n\ticall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);\n}\n\nvoid\nmono_icall_cleanup (void)\n{\n\tg_hash_table_destroy (icall_hash);\n\tg_hash_table_destroy (jit_icall_hash_name);\n\tg_hash_table_destroy (jit_icall_hash_addr);\n}\n\nvoid\nmono_add_internal_call (const char *name, gconstpointer method)\n{\n\tmono_loader_lock ();\n\n\tg_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);\n\n\tmono_loader_unlock ();\n}\n\n#ifdef HAVE_ARRAY_ELEM_INIT\nstatic int\ncompare_method_imap (const void *key, const void *elem)\n{\n\tconst char* method_name = (const char*)&icall_names_str + (*(guint16*)elem);\n\treturn strcmp (key, method_name);\n}\n\nstatic gpointer\nfind_method_icall (const IcallTypeDesc *imap, const char *name)\n{\n\tconst guint16 *nameslot = bsearch (name, icall_names_idx + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names_idx [0]), compare_method_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn (gpointer)icall_functions [(nameslot - &icall_names_idx [0])];\n}\n\nstatic int\ncompare_class_imap (const void *key, const void *elem)\n{\n\tconst char* class_name = (const char*)&icall_type_names_str + (*(guint16*)elem);\n\treturn strcmp (key, class_name);\n}\n\nstatic const IcallTypeDesc*\nfind_class_icalls (const char *name)\n{\n\tconst guint16 *nameslot = bsearch (name, icall_type_names_idx, Icall_type_num, sizeof (icall_type_names_idx [0]), compare_class_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn &icall_type_descs [nameslot - &icall_type_names_idx [0]];\n}\n\n#else\nstatic int\ncompare_method_imap (const void *key, const void *elem)\n{\n\tconst char** method_name = (const char**)elem;\n\treturn strcmp (key, *method_name);\n}\n\nstatic gpointer\nfind_method_icall (const IcallTypeDesc *imap, const char *name)\n{\n\tconst char **nameslot = bsearch (name, icall_names + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names [0]), compare_method_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn (gpointer)icall_functions [(nameslot - icall_names)];\n}\n\nstatic int\ncompare_class_imap (const void *key, const void *elem)\n{\n\tconst char** class_name = (const char**)elem;\n\treturn strcmp (key, *class_name);\n}\n\nstatic const IcallTypeDesc*\nfind_class_icalls (const char *name)\n{\n\tconst char **nameslot = bsearch (name, icall_type_names, Icall_type_num, sizeof (icall_type_names [0]), compare_class_imap);\n\tif (!nameslot)\n\t\treturn NULL;\n\treturn &icall_type_descs [nameslot - icall_type_names];\n}\n\n#endif\n\n/* \n * we should probably export this as an helper (handle nested types).\n * Returns the number of chars written in buf.\n */\nstatic int\nconcat_class_name (char *buf, int bufsize, MonoClass *klass)\n{\n\tint nspacelen, cnamelen;\n\tnspacelen = strlen (klass->name_space);\n\tcnamelen = strlen (klass->name);\n\tif (nspacelen + cnamelen + 2 > bufsize)\n\t\treturn 0;\n\tif (nspacelen) {\n\t\tmemcpy (buf, klass->name_space, nspacelen);\n\t\tbuf [nspacelen ++] = '.';\n\t}\n\tmemcpy (buf + nspacelen, klass->name, cnamelen);\n\tbuf [nspacelen + cnamelen] = 0;\n\treturn nspacelen + cnamelen;\n}\n\ngpointer\nmono_lookup_internal_call (MonoMethod *method)\n{\n\tchar *sigstart;\n\tchar *tmpsig;\n\tchar mname [2048];\n\tint typelen = 0, mlen, siglen;\n\tgpointer res;\n\tconst IcallTypeDesc *imap;\n\n\tg_assert (method != NULL);\n\n\tif (method->is_inflated)\n\t\tmethod = ((MonoMethodInflated *) method)->declaring;\n\n\tif (method->klass->nested_in) {\n\t\tint pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);\n\t\tif (!pos)\n\t\t\treturn NULL;\n\n\t\tmname [pos++] = '/';\n\t\tmname [pos] = 0;\n\n\t\ttypelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\n\t\ttypelen += pos;\n\t} else {\n\t\ttypelen = concat_class_name (mname, sizeof (mname), method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\t}\n\n\timap = find_class_icalls (mname);\n\n\tmname [typelen] = ':';\n\tmname [typelen + 1] = ':';\n\n\tmlen = strlen (method->name);\n\tmemcpy (mname + typelen + 2, method->name, mlen);\n\tsigstart = mname + typelen + 2 + mlen;\n\t*sigstart = 0;\n\n\ttmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);\n\tsiglen = strlen (tmpsig);\n\tif (typelen + mlen + siglen + 6 > sizeof (mname))\n\t\treturn NULL;\n\tsigstart [0] = '(';\n\tmemcpy (sigstart + 1, tmpsig, siglen);\n\tsigstart [siglen + 1] = ')';\n\tsigstart [siglen + 2] = 0;\n\tg_free (tmpsig);\n\t\n\tmono_loader_lock ();\n\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try without signature */\n\t*sigstart = 0;\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\t/* it wasn't found in the static call tables */\n\tif (!imap) {\n\t\tmono_loader_unlock ();\n\t\treturn NULL;\n\t}\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try _with_ signature */\n\t*sigstart = '(';\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tg_warning (\"cant resolve internal call to \\\"%s\\\" (tested without signature also)\", mname);\n\tg_print (\"\\nYour mono runtime and class libraries are out of sync.\\n\");\n\tg_print (\"The out of sync library is: %s\\n\", method->klass->image->name);\n\tg_print (\"\\nWhen you update one from svn you need to update, compile and install\\nthe other too.\\n\");\n\tg_print (\"Do not report this as a bug unless you're sure you have updated correctly:\\nyou probably have a broken mono install.\\n\");\n\tg_print (\"If you see other errors or faults after this message they are probably related\\n\");\n\tg_print (\"and you need to fix your mono install first.\\n\");\n\n\tmono_loader_unlock ();\n\n\treturn NULL;\n}\n\nstatic MonoType*\ntype_from_typename (char *typename)\n{\n\tMonoClass *klass = NULL;\t/* assignment to shut GCC warning up */\n\n\tif (!strcmp (typename, \"int\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"ptr\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"void\"))\n\t\tklass = mono_defaults.void_class;\n\telse if (!strcmp (typename, \"int32\"))\n\t\tklass = mono_defaults.int32_class;\n\telse if (!strcmp (typename, \"uint32\"))\n\t\tklass = mono_defaults.uint32_class;\n\telse if (!strcmp (typename, \"int8\"))\n\t\tklass = mono_defaults.sbyte_class;\n\telse if (!strcmp (typename, \"uint8\"))\n\t\tklass = mono_defaults.byte_class;\n\telse if (!strcmp (typename, \"int16\"))\n\t\tklass = mono_defaults.int16_class;\n\telse if (!strcmp (typename, \"uint16\"))\n\t\tklass = mono_defaults.uint16_class;\n\telse if (!strcmp (typename, \"long\"))\n\t\tklass = mono_defaults.int64_class;\n\telse if (!strcmp (typename, \"ulong\"))\n\t\tklass = mono_defaults.uint64_class;\n\telse if (!strcmp (typename, \"float\"))\n\t\tklass = mono_defaults.single_class;\n\telse if (!strcmp (typename, \"double\"))\n\t\tklass = mono_defaults.double_class;\n\telse if (!strcmp (typename, \"object\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"obj\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"string\"))\n\t\tklass = mono_defaults.string_class;\n\telse if (!strcmp (typename, \"bool\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse if (!strcmp (typename, \"boolean\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse {\n\t\tg_error (\"%s\", typename);\n\t\tg_assert_not_reached ();\n\t}\n\treturn &klass->byval_arg;\n}\n\nMonoMethodSignature*\nmono_create_icall_signature (const char *sigstr)\n{\n\tgchar **parts;\n\tint i, len;\n\tgchar **tmp;\n\tMonoMethodSignature *res;\n\n\tmono_loader_lock ();\n\tres = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tparts = g_strsplit (sigstr, \" \", 256);\n\n\ttmp = parts;\n\tlen = 0;\n\twhile (*tmp) {\n\t\tlen ++;\n\t\ttmp ++;\n\t}\n\n\tres = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);\n\tres->pinvoke = 1;\n\n#ifdef PLATFORM_WIN32\n\t/* \n\t * Under windows, the default pinvoke calling convention is STDCALL but\n\t * we need CDECL.\n\t */\n\tres->call_convention = MONO_CALL_C;\n#endif\n\n\tres->ret = type_from_typename (parts [0]);\n\tfor (i = 1; i < len; ++i) {\n\t\tres->params [i - 1] = type_from_typename (parts [i]);\n\t}\n\n\tg_strfreev (parts);\n\n\tg_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);\n\n\tmono_loader_unlock ();\n\n\treturn res;\n}\n\nMonoJitICallInfo *\nmono_find_jit_icall_by_name (const char *name)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_name);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_name, name);\n\tmono_loader_unlock ();\n\treturn info;\n}\n\nMonoJitICallInfo *\nmono_find_jit_icall_by_addr (gconstpointer addr)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_addr);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);\n\tmono_loader_unlock ();\n\n\treturn info;\n}\n\n/*\n * mono_get_jit_icall_info:\n *\n * Return the hashtable mapping JIT icall names to MonoJitICallInfo structures. The\n * caller should access it while holding the loader lock.\n */\nGHashTable*\nmono_get_jit_icall_info (void)\n{\n\treturn jit_icall_hash_name;\n}\n\nvoid\nmono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)\n{\n\tmono_loader_lock ();\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)wrapper, info);\n\tmono_loader_unlock ();\n}\n\nMonoJitICallInfo *\nmono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)\n{\n\tMonoJitICallInfo *info;\n\t\n\tg_assert (func);\n\tg_assert (name);\n\n\tmono_loader_lock ();\n\n\tif (!jit_icall_hash_name) {\n\t\tjit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);\n\t\tjit_icall_hash_addr = g_hash_table_new (NULL, NULL);\n\t}\n\n\tif (g_hash_table_lookup (jit_icall_hash_name, name)) {\n\t\tg_warning (\"jit icall already defined \\\"%s\\\"\\n\", name);\n\t\tg_assert_not_reached ();\n\t}\n\n\tinfo = g_new0 (MonoJitICallInfo, 1);\n\t\n\tinfo->name = name;\n\tinfo->func = func;\n\tinfo->sig = sig;\n\n\tif (is_save) {\n\t\tinfo->wrapper = func;\n\t} else {\n\t\tinfo->wrapper = NULL;\n\t}\n\n\tg_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);\n\n\tmono_loader_unlock ();\n\treturn info;\n}\n",
"patch": "@@ -718,7 +718,6 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \tvoid * source_addr;\n \tMonoClass *src_class;\n \tMonoClass *dest_class;\n-\tint i;\n \n \tMONO_ARCH_SAVE_REGS;\n \n@@ -742,6 +741,10 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \n \t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n \tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n+\t\t// FIXME: This is racy\n+\t\treturn FALSE;\n+\t\t/*\n+\t\t int i;\n \t\tint has_refs = dest_class->has_references;\n \t\tfor (i = source_idx; i < source_idx + length; ++i) {\n \t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n@@ -762,6 +765,7 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n \t\t}\n \t\treturn TRUE;\n+\t\t*/\n \t}\n \n \t/* Check if we're copying a char[] <==> (u)short[] */\n@@ -772,13 +776,18 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n \t\t\t;\n \t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n-\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE))\n+\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {\n+\t\t\t// FIXME: This is racy\n+\t\t\treturn FALSE;\n+\t\t\t/*\n+\t\t\t int i;\n \t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n \t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n \t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n \t\t\t\t\treturn FALSE;\n \t\t\t}\n-\t\telse\n+\t\t\t*/\n+\t\t} else\n \t\t\treturn FALSE;\n \t}\n ",
"file_path": "files/2011_4/1",
"file_language": "c",
"file_name": "mono/metadata/icall.c",
"outdated_file_modify": 0,
"outdated_file_before": 1,
"outdated_file_after": 0,
"llm_check": 1,
"static_check": 1,
"static": {
"flawfinder": [
true,
[
"/data/rdhu/other/Static/tmp/2011_4_1.c:762: [2] (buffer) memcpy:\n Does not check for buffer overflows when copying to destination (CWE-120).\n Make sure destination can always hold the source data.\n\t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);"
]
],
"rats": [
false,
[]
],
"semgrep": [
false,
[]
],
"cppcheck": [
false,
[]
]
},
"target": 1,
"function_before": [
{
"function": "static inline MonoBoolean\nis_generic_parameter (MonoType *type)\n{\n\treturn !type->byref && (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR);\n}",
"target": 0
},
{
"function": "static gboolean\nmono_double_ParseImpl (char *ptr, double *result)\n{\n\tgchar *endptr = NULL;\n\t*result = 0.0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n#ifdef __arm__\n\tif (*ptr)\n\t\t*result = strtod (ptr, &endptr);\n#else\n\tif (*ptr){\n#ifdef _EGLIB_MAJOR\n\t\t/* Need to lock here because EGLIB (#464316) has locking defined as no-ops, and that breaks mono_strtod */\n\t\tEnterCriticalSection (&mono_strtod_mutex);\n\t\t*result = mono_strtod (ptr, &endptr);\n\t\tLeaveCriticalSection (&mono_strtod_mutex);\n#else\n\t\t*result = mono_strtod (ptr, &endptr);\n#endif\n\t}\n#endif\n\n\tif (!*ptr || (endptr && *endptr))\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (ac->element_class->valuetype)\n\t\treturn mono_value_box (this->vtable->domain, ac->element_class, ea);\n\telse\n\t\treturn *ea;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)\n{\n\tMonoClass *ac, *ic;\n\tMonoArray *ao, *io;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tio = (MonoArray *)idxs;\n\tic = (MonoClass *)io->obj.vtable->klass;\n\t\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (io->bounds != NULL || io->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)io->vector;\n\n\tif (ao->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= ao->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\treturn ves_icall_System_Array_GetValueImpl (this, *ind);\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < ao->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - ao->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos*ao->bounds [i].length + ind [i] - \n\t\t\tao->bounds [i].lower_bound;\n\n\treturn ves_icall_System_Array_GetValueImpl (this, pos);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)\n{\n\tMonoClass *ac, *vc, *ec;\n\tgint32 esize, vsize;\n\tgpointer *ea, *va;\n\tint et, vt;\n\n\tguint64 u64 = 0;\n\tgint64 i64 = 0;\n\tgdouble r64 = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (value)\n\t\tvc = value->vtable->klass;\n\telse\n\t\tvc = NULL;\n\n\tac = this->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)this->vector + (pos * esize));\n\tva = (gpointer*)((char*)value + sizeof (MonoObject));\n\n\tif (mono_class_is_nullable (ec)) {\n\t\tmono_nullable_init ((guint8*)ea, value, ec);\n\t\treturn;\n\t}\n\n\tif (!value) {\n\t\tmemset (ea, 0, esize);\n\t\treturn;\n\t}\n\n#define NO_WIDENING_CONVERSION G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\\\n\tif (esize < vsize + (extra)) \\\n\t\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define INVALID_CAST G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_invalid_cast ()); \\\n}G_STMT_END\n\n\t/* Check element (destination) type. */\n\tswitch (ec->byval_arg.type) {\n\tcase MONO_TYPE_STRING:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_STRING:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (!ec->valuetype) {\n\t\tif (!mono_object_isinst (value, ec))\n\t\t\tINVALID_CAST;\n\t\tmono_gc_wbarrier_set_arrayref (this, ea, (MonoObject*)value);\n\t\treturn;\n\t}\n\n\tif (mono_object_isinst (value, ec)) {\n\t\tif (ec->has_references)\n\t\t\tmono_value_copy (ea, (char*)value + sizeof (MonoObject), ec);\n\t\telse\n\t\t\tmemcpy (ea, (char *)value + sizeof (MonoObject), esize);\n\t\treturn;\n\t}\n\n\tif (!vc->valuetype)\n\t\tINVALID_CAST;\n\n\tvsize = mono_class_instance_size (vc) - sizeof (MonoObject);\n\n\tet = ec->byval_arg.type;\n\tif (et == MONO_TYPE_VALUETYPE && ec->byval_arg.data.klass->enumtype)\n\t\tet = mono_class_enum_basetype (ec->byval_arg.data.klass)->type;\n\n\tvt = vc->byval_arg.type;\n\tif (vt == MONO_TYPE_VALUETYPE && vc->byval_arg.data.klass->enumtype)\n\t\tvt = mono_class_enum_basetype (vc->byval_arg.data.klass)->type;\n\n#define ASSIGN_UNSIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a signed value to an unsigned array. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t}",
"target": 0
},
{
"function": "static void \nves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,\n\t\t\t\t MonoArray *idxs)\n{\n\tMonoClass *ac, *ic;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tic = idxs->obj.vtable->klass;\n\tac = this->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (idxs->bounds != NULL || idxs->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)idxs->vector;\n\n\tif (this->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= this->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\tves_icall_System_Array_SetValueImpl (this, value, *ind);\n\t\treturn;\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < this->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - this->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos * this->bounds [i].length + ind [i] - \n\t\t\tthis->bounds [i].lower_bound;\n\n\tves_icall_System_Array_SetValueImpl (this, value, pos);\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++)\n\t\tif (mono_array_get (lengths, gint32, i) < 0)\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint32, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++) \n\t\tif ((mono_array_get (lengths, gint64, i) < 0) ||\n\t\t (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX))\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint64, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = (mono_array_size_t) mono_array_get (bounds, guint64, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}",
"target": 0
},
{
"function": "static gint32 \nves_icall_System_Array_GetRank (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this->vtable->klass->rank;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\tmono_array_size_t length;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\tlength = this->max_length;\n\telse\n\t\tlength = this->bounds [dimension].length;\n\n#ifdef MONO_BIG_ARRAYS\n\tif (length > G_MAXINT32)\n\t mono_raise_exception (mono_get_exception_overflow ());\n#endif\n\treturn length;\n}",
"target": 0
},
{
"function": "static gint64\nves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n \t\treturn this->max_length;\n \t\n \treturn this->bounds [dimension].length;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\treturn 0;\n\t\n\treturn this->bounds [dimension].lower_bound;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)\n{\n\tint sz = mono_array_element_size (mono_object_class (arr));\n\tmemset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)\n{\n\tint element_size;\n\tvoid * dest_addr;\n\tvoid * source_addr;\n\tMonoClass *src_class;\n\tMonoClass *dest_class;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)\n\t\treturn FALSE;\n\n\tif (source->bounds || dest->bounds)\n\t\treturn FALSE;\n\n\t/* there's no integer overflow since mono_array_length returns an unsigned integer */\n\tif ((dest_idx + length > mono_array_length (dest)) ||\n\t\t(source_idx + length > mono_array_length (source)))\n\t\treturn FALSE;\n\n\tsrc_class = source->obj.vtable->klass->element_class;\n\tdest_class = dest->obj.vtable->klass->element_class;\n\n\t/*\n\t * Handle common cases.\n\t */\n\n\t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n\tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n\t\tint has_refs = dest_class->has_references;\n\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\treturn FALSE;\n\t\t}\n\n\t\telement_size = mono_array_element_size (dest->obj.vtable->klass);\n\t\tmemset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);\n\t\t\tvoid *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);\n\t\t\tif (!elem)\n\t\t\t\tcontinue;\n\t\t\tif (has_refs)\n\t\t\t\tmono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);\n\t\t\telse\n\t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\t/* Check if we're copying a char[] <==> (u)short[] */\n\tif (src_class != dest_class) {\n\t\tif (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)\n\t\t\treturn FALSE;\n\n\t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n\t\t\t;\n\t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE))\n\t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\tif (dest_class->valuetype) {\n\t\telement_size = mono_array_element_size (source->obj.vtable->klass);\n\t\tsource_addr = mono_array_addr_with_size (source, element_size, source_idx);\n\t\tif (dest_class->has_references) {\n\t\t\tmono_value_copy_array (dest, dest_idx, source_addr, length);\n\t\t} else {\n\t\t\tdest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);\n\t\t\tmemmove (dest_addr, source_addr, element_size * length);\n\t\t}\n\t} else {\n\t\tmono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);\n\t}\n\n\treturn TRUE;\n}",
"target": 1,
"line": "@@ -718,7 +718,6 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \tvoid * source_addr;\n \tMonoClass *src_class;\n \tMonoClass *dest_class;\n-\tint i;\n \n \tMONO_ARCH_SAVE_REGS;\n \n@@ -742,6 +741,10 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \n \t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n \tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n+\t\t// FIXME: This is racy\n+\t\treturn FALSE;\n+\t\t/*\n+\t\t int i;\n \t\tint has_refs = dest_class->has_references;\n \t\tfor (i = source_idx; i < source_idx + length; ++i) {\n \t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n@@ -762,6 +765,7 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n \t\t}\n \t\treturn TRUE;\n+\t\t*/\n \t}\n \n \t/* Check if we're copying a char[] <==> (u)short[] */\n@@ -772,13 +776,18 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d\n \t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n \t\t\t;\n \t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n-\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE))\n+\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {\n+\t\t\t// FIXME: This is racy\n+\t\t\treturn FALSE;\n+\t\t\t/*\n+\t\t\t int i;\n \t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n \t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n \t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n \t\t\t\t\treturn FALSE;\n \t\t\t}\n-\t\telse\n+\t\t\t*/\n+\t\t} else\n \t\t\treturn FALSE;\n \t}\n "
},
{
"function": "static void\nves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tmemcpy (value, ea, esize);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac, *ec;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (MONO_TYPE_IS_REFERENCE (&ec->byval_arg)) {\n\t\tg_assert (esize == sizeof (gpointer));\n\t\tmono_gc_wbarrier_generic_store (ea, *(gpointer*)value);\n\t} else {\n\t\tg_assert (ec->inited);\n\t\tif (ec->has_references)\n\t\t\tmono_gc_wbarrier_value_copy (ea, value, 1, ec);\n\t\tmemcpy (ea, value, esize);\n\t}\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)\n{\n\tMonoClass *klass = array->obj.vtable->klass;\n\tguint32 size = mono_array_element_size (klass);\n\tMonoType *type = mono_type_get_underlying_type (&klass->element_class->byval_arg);\n\tint align;\n\tconst char *field_data;\n\n\tif (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {\n\t\tMonoException *exc = mono_get_exception_argument(\"array\",\n\t\t\t\"Cannot initialize array of non-primitive type.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field doesn't have an RVA\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tsize *= array->max_length;\n\tfield_data = mono_field_get_data (field_handle);\n\n\tif (size > mono_type_size (field_handle->type, &align)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field not large enough to fill array\");\n\t\tmono_raise_exception (exc);\n\t}\n\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n#define SWAP(n) {\\\n\tguint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \\\n\tguint ## n *src = (guint ## n *) field_data; \\\n\tguint ## n *end = (guint ## n *)((char*)src + size); \\\n\\\n\tfor (; src < end; data++, src++) { \\\n\t\t*data = read ## n (src); \\\n\t} \\\n}\n\n\t/* printf (\"Initialize array with elements of %s type\\n\", klass->element_class->name); */\n\n\tswitch (type->type) {\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\t\tSWAP (16);\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\tSWAP (32);\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\tSWAP (64);\n\t\tbreak;\n\tdefault:\n\t\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n\t\tbreak;\n\t}\n#else\n\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n#ifdef ARM_FPU_FPA\n\tif (klass->element_class->byval_arg.type == MONO_TYPE_R8) {\n\t\tgint i;\n\t\tdouble tmp;\n\t\tdouble *data = (double*)mono_array_addr (array, double, 0);\n\n\t\tfor (i = 0; i < size; i++, data++) {\n\t\t\treadr8 (data, &tmp);\n\t\t\t*data = tmp;\n\t\t}\n\t}\n#endif\n#endif\n}",
"target": 0
},
{
"function": "static gint\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn offsetof (MonoString, chars);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((obj == NULL) || (! (obj->vtable->klass->valuetype)))\n\t\treturn obj;\n\telse\n\t\treturn mono_object_clone (obj);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)\n{\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\n\tMONO_CHECK_ARG_NULL (handle);\n\n\tklass = mono_class_from_mono_type (handle);\n\tMONO_CHECK_ARG (handle, klass);\n\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\t/* This will call the type constructor */\n\tmono_runtime_class_init (vtable);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (MonoImage *image)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_check_for_module_cctor (image);\n\tif (image->has_module_cctor) {\n\t\tMonoClass *module_klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | 1);\n\t\t/*It's fine to raise the exception here*/\n\t\tmono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE));\n\t}\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Object_MemberwiseClone (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_object_clone (this);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tint count = 0;\n\tgint32 result = 0;\n\tMonoClassField* field;\n\tgpointer iter;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_object_class (this);\n\n\tif (mono_class_num_fields (klass) == 0)\n\t\treturn mono_object_hash (this);\n\n\t/*\n\t * Compute the starting value of the hashcode for fields of primitive\n\t * types, and return the remaining fields in an array to the managed side.\n\t * This way, we can avoid costly reflection operations in managed code.\n\t */\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_I4:\n\t\t\tresult ^= *(gint32*)((guint8*)this + field->offset);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s;\n\t\t\ts = *(MonoString**)((guint8*)this + field->offset);\n\t\t\tif (s != NULL)\n\t\t\t\tresult ^= mono_string_hash (s);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass));\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t}\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t} else {\n\t\t*fields = NULL;\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tMonoClassField* field;\n\tgpointer iter;\n\tint count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (that);\n\n\tif (this->vtable != that->vtable)\n\t\treturn FALSE;\n\n\tklass = mono_object_class (this);\n\n\tif (klass->enumtype && mono_class_enum_basetype (klass) && mono_class_enum_basetype (klass)->type == MONO_TYPE_I4)\n\t\treturn (*(gint32*)((guint8*)this + sizeof (MonoObject)) == *(gint32*)((guint8*)that + sizeof (MonoObject)));\n\n\t/*\n\t * Do the comparison for fields of primitive type and return a result if\n\t * possible. Otherwise, return the remaining fields in an array to the \n\t * managed side. This way, we can avoid costly reflection operations in \n\t * managed code.\n\t */\n\t*fields = NULL;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tif (*((guint8*)this + field->offset) != *((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\t\tif (*(gint16*)((guint8*)this + field->offset) != *(gint16*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tif (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tif (*(gint64*)((guint8*)this + field->offset) != *(gint64*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R4:\n\t\t\tif (*(float*)((guint8*)this + field->offset) != *(float*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R8:\n\t\t\tif (*(double*)((guint8*)this + field->offset) != *(double*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\n\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s1, *s2;\n\t\t\tguint32 s1len, s2len;\n\t\t\ts1 = *(MonoString**)((guint8*)this + field->offset);\n\t\t\ts2 = *(MonoString**)((guint8*)that + field->offset);\n\t\t\tif (s1 == s2)\n\t\t\t\tbreak;\n\t\t\tif ((s1 == NULL) || (s2 == NULL))\n\t\t\t\treturn FALSE;\n\t\t\ts1len = mono_string_length (s1);\n\t\t\ts2len = mono_string_length (s2);\n\t\t\tif (s1len != s2len)\n\t\t\t\treturn FALSE;\n\n\t\t\tif (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, that);\n\t\t\tvalues [count++] = o;\n\t\t}\n\n\t\tif (klass->enumtype)\n\t\t\t/* enums only have one non-static field */\n\t\t\tbreak;\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t\treturn FALSE;\n\t} else {\n\t\treturn TRUE;\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_System_Object_GetType (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (obj->vtable->klass != mono_defaults.transparent_proxy_class)\n\t\treturn mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);\n\telse\n\t\treturn mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nmono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmtype->type = &obj->vtable->klass->byval_arg;\n\tg_assert (mtype->type->type);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tMONO_CHECK_ARG_NULL (obj);\n\t\n\treturn mono_image_create_token (mb->dynamic_image, obj, TRUE, TRUE);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,\n\t\t\t\t\tMonoReflectionMethod *method,\n\t\t\t\t\tMonoArray *opt_param_types)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (method);\n\t\n\treturn mono_image_create_method_token (\n\t\tmb->dynamic_image, (MonoObject *) method, opt_param_types);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_create_pefile (mb, file);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_build_metadata (mb);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_register_token (mb->dynamic_image, token, obj);\n}",
"target": 0
},
{
"function": "static gboolean\nget_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static gboolean\nget_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (!(*dest)) {\n\t\tif (!strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\t\treturn FALSE;\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static gboolean\nget_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m->wrapper_type != MONO_WRAPPER_NONE)\n\t\treturn FALSE;\n\n\tif (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\ntype_from_name (const char *str, MonoBoolean ignoreCase)\n{\n\tMonoType *type = NULL;\n\tMonoAssembly *assembly = NULL;\n\tMonoTypeNameParse info;\n\tchar *temp_str = g_strdup (str);\n\tgboolean type_resolve = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* mono_reflection_parse_type() mangles the string */\n\tif (!mono_reflection_parse_type (temp_str, &info)) {\n\t\tmono_reflection_free_type_info (&info);\n\t\tg_free (temp_str);\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tassembly = mono_assembly_load (&info.assembly, NULL, NULL);\n\t} else {\n\t\tMonoMethod *m = mono_method_get_last_managed ();\n\t\tMonoMethod *dest = m;\n\n\t\tmono_stack_walk_no_il (get_caller_no_reflection, &dest);\n\t\tif (!dest)\n\t\t\tdest = m;\n\n\t\t/*\n\t\t * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus\n\t\t * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()\n\t\t * to crash. This only seems to happen in some strange remoting\n\t\t * scenarios and I was unable to figure out what's happening there.\n\t\t * Dec 10, 2005 - Martin.\n\t\t */\n\n\t\tif (dest) {\n\t\t\tassembly = dest->klass->image->assembly;\n\t\t\ttype_resolve = TRUE;\n\t\t} else {\n\t\t\tg_warning (G_STRLOC);\n\t\t}\n\t}\n\n\tif (assembly) {\n\t\t/* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tif (!info.assembly.name && !type) /* try mscorlib */\n\t\ttype = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);\n\n\tif (assembly && !type && type_resolve) {\n\t\ttype_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tmono_reflection_free_type_info (&info);\n\tg_free (temp_str);\n\n\tif (!type) \n\t\treturn NULL;\n\n\treturn mono_type_get_object (mono_domain_get (), type);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_type_from_name (MonoString *name,\n\t\t\t MonoBoolean throwOnError,\n\t\t\t MonoBoolean ignoreCase)\n{\n\tchar *str = mono_string_to_utf8 (name);\n\tMonoReflectionType *type;\n\n\ttype = type_from_name (str, ignoreCase);\n\tg_free (str);\n\tif (type == NULL){\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tmono_loader_clear_error ();\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\t}\n\t\n\treturn type;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_type_from_handle (MonoType *handle)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *klass = mono_class_from_mono_type (handle);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_init (klass);\n\treturn mono_type_get_object (domain, handle);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (c && type->type && c->type)\n\t\treturn mono_metadata_type_equal (type->type, c->type);\n\telse\n\t\treturn (type == c) ? TRUE : FALSE;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)\n{\n\tint t = type->type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn TYPECODE_OBJECT;\n\nhandle_enum:\n\tswitch (t) {\n\tcase MONO_TYPE_VOID:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn TYPECODE_BOOLEAN;\n\tcase MONO_TYPE_U1:\n\t\treturn TYPECODE_BYTE;\n\tcase MONO_TYPE_I1:\n\t\treturn TYPECODE_SBYTE;\n\tcase MONO_TYPE_U2:\n\t\treturn TYPECODE_UINT16;\n\tcase MONO_TYPE_I2:\n\t\treturn TYPECODE_INT16;\n\tcase MONO_TYPE_CHAR:\n\t\treturn TYPECODE_CHAR;\n\tcase MONO_TYPE_PTR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_U4:\n\t\treturn TYPECODE_UINT32;\n\tcase MONO_TYPE_I4:\n\t\treturn TYPECODE_INT32;\n\tcase MONO_TYPE_U8:\n\t\treturn TYPECODE_UINT64;\n\tcase MONO_TYPE_I8:\n\t\treturn TYPECODE_INT64;\n\tcase MONO_TYPE_R4:\n\t\treturn TYPECODE_SINGLE;\n\tcase MONO_TYPE_R8:\n\t\treturn TYPECODE_DOUBLE;\n\tcase MONO_TYPE_VALUETYPE:\n\t\tif (type->type->data.klass->enumtype) {\n\t\t\tt = mono_class_enum_basetype (type->type->data.klass)->type;\n\t\t\tgoto handle_enum;\n\t\t} else {\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"Decimal\") == 0)\n\t\t\t\t\treturn TYPECODE_DECIMAL;\n\t\t\t\telse if (strcmp (k->name, \"DateTime\") == 0)\n\t\t\t\t\treturn TYPECODE_DATETIME;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_STRING:\n\t\treturn TYPECODE_STRING;\n\tcase MONO_TYPE_SZARRAY:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_VAR:\n\tcase MONO_TYPE_MVAR:\n\tcase MONO_TYPE_TYPEDBYREF:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_CLASS:\n\t\t{\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"DBNull\") == 0)\n\t\t\t\t\treturn TYPECODE_DBNULL;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_GENERICINST:\n\t\treturn TYPECODE_OBJECT;\n\tdefault:\n\t\tg_error (\"type 0x%02x not handled in GetTypeCode()\", t);\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tif (!c) /* FIXME: dont know what do do here */\n\t\treturn 0;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref)\n\t\treturn klassc == mono_defaults.object_class;\n\n\treturn mono_class_is_subclass_of (klass, klassc, check_interfaces);\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref && !c->type->byref)\n\t\treturn FALSE;\n\n\treturn mono_class_is_assignable_from (klass, klassc);\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\treturn mono_object_isinst (obj, klass) != NULL;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_get_attributes (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn klass->flags;\n}",
"target": 0
},
{
"function": "static MonoReflectionMarshal*\nves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)\n{\n\tMonoClass *klass = field->field->parent;\n\tMonoMarshalType *info;\n\tint i;\n\n\tif (klass->generic_container ||\n\t (klass->generic_class && klass->generic_class->context.class_inst->is_open))\n\t\treturn NULL;\n\n\tinfo = mono_marshal_load_type_info (klass);\n\n\tfor (i = 0; i < info->num_fields; ++i) {\n\t\tif (info->fields [i].field == field->field) {\n\t\t\tif (!info->fields [i].mspec)\n\t\t\t\treturn NULL;\n\t\t\telse\n\t\t\t\treturn mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);\n\t\t}\n\t}\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionField*\nves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)\n{\n\tgboolean found = FALSE;\n\tMonoClass *klass;\n\tMonoClass *k;\n\n\tg_assert (handle);\n\n\tif (!type) {\n\t\tklass = handle->parent;\n\t} else {\n\t\tklass = mono_class_from_mono_type (type);\n\n\t\t/* Check that the field belongs to the class */\n\t\tfor (k = klass; k; k = k->parent) {\n\t\t\tif (k == handle->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found)\n\t\t\t/* The managed code will throw the exception */\n\t\t\treturn NULL;\n\t}\n\n\treturn mono_field_get_object (mono_domain_get (), klass, handle);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *field, MonoBoolean optional)\n{\n\tMonoType *type = field->field->type;\n\n\treturn type_array_from_modifiers (field->field->parent->image, type, optional);\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoMethodSignature* sig;\n\tMONO_ARCH_SAVE_REGS;\n\n\tsig = mono_method_signature (method);\n\tif (!sig) {\n\t\tg_assert (mono_loader_get_last_error ());\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t}\n\n\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &method->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, ret, mono_type_get_object (domain, sig->ret));\n\tinfo->attrs = method->flags;\n\tinfo->implattrs = method->iflags;\n\tif (sig->call_convention == MONO_CALL_DEFAULT)\n\t\tinfo->callconv = sig->sentinelpos >= 0 ? 2 : 1;\n\telse {\n\t\tif (sig->call_convention == MONO_CALL_VARARG || sig->sentinelpos >= 0)\n\t\t\tinfo->callconv = 2;\n\t\telse\n\t\t\tinfo->callconv = 1;\n\t}\n\tinfo->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6); \n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\n\treturn mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionMarshal*\nves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoReflectionMarshal* res = NULL;\n\tMonoMarshalSpec **mspecs;\n\tint i;\n\n\tmspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);\n\tmono_method_get_marshal_info (method, mspecs);\n\n\tif (mspecs [0])\n\t\tres = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);\n\t\t\n\tfor (i = mono_method_signature (method)->param_count; i >= 0; i--)\n\t\tif (mspecs [i])\n\t\t\tmono_metadata_free_marshal_spec (mspecs [i]);\n\tg_free (mspecs);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)\n{\n\treturn field->field->offset - sizeof (MonoObject);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)\n{\n\tMonoClass *parent;\n\tMONO_ARCH_SAVE_REGS;\n\n\tparent = declaring? field->field->parent: field->klass;\n\n\treturn mono_type_get_object (mono_object_domain (field), &parent->byval_arg);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)\n{\t\n\tMonoObject *o;\n\tMonoClassField *cf = field->field;\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\tMonoType *t;\n\tMonoDomain *domain = mono_object_domain (field); \n\tgchar *v;\n\tgboolean is_static = FALSE;\n\tgboolean is_ref = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\t\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tmono_class_init (field->klass);\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\tis_static = TRUE;\n\n\tif (obj && !is_static) {\n\t\t/* Check that the field belongs to the object */\n\t\tgboolean found = FALSE;\n\t\tMonoClass *k;\n\n\t\tfor (k = obj->vtable->klass; k; k = k->parent) {\n\t\t\tif (k == cf->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tchar *msg = g_strdup_printf (\"Field '%s' defined on type '%s' is not a field on the target object which is of type '%s'.\", mono_field_get_name (cf), cf->parent->name, obj->vtable->klass->name);\n\t\t\tMonoException *ex = mono_get_exception_argument (NULL, msg);\n\t\t\tg_free (msg);\n\t\t\tmono_raise_exception (ex);\n\t\t}\n\t}\n\n\tt = mono_type_get_underlying_type (cf->type);\n\tswitch (t->type) {\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_CLASS:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_SZARRAY:\n\t\tis_ref = TRUE;\n\t\tbreak;\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8:\n\tcase MONO_TYPE_VALUETYPE:\n\t\tis_ref = t->byref;\n\t\tbreak;\n\tcase MONO_TYPE_GENERICINST:\n\t\tif (mono_type_generic_inst_is_valuetype (t)) {\n\t\t\tis_ref = t->byref;\n\t\t} else {\n\t\t\tis_ref = TRUE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t \"ves_icall_Monofield_GetValue\", t->type);\n\t\treturn NULL;\n\t}\n\n\tvtable = NULL;\n\tif (is_static) {\n\t\tvtable = mono_class_vtable_full (domain, cf->parent, TRUE);\n\t\tif (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))\n\t\t\tmono_runtime_class_init (vtable);\n\t}\n\t\n\tif (is_ref) {\n\t\tif (is_static) {\n\t\t\tmono_field_static_get_value (vtable, cf, &o);\n\t\t} else {\n\t\t\tmono_field_get_value (obj, cf, &o);\n\t\t}\n\t\treturn o;\n\t}\n\n\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\tguint8 *buf;\n\n\t\t/* Convert the Nullable structure into a boxed vtype */\n\t\tif (is_static)\n\t\t\tbuf = (guint8*)vtable->data + cf->offset;\n\t\telse\n\t\t\tbuf = (guint8*)obj + cf->offset;\n\n\t\treturn mono_nullable_box (buf, nklass);\n\t}\n\n\t/* boxed value type */\n\tklass = mono_class_from_mono_type (cf->type);\n\to = mono_object_new (domain, klass);\n\tv = ((gchar *) o) + sizeof (MonoObject);\n\tif (is_static) {\n\t\tmono_field_static_get_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_get_value (obj, cf, v);\n\t}\n\n\treturn o;\n}",
"target": 0
},
{
"function": "static void\nves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)\n{\n\tMonoClassField *cf = field->field;\n\tgchar *v;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tv = (gchar *) value;\n\tif (!cf->type->byref) {\n\t\tswitch (cf->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U:\n\t\tcase MONO_TYPE_I:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R8:\n\t\tcase MONO_TYPE_VALUETYPE:\n\t\t\tif (v != NULL)\n\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING:\n\t\tcase MONO_TYPE_OBJECT:\n\t\tcase MONO_TYPE_CLASS:\n\t\tcase MONO_TYPE_ARRAY:\n\t\tcase MONO_TYPE_SZARRAY:\n\t\t\t/* Do nothing */\n\t\t\tbreak;\n\t\tcase MONO_TYPE_GENERICINST: {\n\t\t\tMonoGenericClass *gclass = cf->type->data.generic_class;\n\t\t\tg_assert (!gclass->context.class_inst->is_open);\n\n\t\t\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\t\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\t\t\tMonoObject *nullable;\n\n\t\t\t\t/* \n\t\t\t\t * Convert the boxed vtype into a Nullable structure.\n\t\t\t\t * This is complicated by the fact that Nullables have\n\t\t\t\t * a variable structure.\n\t\t\t\t */\n\t\t\t\tnullable = mono_object_new (mono_domain_get (), nklass);\n\n\t\t\t\tmono_nullable_init (mono_object_unbox (nullable), value, nklass);\n\n\t\t\t\tv = mono_object_unbox (nullable);\n\t\t\t}\n\t\t\telse \n\t\t\t\tif (gclass->container_class->valuetype && (v != NULL))\n\t\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t\t \"ves_icall_FieldInfo_SetValueInternal\", cf->type->type);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\tMonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, TRUE);\n\t\tif (!vtable->initialized)\n\t\t\tmono_runtime_class_init (vtable);\n\t\tmono_field_static_set_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_set_value (obj, cf, v);\n\t}\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this)\n{\t\n\tMonoObject *o = NULL;\n\tMonoClassField *field = this->field;\n\tMonoClass *klass;\n\tMonoDomain *domain = mono_object_domain (this); \n\tgchar *v;\n\tMonoTypeEnum def_type;\n\tconst char *def_value;\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tmono_class_init (field->parent);\n\n\tif (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (NULL));\n\n\tif (field->parent->image->dynamic) {\n\t\t/* FIXME: */\n\t\tg_assert_not_reached ();\n\t}\n\n\tdef_value = mono_class_get_field_default_value (field, &def_type);\n\n\tswitch (def_type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8: {\n\t\tMonoType *t;\n\n\t\t/* boxed value type */\n\t\tt = g_new0 (MonoType, 1);\n\t\tt->type = def_type;\n\t\tklass = mono_class_from_mono_type (t);\n\t\tg_free (t);\n\t\to = mono_object_new (domain, klass);\n\t\tv = ((gchar *) o) + sizeof (MonoObject);\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, v);\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_CLASS:\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, &o);\n\t\tbreak;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\n\treturn o;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)\n{\n\tMonoMethod *method = rmethod->method.method;\n\n\treturn mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)\n{\n\tMonoDomain *domain = mono_object_domain (property); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((req_info & PInfo_ReflectedType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg));\n\telse if ((req_info & PInfo_DeclaringType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->property->parent->byval_arg));\n\n\tif ((req_info & PInfo_Name) != 0)\n\t\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, property->property->name));\n\n\tif ((req_info & PInfo_Attributes) != 0)\n\t\tinfo->attrs = property->property->attrs;\n\n\tif ((req_info & PInfo_GetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, get, property->property->get ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->get, property->klass): NULL);\n\t\n\tif ((req_info & PInfo_SetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, set, property->property->set ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->set, property->klass): NULL);\n\t/* \n\t * There may be other methods defined for properties, though, it seems they are not exposed \n\t * in the reflection API \n\t */\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (event); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg));\n\n\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));\n\tinfo->attrs = event->event->attrs;\n\tMONO_STRUCT_SETREF (info, add_method, event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, remove_method, event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, raise_method, event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL);\n\n\tif (event->event->other) {\n\t\tint i, n = 0;\n\t\twhile (event->event->other [n])\n\t\t\tn++;\n\t\tMONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));\n\n\t\tfor (i = 0; i < n; i++)\n\t\t\tmono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));\n\t}\t\t\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetInterfaces (MonoReflectionType* type)\n{\n\tMonoError error;\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoArray *intf;\n\tGPtrArray *ifaces = NULL;\n\tint i;\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *parent;\n\tMonoBitSet *slots;\n\tMonoGenericContext *context = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->generic_class && class->generic_class->context.class_inst->is_open) {\n\t\tcontext = mono_class_get_context (class);\n\t\tclass = class->generic_class->container_class;\n\t}\n\n\tmono_class_setup_vtable (class);\n\n\tslots = mono_bitset_new (class->max_interface_id + 1, 0);\n\n\tfor (parent = class; parent; parent = parent->parent) {\n\t\tGPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error);\n\t\tif (!mono_error_ok (&error)) {\n\t\t\tmono_bitset_free (slots);\n\t\t\tmono_error_raise_exception (&error);\n\t\t\treturn NULL;\n\t\t} else if (tmp_ifaces) {\n\t\t\tfor (i = 0; i < tmp_ifaces->len; ++i) {\n\t\t\t\tMonoClass *ic = g_ptr_array_index (tmp_ifaces, i);\n\n\t\t\t\tif (mono_bitset_test (slots, ic->interface_id))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmono_bitset_set (slots, ic->interface_id);\n\t\t\t\tif (ifaces == NULL)\n\t\t\t\t\tifaces = g_ptr_array_new ();\n\t\t\t\tg_ptr_array_add (ifaces, ic);\n\t\t\t}\n\t\t\tg_ptr_array_free (tmp_ifaces, TRUE);\n\t\t}\n\t}\n\tmono_bitset_free (slots);\n\n\tif (!ifaces)\n\t\treturn mono_array_new_cached (domain, mono_defaults.monotype_class, 0);\n\t\t\n\tintf = mono_array_new_cached (domain, mono_defaults.monotype_class, ifaces->len);\n\tfor (i = 0; i < ifaces->len; ++i) {\n\t\tMonoClass *ic = g_ptr_array_index (ifaces, i);\n\t\tMonoType *ret = &ic->byval_arg, *inflated = NULL;\n\t\tif (context && ic->generic_class && ic->generic_class->context.class_inst->is_open)\n\t\t\tinflated = ret = mono_class_inflate_generic_type (ret, context);\n\t\t\n\t\tmono_array_setref (intf, i, mono_type_get_object (domain, ret));\n\t\tif (inflated)\n\t\t\tmono_metadata_free_type (inflated);\n\t}\n\tg_ptr_array_free (ifaces, TRUE);\n\n\treturn intf;\n}",
"target": 0
},
{
"function": "static void\nves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *iclass = mono_class_from_mono_type (iface->type);\n\tMonoReflectionMethod *member;\n\tMonoMethod* method;\n\tgpointer iter;\n\tint i = 0, len, ioffset;\n\tMonoDomain *domain;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_setup_vtable (class);\n\n\t/* type doesn't implement iface: the exception is thrown in managed code */\n\tif (! MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))\n\t\t\treturn;\n\n\tlen = mono_class_num_methods (iclass);\n\tioffset = mono_class_interface_offset (class, iclass);\n\tdomain = mono_object_domain (type);\n\tmono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\tmono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (iclass, &iter))) {\n\t\tmember = mono_method_get_object (domain, method, iclass);\n\t\tmono_array_setref (*methods, i, member);\n\t\tmember = mono_method_get_object (domain, class->vtable [i + ioffset], class);\n\t\tmono_array_setref (*targets, i, member);\n\t\t\n\t\ti ++;\n\t}\n}",
"target": 0
},
{
"function": "static void\nves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tif (klass->image->dynamic) {\n\t\tMonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type;\n\t\t*packing = tb->packing_size;\n\t\t*size = tb->class_size;\n\t} else {\n\t\tmono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_GetElementType (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY)\n\t\treturn mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg);\n\n\tclass = mono_class_from_mono_type (type->type);\n\n\t// GetElementType should only return a type for:\n\t// Array Pointer PassedByRef\n\tif (type->type->byref)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->byval_arg);\n\telse if (class->element_class && MONO_CLASS_IS_ARRAY (class))\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse if (class->element_class && type->type->type == MONO_TYPE_PTR)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_get_type_parent (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_ispointer (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->type == MONO_TYPE_PTR;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_isprimitive (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_isbyref (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->byref;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_iscomobject (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (klass && klass->is_com_object);\n}",
"target": 0
},
{
"function": "static MonoReflectionModule*\nves_icall_MonoType_get_Module (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_module_get_object (mono_object_domain (type), class->image);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_MonoType_get_Assembly (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_assembly_get_object (domain, class->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\tif (type->type->type == MONO_TYPE_VAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.klass;\n\telse if (type->type->type == MONO_TYPE_MVAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.method->klass;\n\telse\n\t\tclass = mono_class_from_mono_type (type->type)->nested_in;\n\n\treturn class ? mono_type_get_object (domain, &class->byval_arg) : NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->enumtype && mono_class_enum_basetype (class)) /* types that are modified typebuilders may not have enum_basetype set */\n\t\treturn mono_type_get_object (domain, mono_class_enum_basetype (class));\n\telse if (class->element_class)\n\t\treturn mono_type_get_object (domain, &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_MonoType_get_Name (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref) {\n\t\tchar *n = g_strdup_printf (\"%s&\", class->name);\n\t\tMonoString *res = mono_string_new (domain, n);\n\n\t\tg_free (n);\n\n\t\treturn res;\n\t} else {\n\t\treturn mono_string_new (domain, class->name);\n\t}\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_MonoType_get_Namespace (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile (class->nested_in)\n\t\tclass = class->nested_in;\n\n\tif (class->name_space [0] == '\\0')\n\t\treturn NULL;\n\telse\n\t\treturn mono_string_new (domain, class->name_space);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_MonoType_GetArrayRank (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tif (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY)\n\t\tmono_raise_exception (mono_get_exception_argument (\"type\", \"Type must be an array type\"));\n\n\tclass = mono_class_from_mono_type (type->type);\n\treturn class->rank;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)\n{\n\tMonoArray *res;\n\tMonoClass *klass, *pklass;\n\tMonoDomain *domain = mono_object_domain (type);\n\tMonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE);\n\tint i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->generic_container) {\n\t\tMonoGenericContainer *container = klass->generic_container;\n\t\tres = mono_array_new_specific (array_vtable, container->type_argc);\n\t\tfor (i = 0; i < container->type_argc; ++i) {\n\t\t\tpklass = mono_class_from_generic_parameter (mono_generic_container_get_param (container, i), klass->image, FALSE);\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, &pklass->byval_arg));\n\t\t}\n\t} else if (klass->generic_class) {\n\t\tMonoGenericInst *inst = klass->generic_class->context.class_inst;\n\t\tres = mono_array_new_specific (array_vtable, inst->type_argc);\n\t\tfor (i = 0; i < inst->type_argc; ++i)\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\t} else {\n\t\tres = mono_array_new_specific (array_vtable, 0);\n\t}\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\treturn klass->generic_container != NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->generic_container) {\n\t\treturn type; /* check this one */\n\t}\n\tif (klass->generic_class) {\n\t\tMonoClass *generic_class = klass->generic_class->container_class;\n\n\t\tif (generic_class->wastypebuilder && generic_class->reflection_info)\n\t\t\treturn generic_class->reflection_info;\n\t\telse\n\t\t\treturn mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);\n\t}\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)\n{\n\tMonoClass *class;\n\tMonoType *geninst, **types;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tcount = mono_array_length (type_array);\n\ttypes = g_new0 (MonoType *, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionType *t = mono_array_get (type_array, gpointer, i);\n\t\ttypes [i] = t->type;\n\t}\n\n\tgeninst = mono_reflection_bind_generic_parameters (type, count, types);\n\tg_free (types);\n\tif (!geninst)\n\t\treturn NULL;\n\n\tclass = mono_class_from_mono_type (geninst);\n\n\t/*we might inflate to the GTD*/\n\tif (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class))\n\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"Invalid generic arguments\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), geninst);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericType (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL || klass->generic_container != NULL;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn -1;\n\n\tif (is_generic_parameter (type->type))\n\t\treturn mono_type_get_generic_param_num (type->type);\n\treturn -1;\n}",
"target": 0
},
{
"function": "static GenericParameterAttributes\nves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\tg_assert (is_generic_parameter (type->type));\n\treturn mono_generic_param_info (type->type->data.generic_param)->flags;\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)\n{\n\tMonoGenericParamInfo *param_info;\n\tMonoDomain *domain;\n\tMonoClass **ptr;\n\tMonoArray *res;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\n\tdomain = mono_object_domain (type);\n\tparam_info = mono_generic_param_info (type->type->data.generic_param);\n\tfor (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++)\n\t\t;\n\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\tfor (i = 0; i < count; i++)\n\t\tmono_array_setref (res, i, mono_type_get_object (domain, &param_info->constraints [i]->byval_arg));\n\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (type->type);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (tb->type.type);\n}",
"target": 0
},
{
"function": "static void\nves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,\n\t\t\t\t\t\t\t\t\t MonoReflectionType *t)\n{\n\tenumtype->type = t->type;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, \n MonoReflectionMethod* generic)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoMethod *method;\n\tgpointer iter;\n\t\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n if (method->token == generic->method->token)\n return mono_method_get_object (domain, method, klass);\n }\n\n return NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)\n{\n\tMonoMethod *method;\n\tMonoType *type = ref_type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\"DeclaringMethod can only be used on generic arguments\"));\n\tif (type->type == MONO_TYPE_VAR)\n\t\treturn NULL;\n\n\tmethod = mono_type_get_generic_param_owner (type)->owner.method;\n\tg_assert (method);\n\treturn mono_method_get_object (mono_object_domain (ref_type), method, method->klass);\n}",
"target": 0
},
{
"function": "static MonoReflectionDllImportAttribute*\nves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)\n{\n\tstatic MonoClass *DllImportAttributeClass = NULL;\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoReflectionDllImportAttribute *attr;\n\tMonoImage *image = method->klass->image;\n\tMonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;\n\tMonoTableInfo *tables = image->tables;\n\tMonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];\n\tMonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];\n\tguint32 im_cols [MONO_IMPLMAP_SIZE];\n\tguint32 scope_token;\n\tconst char *import = NULL;\n\tconst char *scope = NULL;\n\tguint32 flags;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn NULL;\n\n\tif (!DllImportAttributeClass) {\n\t\tDllImportAttributeClass = \n\t\t\tmono_class_from_name (mono_defaults.corlib,\n\t\t\t\t\t\t\t\t \"System.Runtime.InteropServices\", \"DllImportAttribute\");\n\t\tg_assert (DllImportAttributeClass);\n\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tif (method->klass->image->dynamic) {\n\t\tMonoReflectionMethodAux *method_aux = \n\t\t\tg_hash_table_lookup (\n\t\t\t\t\t\t\t\t\t ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);\n\t\tif (method_aux) {\n\t\t\timport = method_aux->dllentry;\n\t\t\tscope = method_aux->dll;\n\t\t}\n\n\t\tif (!import || !scope) {\n\t\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"System.Reflection.Emit method with invalid pinvoke information\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (piinfo->implmap_idx) {\n\t\t\tmono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);\n\t\t\t\n\t\t\tpiinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];\n\t\t\timport = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);\n\t\t\tscope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);\n\t\t\tscope = mono_metadata_string_heap (image, scope_token);\n\t\t}\n\t}\n\tflags = piinfo->piflags;\n\t\n\tattr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);\n\n\tMONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));\n\tMONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, import));\n\tattr->call_conv = (flags & 0x700) >> 8;\n\tattr->charset = ((flags & 0x6) >> 1) + 1;\n\tif (attr->charset == 1)\n\t\tattr->charset = 2;\n\tattr->exact_spelling = (flags & 0x1) != 0;\n\tattr->set_last_error = (flags & 0x40) != 0;\n\tattr->best_fit_mapping = (flags & 0x30) == 0x10;\n\tattr->throw_on_unmappable = (flags & 0x3000) == 0x1000;\n\tattr->preserve_sig = FALSE;\n\n\treturn attr;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMonoMethodInflated *imethod;\n\tMonoMethod *result;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->method->is_generic)\n\t\treturn method;\n\n\tif (!method->method->is_inflated)\n\t\treturn NULL;\n\n\timethod = (MonoMethodInflated *) method->method;\n\n\tresult = imethod->declaring;\n\t/* Not a generic method. */\n\tif (!result->is_generic)\n\t\treturn NULL;\n\n\tif (method->method->klass->image->dynamic) {\n\t\tMonoDynamicImage *image = (MonoDynamicImage*)method->method->klass->image;\n\t\tMonoReflectionMethod *res;\n\n\t\t/*\n\t\t * FIXME: Why is this stuff needed at all ? Why can't the code below work for\n\t\t * the dynamic case as well ?\n\t\t */\n\t\tmono_loader_lock ();\n\t\tres = mono_g_hash_table_lookup (image->generic_def_objects, imethod);\n\t\tmono_loader_unlock ();\n\n\t\tif (res)\n\t\t\treturn res;\n\t}\n\n\tif (imethod->context.class_inst) {\n\t\tMonoClass *klass = ((MonoMethod *) imethod)->klass;\n\t\t/*Generic methods gets the context of the GTD.*/\n\t\tif (mono_class_get_context (klass))\n\t\t\tresult = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));\n\t}\n\n\treturn mono_method_get_object (mono_object_domain (method), result, NULL);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_signature (method->method)->generic_param_count != 0;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn method->method->is_generic;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)\n{\n\tMonoArray *res;\n\tMonoDomain *domain;\n\tint count, i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (method);\n\n\tif (method->method->is_inflated) {\n\t\tMonoGenericInst *inst = mono_method_get_context (method->method)->method_inst;\n\n\t\tif (inst) {\n\t\t\tcount = inst->type_argc;\n\t\t\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\t\t\tfor (i = 0; i < count; i++)\n\t\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tcount = mono_method_signature (method->method)->generic_param_count;\n\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoGenericContainer *container = mono_method_get_generic_container (method->method);\n\t\tMonoGenericParam *param = mono_generic_container_get_param (container, i);\n\t\tMonoClass *pklass = mono_class_from_generic_parameter (\n\t\t\tparam, method->method->klass->image, TRUE);\n\t\tmono_array_setref (res, i,\n\t\t\t\tmono_type_get_object (domain, &pklass->byval_arg));\n\t}\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoException **exc) \n{\n\t/* \n\t * Invoke from reflection is supposed to always be a virtual call (the API\n\t * is stupid), mono_runtime_invoke_*() calls the provided method, allowing\n\t * greater flexibility.\n\t */\n\tMonoMethod *m = method->method;\n\tint pcount;\n\tvoid *obj = this;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*exc = NULL;\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_method (m);\n\n\tif (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {\n\t\tif (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (this) {\n\t\t\tif (!mono_object_isinst (this, m->klass)) {\n\t\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Object does not match target type.\"));\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tm = mono_object_get_virtual_method (this, m);\n\t\t\t/* must pass the pointer to the value for valuetype methods */\n\t\t\tif (m->klass->valuetype)\n\t\t\t\tobj = mono_object_unbox (this);\n\t\t} else if (strcmp (m->name, \".ctor\") && !m->wrapper_type) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Non-static method requires a target.\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tpcount = params? mono_array_length (params): 0;\n\tif (pcount != mono_method_signature (m)->param_count) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name (mono_defaults.corlib, \"System.Reflection\", \"TargetParameterCountException\"));\n\t\treturn NULL;\n\t}\n\n\tif ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, \".ctor\") && !this) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Cannot invoke constructor of an abstract class.\"));\n\t\treturn NULL;\n\t}\n\n\tif (m->klass->image->assembly->ref_only) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_get_exception_invalid_operation (\"It is illegal to invoke a method on a type loaded using the ReflectionOnly api.\"));\n\t\treturn NULL;\n\t}\n\t\n\tif (m->klass->rank && !strcmp (m->name, \".ctor\")) {\n\t\tint i;\n\t\tmono_array_size_t *lengths;\n\t\tmono_array_size_t *lower_bounds;\n\t\tpcount = mono_array_length (params);\n\t\tlengths = alloca (sizeof (mono_array_size_t) * pcount);\n\t\tfor (i = 0; i < pcount; ++i)\n\t\t\tlengths [i] = *(mono_array_size_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));\n\n\t\tif (m->klass->rank == pcount) {\n\t\t\t/* Only lengths provided. */\n\t\t\tlower_bounds = NULL;\n\t\t} else {\n\t\t\tg_assert (pcount == (m->klass->rank * 2));\n\t\t\t/* lower bounds are first. */\n\t\t\tlower_bounds = lengths;\n\t\t\tlengths += m->klass->rank;\n\t\t}\n\n\t\treturn (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);\n\t}\n\treturn mono_runtime_invoke_array (m, obj, params, NULL);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs) \n{\n\tMonoDomain *domain = mono_object_domain (method); \n\tMonoMethod *m = method->method;\n\tMonoMethodSignature *sig = mono_method_signature (m);\n\tMonoArray *out_args;\n\tMonoObject *result;\n\tint i, j, outarg_count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (m->klass == mono_defaults.object_class) {\n\n\t\tif (!strcmp (m->name, \"FieldGetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tif (field_klass->valuetype)\n\t\t\t\t\t\tresult = mono_value_box (domain, field_klass, (char *)this + field->offset);\n\t\t\t\t\telse \n\t\t\t\t\t\tresult = *((gpointer *)((char *)this + field->offset));\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 1);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\t\t\t\t\tmono_array_setref (out_args, 0, result);\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t} else if (!strcmp (m->name, \"FieldSetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tguint32 size;\n\t\t\tgint32 align;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tMonoObject *val = mono_array_get (params, gpointer, 2);\n\n\t\t\t\t\tif (field_klass->valuetype) {\n\t\t\t\t\t\tsize = mono_type_size (field->type, &align);\n#ifdef HAVE_SGEN_GC\n\t\t\t\t\t\tmono_gc_wbarrier_value_copy ((char *)this + field->offset, (char*)val + sizeof (MonoObject), 1, field_klass);\n#endif\n\t\t\t\t\t\tmemcpy ((char *)this + field->offset, \n\t\t\t\t\t\t\t((char *)val) + sizeof (MonoObject), size);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmono_gc_wbarrier_set_field (this, (char*)this + field->offset, val);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 0);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t}\n\t}\n\n\tfor (i = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) \n\t\t\toutarg_count++;\n\t}\n\n\tout_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);\n\t\n\t/* handle constructors only for objects already allocated */\n\tif (!strcmp (method->method->name, \".ctor\"))\n\t\tg_assert (this);\n\n\t/* This can be called only on MBR objects, so no need to unbox for valuetypes. */\n\tg_assert (!method->method->klass->valuetype);\n\tresult = mono_runtime_invoke_array (method->method, this, params, NULL);\n\n\tfor (i = 0, j = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) {\n\t\t\tgpointer arg;\n\t\t\targ = mono_array_get (params, gpointer, i);\n\t\t\tmono_array_setref (out_args, j, arg);\n\t\t\tj++;\n\t\t}\n\t}\n\n\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static guint64\nread_enum_value (char *mem, int type)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\t\treturn *(guint8*)mem;\n\tcase MONO_TYPE_I1:\n\t\treturn *(gint8*)mem;\n\tcase MONO_TYPE_U2:\n\t\treturn *(guint16*)mem;\n\tcase MONO_TYPE_I2:\n\t\treturn *(gint16*)mem;\n\tcase MONO_TYPE_U4:\n\t\treturn *(guint32*)mem;\n\tcase MONO_TYPE_I4:\n\t\treturn *(gint32*)mem;\n\tcase MONO_TYPE_U8:\n\t\treturn *(guint64*)mem;\n\tcase MONO_TYPE_I8:\n\t\treturn *(gint64*)mem;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static void\nwrite_enum_value (char *mem, int type, guint64 value)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1: {\n\t\tguint8 *p = (guint8*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2: {\n\t\tguint16 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4: {\n\t\tguint32 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8: {\n\t\tguint64 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)\n{\n\tMonoDomain *domain; \n\tMonoClass *enumc, *objc;\n\tMonoObject *res;\n\tMonoType *etype;\n\tguint64 val;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (enumType);\n\tMONO_CHECK_ARG_NULL (value);\n\n\tdomain = mono_object_domain (enumType); \n\tenumc = mono_class_from_mono_type (enumType->type);\n\tobjc = value->vtable->klass;\n\n\tif (!enumc->enumtype)\n\t\tmono_raise_exception (mono_get_exception_argument (\"enumType\", \"Type provided must be an Enum.\"));\n\tif (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))\n\t\tmono_raise_exception (mono_get_exception_argument (\"value\", \"The value passed in must be an enum base or an underlying type for an enum, such as an Int32.\"));\n\n\tetype = mono_class_enum_basetype (enumc);\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\tres = mono_object_new (domain, enumc);\n\tval = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);\n\twrite_enum_value ((char *)res + sizeof (MonoObject), etype->type, val);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Enum_get_value (MonoObject *this)\n{\n\tMonoObject *res;\n\tMonoClass *enumc;\n\tgpointer dst;\n\tgpointer src;\n\tint size;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!this)\n\t\treturn NULL;\n\n\tg_assert (this->vtable->klass->enumtype);\n\t\n\tenumc = mono_class_from_mono_type (mono_class_enum_basetype (this->vtable->klass));\n\tres = mono_object_new (mono_object_domain (this), enumc);\n\tdst = (char *)res + sizeof (MonoObject);\n\tsrc = (char *)this + sizeof (MonoObject);\n\tsize = mono_class_value_size (enumc, NULL);\n\n\tmemcpy (dst, src, size);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)\n{\n\tMonoType *etype;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tetype = mono_class_enum_basetype (mono_class_from_mono_type (type->type));\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), etype);\n}",
"target": 0
},
{
"function": "static int\nves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)\n{\n\tgpointer tdata = (char *)this + sizeof (MonoObject);\n\tgpointer odata = (char *)other + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n#define COMPARE_ENUM_VALUES(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me > other ? 1 : -1; \\\n\t} while (0)\n\n#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me - other; \\\n\t} while (0)\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_U1:\n\t\t\tCOMPARE_ENUM_VALUES (guint8);\n\t\tcase MONO_TYPE_I1:\n\t\t\tCOMPARE_ENUM_VALUES (gint8);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\tCOMPARE_ENUM_VALUES_RANGE (guint16);\n\t\tcase MONO_TYPE_I2:\n\t\t\tCOMPARE_ENUM_VALUES (gint16);\n\t\tcase MONO_TYPE_U4:\n\t\t\tCOMPARE_ENUM_VALUES (guint32);\n\t\tcase MONO_TYPE_I4:\n\t\t\tCOMPARE_ENUM_VALUES (gint32);\n\t\tcase MONO_TYPE_U8:\n\t\t\tCOMPARE_ENUM_VALUES (guint64);\n\t\tcase MONO_TYPE_I8:\n\t\t\tCOMPARE_ENUM_VALUES (gint64);\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n#undef COMPARE_ENUM_VALUES_RANGE\n#undef COMPARE_ENUM_VALUES\n\treturn 0;\n}",
"target": 0
},
{
"function": "static int\nves_icall_System_Enum_get_hashcode (MonoObject *this)\n{\n\tgpointer data = (char *)this + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_I1:\t\n\t\t\treturn *((gint8*)data);\n\t\tcase MONO_TYPE_U1:\n\t\t\treturn *((guint8*)data);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\treturn *((guint16*)data);\n\t\t\n\t\tcase MONO_TYPE_I2:\n\t\t\treturn *((gint16*)data);\n\t\tcase MONO_TYPE_U4:\n\t\t\treturn *((guint32*)data);\n\t\tcase MONO_TYPE_I4:\n\t\t\treturn *((gint32*)data);\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8: {\n\t\t\tgint64 value = *((gint64*)data);\n\t\t\treturn (gint)(value & 0xffffffff) ^ (int)(value >> 32);\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoClass *enumc = mono_class_from_mono_type (type->type);\n\tguint j = 0, nvalues, crow;\n\tgpointer iter;\n\tMonoClassField *field;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc)));\n\tnvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;\n\tMONO_STRUCT_SETREF (info, names, mono_array_new (domain, mono_defaults.string_class, nvalues));\n\tMONO_STRUCT_SETREF (info, values, mono_array_new (domain, enumc, nvalues));\n\n\tcrow = -1;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (enumc, &iter))) {\n\t\tconst char *p;\n\t\tint len;\n\t\tMonoTypeEnum def_type;\n\t\t\n\t\tif (strcmp (\"value__\", mono_field_get_name (field)) == 0)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tmono_array_setref (info->names, j, mono_string_new (domain, mono_field_get_name (field)));\n\n\t\tp = mono_class_get_field_default_value (field, &def_type);\n\t\tlen = mono_metadata_decode_blob_size (p, &p);\n\t\tswitch (mono_class_enum_basetype (enumc)->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\t\tmono_array_set (info->values, gchar, j, *p);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\t\tmono_array_set (info->values, gint16, j, read16 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tmono_array_set (info->values, gint32, j, read32 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tmono_array_set (info->values, gint64, j, read64 (p));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_enum_info\", mono_class_enum_basetype (enumc)->type);\n\t\t}\n\t\t++j;\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionField *\nves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass;\n\tint match;\n\tMonoClassField *field;\n\tgpointer iter;\n\tchar *utf8_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!name)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\nhandle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\n\t\tif (field->type == NULL)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\t\n\t\tutf8_name = mono_string_to_utf8 (name);\n\n\t\tif (compare_func (mono_field_get_name (field), utf8_name)) {\n\t\t\tg_free (utf8_name);\n\t\t\tcontinue;\n\t\t}\n\t\tg_free (utf8_name);\n\t\t\n\t\treturn mono_field_get_object (domain, klass, field);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter;\n\tMonoClassField *field;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.field_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tmono_ptr_array_init (tmp_array, 2);\n\t\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_field_get_object (domain, refklass, field);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nmethod_nonpublic (MonoMethod* method, gboolean start_klass)\n{\n\tswitch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) {\n\t\tcase METHOD_ATTRIBUTE_ASSEM:\n\t\t\treturn (start_klass || mono_defaults.generic_ilist_class);\n\t\tcase METHOD_ATTRIBUTE_PRIVATE:\n\t\t\treturn start_klass;\n\t\tcase METHOD_ATTRIBUTE_PUBLIC:\n\t\t\treturn FALSE;\n\t\tdefault:\n\t\t\treturn TRUE;\n\t}\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tstatic MonoClass *MethodInfo_array;\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tgpointer iter;\n\tMonoObject *member;\n\tint i, len, match, nslots;\n\t/*FIXME, use MonoBitSet*/\n\tguint32 method_slots_default [8];\n\tguint32 *method_slots = NULL;\n\tgchar *mname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMonoVTable *array_vtable;\n\tMonoException *ex;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!MethodInfo_array) {\n\t\tMonoClass *klass = mono_array_class_get (mono_defaults.method_info_class, 1);\n\t\tmono_memory_barrier ();\n\t\tMethodInfo_array = klass;\n\t}\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tarray_vtable = mono_class_vtable_full (domain, MethodInfo_array, TRUE);\n\tif (type->type->byref)\n\t\treturn mono_array_new_specific (array_vtable, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\tlen = 0;\n\tif (name != NULL) {\n\t\tmname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\t/* An optimization for calls made from Delegate:CreateDelegate () */\n\tif (klass->delegate && mname && !strcmp (mname, \"Invoke\") && (bflags == (BFLAGS_Public | BFLAGS_Static | BFLAGS_Instance))) {\n\t\tmethod = mono_get_delegate_invoke (klass);\n\t\tif (mono_loader_get_last_error ())\n\t\t\tgoto loader_error;\n\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tres = mono_array_new_specific (array_vtable, 1);\n\t\tmono_array_setref (res, 0, member);\n\t\tg_free (mname);\n\t\treturn res;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\n\n\tif (is_generic_parameter (type->type))\n\t\tnslots = mono_class_get_vtable_size (klass->parent);\n\telse\n\t\tnslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : mono_class_get_vtable_size (klass);\n\tif (nslots >= sizeof (method_slots_default) * 8) {\n\t\tmethod_slots = g_new0 (guint32, nslots / 32 + 1);\n\t} else {\n\t\tmethod_slots = method_slots_default;\n\t\tmemset (method_slots, 0, sizeof (method_slots_default));\n\t}\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\t\t\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (method->slot != -1) {\n\t\t\tg_assert (method->slot < nslots);\n\t\t\tif (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))\n\t\t\t\tcontinue;\n\t\t\tif (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT))\n\t\t\t\tmethod_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);\n\t\t}\n\n\t\tif (method->name [0] == '.' && (strcmp (method->name, \".ctor\") == 0 || strcmp (method->name, \".cctor\") == 0))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((bflags & BFLAGS_NonPublic) && method_nonpublic (method, (klass == startklass))) {\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (mname, method->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tmatch = 0;\n\t\t\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\t\t\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\n\tres = mono_array_new_specific (array_vtable, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\treturn res;\n\nloader_error:\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\tmono_ptr_array_destroy (tmp_array);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tex = mono_class_get_exception_for_failure (klass);\n\t} else {\n\t\tex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\t\tmono_loader_clear_error ();\n\t}\n\tmono_raise_exception (ex);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_ConstructorInfo;\n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter = NULL;\n\tMonoPtrArray tmp_array;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, mono_defaults.method_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\tif (!System_Reflection_ConstructorInfo)\n\t\tSystem_Reflection_ConstructorInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"ConstructorInfo\");\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (strcmp (method->name, \".ctor\") && strcmp (method->name, \".cctor\"))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, System_Reflection_ConstructorInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static guint\nproperty_hash (gconstpointer data)\n{\n\tMonoProperty *prop = (MonoProperty*)data;\n\n\treturn g_str_hash (prop->name);\n}",
"target": 0
},
{
"function": "static gboolean\nproperty_equal (MonoProperty *prop1, MonoProperty *prop2)\n{\n\t// Properties are hide-by-name-and-signature\n\tif (!g_str_equal (prop1->name, prop2->name))\n\t\treturn FALSE;\n\n\tif (prop1->get && prop2->get && !mono_metadata_signature_equal (mono_method_signature (prop1->get), mono_method_signature (prop2->get)))\n\t\treturn FALSE;\n\tif (prop1->set && prop2->set && !mono_metadata_signature_equal (mono_method_signature (prop1->set), mono_method_signature (prop2->set)))\n\t\treturn FALSE;\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static gboolean\nproperty_accessor_nonpublic (MonoMethod* accessor, gboolean start_klass)\n{\n\tif (!accessor)\n\t\treturn FALSE;\n\n\treturn method_nonpublic (accessor, start_klass);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_PropertyInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoProperty *prop;\n\tint i, match;\n\tguint32 flags;\n\tgchar *propname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tgpointer iter;\n\tGHashTable *properties;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/\n\n\tif (!System_Reflection_PropertyInfo)\n\t\tSystem_Reflection_PropertyInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"PropertyInfo\");\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_PropertyInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tif (name != NULL) {\n\t\tpropname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\n\tproperties = g_hash_table_new (property_hash, (GEqualFunc)property_equal);\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tg_hash_table_destroy (properties);\n\t\tif (name != NULL)\n\t\t\tg_free (propname);\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\t}\n\n\titer = NULL;\n\twhile ((prop = mono_class_get_properties (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = prop->get;\n\t\tif (!method)\n\t\t\tmethod = prop->set;\n\t\tif (method)\n\t\t\tflags = method->flags;\n\t\telse\n\t\t\tflags = 0;\n\t\tif ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||\n\t\t\t(prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if (bflags & BFLAGS_NonPublic) {\n\t\t\tif (property_accessor_nonpublic(prop->get, startklass == klass) ||\n\t\t\t\tproperty_accessor_nonpublic(prop->set, startklass == klass)) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (propname, prop->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (g_hash_table_lookup (properties, prop))\n\t\t\tcontinue;\n\n\t\tmono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));\n\t\t\n\t\tg_hash_table_insert (properties, prop, prop);\n\t}\n\tif ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))\n\t\tgoto handle_parent;\n\n\tg_hash_table_destroy (properties);\n\tg_free (propname);\n\n\tres = mono_array_new_cached (domain, System_Reflection_PropertyInfo, mono_ptr_array_size (tmp_array));\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionEvent *\nves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain;\n\tMonoClass *klass, *startklass;\n\tgpointer iter;\n\tMonoEvent *event;\n\tMonoMethod *method;\n\tgchar *event_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\tevent_name = mono_string_to_utf8 (name);\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tdomain = mono_object_domain (type);\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tif (compare_func (event->name, event_name))\n\t\t\tcontinue;\n\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Public))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\t\tcontinue;\n\t\t\t\tif ((klass != startklass) && (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PRIVATE)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Static))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (!(bflags & BFLAGS_FlattenHierarchy) && (klass != startklass))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_Instance))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else \n\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\tcontinue;\n\t\t\n\t\tg_free (event_name);\n\t\treturn mono_event_get_object (domain, startklass, event);\n\t}\n\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (event_name);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_EventInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoEvent *event;\n\tint i, match;\n\tgpointer iter;\n\t\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!System_Reflection_EventInfo)\n\t\tSystem_Reflection_EventInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"EventInfo\");\n\n\tdomain = mono_object_domain (type);\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_EventInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\t\tmatch++;\n\t\t\t} else if ((klass == startklass) || (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) {\n\t\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method) {\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\t\tmatch++;\n\t\t\t} else {\n\t\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, System_Reflection_EventInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *nested;\n\tchar *str;\n\tgpointer iter;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = mono_class_from_mono_type (type->type);\n\tstr = mono_string_to_utf8 (name);\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially a\n\t * nested type of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tint match = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tif (strcmp (nested->name, str) == 0){\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (domain, &nested->byval_arg);\n\t\t}\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\tg_free (str);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tMonoClass *nested;\n\tgpointer iter;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.monotype_class, 0);\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially the set\n\t * of nested types of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\tmono_ptr_array_init (tmp_array, 1);\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)\n{\n\tgchar *str;\n\tMonoType *type = NULL;\n\tMonoTypeNameParse info;\n\tgboolean type_resolve;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* On MS.NET, this does not fire a TypeResolve event */\n\ttype_resolve = TRUE;\n\tstr = mono_string_to_utf8 (name);\n\t/*g_print (\"requested type %s in %s\\n\", str, assembly->assembly->aname.name);*/\n\tif (!mono_reflection_parse_type (str, &info)) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) /* uhm: this is a parse error, though... */\n\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t/*g_print (\"failed parse\\n\");*/\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) {\n\t\t\t/* 1.0 and 2.0 throw different exceptions */\n\t\t\tif (mono_defaults.generic_ilist_class)\n\t\t\t\tmono_raise_exception (mono_get_exception_argument (NULL, \"Type names passed to Assembly.GetType() must not specify an assembly.\"));\n\t\t\telse\n\t\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tif (module != NULL) {\n\t\tif (module->image)\n\t\t\ttype = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);\n\t\telse\n\t\t\ttype = NULL;\n\t}\n\telse\n\t\tif (assembly->assembly->dynamic) {\n\t\t\t/* Enumerate all modules */\n\t\t\tMonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;\n\t\t\tint i;\n\n\t\t\ttype = NULL;\n\t\t\tif (abuilder->modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->modules); ++i) {\n\t\t\t\t\tMonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!type && abuilder->loaded_modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {\n\t\t\t\t\tMonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\ttype = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);\n\tg_free (str);\n\tmono_reflection_free_type_info (&info);\n\tif (!type) {\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tif (mono_loader_get_last_error () && mono_defaults.generic_ilist_class)\n\t\t\te = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\n\t\tmono_loader_clear_error ();\n\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\n\t\treturn NULL;\n\t}\n\n\tif (type->type == MONO_TYPE_CLASS) {\n\t\tMonoClass *klass = mono_type_get_class (type);\n\n\t\tif (mono_is_security_manager_active () && !klass->exception_type)\n\t\t\t/* Some security problems are detected during generic vtable construction */\n\t\t\tmono_class_setup_vtable (klass);\n\t\t/* need to report exceptions ? */\n\t\tif (throwOnError && klass->exception_type) {\n\t\t\t/* report SecurityException (or others) that occured when loading the assembly */\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (klass);\n\t\t\tmono_loader_clear_error ();\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\t/* g_print (\"got it\\n\"); */\n\treturn mono_type_get_object (mono_object_domain (assembly), type);\n}",
"target": 0
},
{
"function": "static gboolean\nreplace_shadow_path (MonoDomain *domain, gchar *dirname, gchar **filename)\n{\n\tgchar *content;\n\tgchar *shadow_ini_file;\n\tgsize len;\n\n\t/* Check for shadow-copied assembly */\n\tif (mono_is_shadow_copy_enabled (domain, dirname)) {\n\t\tshadow_ini_file = g_build_filename (dirname, \"__AssemblyInfo__.ini\", NULL);\n\t\tcontent = NULL;\n\t\tif (!g_file_get_contents (shadow_ini_file, &content, &len, NULL) ||\n\t\t\t!g_file_test (content, G_FILE_TEST_IS_REGULAR)) {\n\t\t\tif (content) {\n\t\t\t\tg_free (content);\n\t\t\t\tcontent = NULL;\n\t\t\t}\n\t\t}\n\t\tg_free (shadow_ini_file);\n\t\tif (content != NULL) {\n\t\t\tif (*filename)\n\t\t\t\tg_free (*filename);\n\t\t\t*filename = content;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res = NULL;\n\tgchar *uri;\n\tgchar *absolute;\n\tgchar *dirname;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tabsolute = g_strdup (mass->image->name);\n\t\tdirname = g_path_get_dirname (absolute);\n\t} else {\n\t\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\t\tdirname = g_strdup (mass->basedir);\n\t}\n\n\treplace_shadow_path (domain, dirname, &absolute);\n\tg_free (dirname);\n#if PLATFORM_WIN32\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (absolute) - 1; i >= 0; i--)\n\t\t\tif (absolute [i] == '\\\\')\n\t\t\t\tabsolute [i] = '/';\n\t}\n#endif\n\tif (escaped) {\n\t\turi = g_filename_to_uri (absolute, NULL, NULL);\n\t} else {\n\t\tconst char *prepend = \"file://\";\n#if PLATFORM_WIN32\n\t\tif (*absolute == '/' && *(absolute + 1) == '/') {\n\t\t\tprepend = \"file:\";\n\t\t} else {\n\t\t\tprepend = \"file:///\";\n\t\t}\n#endif\n\t\turi = g_strconcat (prepend, absolute, NULL);\n\t}\n\n\tif (uri) {\n\t\tres = mono_string_new (domain, uri);\n\t\tg_free (uri);\n\t}\n\tg_free (absolute);\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)\n{\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mass->in_gac;\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)\n{\n\tgchar *name;\n\tMonoAssembly *res;\n\tMonoImageOpenStatus status;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tname = mono_string_to_utf8 (mname);\n\tres = mono_assembly_load_with_partial_name (name, &status);\n\n\tg_free (name);\n\n\tif (res == NULL)\n\t\treturn NULL;\n\treturn mono_assembly_get_object (mono_domain_get (), res);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoString *res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn assembly->assembly->ref_only;\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (domain, assembly->assembly->image->version);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) \n{\n\tguint32 token = mono_image_get_entry_point (assembly->assembly->image);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!token)\n\t\treturn NULL;\n\treturn mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionModule*\nves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly) \n{\n\treturn mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tMonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);\n\tint i;\n\tconst char *val;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));\n\t\tmono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoObject*\ncreate_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)\n{\n\tstatic MonoClass *System_Version = NULL;\n\tstatic MonoMethod *create_version = NULL;\n\tMonoObject *result;\n\tgpointer args [4];\n\t\n\tif (!System_Version) {\n\t\tSystem_Version = mono_class_from_name (mono_defaults.corlib, \"System\", \"Version\");\n\t\tg_assert (System_Version);\n\t}\n\n\tif (!create_version) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\":.ctor(int,int,int,int)\", FALSE);\n\t\tcreate_version = mono_method_desc_search_in_class (desc, System_Version);\n\t\tg_assert (create_version);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\targs [0] = &major;\n\targs [1] = &minor;\n\targs [2] = &build;\n\targs [3] = &revision;\n\tresult = mono_object_new (domain, System_Version);\n\tmono_runtime_invoke (create_version, result, args, NULL);\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly) \n{\n\tstatic MonoClass *System_Reflection_AssemblyName;\n\tMonoArray *result;\n\tMonoDomain *domain = mono_object_domain (assembly);\n\tint i, count = 0;\n\tstatic MonoMethod *create_culture = NULL;\n\tMonoImage *image = assembly->assembly->image;\n\tMonoTableInfo *t;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!System_Reflection_AssemblyName)\n\t\tSystem_Reflection_AssemblyName = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"AssemblyName\");\n\n\tt = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];\n\tcount = t->rows;\n\n\tresult = mono_array_new (domain, System_Reflection_AssemblyName, count);\n\n\tif (count > 0 && !create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\n\t\t\t\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionAssemblyName *aname;\n\t\tguint32 cols [MONO_ASSEMBLYREF_SIZE];\n\n\t\tmono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);\n\n\t\taname = (MonoReflectionAssemblyName *) mono_object_new (\n\t\t\tdomain, System_Reflection_AssemblyName);\n\n\t\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));\n\n\t\taname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];\n\t\taname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];\n\t\taname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];\n\t\taname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];\n\t\taname->flags = cols [MONO_ASSEMBLYREF_FLAGS];\n\t\taname->versioncompat = 1; /* SameMachine (default) */\n\t\taname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));\n\n\t\tif (create_culture) {\n\t\t\tgpointer args [2];\n\t\t\tMonoBoolean assembly_ref = 1;\n\t\t\targs [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));\n\t\t\targs [1] = &assembly_ref;\n\t\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t\t}\n\t\t\n\t\tif (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {\n\t\t\tconst gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);\n\t\t\tguint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\t\tif ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {\n\t\t\t\t/* public key token isn't copied - the class library will \n\t\t \t\tautomatically generate it from the public key if required */\n\t\t\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t} else {\n\t\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t}\n\t\t} else {\n\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\t}\n\t\t\n\t\t/* note: this function doesn't return the codebase on purpose (i.e. it can\n\t\t be used under partial trust as path information isn't present). */\n\n\t\tmono_array_setref (result, i, aname);\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static void\nforeach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)\n{\n\tMonoString *name = mono_string_new (mono_object_domain (info->res), key);\n\n\tmono_array_setref (info->res, info->idx, name);\n\tinfo->idx++;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly) \n{\n\tMonoImage *img = assembly->assembly->image;\n\tMonoArray *res;\n\tNameSpaceInfo info;\n\tint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_lock (img);\n\tmono_image_init_name_cache (img);\n\nRETRY_LEN:\n\tlen = g_hash_table_size (img->name_cache);\n\tmono_image_unlock (img);\n\n\t/*we can't create objects holding the image lock */\n\tres = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, len);\n\n\tmono_image_lock (img);\n\t/*len might have changed, create a new array*/\n\tif (len != g_hash_table_size (img->name_cache))\n\t\tgoto RETRY_LEN;\n\n\tinfo.res = res;\n\tinfo.idx = 0;\n\tg_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);\n\tmono_image_unlock (img);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static char *\ng_concat_dir_and_file (const char *dir, const char *file)\n{\n\tg_return_val_if_fail (dir != NULL, NULL);\n\tg_return_val_if_fail (file != NULL, NULL);\n\n /*\n\t * If the directory name doesn't have a / on the end, we need\n\t * to add one so we get a proper path to the file\n\t */\n\tif (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)\n\t\treturn g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);\n\telse\n\t\treturn g_strconcat (dir, file, NULL);\n}",
"target": 0
},
{
"function": "static void *\nves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module) \n{\n\tchar *n = mono_string_to_utf8 (name);\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tguint32 i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 impl, file_idx;\n\tconst char *val;\n\tMonoImage *module;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn NULL;\n\t/* FIXME */\n\timpl = cols [MONO_MANIFEST_IMPLEMENTATION];\n\tif (impl) {\n\t\t/*\n\t\t * this code should only be called after obtaining the \n\t\t * ResourceInfo and handling the other cases.\n\t\t */\n\t\tg_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);\n\t\tfile_idx = impl >> MONO_IMPLEMENTATION_BITS;\n\n\t\tmodule = mono_image_load_file_for_image (assembly->assembly->image, file_idx);\n\t\tif (!module)\n\t\t\treturn NULL;\n\t}\n\telse\n\t\tmodule = assembly->assembly->image;\n\n\tmono_gc_wbarrier_generic_store (ref_module, (MonoObject*) mono_module_get_object (mono_domain_get (), module));\n\n\treturn (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)\n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tint i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 file_cols [MONO_FILE_SIZE];\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = mono_string_to_utf8 (name);\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn FALSE;\n\n\tif (!cols [MONO_MANIFEST_IMPLEMENTATION]) {\n\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;\n\t}\n\telse {\n\t\tswitch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {\n\t\tcase MONO_IMPLEMENTATION_FILE:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\ttable = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\t\t\tmono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);\n\t\t\tMONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));\n\t\t\tif (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\t\tinfo->location = 0;\n\t\t\telse\n\t\t\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_ASSEMBLYREF:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\tmono_assembly_load_reference (assembly->assembly->image, i - 1);\n\t\t\tif (assembly->assembly->image->references [i - 1] == (gpointer)-1) {\n\t\t\t\tchar *msg = g_strdup_printf (\"Assembly %d referenced from assembly %s not found \", i - 1, assembly->assembly->image->name);\n\t\t\t\tMonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);\n\t\t\t\tg_free (msg);\n\t\t\t\tmono_raise_exception (ex);\n\t\t\t}\n\t\t\tMONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));\n\n\t\t\t/* Obtain info recursively */\n\t\t\tves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);\n\t\t\tinfo->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_EXP_TYPE:\n\t\t\tg_assert_not_reached ();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoObject*\nves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\tMonoArray *result = NULL;\n\tint i, count;\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* check hash if needed */\n\tif (name) {\n\t\tn = mono_string_to_utf8 (name);\n\t\tfor (i = 0; i < table->rows; ++i) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tif (strcmp (val, n) == 0) {\n\t\t\t\tMonoString *fn;\n\t\t\t\tg_free (n);\n\t\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\t\tfn = mono_string_new (mono_object_domain (assembly), n);\n\t\t\t\tg_free (n);\n\t\t\t\treturn (MonoObject*)fn;\n\t\t\t}\n\t\t}\n\t\tg_free (n);\n\t\treturn NULL;\n\t}\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))\n\t\t\tcount ++;\n\t}\n\n\tresult = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\tmono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));\n\t\t\tg_free (n);\n\t\t\tcount ++;\n\t\t}\n\t}\n\treturn (MonoObject*)result;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_domain_get();\n\tMonoArray *res;\n\tMonoClass *klass;\n\tint i, j, file_count = 0;\n\tMonoImage **modules;\n\tguint32 module_count, real_module_count;\n\tMonoTableInfo *table;\n\tguint32 cols [MONO_FILE_SIZE];\n\tMonoImage *image = assembly->assembly->image;\n\n\tg_assert (image != NULL);\n\tg_assert (!assembly->assembly->dynamic);\n\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tfile_count = table->rows;\n\n\tmodules = image->modules;\n\tmodule_count = image->module_count;\n\n\treal_module_count = 0;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i])\n\t\t\treal_module_count ++;\n\n\tklass = mono_class_from_name (mono_defaults.corlib, \"System.Reflection\", \"Module\");\n\tres = mono_array_new (domain, klass, 1 + real_module_count + file_count);\n\n\tmono_array_setref (res, 0, mono_module_get_object (domain, image));\n\tj = 1;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i]) {\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, modules[i]));\n\t\t\t++j;\n\t\t}\n\n\tfor (i = 0; i < file_count; ++i, ++j) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);\n\t\tif (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\tmono_array_setref (res, j, mono_module_file_get_object (domain, image, i));\n\t\telse {\n\t\t\tMonoImage *m = mono_image_load_file_for_image (image, i + 1);\n\t\t\tif (!m) {\n\t\t\t\tMonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME]));\n\t\t\t\tmono_raise_exception (mono_get_exception_file_not_found2 (NULL, fname));\n\t\t\t}\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, m));\n\t\t}\n\t}\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_GetCurrentMethod (void) \n{\n\tMonoMethod *m = mono_method_get_last_managed ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_get_object (mono_domain_get (), m, NULL);\n}",
"target": 0
},
{
"function": "static MonoMethod*\nmono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)\n{\n\tint offset = -1, i;\n\tif (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {\n\t\tMonoMethodInflated *inflated = (MonoMethodInflated*)method;\n\t\t//method is inflated, we should inflate it on the other class\n\t\tMonoGenericContext ctx;\n\t\tctx.method_inst = inflated->context.method_inst;\n\t\tctx.class_inst = inflated->context.class_inst;\n\t\tif (klass->generic_class)\n\t\t\tctx.class_inst = klass->generic_class->context.class_inst;\n\t\telse if (klass->generic_container)\n\t\t\tctx.class_inst = klass->generic_container->context.class_inst;\n\t\treturn mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx);\n\t}\n\n\tmono_class_setup_methods (method->klass);\n\tif (method->klass->exception_type)\n\t\treturn NULL;\n\tfor (i = 0; i < method->klass->method.count; ++i) {\n\t\tif (method->klass->methods [i] == method) {\n\t\t\toffset = i;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\tmono_class_setup_methods (klass);\n\tif (klass->exception_type)\n\t\treturn NULL;\n\tg_assert (offset >= 0 && offset < klass->method.count);\n\treturn klass->methods [offset];\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMethod *method, MonoType *type)\n{\n\tMonoClass *klass;\n\tif (type) {\n\t\tklass = mono_class_from_mono_type (type);\n\t\tif (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass)) \n\t\t\treturn NULL;\n\t\tif (method->klass != klass) {\n\t\t\tmethod = mono_method_get_equivalent_method (method, klass);\n\t\t\tif (!method)\n\t\t\t\treturn NULL;\n\t\t}\n\t} else\n\t\tklass = method->klass;\n\treturn mono_method_get_object (mono_domain_get (), method, klass);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)\n{\n\treturn mono_method_get_object (mono_domain_get (), method, NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethodBody*\nves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)\n{\n\treturn mono_method_body_get_object (mono_domain_get (), method);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)\n{\n\tMonoMethod *dest = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_stack_walk_no_il (get_executing, &dest);\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetEntryAssembly (void)\n{\n\tMonoDomain* domain = mono_domain_get ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!domain->entry_assembly)\n\t\treturn NULL;\n\n\treturn mono_assembly_get_object (domain, domain->entry_assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetCallingAssembly (void)\n{\n\tMonoMethod *m;\n\tMonoMethod *dest;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdest = NULL;\n\tmono_stack_walk_no_il (get_executing, &dest);\n\tm = dest;\n\tmono_stack_walk_no_il (get_caller, &dest);\n\tif (!dest)\n\t\tdest = m;\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,\n\t\t\t\t gboolean assembly_qualified)\n{\n\tMonoDomain *domain = mono_object_domain (object); \n\tMonoTypeNameFormat format;\n\tMonoString *res;\n\tgchar *name;\n\n\tMONO_ARCH_SAVE_REGS;\n\tif (full_name)\n\t\tformat = assembly_qualified ?\n\t\t\tMONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :\n\t\t\tMONO_TYPE_NAME_FORMAT_FULL_NAME;\n\telse\n\t\tformat = MONO_TYPE_NAME_FORMAT_REFLECTION;\n \n\tname = mono_type_get_name_full (object->type, format);\n\tif (!name)\n\t\treturn NULL;\n\n\tif (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR)) {\n\t\tg_free (name);\n\t\treturn NULL;\n\t}\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static void\nfill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)\n{\n\tstatic MonoMethod *create_culture = NULL;\n\tgpointer args [2];\n\tguint32 pkey_len;\n\tconst char *pkey_ptr;\n\tgchar *codebase;\n\tMonoBoolean assembly_ref = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));\n\taname->major = name->major;\n\taname->minor = name->minor;\n\taname->build = name->build;\n\taname->flags = name->flags;\n\taname->revision = name->revision;\n\taname->hashalg = name->hash_alg;\n\taname->versioncompat = 1; /* SameMachine (default) */\n\n\tif (by_default_version)\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));\n\n\tcodebase = NULL;\n\tif (absolute != NULL && *absolute != '\\0') {\n\t\tconst gchar *prepend = \"file://\";\n\t\tgchar *result;\n\n\t\tcodebase = g_strdup (absolute);\n\n#if PLATFORM_WIN32\n\t\t{\n\t\t\tgint i;\n\t\t\tfor (i = strlen (codebase) - 1; i >= 0; i--)\n\t\t\t\tif (codebase [i] == '\\\\')\n\t\t\t\t\tcodebase [i] = '/';\n\n\t\t\tif (*codebase == '/' && *(codebase + 1) == '/') {\n\t\t\t\tprepend = \"file:\";\n\t\t\t} else {\n\t\t\t\tprepend = \"file:///\";\n\t\t\t}\n\t\t}\n#endif\n\t\tresult = g_strconcat (prepend, codebase, NULL);\n\t\tg_free (codebase);\n\t\tcodebase = result;\n\t}\n\n\tif (codebase) {\n\t\tMONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));\n\t\tg_free (codebase);\n\t}\n\n\tif (!create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tif (name->culture) {\n\t\targs [0] = mono_string_new (domain, name->culture);\n\t\targs [1] = &assembly_ref;\n\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t}\n\n\tif (name->public_key) {\n\t\tpkey_ptr = (char*)name->public_key;\n\t\tpkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t} else if (default_publickey) {\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t}\n\n\t/* MonoAssemblyName keeps the public key token as an hexadecimal string */\n\tif (name->public_key_token [0]) {\n\t\tint i, j;\n\t\tchar *p;\n\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));\n\t\tp = mono_array_addr (aname->keyToken, char, 0);\n\n\t\tfor (i = 0, j = 0; i < 8; i++) {\n\t\t\t*p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;\n\t\t\t*p |= g_ascii_xdigit_value (name->public_key_token [j++]);\n\t\t\tp++;\n\t\t}\n\t} else if (default_token) {\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t}\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res;\n\tgchar *name;\n\n\tname = g_strdup_printf (\n\t\t\"%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s\",\n\t\tmass->aname.name,\n\t\tmass->aname.major, mass->aname.minor, mass->aname.build, mass->aname.revision,\n\t\tmass->aname.culture && *mass->aname.culture? mass->aname.culture: \"neutral\",\n\t\tmass->aname.public_key_token [0] ? (char *)mass->aname.public_key_token : \"null\",\n\t\t(mass->aname.flags & ASSEMBLYREF_RETARGETABLE_FLAG) ? \", Retargetable=Yes\" : \"\");\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)\n{\n\tgchar *absolute;\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\t\taname, &mass->aname, mass->image->name, TRUE,\n\t\t\tTRUE, mono_framework_version () >= 2);\n\t\treturn;\n\t}\n\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\n\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\taname, &mass->aname, absolute, TRUE, TRUE,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (absolute);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)\n{\n\tchar *filename;\n\tMonoImageOpenStatus status = MONO_IMAGE_OK;\n\tgboolean res;\n\tMonoImage *image;\n\tMonoAssemblyName name;\n\tchar *dirname\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfilename = mono_string_to_utf8 (fname);\n\n\tdirname = g_path_get_dirname (filename);\n\treplace_shadow_path (mono_domain_get (), dirname, &filename);\n\tg_free (dirname);\n\n\timage = mono_image_open (filename, &status);\n\n\tif (!image){\n\t\tMonoException *exc;\n\n\t\tg_free (filename);\n\t\tif (status == MONO_IMAGE_IMAGE_INVALID)\n\t\t\texc = mono_get_exception_bad_image_format2 (NULL, fname);\n\t\telse\n\t\t\texc = mono_get_exception_file_not_found2 (NULL, fname);\n\t\tmono_raise_exception (exc);\n\t}\n\n\tres = mono_assembly_fill_assembly_name (image, &name);\n\tif (!res) {\n\t\tmono_image_close (image);\n\t\tg_free (filename);\n\t\tmono_raise_exception (mono_get_exception_argument (\"assemblyFile\", \"The file does not contain a manifest\"));\n\t}\n\n\tfill_reflection_assembly_name (mono_domain_get (), aname, &name, filename,\n\t\tTRUE, mono_framework_version () == 1,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (filename);\n\tmono_image_close (image);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,\n\tchar **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)\n{\n\tMonoBoolean result = FALSE;\n\tMonoDeclSecurityEntry entry;\n\n\t/* SecurityAction.RequestMinimum */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {\n\t\t*minimum = entry.blob;\n\t\t*minLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestOptional */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {\n\t\t*optional = entry.blob;\n\t\t*optLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestRefuse */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {\n\t\t*refused = entry.blob;\n\t\t*refLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\n\treturn result;\t\n}",
"target": 0
},
{
"function": "static MonoArray*\nmono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly)\n{\n\tMonoArray *res;\n\tMonoClass *klass;\n\tMonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];\n\tint i, count;\n\tguint32 attrs, visibility;\n\n\t/* we start the count from 1 because we skip the special type <Module> */\n\tif (exportedOnly) {\n\t\tcount = 0;\n\t\tfor (i = 1; i < tdef->rows; ++i) {\n\t\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\t\tif (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)\n\t\t\t\tcount++;\n\t\t}\n\t} else {\n\t\tcount = tdef->rows - 1;\n\t}\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\t*exceptions = mono_array_new (domain, mono_defaults.exception_class, count);\n\tcount = 0;\n\tfor (i = 1; i < tdef->rows; ++i) {\n\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\tif (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {\n\t\t\tklass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);\n\t\t\tif (klass) {\n\t\t\t\tmono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));\n\t\t\t} else {\n\t\t\t\tMonoLoaderError *error;\n\t\t\t\tMonoException *ex;\n\t\t\t\t\n\t\t\t\terror = mono_loader_get_last_error ();\n\t\t\t\tg_assert (error != NULL);\n\t\n\t\t\t\tex = mono_loader_error_prepare_exception (error);\n\t\t\t\tmono_array_setref (*exceptions, count, ex);\n\t\t\t}\n\t\t\tif (mono_loader_get_last_error ())\n\t\t\t\tmono_loader_clear_error ();\n\t\t\tcount++;\n\t\t}\n\t}\n\t\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)\n{\n\tMonoArray *res = NULL;\n\tMonoArray *exceptions = NULL;\n\tMonoImage *image = NULL;\n\tMonoTableInfo *table = NULL;\n\tMonoDomain *domain;\n\tGList *list = NULL;\n\tint i, len, ex_count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (assembly);\n\n\tg_assert (!assembly->assembly->dynamic);\n\timage = assembly->assembly->image;\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tres = mono_module_get_types (domain, image, &exceptions, exportedOnly);\n\n\t/* Append data from all modules in the assembly */\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tMonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);\n\t\t\tif (loaded_image) {\n\t\t\t\tMonoArray *ex2;\n\t\t\t\tMonoArray *res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly);\n\t\t\t\t/* Append the new types to the end of the array */\n\t\t\t\tif (mono_array_length (res2) > 0) {\n\t\t\t\t\tguint32 len1, len2;\n\t\t\t\t\tMonoArray *res3, *ex3;\n\n\t\t\t\t\tlen1 = mono_array_length (res);\n\t\t\t\t\tlen2 = mono_array_length (res2);\n\n\t\t\t\t\tres3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (res3, 0, res, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (res3, len1, res2, 0, len2);\n\t\t\t\t\tres = res3;\n\n\t\t\t\t\tex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, len1, ex2, 0, len2);\n\t\t\t\t\texceptions = ex3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* the ReflectionTypeLoadException must have all the types (Types property), \n\t * NULL replacing types which throws an exception. The LoaderException must\n\t * contain all exceptions for NULL items.\n\t */\n\n\tlen = mono_array_length (res);\n\n\tex_count = 0;\n\tfor (i = 0; i < len; i++) {\n\t\tMonoReflectionType *t = mono_array_get (res, gpointer, i);\n\t\tMonoClass *klass;\n\n\t\tif (t) {\n\t\t\tklass = mono_type_get_class (t->type);\n\t\t\tif ((klass != NULL) && klass->exception_type) {\n\t\t\t\t/* keep the class in the list */\n\t\t\t\tlist = g_list_append (list, klass);\n\t\t\t\t/* and replace Type with NULL */\n\t\t\t\tmono_array_setref (res, i, NULL);\n\t\t\t}\n\t\t} else {\n\t\t\tex_count ++;\n\t\t}\n\t}\n\n\tif (list || ex_count) {\n\t\tGList *tmp = NULL;\n\t\tMonoException *exc = NULL;\n\t\tMonoArray *exl = NULL;\n\t\tint j, length = g_list_length (list) + ex_count;\n\n\t\tmono_loader_clear_error ();\n\n\t\texl = mono_array_new (domain, mono_defaults.exception_class, length);\n\t\t/* Types for which mono_class_get () succeeded */\n\t\tfor (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (tmp->data);\n\t\t\tmono_array_setref (exl, i, exc);\n\t\t}\n\t\t/* Types for which it don't */\n\t\tfor (j = 0; j < mono_array_length (exceptions); ++j) {\n\t\t\tMonoException *exc = mono_array_get (exceptions, MonoException*, j);\n\t\t\tif (exc) {\n\t\t\t\tg_assert (i < length);\n\t\t\t\tmono_array_setref (exl, i, exc);\n\t\t\t\ti ++;\n\t\t\t}\n\t\t}\n\t\tg_list_free (list);\n\t\tlist = NULL;\n\n\t\texc = mono_get_exception_reflection_type_load (res, exl);\n\t\tmono_loader_clear_error ();\n\t\tmono_raise_exception (exc);\n\t}\n\t\t\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)\n{\n\tMonoAssemblyName aname;\n\tMonoDomain *domain = mono_object_domain (name);\n\tchar *val;\n\tgboolean is_version_defined;\n\tgboolean is_token_defined;\n\n\taname.public_key = NULL;\n\tval = mono_string_to_utf8 (assname);\n\tif (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined, &is_token_defined)) {\n\t\tg_free ((guint8*) aname.public_key);\n\t\tg_free (val);\n\t\treturn FALSE;\n\t}\n\t\n\tfill_reflection_assembly_name (domain, name, &aname, \"\", is_version_defined,\n\t\tFALSE, is_token_defined);\n\n\tmono_assembly_name_free (&aname);\n\tg_free ((guint8*) aname.public_key);\n\tg_free (val);\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\n\tif (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)\n\t\t/* These images do not have a global type */\n\t\treturn NULL;\n\n\tklass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);\n\treturn mono_type_get_object (domain, &klass->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)\n{\n\t/*if (module->image)\n\t\tmono_image_close (module->image);*/\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\treturn mono_string_new (domain, module->image->guid);\n}",
"target": 0
},
{
"function": "static gpointer\nves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModule *module)\n{\n#ifdef PLATFORM_WIN32\n\tif (module->image && module->image->is_module_handle)\n\t\treturn module->image->raw_data;\n#endif\n\n\treturn (gpointer) (-1);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)\n{\n\tif (image->dynamic) {\n\t\tMonoDynamicImage *dyn = (MonoDynamicImage*)image;\n\t\t*pe_kind = dyn->pe_kind;\n\t\t*machine = dyn->machine;\n\t}\n\telse {\n\t\t*pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;\n\t\t*machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;\n\t}\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)\n{\n\treturn (image->md_version_major << 16) | (image->md_version_minor);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)\n{\n\tMonoArray *exceptions;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!module->image)\n\t\treturn mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);\n\telse {\n\t\tMonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE);\n\t\tfor (i = 0; i < mono_array_length (exceptions); ++i) {\n\t\t\tMonoException *ex = mono_array_get (exceptions, MonoException *, i);\n\t\t\tif (ex)\n\t\t\t\tmono_raise_exception (ex);\n\t\t}\n\t\treturn res;\n\t}\n}",
"target": 0
},
{
"function": "static gboolean\nmono_metadata_memberref_is_method (MonoImage *image, guint32 token)\n{\n\tguint32 cols [MONO_MEMBERREF_SIZE];\n\tconst char *sig;\n\tmono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);\n\tsig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);\n\tmono_metadata_decode_blob_size (sig, &sig);\n\treturn (*sig != 0x6);\n}",
"target": 0
},
{
"function": "static void\ninit_generic_context_from_args (MonoGenericContext *context, MonoArray *type_args, MonoArray *method_args)\n{\n\tif (type_args)\n\t\tcontext->class_inst = mono_metadata_get_generic_inst (mono_array_length (type_args),\n\t\t\t\t\t\t\t\t mono_array_addr (type_args, MonoType*, 0));\n\telse\n\t\tcontext->class_inst = NULL;\n\tif (method_args)\n\t\tcontext->method_inst = mono_metadata_get_generic_inst (mono_array_length (method_args),\n\t\t\t\t\t\t\t\t mono_array_addr (method_args, MonoType*, 0));\n\telse\n\t\tcontext->method_inst = NULL;\n}",
"target": 0
},
{
"function": "static MonoType*\nves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && \n\t\t(table != MONO_TABLE_TYPESPEC)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\tklass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t\tif (!klass)\n\t\t\treturn NULL;\n\t\treturn &klass->byval_arg;\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tklass = mono_class_get_full (image, token, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\tif (klass)\n\t\treturn &klass->byval_arg;\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoMethod*\nves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoMethod *method;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && \n\t\t(table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tmethod = mono_get_method_full (image, token, NULL, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\treturn method;\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint index = mono_metadata_token_index (token);\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic)\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\n\tif ((index <= 0) || (index >= image->heap_us.size)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\t/* FIXME: What to do if the index points into the middle of a string ? */\n\n\treturn mono_ldstr (mono_domain_get (), image, index);\n}",
"target": 0
},
{
"function": "static MonoClassField*\nves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoClassField *field;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tfield = mono_field_from_token (image, token, &klass, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\n\treturn field;\n}",
"target": 0
},
{
"function": "static MonoObject*\nves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\n\t*error = ResolveTokenError_Other;\n\n\tswitch (table) {\n\tcase MONO_TABLE_TYPEDEF:\n\tcase MONO_TABLE_TYPEREF:\n\tcase MONO_TABLE_TYPESPEC: {\n\t\tMonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);\n\t\tif (t)\n\t\t\treturn (MonoObject*)mono_type_get_object (mono_domain_get (), t);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_METHOD:\n\tcase MONO_TABLE_METHODSPEC: {\n\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\tif (m)\n\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\telse\n\t\t\treturn NULL;\n\t}\t\t\n\tcase MONO_TABLE_FIELD: {\n\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\tif (f)\n\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_MEMBERREF:\n\t\tif (mono_metadata_memberref_is_method (image, token)) {\n\t\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\t\tif (m)\n\t\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse {\n\t\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\t\tif (f)\n\t\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\t*error = ResolveTokenError_BadTable;\n\t}\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint idx = mono_metadata_token_index (token);\n\tMonoTableInfo *tables = image->tables;\n\tguint32 sig, len;\n\tconst char *ptr;\n\tMonoArray *res;\n\n\t*error = ResolveTokenError_OutOfRange;\n\n\t/* FIXME: Support other tables ? */\n\tif (table != MONO_TABLE_STANDALONESIG)\n\t\treturn NULL;\n\n\tif (image->dynamic)\n\t\treturn NULL;\n\n\tif ((idx == 0) || (idx > tables [MONO_TABLE_STANDALONESIG].rows))\n\t\treturn NULL;\n\n\tsig = mono_metadata_decode_row_col (&tables [MONO_TABLE_STANDALONESIG], idx - 1, 0);\n\n\tptr = mono_metadata_blob_heap (image, sig);\n\tlen = mono_metadata_decode_blob_size (ptr, &ptr);\n\n\tres = mono_array_new (mono_domain_get (), mono_defaults.byte_class, len);\n\tmemcpy (mono_array_addr (res, guint8, 0), ptr, len);\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)\n{\n\tMonoClass *klass;\n\tint isbyref = 0, rank;\n\tchar *str = mono_string_to_utf8 (smodifiers);\n\tchar *p;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (tb->type.type);\n\tp = str;\n\t/* logic taken from mono_reflection_parse_type(): keep in sync */\n\twhile (*p) {\n\t\tswitch (*p) {\n\t\tcase '&':\n\t\t\tif (isbyref) { /* only one level allowed by the spec */\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tisbyref = 1;\n\t\t\tp++;\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (mono_object_domain (tb), &klass->this_arg);\n\t\t\tbreak;\n\t\tcase '*':\n\t\t\tklass = mono_ptr_class_get (&klass->byval_arg);\n\t\t\tmono_class_init (klass);\n\t\t\tp++;\n\t\t\tbreak;\n\t\tcase '[':\n\t\t\trank = 1;\n\t\t\tp++;\n\t\t\twhile (*p) {\n\t\t\t\tif (*p == ']')\n\t\t\t\t\tbreak;\n\t\t\t\tif (*p == ',')\n\t\t\t\t\trank++;\n\t\t\t\telse if (*p != '*') { /* '*' means unknown lower bound */\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t++p;\n\t\t\t}\n\t\t\tif (*p != ']') {\n\t\t\t\tg_free (str);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tp++;\n\t\t\tklass = mono_array_class_get (klass, rank);\n\t\t\tmono_class_init (klass);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\tg_free (str);\n\treturn mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_Type_IsArrayImpl (MonoReflectionType *t)\n{\n\tMonoType *type;\n\tMonoBoolean res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\ttype = t->type;\n\tres = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static void\ncheck_for_invalid_type (MonoClass *klass)\n{\n\tchar *name;\n\tMonoString *str;\n\tif (klass->byval_arg.type != MONO_TYPE_TYPEDBYREF)\n\t\treturn;\n\n\tname = mono_type_get_full_name (klass);\n\tstr = mono_string_new (mono_domain_get (), name);\n\tg_free (name);\n\tmono_raise_exception ((MonoException*)mono_get_exception_type_load (str, NULL));\n\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Type_make_array_type (MonoReflectionType *type, int rank)\n{\n\tMonoClass *klass, *aklass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tif (rank == 0) //single dimentional array\n\t\taklass = mono_array_class_get (klass, 1);\n\telse\n\t\taklass = mono_bounded_array_class_get (klass, rank, TRUE);\n\n\treturn mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Type_make_byref_type (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\treturn mono_type_get_object (mono_object_domain (type), &klass->this_arg);\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Type_MakePointerType (MonoReflectionType *type)\n{\n\tMonoClass *klass, *pklass;\n\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tcheck_for_invalid_type (klass);\n\n\tpklass = mono_ptr_class_get (type->type);\n\n\treturn mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,\n\t\t\t\t\t\t MonoReflectionMethod *info, MonoBoolean throwOnBindFailure)\n{\n\tMonoClass *delegate_class = mono_class_from_mono_type (type->type);\n\tMonoObject *delegate;\n\tgpointer func;\n\tMonoMethod *method = info->method;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR) {\n\t\tif (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure))\n\t\t\treturn NULL;\n\t}\n\n\tdelegate = mono_object_new (mono_object_domain (type), delegate_class);\n\n\tif (method->dynamic) {\n\t\t/* Creating a trampoline would leak memory */\n\t\tfunc = mono_compile_method (method);\n\t} else {\n\t\tfunc = mono_create_ftnptr (mono_domain_get (),\n\t\t\tmono_runtime_create_jump_trampoline (mono_domain_get (), method, TRUE));\n\t}\n\n\tmono_delegate_ctor_with_method (delegate, target, func, method);\n\n\treturn delegate;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Delegate_SetMulticastInvoke (MonoDelegate *this)\n{\n\t/* Reset the invoke impl to the default one */\n\tthis->invoke_impl = mono_runtime_create_delegate_trampoline (this->object.vtable->klass);\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)\n{\n#ifndef PLATFORM_WIN32\n\tMonoDomain *domain = mono_domain_get ();\n\tstruct tm start, tt;\n\ttime_t t;\n\n\tlong int gmtoff;\n\tint is_daylight = 0, day;\n\tchar tzone [64];\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, (MonoObject*) mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, (MonoObject*) mono_array_new (domain, mono_defaults.string_class, 2));\n\n\t/* \n\t * no info is better than crashing: we'll need our own tz data\n\t * to make this work properly, anyway. The range is probably\n\t * reduced to 1970 .. 2037 because that is what mktime is\n\t * guaranteed to support (we get into an infinite loop\n\t * otherwise).\n\t */\n\n\tmemset (&start, 0, sizeof (start));\n\n\tstart.tm_mday = 1;\n\tstart.tm_year = year-1900;\n\n\tt = mktime (&start);\n\n\tif ((year < 1970) || (year > 2037) || (t == -1)) {\n\t\tt = time (NULL);\n\t\ttt = *localtime (&t);\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\treturn 1;\n\t}\n\n\tgmtoff = gmt_offset (&start, t);\n\n\t/* For each day of the year, calculate the tm_gmtoff. */\n\tfor (day = 0; day < 365; day++) {\n\n\t\tt += 3600*24;\n\t\ttt = *localtime (&t);\n\n\t\t/* Daylight saving starts or ends here. */\n\t\tif (gmt_offset (&tt, t) != gmtoff) {\n\t\t\tstruct tm tt1;\n\t\t\ttime_t t1;\n\n\t\t\t/* Try to find the exact hour when daylight saving starts/ends. */\n\t\t\tt1 = t;\n\t\t\tdo {\n\t\t\t\tt1 -= 3600;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) != gmtoff);\n\n\t\t\t/* Try to find the exact minute when daylight saving starts/ends. */\n\t\t\tdo {\n\t\t\t\tt1 += 60;\n\t\t\t\ttt1 = *localtime (&t1);\n\t\t\t} while (gmt_offset (&tt1, t1) == gmtoff);\n\t\t\tt1+=gmtoff;\n\t\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\t\t\n\t\t\t/* Write data, if we're already in daylight saving, we're done. */\n\t\t\tif (is_daylight) {\n\t\t\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\t\t\tmono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);\n\t\t\t\tis_daylight = 1;\n\t\t\t}\n\n\t\t\t/* This is only set once when we enter daylight saving. */\n\t\t\tmono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);\n\t\t\tmono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);\n\n\t\t\tgmtoff = gmt_offset (&tt, t);\n\t\t}\n\t}\n\n\tif (!is_daylight) {\n\t\tstrftime (tzone, sizeof (tzone), \"%Z\", &tt);\n\t\tmono_array_setref ((*names), 0, mono_string_new (domain, tzone));\n\t\tmono_array_setref ((*names), 1, mono_string_new (domain, tzone));\n\t\tmono_array_set ((*data), gint64, 0, 0);\n\t\tmono_array_set ((*data), gint64, 1, 0);\n\t\tmono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);\n\t\tmono_array_set ((*data), gint64, 3, 0);\n\t}\n\n\treturn 1;\n#else\n\tMonoDomain *domain = mono_domain_get ();\n\tTIME_ZONE_INFORMATION tz_info;\n\tFILETIME ft;\n\tint i;\n\tint err, tz_id;\n\n\ttz_id = GetTimeZoneInformation (&tz_info);\n\tif (tz_id == TIME_ZONE_ID_INVALID)\n\t\treturn 0;\n\n\tMONO_CHECK_ARG_NULL (data);\n\tMONO_CHECK_ARG_NULL (names);\n\n\tmono_gc_wbarrier_generic_store (data, mono_array_new (domain, mono_defaults.int64_class, 4));\n\tmono_gc_wbarrier_generic_store (names, mono_array_new (domain, mono_defaults.string_class, 2));\n\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.DaylightName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));\n\tfor (i = 0; i < 32; ++i)\n\t\tif (!tz_info.StandardName [i])\n\t\t\tbreak;\n\tmono_array_setref ((*names), 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));\n\n\tif ((year <= 1601) || (year > 30827)) {\n\t\t/*\n\t\t * According to MSDN, the MS time functions can't handle dates outside\n\t\t * this interval.\n\t\t */\n\t\treturn 1;\n\t}\n\n\t/* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */\n\tif (tz_id != TIME_ZONE_ID_UNKNOWN) {\n\t\ttz_info.StandardDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.StandardDate);\n\t\terr = SystemTimeToFileTime (&tz_info.StandardDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t\ttz_info.DaylightDate.wYear = year;\n\t\tconvert_to_absolute_date(&tz_info.DaylightDate);\n\t\terr = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);\n\t\t//g_assert(err);\n\t\tif (err == 0)\n\t\t\treturn 0;\n\t\t\n\t\tmono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));\n\t}\n\tmono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);\n\tmono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);\n\n\treturn 1;\n#endif\n}",
"target": 0
},
{
"function": "static gpointer\nves_icall_System_Object_obj_address (MonoObject *this) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this;\n}",
"target": 0
},
{
"function": "static inline gint32 \nmono_array_get_byte_length (MonoArray *array)\n{\n\tMonoClass *klass;\n\tint length;\n\tint i;\n\n\tklass = array->obj.vtable->klass;\n\n\tif (array->bounds == NULL)\n\t\tlength = array->max_length;\n\telse {\n\t\tlength = 1;\n\t\tfor (i = 0; i < klass->rank; ++ i)\n\t\t\tlength *= array->bounds [i].length;\n\t}\n\n\tswitch (klass->element_class->byval_arg.type) {\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn length;\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_CHAR:\n\t\treturn length << 1;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\treturn length << 2;\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U:\n\t\treturn length * sizeof (gpointer);\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\treturn length << 3;\n\tdefault:\n\t\treturn -1;\n\t}\n}",
"target": 0
},
{
"function": "static gint32 \nves_icall_System_Buffer_ByteLengthInternal (MonoArray *array) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get_byte_length (array);\n}",
"target": 0
},
{
"function": "static gint8 \nves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_array_get (array, gint8, idx);\n}",
"target": 0
},
{
"function": "static void \nves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value) \n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_array_set (array, gint8, idx, value);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count) \n{\n\tguint8 *src_buf, *dest_buf;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* watch out for integer overflow */\n\tif ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))\n\t\treturn FALSE;\n\n\tsrc_buf = (guint8 *)src->vector + src_offset;\n\tdest_buf = (guint8 *)dest->vector + dest_offset;\n\n\tif (src != dest)\n\t\tmemcpy (dest_buf, src_buf, count);\n\telse\n\t\tmemmove (dest_buf, src_buf, count); /* Source and dest are the same array */\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)\n{\n\tMonoDomain *domain = mono_object_domain (this); \n\tMonoObject *res;\n\tMonoRealProxy *rp = ((MonoRealProxy *)this);\n\tMonoTransparentProxy *tp;\n\tMonoType *type;\n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_object_new (domain, mono_defaults.transparent_proxy_class);\n\ttp = (MonoTransparentProxy*) res;\n\t\n\tMONO_OBJECT_SETREF (tp, rp, rp);\n\ttype = ((MonoReflectionType *)rp->class_to_proxy)->type;\n\tklass = mono_class_from_mono_type (type);\n\n\ttp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);\n\ttp->remote_class = mono_remote_class (domain, class_name, klass);\n\n\tres->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)\n{\n\treturn mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);\n}",
"target": 0
},
{
"function": "MonoString*\nves_icall_System_Environment_get_UserName (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* using glib is more portable */\n\treturn mono_string_new (mono_domain_get (), g_get_user_name ());\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Environment_get_MachineName (void)\n{\n#if defined (PLATFORM_WIN32)\n\tgunichar2 *buf;\n\tguint32 len;\n\tMonoString *result;\n\n\tlen = MAX_COMPUTERNAME_LENGTH + 1;\n\tbuf = g_new (gunichar2, len);\n\n\tresult = NULL;\n\tif (GetComputerName (buf, (PDWORD) &len))\n\t\tresult = mono_string_new_utf16 (mono_domain_get (), buf, len);\n\n\tg_free (buf);\n\treturn result;\n#elif !defined(DISABLE_SOCKETS)\n\tgchar buf [256];\n\tMonoString *result;\n\n\tif (gethostname (buf, sizeof (buf)) == 0)\n\t\tresult = mono_string_new (mono_domain_get (), buf);\n\telse\n\t\tresult = NULL;\n\t\n\treturn result;\n#else\n\treturn mono_string_new (mono_domain_get (), \"mono\");\n#endif\n}",
"target": 0
},
{
"function": "static int\nves_icall_System_Environment_get_Platform (void)\n{\n#if defined (PLATFORM_WIN32)\n\t/* Win32NT */\n\treturn 2;\n#elif defined(__MACH__)\n\t/* OSX */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\n\t//\n\t// For compatibility with our client code, this will be 4 for a while.\n\t// We will eventually move to 6 to match .NET, but it requires all client\n\t// code to be updated and the documentation everywhere to be updated \n\t// first.\n\t//\n\treturn 4;\n#else\n\t/* Unix */\n\tif (mono_framework_version () < 2)\n\t\treturn 128;\n\treturn 4;\n#endif\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Environment_get_NewLine (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n#if defined (PLATFORM_WIN32)\n\treturn mono_string_new (mono_domain_get (), \"\\r\\n\");\n#else\n\treturn mono_string_new (mono_domain_get (), \"\\n\");\n#endif\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)\n{\n\tconst gchar *value;\n\tgchar *utf8_name;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\treturn NULL;\n\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\tvalue = g_getenv (utf8_name);\n\n\tg_free (utf8_name);\n\n\tif (value == 0)\n\t\treturn NULL;\n\t\n\treturn mono_string_new (mono_domain_get (), value);\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Environment_GetEnvironmentVariableNames (void)\n{\n#ifdef PLATFORM_WIN32\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tWCHAR* env_strings;\n\tWCHAR* env_string;\n\tWCHAR* equal_str;\n\tint n = 0;\n\n\tenv_strings = GetEnvironmentStrings();\n\n\tif (env_strings) {\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=')\n\t\t\t\tn++;\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\t}\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tif (env_strings) {\n\t\tn = 0;\n\t\tenv_string = env_strings;\n\t\twhile (*env_string != '\\0') {\n\t\t\t/* weird case that MS seems to skip */\n\t\t\tif (*env_string != '=') {\n\t\t\t\tequal_str = wcschr(env_string, '=');\n\t\t\t\tg_assert(equal_str);\n\t\t\t\tstr = mono_string_new_utf16 (domain, env_string, equal_str-env_string);\n\t\t\t\tmono_array_setref (names, n, str);\n\t\t\t\tn++;\n\t\t\t}\n\t\t\twhile (*env_string != '\\0')\n\t\t\t\tenv_string++;\n\t\t\tenv_string++;\n\t\t}\n\n\t\tFreeEnvironmentStrings (env_strings);\n\t}\n\n\treturn names;\n\n#else\n\tMonoArray *names;\n\tMonoDomain *domain;\n\tMonoString *str;\n\tgchar **e, **parts;\n\tint n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e)\n\t\t++ n;\n\n\tdomain = mono_domain_get ();\n\tnames = mono_array_new (domain, mono_defaults.string_class, n);\n\n\tn = 0;\n\tfor (e = environ; *e != 0; ++ e) {\n\t\tparts = g_strsplit (*e, \"=\", 2);\n\t\tif (*parts != 0) {\n\t\t\tstr = mono_string_new (domain, *parts);\n\t\t\tmono_array_setref (names, n, str);\n\t\t}\n\n\t\tg_strfreev (parts);\n\n\t\t++ n;\n\t}\n\n\treturn names;\n#endif\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, MonoString *value)\n{\n\tMonoError error;\n\n#ifdef PLATFORM_WIN32\n\tgunichar2 *utf16_name, *utf16_value;\n#else\n\tgchar *utf8_name, *utf8_value;\n#endif\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n#ifdef PLATFORM_WIN32\n\tutf16_name = mono_string_to_utf16 (name);\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tSetEnvironmentVariable (utf16_name, NULL);\n\t\tg_free (utf16_name);\n\t\treturn;\n\t}\n\n\tutf16_value = mono_string_to_utf16 (value);\n\n\tSetEnvironmentVariable (utf16_name, utf16_value);\n\n\tg_free (utf16_name);\n\tg_free (utf16_value);\n#else\n\tutf8_name = mono_string_to_utf8 (name);\t/* FIXME: this should be ascii */\n\n\tif ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {\n\t\tg_unsetenv (utf8_name);\n\t\tg_free (utf8_name);\n\t\treturn;\n\t}\n\n\tutf8_value = mono_string_to_utf8_checked (value, &error);\n\tif (!mono_error_ok (&error)) {\n\t\tg_free (utf8_name);\n\t\tmono_error_raise_exception (&error);\n\t}\n\tg_setenv (utf8_name, utf8_value, TRUE);\n\n\tg_free (utf8_name);\n\tg_free (utf8_value);\n#endif\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Environment_Exit (int result)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_threads_set_shutting_down ();\n\n\tmono_runtime_set_shutting_down ();\n\n\t/* This will kill the tp threads which cannot be suspended */\n\tmono_thread_pool_cleanup ();\n\n\t/* Suspend all managed threads since the runtime is going away */\n\tmono_thread_suspend_all_other_threads ();\n\n\tmono_runtime_quit ();\n\n\t/* we may need to do some cleanup here... */\n\texit (result);\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Environment_GetGacPath (void)\n{\n\treturn mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Environment_GetWindowsFolderPath (int folder)\n{\n#if defined (PLATFORM_WIN32)\n\t#ifndef CSIDL_FLAG_CREATE\n\t\t#define CSIDL_FLAG_CREATE\t0x8000\n\t#endif\n\n\tWCHAR path [MAX_PATH];\n\t/* Create directory if no existing */\n\tif (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {\n\t\tint len = 0;\n\t\twhile (path [len])\n\t\t\t++ len;\n\t\treturn mono_string_new_utf16 (mono_domain_get (), path, len);\n\t}\n#else\n\tg_warning (\"ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!\");\n#endif\n\treturn mono_string_new (mono_domain_get (), \"\");\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Environment_GetLogicalDrives (void)\n{\n gunichar2 buf [256], *ptr, *dname;\n\tgunichar2 *u16;\n\tguint initial_size = 127, size = 128;\n\tgint ndrives;\n\tMonoArray *result;\n\tMonoString *drivestr;\n\tMonoDomain *domain = mono_domain_get ();\n\tgint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n buf [0] = '\\0';\n\tptr = buf;\n\n\twhile (size > initial_size) {\n\t\tsize = (guint) GetLogicalDriveStrings (initial_size, ptr);\n\t\tif (size > initial_size) {\n\t\t\tif (ptr != buf)\n\t\t\t\tg_free (ptr);\n\t\t\tptr = g_malloc0 ((size + 1) * sizeof (gunichar2));\n\t\t\tinitial_size = size;\n\t\t\tsize++;\n\t\t}\n\t}\n\n\t/* Count strings */\n\tdname = ptr;\n\tndrives = 0;\n\tdo {\n\t\twhile (*dname++);\n\t\tndrives++;\n\t} while (*dname);\n\n\tdname = ptr;\n\tresult = mono_array_new (domain, mono_defaults.string_class, ndrives);\n\tndrives = 0;\n\tdo {\n\t\tlen = 0;\n\t\tu16 = dname;\n\t\twhile (*u16) { u16++; len ++; }\n\t\tdrivestr = mono_string_new_utf16 (domain, dname, len);\n\t\tmono_array_setref (result, ndrives++, drivestr);\n\t\twhile (*dname++);\n\t} while (*dname);\n\n\tif (ptr != buf)\n\t\tg_free (ptr);\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Environment_InternalGetHome (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_home_dir ());\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) \n{\n\tconst char *cset;\n\tconst char *p;\n\tchar *c;\n\tchar *codepage = NULL;\n\tint code;\n\tint want_name = *int_code_page;\n\tint i;\n\t\n\t*int_code_page = -1;\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_get_charset (&cset);\n\tc = codepage = strdup (cset);\n\tfor (c = codepage; *c; c++){\n\t\tif (isascii (*c) && isalpha (*c))\n\t\t\t*c = tolower (*c);\n\t\tif (*c == '-')\n\t\t\t*c = '_';\n\t}\n\t/* g_print (\"charset: %s\\n\", cset); */\n\t\n\t/* handle some common aliases */\n\tp = encodings [0];\n\tcode = 0;\n\tfor (i = 0; p != 0; ){\n\t\tif ((gssize) p < 7){\n\t\t\tcode = (gssize) p;\n\t\t\tp = encodings [++i];\n\t\t\tcontinue;\n\t\t}\n\t\tif (strcmp (p, codepage) == 0){\n\t\t\t*int_code_page = code;\n\t\t\tbreak;\n\t\t}\n\t\tp = encodings [++i];\n\t}\n\t\n\tif (strstr (codepage, \"utf_8\") != NULL)\n\t\t*int_code_page |= 0x10000000;\n\tfree (codepage);\n\t\n\tif (want_name && *int_code_page == -1)\n\t\treturn mono_string_new (mono_domain_get (), cset);\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Environment_get_HasShutdownStarted (void)\n{\n\tif (mono_runtime_is_shutting_down ())\n\t\treturn TRUE;\n\n\tif (mono_domain_is_unloading (mono_domain_get ()))\n\t\treturn TRUE;\n\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Environment_BroadcastSettingChange (void)\n{\n#ifdef PLATFORM_WIN32\n\tSendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, NULL, L\"Environment\", SMTO_ABORTIFHUNG, 2000, 0);\n#endif\n}",
"target": 0
},
{
"function": "static void\nves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, \n\t\t\t\t\t MonoReflectionMethod *method,\n\t\t\t\t\t MonoArray *out_args)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_message_init (mono_object_domain (this), this, method, out_args);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_IsTransparentProxy (MonoObject *proxy)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!proxy)\n\t\treturn 0;\n\n\tif (proxy->vtable->klass == mono_defaults.transparent_proxy_class)\n\t\treturn 1;\n\n\treturn 0;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_Remoting_RemotingServices_GetVirtualMethod (\n\tMonoReflectionType *rtype, MonoReflectionMethod *rmethod)\n{\n\tMonoClass *klass;\n\tMonoMethod *method;\n\tMonoMethod **vtable;\n\tMonoMethod *res = NULL;\n\n\tMONO_CHECK_ARG_NULL (rtype);\n\tMONO_CHECK_ARG_NULL (rmethod);\n\n\tmethod = rmethod->method;\n\tklass = mono_class_from_mono_type (rtype->type);\n\n\tif (MONO_CLASS_IS_INTERFACE (klass))\n\t\treturn NULL;\n\n\tif (method->flags & METHOD_ATTRIBUTE_STATIC)\n\t\treturn NULL;\n\n\tif ((method->flags & METHOD_ATTRIBUTE_FINAL) || !(method->flags & METHOD_ATTRIBUTE_VIRTUAL)) {\n\t\tif (klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE))\n\t\t\treturn rmethod;\n\t\telse\n\t\t\treturn NULL;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tvtable = klass->vtable;\n\n\tif (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {\n\t\tint offs = mono_class_interface_offset (klass, method->klass);\n\t\tif (offs >= 0)\n\t\t\tres = vtable [offs + method->slot];\n\t} else {\n\t\tif (!(klass == method->klass || mono_class_is_subclass_of (klass, method->klass, FALSE)))\n\t\t\treturn NULL;\n\n\t\tif (method->slot != -1)\n\t\t\tres = vtable [method->slot];\n\t}\n\n\tif (!res)\n\t\treturn NULL;\n\n\treturn mono_method_get_object (mono_domain_get (), res, NULL);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)\n{\n\tMonoClass *klass;\n\tMonoVTable* vtable;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\tif (enable) vtable->remote = 1;\n\telse vtable->remote = 0;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->rank >= 1) {\n\t\tg_assert (klass->rank == 1);\n\t\treturn (MonoObject *) mono_array_new (domain, klass->element_class, 0);\n\t} else {\n\t\t/* Bypass remoting object creation check */\n\t\treturn mono_object_new_alloc_specific (mono_class_vtable_full (domain, klass, TRUE));\n\t}\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_IO_get_temp_path (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (mono_domain_get (), g_get_tmp_dir ());\n}",
"target": 0
},
{
"function": "static gpointer\nves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_compile_method (method);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)\n{\n\tMonoString *mcpath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), \"mono\", mono_get_runtime_info ()->framework_version, \"machine.config\", NULL);\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tmcpath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn mcpath;\n}",
"target": 0
},
{
"function": "static MonoString *\nget_bundled_machine_config (void)\n{\n\tconst gchar *machine_config;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmachine_config = mono_get_machine_config ();\n\n\tif (!machine_config)\n\t\treturn NULL;\n\n\treturn mono_string_new (mono_domain_get (), machine_config);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)\n{\n\tMonoString *ipath;\n\tgchar *path;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tpath = g_path_get_dirname (mono_get_config_dir ());\n\n#if defined (PLATFORM_WIN32)\n\t/* Avoid mixing '/' and '\\\\' */\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (path) - 1; i >= 0; i--)\n\t\t\tif (path [i] == '/')\n\t\t\t\tpath [i] = '\\\\';\n\t}\n#endif\n\tipath = mono_string_new (mono_domain_get (), path);\n\tg_free (path);\n\n\treturn ipath;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, gint32 *size)\n{\n\tMonoPEResourceDataEntry *entry;\n\tMonoImage *image;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!assembly || !result || !size)\n\t\treturn FALSE;\n\n\t*result = NULL;\n\t*size = 0;\n\timage = assembly->assembly->image;\n\tentry = mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);\n\tif (!entry)\n\t\treturn FALSE;\n\n\t*result = mono_image_rva_map (image, entry->rde_data_offset);\n\tif (!(*result)) {\n\t\tg_free (entry);\n\t\treturn FALSE;\n\t}\n\t*size = entry->rde_size;\n\tg_free (entry);\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Diagnostics_Debugger_IsAttached_internal (void)\n{\n\treturn mono_debug_using_mono_debugger () || mono_is_debugger_attached ();\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)\n{\n#if defined (PLATFORM_WIN32)\n\tOutputDebugString (mono_string_chars (message));\n#else\n\tg_warning (\"WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\\n\");\n#endif\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMonoDomain *domain;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (type);\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (mono_class_is_nullable (klass))\n\t\t/* No arguments -> null */\n\t\treturn NULL;\n\n\treturn mono_object_new (domain, klass);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)\n{\n\tMonoClass *klass, *parent;\n\tMonoMethod *method = m->method;\n\tMonoMethod *result = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->klass == NULL)\n\t\treturn m;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||\n\t MONO_CLASS_IS_INTERFACE (method->klass) ||\n\t method->flags & METHOD_ATTRIBUTE_NEW_SLOT)\n\t\treturn m;\n\n\tklass = method->klass;\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\t/* At the end of the loop, klass points to the eldest class that has this virtual function slot. */\n\tfor (parent = klass->parent; parent != NULL; parent = parent->parent) {\n\t\tmono_class_setup_vtable (parent);\n\t\tif (parent->vtable_size <= method->slot)\n\t\t\tbreak;\n\t\tklass = parent;\n\t}\t\t\n\n\tif (klass == method->klass)\n\t\treturn m;\n\n\tresult = klass->vtable [method->slot];\n\tif (result == NULL) {\n\t\t/* It is an abstract method */\n\t\tgpointer iter = NULL;\n\t\twhile ((result = mono_class_get_methods (klass, &iter)))\n\t\t\tif (result->slot == method->slot)\n\t\t\t\tbreak;\n\t}\n\n\tif (result == NULL)\n\t\treturn m;\n\n\treturn mono_method_get_object (mono_domain_get (), result, NULL);\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_MonoMethod_get_name (MonoReflectionMethod *m)\n{\n\tMonoMethod *method = m->method;\n\n\tMONO_OBJECT_SETREF (m, name, mono_string_new (mono_object_domain (m), method->name));\n\treturn m->name;\n}",
"target": 0
},
{
"function": "static void\nmono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\titer->sig = *(MonoMethodSignature**)argsp;\n\t\n\tg_assert (iter->sig->sentinelpos <= iter->sig->param_count);\n\tg_assert (iter->sig->call_convention == MONO_CALL_VARARG);\n\n\titer->next_arg = 0;\n\t/* FIXME: it's not documented what start is exactly... */\n\tif (start) {\n\t\titer->args = start;\n\t} else {\n\t\titer->args = argsp + sizeof (gpointer);\n#ifndef MONO_ARCH_REGPARMS\n\t\t{\n\t\tguint32 i, arg_size;\n\t\tgint32 align;\n\t\tfor (i = 0; i < iter->sig->sentinelpos; ++i) {\n\t\t\targ_size = mono_type_stack_size (iter->sig->params [i], &align);\n\t\t\titer->args = (char*)iter->args + arg_size;\n\t\t}\n\t\t}\n#endif\n\t}\n\titer->num_args = iter->sig->param_count - iter->sig->sentinelpos;\n\n\t/* g_print (\"sig %p, param_count: %d, sent: %d\\n\", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */\n}",
"target": 0
},
{
"function": "static MonoTypedRef\nmono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\tres.type = iter->sig->params [i];\n\tres.klass = mono_class_from_mono_type (res.type);\n\tres.value = iter->args;\n\targ_size = mono_type_stack_size (res.type, &align);\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n\tif (arg_size <= sizeof (gpointer)) {\n\t\tint dummy;\n\t\tint padding = arg_size - mono_type_size (res.type, &dummy);\n\t\tres.value = (guint8*)res.value + padding;\n\t}\n#endif\n\titer->args = (char*)iter->args + arg_size;\n\titer->next_arg++;\n\n\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoTypedRef\nmono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)\n{\n\tguint32 i, arg_size;\n\tgint32 align;\n\tMonoTypedRef res;\n\tMONO_ARCH_SAVE_REGS;\n\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\twhile (i < iter->sig->param_count) {\n\t\tif (!mono_metadata_type_equal (type, iter->sig->params [i]))\n\t\t\tcontinue;\n\t\tres.type = iter->sig->params [i];\n\t\tres.klass = mono_class_from_mono_type (res.type);\n\t\t/* FIXME: endianess issue... */\n\t\tres.value = iter->args;\n\t\targ_size = mono_type_stack_size (res.type, &align);\n\t\titer->args = (char*)iter->args + arg_size;\n\t\titer->next_arg++;\n\t\t/* g_print (\"returning arg %d, type 0x%02x of size %d at %p\\n\", i, res.type->type, arg_size, res.value); */\n\t\treturn res;\n\t}\n\t/* g_print (\"arg type 0x%02x not found\\n\", res.type->type); */\n\n\tres.type = NULL;\n\tres.value = NULL;\n\tres.klass = NULL;\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoType*\nmono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)\n{\n\tgint i;\n\tMONO_ARCH_SAVE_REGS;\n\t\n\ti = iter->sig->sentinelpos + iter->next_arg;\n\n\tg_assert (i < iter->sig->param_count);\n\n\treturn iter->sig->params [i];\n}",
"target": 0
},
{
"function": "static MonoObject*\nmono_TypedReference_ToObject (MonoTypedRef tref)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (tref.type)) {\n\t\tMonoObject** objp = tref.value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), tref.klass, tref.value);\n}",
"target": 0
},
{
"function": "static MonoObject*\nmono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (MONO_TYPE_IS_REFERENCE (type)) {\n\t\tMonoObject** objp = value;\n\t\treturn *objp;\n\t}\n\n\treturn mono_value_box (mono_domain_get (), klass, value);\n}",
"target": 0
},
{
"function": "static void\nprelink_method (MonoMethod *method)\n{\n\tconst char *exc_class, *exc_arg;\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn;\n\tmono_lookup_pinvoke_call (method, &exc_class, &exc_arg);\n\tif (exc_class) {\n\t\tmono_raise_exception( \n\t\t\tmono_exception_from_name_msg (mono_defaults.corlib, \"System\", exc_class, exc_arg ) );\n\t}\n\t/* create the wrapper, too? */\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\tprelink_method (method->method);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMonoMethod* m;\n\tgpointer iter = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile ((m = mono_class_get_methods (klass, &iter)))\n\t\tprelink_method (m);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas,\n\t\t\t\t\t gint32 const **exponents,\n\t\t\t\t\t gunichar2 const **digitLowerTable,\n\t\t\t\t\t gunichar2 const **digitUpperTable,\n\t\t\t\t\t gint64 const **tenPowersList,\n\t\t\t\t\t gint32 const **decHexDigits)\n{\n\t*mantissas = Formatter_MantissaBitsTable;\n\t*exponents = Formatter_TensExponentTable;\n\t*digitLowerTable = Formatter_DigitLowerTable;\n\t*digitUpperTable = Formatter_DigitUpperTable;\n\t*tenPowersList = Formatter_TenPowersList;\n\t*decHexDigits = Formatter_DecHexDigits;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,\n\t\t\t\t\t guint8 const **numeric_data,\n\t\t\t\t\t gdouble const **numeric_data_values,\n\t\t\t\t\t guint16 const **to_lower_data_low,\n\t\t\t\t\t guint16 const **to_lower_data_high,\n\t\t\t\t\t guint16 const **to_upper_data_low,\n\t\t\t\t\t guint16 const **to_upper_data_high)\n{\n\t*category_data = CategoryData;\n\t*numeric_data = NumericData;\n\t*numeric_data_values = NumericDataValues;\n\t*to_lower_data_low = ToLowerDataLow;\n\t*to_lower_data_high = ToLowerDataHigh;\n\t*to_upper_data_low = ToUpperDataLow;\n\t*to_upper_data_high = ToUpperDataHigh;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method)\n{\n\treturn method->method->token;\n}",
"target": 0
},
{
"function": "static MonoArray*\ntype_array_from_modifiers (MonoImage *image, MonoType *type, int optional)\n{\n\tMonoArray *res;\n\tint i, count = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required))\n\t\t\tcount++;\n\t}\n\tif (!count)\n\t\treturn NULL;\n\tres = mono_array_new (mono_domain_get (), mono_defaults.systemtype_class, count);\n\tcount = 0;\n\tfor (i = 0; i < type->num_mods; ++i) {\n\t\tif ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {\n\t\t\tMonoClass *klass = mono_class_get (image, type->modifiers [i].token);\n\t\t\tmono_array_setref (res, count, mono_type_get_object (mono_domain_get (), &klass->byval_arg));\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoArray*\nparam_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optional)\n{\n\tMonoType *type = param->ClassImpl->type;\n\tMonoClass *member_class = mono_object_class (param->MemberImpl);\n\tMonoMethod *method = NULL;\n\tMonoImage *image;\n\tint pos;\n\tMonoMethodSignature *sig;\n\n\tif (mono_class_is_reflection_method_or_constructor (member_class)) {\n\t\tMonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;\n\t\tmethod = rmethod->method;\n\t} else if (member_class->image == mono_defaults.corlib && !strcmp (\"MonoProperty\", member_class->name)) {\n\t\tMonoReflectionProperty *prop = (MonoReflectionProperty *)param->MemberImpl;\n\t\tif (!(method = prop->property->get))\n\t\t\tmethod = prop->property->set;\n\t\tg_assert (method);\t\n\t} else {\n\t\tchar *type_name = mono_type_get_full_name (member_class);\n\t\tchar *msg = g_strdup_printf (\"Custom modifiers on a ParamInfo with member %s are not supported\", type_name);\n\t\tMonoException *ex = mono_get_exception_not_supported (msg);\n\t\tg_free (type_name);\n\t\tg_free (msg);\n\t\tmono_raise_exception (ex);\n\t}\n\n\timage = method->klass->image;\n\tpos = param->PositionImpl;\n\tsig = mono_method_signature (method);\n\tif (pos == -1)\n\t\ttype = sig->ret;\n\telse\n\t\ttype = sig->params [pos];\n\n\treturn type_array_from_modifiers (image, type, optional);\n}",
"target": 0
},
{
"function": "static MonoType*\nget_property_type (MonoProperty *prop)\n{\n\tMonoMethodSignature *sig;\n\tif (prop->get) {\n\t\tsig = mono_method_signature (prop->get);\n\t\treturn sig->ret;\n\t} else if (prop->set) {\n\t\tsig = mono_method_signature (prop->set);\n\t\treturn sig->params [sig->param_count - 1];\n\t}\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nproperty_info_get_type_modifiers (MonoReflectionProperty *property, MonoBoolean optional)\n{\n\tMonoType *type = get_property_type (property->property);\n\tMonoImage *image = property->klass->image;\n\n\tif (!type)\n\t\treturn NULL;\n\treturn type_array_from_modifiers (image, type, optional);\n}",
"target": 0
},
{
"function": "static MonoBoolean\ncustom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoCustomAttrInfo *cinfo;\n\tgboolean found;\n\n\tcinfo = mono_reflection_get_custom_attrs_info (obj);\n\tif (!cinfo)\n\t\treturn FALSE;\n\tfound = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));\n\tif (!cinfo->cached)\n\t\tmono_custom_attrs_free (cinfo);\n\treturn found;\n}",
"target": 0
},
{
"function": "static MonoArray*\ncustom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)\n{\n\tMonoArray *res = mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL);\n\n\tif (mono_loader_get_last_error ()) {\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\tg_assert_not_reached ();\n\t\t/* Not reached */\n\t\treturn NULL;\n\t} else {\n\t\treturn res;\n\t}\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_Mono_Runtime_GetDisplayName (void)\n{\n\tchar *info;\n\tMonoString *display_name;\n\n\tinfo = mono_get_runtime_callbacks ()->get_runtime_build_info ();\n\tdisplay_name = mono_string_new (mono_domain_get (), info);\n\tg_free (info);\n\treturn display_name;\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)\n{\n\tMonoString *message;\n\tguint32 ret;\n\tgunichar2 buf[256];\n\t\n\tret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |\n\t\t\t FORMAT_MESSAGE_IGNORE_INSERTS, NULL, code, 0,\n\t\t\t buf, 255, NULL);\n\tif (ret == 0) {\n\t\tmessage = mono_string_new (mono_domain_get (), \"Error looking up error string\");\n\t} else {\n\t\tmessage = mono_string_new_utf16 (mono_domain_get (), buf, ret);\n\t}\n\t\n\treturn message;\n}",
"target": 0
},
{
"function": "static MonoArray *\nbase64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)\n{\n\tgint ignored;\n\tgint i;\n\tgunichar2 c;\n\tgunichar2 last, prev_last, prev2_last;\n\tgint olength;\n\tMonoArray *result;\n\tguchar *res_ptr;\n\tgint a [4], b [4];\n\tMonoException *exc;\n\n\tignored = 0;\n\tlast = prev_last = 0, prev2_last = 0;\n\tfor (i = 0; i < ilength; i++) {\n\t\tc = start [i];\n\t\tif (c >= sizeof (dbase64)) {\n\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\"Invalid character found.\");\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (isspace (c)) {\n\t\t\tignored++;\n\t\t} else {\n\t\t\tprev2_last = prev_last;\n\t\t\tprev_last = last;\n\t\t\tlast = c;\n\t\t}\n\t}\n\n\tolength = ilength - ignored;\n\n\tif (allowWhitespaceOnly && olength == 0) {\n\t\treturn mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0);\n\t}\n\n\tif ((olength & 3) != 0 || olength <= 0) {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\",\n\t\t\t\t\t\"FormatException\", \"Invalid length.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (prev2_last == '=') {\n\t\texc = mono_exception_from_name_msg (mono_get_corlib (), \"System\", \"FormatException\", \"Invalid format.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tolength = (olength * 3) / 4;\n\tif (last == '=')\n\t\tolength--;\n\n\tif (prev_last == '=')\n\t\tolength--;\n\n\tresult = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);\n\tres_ptr = mono_array_addr (result, guchar, 0);\n\tfor (i = 0; i < ilength; ) {\n\t\tint k;\n\n\t\tfor (k = 0; k < 4 && i < ilength;) {\n\t\t\tc = start [i++];\n\t\t\tif (isspace (c))\n\t\t\t\tcontinue;\n\n\t\t\ta [k] = (guchar) c;\n\t\t\tif (((b [k] = dbase64 [c]) & 0x80) != 0) {\n\t\t\t\texc = mono_exception_from_name_msg (mono_get_corlib (),\n\t\t\t\t\t\"System\", \"FormatException\",\n\t\t\t\t\t\"Invalid character found.\");\n\t\t\t\tmono_raise_exception (exc);\n\t\t\t}\n\t\t\tk++;\n\t\t}\n\n\t\t*res_ptr++ = (b [0] << 2) | (b [1] >> 4);\n\t\tif (a [2] != '=')\n\t\t\t*res_ptr++ = (b [1] << 4) | (b [2] >> 2);\n\t\tif (a [3] != '=')\n\t\t\t*res_ptr++ = (b [2] << 6) | b [3];\n\n\t\twhile (i < ilength && isspace (start [i]))\n\t\t\ti++;\n\t}\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoArray *\nInternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_string_chars (str), \n\t\tmono_string_length (str), allowWhitespaceOnly);\n}",
"target": 0
},
{
"function": "static MonoArray *\nInternalFromBase64CharArray (MonoArray *input, gint offset, gint length)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn base64_to_byte_array (mono_array_addr (input, gunichar2, offset),\n\t\tlength, FALSE);\n}",
"target": 0
},
{
"function": "void\nmono_icall_init (void)\n{\n\tint i = 0;\n\n\t/* check that tables are sorted: disable in release */\n\tif (TRUE) {\n\t\tint j;\n\t\tconst char *prev_class = NULL;\n\t\tconst char *prev_method;\n\t\t\n\t\tfor (i = 0; i < Icall_type_num; ++i) {\n\t\t\tconst IcallTypeDesc *desc;\n\t\t\tint num_icalls;\n\t\t\tprev_method = NULL;\n\t\t\tif (prev_class && strcmp (prev_class, icall_type_name_get (i)) >= 0)\n\t\t\t\tg_print (\"class %s should come before class %s\\n\", icall_type_name_get (i), prev_class);\n\t\t\tprev_class = icall_type_name_get (i);\n\t\t\tdesc = &icall_type_descs [i];\n\t\t\tnum_icalls = icall_desc_num_icalls (desc);\n\t\t\t/*g_print (\"class %s has %d icalls starting at %d\\n\", prev_class, num_icalls, desc->first_icall);*/\n\t\t\tfor (j = 0; j < num_icalls; ++j) {\n\t\t\t\tconst char *methodn = icall_name_get (desc->first_icall + j);\n\t\t\t\tif (prev_method && strcmp (prev_method, methodn) >= 0)\n\t\t\t\t\tg_print (\"method %s should come before method %s\\n\", methodn, prev_method);\n\t\t\t\tprev_method = methodn;\n\t\t\t}\n\t\t}\n\t}\n\n\ticall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);\n}",
"target": 0
},
{
"function": "void\nmono_icall_cleanup (void)\n{\n\tg_hash_table_destroy (icall_hash);\n\tg_hash_table_destroy (jit_icall_hash_name);\n\tg_hash_table_destroy (jit_icall_hash_addr);\n}",
"target": 0
},
{
"function": "void\nmono_add_internal_call (const char *name, gconstpointer method)\n{\n\tmono_loader_lock ();\n\n\tg_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);\n\n\tmono_loader_unlock ();\n}",
"target": 0
},
{
"function": "static int\nconcat_class_name (char *buf, int bufsize, MonoClass *klass)\n{\n\tint nspacelen, cnamelen;\n\tnspacelen = strlen (klass->name_space);\n\tcnamelen = strlen (klass->name);\n\tif (nspacelen + cnamelen + 2 > bufsize)\n\t\treturn 0;\n\tif (nspacelen) {\n\t\tmemcpy (buf, klass->name_space, nspacelen);\n\t\tbuf [nspacelen ++] = '.';\n\t}\n\tmemcpy (buf + nspacelen, klass->name, cnamelen);\n\tbuf [nspacelen + cnamelen] = 0;\n\treturn nspacelen + cnamelen;\n}",
"target": 0
},
{
"function": "gpointer\nmono_lookup_internal_call (MonoMethod *method)\n{\n\tchar *sigstart;\n\tchar *tmpsig;\n\tchar mname [2048];\n\tint typelen = 0, mlen, siglen;\n\tgpointer res;\n\tconst IcallTypeDesc *imap;\n\n\tg_assert (method != NULL);\n\n\tif (method->is_inflated)\n\t\tmethod = ((MonoMethodInflated *) method)->declaring;\n\n\tif (method->klass->nested_in) {\n\t\tint pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);\n\t\tif (!pos)\n\t\t\treturn NULL;\n\n\t\tmname [pos++] = '/';\n\t\tmname [pos] = 0;\n\n\t\ttypelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\n\t\ttypelen += pos;\n\t} else {\n\t\ttypelen = concat_class_name (mname, sizeof (mname), method->klass);\n\t\tif (!typelen)\n\t\t\treturn NULL;\n\t}\n\n\timap = find_class_icalls (mname);\n\n\tmname [typelen] = ':';\n\tmname [typelen + 1] = ':';\n\n\tmlen = strlen (method->name);\n\tmemcpy (mname + typelen + 2, method->name, mlen);\n\tsigstart = mname + typelen + 2 + mlen;\n\t*sigstart = 0;\n\n\ttmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);\n\tsiglen = strlen (tmpsig);\n\tif (typelen + mlen + siglen + 6 > sizeof (mname))\n\t\treturn NULL;\n\tsigstart [0] = '(';\n\tmemcpy (sigstart + 1, tmpsig, siglen);\n\tsigstart [siglen + 1] = ')';\n\tsigstart [siglen + 2] = 0;\n\tg_free (tmpsig);\n\t\n\tmono_loader_lock ();\n\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try without signature */\n\t*sigstart = 0;\n\tres = g_hash_table_lookup (icall_hash, mname);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\t/* it wasn't found in the static call tables */\n\tif (!imap) {\n\t\tmono_loader_unlock ();\n\t\treturn NULL;\n\t}\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\t/* try _with_ signature */\n\t*sigstart = '(';\n\tres = find_method_icall (imap, sigstart - mlen);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tg_warning (\"cant resolve internal call to \\\"%s\\\" (tested without signature also)\", mname);\n\tg_print (\"\\nYour mono runtime and class libraries are out of sync.\\n\");\n\tg_print (\"The out of sync library is: %s\\n\", method->klass->image->name);\n\tg_print (\"\\nWhen you update one from svn you need to update, compile and install\\nthe other too.\\n\");\n\tg_print (\"Do not report this as a bug unless you're sure you have updated correctly:\\nyou probably have a broken mono install.\\n\");\n\tg_print (\"If you see other errors or faults after this message they are probably related\\n\");\n\tg_print (\"and you need to fix your mono install first.\\n\");\n\n\tmono_loader_unlock ();\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoType*\ntype_from_typename (char *typename)\n{\n\tMonoClass *klass = NULL;\t/* assignment to shut GCC warning up */\n\n\tif (!strcmp (typename, \"int\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"ptr\"))\n\t\tklass = mono_defaults.int_class;\n\telse if (!strcmp (typename, \"void\"))\n\t\tklass = mono_defaults.void_class;\n\telse if (!strcmp (typename, \"int32\"))\n\t\tklass = mono_defaults.int32_class;\n\telse if (!strcmp (typename, \"uint32\"))\n\t\tklass = mono_defaults.uint32_class;\n\telse if (!strcmp (typename, \"int8\"))\n\t\tklass = mono_defaults.sbyte_class;\n\telse if (!strcmp (typename, \"uint8\"))\n\t\tklass = mono_defaults.byte_class;\n\telse if (!strcmp (typename, \"int16\"))\n\t\tklass = mono_defaults.int16_class;\n\telse if (!strcmp (typename, \"uint16\"))\n\t\tklass = mono_defaults.uint16_class;\n\telse if (!strcmp (typename, \"long\"))\n\t\tklass = mono_defaults.int64_class;\n\telse if (!strcmp (typename, \"ulong\"))\n\t\tklass = mono_defaults.uint64_class;\n\telse if (!strcmp (typename, \"float\"))\n\t\tklass = mono_defaults.single_class;\n\telse if (!strcmp (typename, \"double\"))\n\t\tklass = mono_defaults.double_class;\n\telse if (!strcmp (typename, \"object\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"obj\"))\n\t\tklass = mono_defaults.object_class;\n\telse if (!strcmp (typename, \"string\"))\n\t\tklass = mono_defaults.string_class;\n\telse if (!strcmp (typename, \"bool\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse if (!strcmp (typename, \"boolean\"))\n\t\tklass = mono_defaults.boolean_class;\n\telse {\n\t\tg_error (\"%s\", typename);\n\t\tg_assert_not_reached ();\n\t}\n\treturn &klass->byval_arg;\n}",
"target": 0
},
{
"function": "MonoMethodSignature*\nmono_create_icall_signature (const char *sigstr)\n{\n\tgchar **parts;\n\tint i, len;\n\tgchar **tmp;\n\tMonoMethodSignature *res;\n\n\tmono_loader_lock ();\n\tres = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);\n\tif (res) {\n\t\tmono_loader_unlock ();\n\t\treturn res;\n\t}\n\n\tparts = g_strsplit (sigstr, \" \", 256);\n\n\ttmp = parts;\n\tlen = 0;\n\twhile (*tmp) {\n\t\tlen ++;\n\t\ttmp ++;\n\t}\n\n\tres = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);\n\tres->pinvoke = 1;\n\n#ifdef PLATFORM_WIN32\n\t/* \n\t * Under windows, the default pinvoke calling convention is STDCALL but\n\t * we need CDECL.\n\t */\n\tres->call_convention = MONO_CALL_C;\n#endif\n\n\tres->ret = type_from_typename (parts [0]);\n\tfor (i = 1; i < len; ++i) {\n\t\tres->params [i - 1] = type_from_typename (parts [i]);\n\t}\n\n\tg_strfreev (parts);\n\n\tg_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);\n\n\tmono_loader_unlock ();\n\n\treturn res;\n}",
"target": 0
},
{
"function": "MonoJitICallInfo *\nmono_find_jit_icall_by_name (const char *name)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_name);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_name, name);\n\tmono_loader_unlock ();\n\treturn info;\n}",
"target": 0
},
{
"function": "MonoJitICallInfo *\nmono_find_jit_icall_by_addr (gconstpointer addr)\n{\n\tMonoJitICallInfo *info;\n\tg_assert (jit_icall_hash_addr);\n\n\tmono_loader_lock ();\n\tinfo = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);\n\tmono_loader_unlock ();\n\n\treturn info;\n}",
"target": 0
},
{
"function": "GHashTable*\nmono_get_jit_icall_info (void)\n{\n\treturn jit_icall_hash_name;\n}",
"target": 0
},
{
"function": "void\nmono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)\n{\n\tmono_loader_lock ();\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)wrapper, info);\n\tmono_loader_unlock ();\n}",
"target": 0
},
{
"function": "MonoJitICallInfo *\nmono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)\n{\n\tMonoJitICallInfo *info;\n\t\n\tg_assert (func);\n\tg_assert (name);\n\n\tmono_loader_lock ();\n\n\tif (!jit_icall_hash_name) {\n\t\tjit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);\n\t\tjit_icall_hash_addr = g_hash_table_new (NULL, NULL);\n\t}\n\n\tif (g_hash_table_lookup (jit_icall_hash_name, name)) {\n\t\tg_warning (\"jit icall already defined \\\"%s\\\"\\n\", name);\n\t\tg_assert_not_reached ();\n\t}\n\n\tinfo = g_new0 (MonoJitICallInfo, 1);\n\t\n\tinfo->name = name;\n\tinfo->func = func;\n\tinfo->sig = sig;\n\n\tif (is_save) {\n\t\tinfo->wrapper = func;\n\t} else {\n\t\tinfo->wrapper = NULL;\n\t}\n\n\tg_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);\n\tg_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);\n\n\tmono_loader_unlock ();\n\treturn info;\n}",
"target": 0
}
],
"function_after": [
{
"function": "static inline MonoBoolean\nis_generic_parameter (MonoType *type)\n{\n\treturn !type->byref && (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR);\n}",
"target": 0
},
{
"function": "static gboolean\nmono_double_ParseImpl (char *ptr, double *result)\n{\n\tgchar *endptr = NULL;\n\t*result = 0.0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n#ifdef __arm__\n\tif (*ptr)\n\t\t*result = strtod (ptr, &endptr);\n#else\n\tif (*ptr){\n#ifdef _EGLIB_MAJOR\n\t\t/* Need to lock here because EGLIB (#464316) has locking defined as no-ops, and that breaks mono_strtod */\n\t\tEnterCriticalSection (&mono_strtod_mutex);\n\t\t*result = mono_strtod (ptr, &endptr);\n\t\tLeaveCriticalSection (&mono_strtod_mutex);\n#else\n\t\t*result = mono_strtod (ptr, &endptr);\n#endif\n\t}\n#endif\n\n\tif (!*ptr || (endptr && *endptr))\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (ac->element_class->valuetype)\n\t\treturn mono_value_box (this->vtable->domain, ac->element_class, ea);\n\telse\n\t\treturn *ea;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)\n{\n\tMonoClass *ac, *ic;\n\tMonoArray *ao, *io;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tio = (MonoArray *)idxs;\n\tic = (MonoClass *)io->obj.vtable->klass;\n\t\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (io->bounds != NULL || io->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)io->vector;\n\n\tif (ao->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= ao->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\treturn ves_icall_System_Array_GetValueImpl (this, *ind);\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < ao->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - ao->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos*ao->bounds [i].length + ind [i] - \n\t\t\tao->bounds [i].lower_bound;\n\n\treturn ves_icall_System_Array_GetValueImpl (this, pos);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)\n{\n\tMonoClass *ac, *vc, *ec;\n\tgint32 esize, vsize;\n\tgpointer *ea, *va;\n\tint et, vt;\n\n\tguint64 u64 = 0;\n\tgint64 i64 = 0;\n\tgdouble r64 = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (value)\n\t\tvc = value->vtable->klass;\n\telse\n\t\tvc = NULL;\n\n\tac = this->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)this->vector + (pos * esize));\n\tva = (gpointer*)((char*)value + sizeof (MonoObject));\n\n\tif (mono_class_is_nullable (ec)) {\n\t\tmono_nullable_init ((guint8*)ea, value, ec);\n\t\treturn;\n\t}\n\n\tif (!value) {\n\t\tmemset (ea, 0, esize);\n\t\treturn;\n\t}\n\n#define NO_WIDENING_CONVERSION G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\\\n\tif (esize < vsize + (extra)) \\\n\t\tmono_raise_exception (mono_get_exception_argument ( \\\n\t\t\t\"value\", \"not a widening conversion\")); \\\n}G_STMT_END\n\n#define INVALID_CAST G_STMT_START{\\\n\tmono_raise_exception (mono_get_exception_invalid_cast ()); \\\n}G_STMT_END\n\n\t/* Check element (destination) type. */\n\tswitch (ec->byval_arg.type) {\n\tcase MONO_TYPE_STRING:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_STRING:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\tcase MONO_TYPE_BOOLEAN:\n\t\tswitch (vc->byval_arg.type) {\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_R8:\n\t\t\tNO_WIDENING_CONVERSION;\n\t\tdefault:\n\t\t\tINVALID_CAST;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (!ec->valuetype) {\n\t\tif (!mono_object_isinst (value, ec))\n\t\t\tINVALID_CAST;\n\t\tmono_gc_wbarrier_set_arrayref (this, ea, (MonoObject*)value);\n\t\treturn;\n\t}\n\n\tif (mono_object_isinst (value, ec)) {\n\t\tif (ec->has_references)\n\t\t\tmono_value_copy (ea, (char*)value + sizeof (MonoObject), ec);\n\t\telse\n\t\t\tmemcpy (ea, (char *)value + sizeof (MonoObject), esize);\n\t\treturn;\n\t}\n\n\tif (!vc->valuetype)\n\t\tINVALID_CAST;\n\n\tvsize = mono_class_instance_size (vc) - sizeof (MonoObject);\n\n\tet = ec->byval_arg.type;\n\tif (et == MONO_TYPE_VALUETYPE && ec->byval_arg.data.klass->enumtype)\n\t\tet = mono_class_enum_basetype (ec->byval_arg.data.klass)->type;\n\n\tvt = vc->byval_arg.type;\n\tif (vt == MONO_TYPE_VALUETYPE && vc->byval_arg.data.klass->enumtype)\n\t\tvt = mono_class_enum_basetype (vc->byval_arg.data.klass)->type;\n\n#define ASSIGN_UNSIGNED(etype) G_STMT_START{\\\n\tswitch (vt) { \\\n\tcase MONO_TYPE_U1: \\\n\tcase MONO_TYPE_U2: \\\n\tcase MONO_TYPE_U4: \\\n\tcase MONO_TYPE_U8: \\\n\tcase MONO_TYPE_CHAR: \\\n\t\tCHECK_WIDENING_CONVERSION(0); \\\n\t\t*(etype *) ea = (etype) u64; \\\n\t\treturn; \\\n\t/* You can't assign a signed value to an unsigned array. */ \\\n\tcase MONO_TYPE_I1: \\\n\tcase MONO_TYPE_I2: \\\n\tcase MONO_TYPE_I4: \\\n\tcase MONO_TYPE_I8: \\\n\t/* You can't assign a floating point number to an integer array. */ \\\n\tcase MONO_TYPE_R4: \\\n\tcase MONO_TYPE_R8: \\\n\t\tNO_WIDENING_CONVERSION; \\\n\t}",
"target": 0
},
{
"function": "static void \nves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,\n\t\t\t\t MonoArray *idxs)\n{\n\tMonoClass *ac, *ic;\n\tgint32 i, pos, *ind;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (idxs);\n\n\tic = idxs->obj.vtable->klass;\n\tac = this->obj.vtable->klass;\n\n\tg_assert (ic->rank == 1);\n\tif (idxs->bounds != NULL || idxs->max_length != ac->rank)\n\t\tmono_raise_exception (mono_get_exception_argument (NULL, NULL));\n\n\tind = (gint32 *)idxs->vector;\n\n\tif (this->bounds == NULL) {\n\t\tif (*ind < 0 || *ind >= this->max_length)\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\t\tves_icall_System_Array_SetValueImpl (this, value, *ind);\n\t\treturn;\n\t}\n\t\n\tfor (i = 0; i < ac->rank; i++)\n\t\tif ((ind [i] < this->bounds [i].lower_bound) ||\n\t\t (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound))\n\t\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\n\tpos = ind [0] - this->bounds [0].lower_bound;\n\tfor (i = 1; i < ac->rank; i++)\n\t\tpos = pos * this->bounds [i].length + ind [i] - \n\t\t\tthis->bounds [i].lower_bound;\n\n\tves_icall_System_Array_SetValueImpl (this, value, pos);\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++)\n\t\tif (mono_array_get (lengths, gint32, i) < 0)\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint32, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)\n{\n\tMonoClass *aklass;\n\tMonoArray *array;\n\tmono_array_size_t *sizes, i;\n\tgboolean bounded = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (type);\n\tMONO_CHECK_ARG_NULL (lengths);\n\n\tMONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);\n\tif (bounds)\n\t\tMONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));\n\n\tfor (i = 0; i < mono_array_length (lengths); i++) \n\t\tif ((mono_array_get (lengths, gint64, i) < 0) ||\n\t\t (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX))\n\t\t\tmono_raise_exception (mono_get_exception_argument_out_of_range (NULL));\n\n\tif (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0))\n\t\t/* vectors are not the same as one dimensional arrays with no-zero bounds */\n\t\tbounded = TRUE;\n\telse\n\t\tbounded = FALSE;\n\n\taklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);\n\n\tsizes = alloca (aklass->rank * sizeof(mono_array_size_t) * 2);\n\tfor (i = 0; i < aklass->rank; ++i) {\n\t\tsizes [i] = mono_array_get (lengths, guint64, i);\n\t\tif (bounds)\n\t\t\tsizes [i + aklass->rank] = (mono_array_size_t) mono_array_get (bounds, guint64, i);\n\t\telse\n\t\t\tsizes [i + aklass->rank] = 0;\n\t}\n\n\tarray = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);\n\n\treturn array;\n}",
"target": 0
},
{
"function": "static gint32 \nves_icall_System_Array_GetRank (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn this->vtable->klass->rank;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\tmono_array_size_t length;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\tlength = this->max_length;\n\telse\n\t\tlength = this->bounds [dimension].length;\n\n#ifdef MONO_BIG_ARRAYS\n\tif (length > G_MAXINT32)\n\t mono_raise_exception (mono_get_exception_overflow ());\n#endif\n\treturn length;\n}",
"target": 0
},
{
"function": "static gint64\nves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n \t\treturn this->max_length;\n \t\n \treturn this->bounds [dimension].length;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)\n{\n\tgint32 rank = ((MonoObject *)this)->vtable->klass->rank;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((dimension < 0) || (dimension >= rank))\n\t\tmono_raise_exception (mono_get_exception_index_out_of_range ());\n\t\n\tif (this->bounds == NULL)\n\t\treturn 0;\n\t\n\treturn this->bounds [dimension].lower_bound;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)\n{\n\tint sz = mono_array_element_size (mono_object_class (arr));\n\tmemset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)\n{\n\tint element_size;\n\tvoid * dest_addr;\n\tvoid * source_addr;\n\tMonoClass *src_class;\n\tMonoClass *dest_class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)\n\t\treturn FALSE;\n\n\tif (source->bounds || dest->bounds)\n\t\treturn FALSE;\n\n\t/* there's no integer overflow since mono_array_length returns an unsigned integer */\n\tif ((dest_idx + length > mono_array_length (dest)) ||\n\t\t(source_idx + length > mono_array_length (source)))\n\t\treturn FALSE;\n\n\tsrc_class = source->obj.vtable->klass->element_class;\n\tdest_class = dest->obj.vtable->klass->element_class;\n\n\t/*\n\t * Handle common cases.\n\t */\n\n\t/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */\n\tif (src_class == mono_defaults.object_class && dest_class->valuetype) {\n\t\t// FIXME: This is racy\n\t\treturn FALSE;\n\t\t/*\n\t\t int i;\n\t\tint has_refs = dest_class->has_references;\n\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\treturn FALSE;\n\t\t}\n\n\t\telement_size = mono_array_element_size (dest->obj.vtable->klass);\n\t\tmemset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);\n\t\t\tvoid *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);\n\t\t\tif (!elem)\n\t\t\t\tcontinue;\n\t\t\tif (has_refs)\n\t\t\t\tmono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);\n\t\t\telse\n\t\t\t\tmemcpy (addr, (char *)elem + sizeof (MonoObject), element_size);\n\t\t}\n\t\treturn TRUE;\n\t\t*/\n\t}\n\n\t/* Check if we're copying a char[] <==> (u)short[] */\n\tif (src_class != dest_class) {\n\t\tif (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)\n\t\t\treturn FALSE;\n\n\t\tif (mono_class_is_subclass_of (src_class, dest_class, FALSE))\n\t\t\t;\n\t\t/* Case2: object[] -> reftype[] (ArrayList::ToArray) */\n\t\telse if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {\n\t\t\t// FIXME: This is racy\n\t\t\treturn FALSE;\n\t\t\t/*\n\t\t\t int i;\n\t\t\tfor (i = source_idx; i < source_idx + length; ++i) {\n\t\t\t\tMonoObject *elem = mono_array_get (source, MonoObject*, i);\n\t\t\t\tif (elem && !mono_object_isinst (elem, dest_class))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t*/\n\t\t} else\n\t\t\treturn FALSE;\n\t}\n\n\tif (dest_class->valuetype) {\n\t\telement_size = mono_array_element_size (source->obj.vtable->klass);\n\t\tsource_addr = mono_array_addr_with_size (source, element_size, source_idx);\n\t\tif (dest_class->has_references) {\n\t\t\tmono_value_copy_array (dest, dest_idx, source_addr, length);\n\t\t} else {\n\t\t\tdest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);\n\t\t\tmemmove (dest_addr, source_addr, element_size * length);\n\t\t}\n\t} else {\n\t\tmono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);\n\t}\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tmemcpy (value, ea, esize);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpointer value)\n{\n\tMonoClass *ac, *ec;\n\tMonoArray *ao;\n\tgint32 esize;\n\tgpointer *ea;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tao = (MonoArray *)this;\n\tac = (MonoClass *)ao->obj.vtable->klass;\n\tec = ac->element_class;\n\n\tesize = mono_array_element_size (ac);\n\tea = (gpointer*)((char*)ao->vector + (pos * esize));\n\n\tif (MONO_TYPE_IS_REFERENCE (&ec->byval_arg)) {\n\t\tg_assert (esize == sizeof (gpointer));\n\t\tmono_gc_wbarrier_generic_store (ea, *(gpointer*)value);\n\t} else {\n\t\tg_assert (ec->inited);\n\t\tif (ec->has_references)\n\t\t\tmono_gc_wbarrier_value_copy (ea, value, 1, ec);\n\t\tmemcpy (ea, value, esize);\n\t}\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)\n{\n\tMonoClass *klass = array->obj.vtable->klass;\n\tguint32 size = mono_array_element_size (klass);\n\tMonoType *type = mono_type_get_underlying_type (&klass->element_class->byval_arg);\n\tint align;\n\tconst char *field_data;\n\n\tif (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {\n\t\tMonoException *exc = mono_get_exception_argument(\"array\",\n\t\t\t\"Cannot initialize array of non-primitive type.\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tif (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field doesn't have an RVA\");\n\t\tmono_raise_exception (exc);\n\t}\n\n\tsize *= array->max_length;\n\tfield_data = mono_field_get_data (field_handle);\n\n\tif (size > mono_type_size (field_handle->type, &align)) {\n\t\tMonoException *exc = mono_get_exception_argument(\"field_handle\",\n\t\t\t\"Field not large enough to fill array\");\n\t\tmono_raise_exception (exc);\n\t}\n\n#if G_BYTE_ORDER != G_LITTLE_ENDIAN\n#define SWAP(n) {\\\n\tguint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \\\n\tguint ## n *src = (guint ## n *) field_data; \\\n\tguint ## n *end = (guint ## n *)((char*)src + size); \\\n\\\n\tfor (; src < end; data++, src++) { \\\n\t\t*data = read ## n (src); \\\n\t} \\\n}\n\n\t/* printf (\"Initialize array with elements of %s type\\n\", klass->element_class->name); */\n\n\tswitch (type->type) {\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_U2:\n\t\tSWAP (16);\n\t\tbreak;\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_R4:\n\t\tSWAP (32);\n\t\tbreak;\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_R8:\n\t\tSWAP (64);\n\t\tbreak;\n\tdefault:\n\t\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n\t\tbreak;\n\t}\n#else\n\tmemcpy (mono_array_addr (array, char, 0), field_data, size);\n#ifdef ARM_FPU_FPA\n\tif (klass->element_class->byval_arg.type == MONO_TYPE_R8) {\n\t\tgint i;\n\t\tdouble tmp;\n\t\tdouble *data = (double*)mono_array_addr (array, double, 0);\n\n\t\tfor (i = 0; i < size; i++, data++) {\n\t\t\treadr8 (data, &tmp);\n\t\t\t*data = tmp;\n\t\t}\n\t}\n#endif\n#endif\n}",
"target": 0
},
{
"function": "static gint\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn offsetof (MonoString, chars);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((obj == NULL) || (! (obj->vtable->klass->valuetype)))\n\t\treturn obj;\n\telse\n\t\treturn mono_object_clone (obj);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)\n{\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\n\tMONO_CHECK_ARG_NULL (handle);\n\n\tklass = mono_class_from_mono_type (handle);\n\tMONO_CHECK_ARG (handle, klass);\n\n\tvtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);\n\n\t/* This will call the type constructor */\n\tmono_runtime_class_init (vtable);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (MonoImage *image)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_check_for_module_cctor (image);\n\tif (image->has_module_cctor) {\n\t\tMonoClass *module_klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | 1);\n\t\t/*It's fine to raise the exception here*/\n\t\tmono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE));\n\t}\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Object_MemberwiseClone (MonoObject *this)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_object_clone (this);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tint count = 0;\n\tgint32 result = 0;\n\tMonoClassField* field;\n\tgpointer iter;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_object_class (this);\n\n\tif (mono_class_num_fields (klass) == 0)\n\t\treturn mono_object_hash (this);\n\n\t/*\n\t * Compute the starting value of the hashcode for fields of primitive\n\t * types, and return the remaining fields in an array to the managed side.\n\t * This way, we can avoid costly reflection operations in managed code.\n\t */\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_I4:\n\t\t\tresult ^= *(gint32*)((guint8*)this + field->offset);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s;\n\t\t\ts = *(MonoString**)((guint8*)this + field->offset);\n\t\t\tif (s != NULL)\n\t\t\t\tresult ^= mono_string_hash (s);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass));\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t}\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t} else {\n\t\t*fields = NULL;\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)\n{\n\tMonoClass *klass;\n\tMonoObject **values = NULL;\n\tMonoObject *o;\n\tMonoClassField* field;\n\tgpointer iter;\n\tint count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (that);\n\n\tif (this->vtable != that->vtable)\n\t\treturn FALSE;\n\n\tklass = mono_object_class (this);\n\n\tif (klass->enumtype && mono_class_enum_basetype (klass) && mono_class_enum_basetype (klass)->type == MONO_TYPE_I4)\n\t\treturn (*(gint32*)((guint8*)this + sizeof (MonoObject)) == *(gint32*)((guint8*)that + sizeof (MonoObject)));\n\n\t/*\n\t * Do the comparison for fields of primitive type and return a result if\n\t * possible. Otherwise, return the remaining fields in an array to the \n\t * managed side. This way, we can avoid costly reflection operations in \n\t * managed code.\n\t */\n\t*fields = NULL;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\t/* FIXME: Add more types */\n\t\tswitch (field->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\t\tif (*((guint8*)this + field->offset) != *((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\t\tif (*(gint16*)((guint8*)this + field->offset) != *(gint16*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tif (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tif (*(gint64*)((guint8*)this + field->offset) != *(gint64*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R4:\n\t\t\tif (*(float*)((guint8*)this + field->offset) != *(float*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\tcase MONO_TYPE_R8:\n\t\t\tif (*(double*)((guint8*)this + field->offset) != *(double*)((guint8*)that + field->offset))\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\n\n\t\tcase MONO_TYPE_STRING: {\n\t\t\tMonoString *s1, *s2;\n\t\t\tguint32 s1len, s2len;\n\t\t\ts1 = *(MonoString**)((guint8*)this + field->offset);\n\t\t\ts2 = *(MonoString**)((guint8*)that + field->offset);\n\t\t\tif (s1 == s2)\n\t\t\t\tbreak;\n\t\t\tif ((s1 == NULL) || (s2 == NULL))\n\t\t\t\treturn FALSE;\n\t\t\ts1len = mono_string_length (s1);\n\t\t\ts2len = mono_string_length (s2);\n\t\t\tif (s1len != s2len)\n\t\t\t\treturn FALSE;\n\n\t\t\tif (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)\n\t\t\t\treturn FALSE;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif (!values)\n\t\t\t\tvalues = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, this);\n\t\t\tvalues [count++] = o;\n\t\t\to = mono_field_get_value_object (mono_object_domain (this), field, that);\n\t\t\tvalues [count++] = o;\n\t\t}\n\n\t\tif (klass->enumtype)\n\t\t\t/* enums only have one non-static field */\n\t\t\tbreak;\n\t}\n\n\tif (values) {\n\t\tint i;\n\t\tmono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));\n\t\tfor (i = 0; i < count; ++i)\n\t\t\tmono_array_setref (*fields, i, values [i]);\n\t\treturn FALSE;\n\t} else {\n\t\treturn TRUE;\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_System_Object_GetType (MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (obj->vtable->klass != mono_defaults.transparent_proxy_class)\n\t\treturn mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);\n\telse\n\t\treturn mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nmono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmtype->type = &obj->vtable->klass->byval_arg;\n\tg_assert (mtype->type->type);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)\n{\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tMONO_CHECK_ARG_NULL (obj);\n\t\n\treturn mono_image_create_token (mb->dynamic_image, obj, TRUE, TRUE);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,\n\t\t\t\t\tMonoReflectionMethod *method,\n\t\t\t\t\tMonoArray *opt_param_types)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (method);\n\t\n\treturn mono_image_create_method_token (\n\t\tmb->dynamic_image, (MonoObject *) method, opt_param_types);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_create_pefile (mb, file);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_build_metadata (mb);\n}",
"target": 0
},
{
"function": "static void\nves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_register_token (mb->dynamic_image, token, obj);\n}",
"target": 0
},
{
"function": "static gboolean\nget_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static gboolean\nget_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (!(*dest)) {\n\t\tif (!strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\t\treturn FALSE;\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static gboolean\nget_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)\n{\n\tMonoMethod **dest = data;\n\n\t/* skip unmanaged frames */\n\tif (!managed)\n\t\treturn FALSE;\n\n\tif (m->wrapper_type != MONO_WRAPPER_NONE)\n\t\treturn FALSE;\n\n\tif (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, \"System.Reflection\"))\n\t\treturn FALSE;\n\n\tif (m == *dest) {\n\t\t*dest = NULL;\n\t\treturn FALSE;\n\t}\n\tif (!(*dest)) {\n\t\t*dest = m;\n\t\treturn TRUE;\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\ntype_from_name (const char *str, MonoBoolean ignoreCase)\n{\n\tMonoType *type = NULL;\n\tMonoAssembly *assembly = NULL;\n\tMonoTypeNameParse info;\n\tchar *temp_str = g_strdup (str);\n\tgboolean type_resolve = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* mono_reflection_parse_type() mangles the string */\n\tif (!mono_reflection_parse_type (temp_str, &info)) {\n\t\tmono_reflection_free_type_info (&info);\n\t\tg_free (temp_str);\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tassembly = mono_assembly_load (&info.assembly, NULL, NULL);\n\t} else {\n\t\tMonoMethod *m = mono_method_get_last_managed ();\n\t\tMonoMethod *dest = m;\n\n\t\tmono_stack_walk_no_il (get_caller_no_reflection, &dest);\n\t\tif (!dest)\n\t\t\tdest = m;\n\n\t\t/*\n\t\t * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus\n\t\t * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()\n\t\t * to crash. This only seems to happen in some strange remoting\n\t\t * scenarios and I was unable to figure out what's happening there.\n\t\t * Dec 10, 2005 - Martin.\n\t\t */\n\n\t\tif (dest) {\n\t\t\tassembly = dest->klass->image->assembly;\n\t\t\ttype_resolve = TRUE;\n\t\t} else {\n\t\t\tg_warning (G_STRLOC);\n\t\t}\n\t}\n\n\tif (assembly) {\n\t\t/* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tif (!info.assembly.name && !type) /* try mscorlib */\n\t\ttype = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);\n\n\tif (assembly && !type && type_resolve) {\n\t\ttype_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */\n\t\ttype = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);\n\t}\n\n\tmono_reflection_free_type_info (&info);\n\tg_free (temp_str);\n\n\tif (!type) \n\t\treturn NULL;\n\n\treturn mono_type_get_object (mono_domain_get (), type);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_type_from_name (MonoString *name,\n\t\t\t MonoBoolean throwOnError,\n\t\t\t MonoBoolean ignoreCase)\n{\n\tchar *str = mono_string_to_utf8 (name);\n\tMonoReflectionType *type;\n\n\ttype = type_from_name (str, ignoreCase);\n\tg_free (str);\n\tif (type == NULL){\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tmono_loader_clear_error ();\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\t}\n\t\n\treturn type;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_type_from_handle (MonoType *handle)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *klass = mono_class_from_mono_type (handle);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_init (klass);\n\treturn mono_type_get_object (domain, handle);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (c && type->type && c->type)\n\t\treturn mono_metadata_type_equal (type->type, c->type);\n\telse\n\t\treturn (type == c) ? TRUE : FALSE;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)\n{\n\tint t = type->type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn TYPECODE_OBJECT;\n\nhandle_enum:\n\tswitch (t) {\n\tcase MONO_TYPE_VOID:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_BOOLEAN:\n\t\treturn TYPECODE_BOOLEAN;\n\tcase MONO_TYPE_U1:\n\t\treturn TYPECODE_BYTE;\n\tcase MONO_TYPE_I1:\n\t\treturn TYPECODE_SBYTE;\n\tcase MONO_TYPE_U2:\n\t\treturn TYPECODE_UINT16;\n\tcase MONO_TYPE_I2:\n\t\treturn TYPECODE_INT16;\n\tcase MONO_TYPE_CHAR:\n\t\treturn TYPECODE_CHAR;\n\tcase MONO_TYPE_PTR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_U4:\n\t\treturn TYPECODE_UINT32;\n\tcase MONO_TYPE_I4:\n\t\treturn TYPECODE_INT32;\n\tcase MONO_TYPE_U8:\n\t\treturn TYPECODE_UINT64;\n\tcase MONO_TYPE_I8:\n\t\treturn TYPECODE_INT64;\n\tcase MONO_TYPE_R4:\n\t\treturn TYPECODE_SINGLE;\n\tcase MONO_TYPE_R8:\n\t\treturn TYPECODE_DOUBLE;\n\tcase MONO_TYPE_VALUETYPE:\n\t\tif (type->type->data.klass->enumtype) {\n\t\t\tt = mono_class_enum_basetype (type->type->data.klass)->type;\n\t\t\tgoto handle_enum;\n\t\t} else {\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"Decimal\") == 0)\n\t\t\t\t\treturn TYPECODE_DECIMAL;\n\t\t\t\telse if (strcmp (k->name, \"DateTime\") == 0)\n\t\t\t\t\treturn TYPECODE_DATETIME;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_STRING:\n\t\treturn TYPECODE_STRING;\n\tcase MONO_TYPE_SZARRAY:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_VAR:\n\tcase MONO_TYPE_MVAR:\n\tcase MONO_TYPE_TYPEDBYREF:\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_CLASS:\n\t\t{\n\t\t\tMonoClass *k = type->type->data.klass;\n\t\t\tif (strcmp (k->name_space, \"System\") == 0) {\n\t\t\t\tif (strcmp (k->name, \"DBNull\") == 0)\n\t\t\t\t\treturn TYPECODE_DBNULL;\n\t\t\t}\n\t\t}\n\t\treturn TYPECODE_OBJECT;\n\tcase MONO_TYPE_GENERICINST:\n\t\treturn TYPECODE_OBJECT;\n\tdefault:\n\t\tg_error (\"type 0x%02x not handled in GetTypeCode()\", t);\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tif (!c) /* FIXME: dont know what do do here */\n\t\treturn 0;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref)\n\t\treturn klassc == mono_defaults.object_class;\n\n\treturn mono_class_is_subclass_of (klass, klassc, check_interfaces);\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *klassc;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (type != NULL);\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tklassc = mono_class_from_mono_type (c->type);\n\n\tif (type->type->byref && !c->type->byref)\n\t\treturn FALSE;\n\n\treturn mono_class_is_assignable_from (klass, klassc);\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\treturn mono_object_isinst (obj, klass) != NULL;\n}",
"target": 0
},
{
"function": "static guint32\nves_icall_get_attributes (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn klass->flags;\n}",
"target": 0
},
{
"function": "static MonoReflectionMarshal*\nves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)\n{\n\tMonoClass *klass = field->field->parent;\n\tMonoMarshalType *info;\n\tint i;\n\n\tif (klass->generic_container ||\n\t (klass->generic_class && klass->generic_class->context.class_inst->is_open))\n\t\treturn NULL;\n\n\tinfo = mono_marshal_load_type_info (klass);\n\n\tfor (i = 0; i < info->num_fields; ++i) {\n\t\tif (info->fields [i].field == field->field) {\n\t\t\tif (!info->fields [i].mspec)\n\t\t\t\treturn NULL;\n\t\t\telse\n\t\t\t\treturn mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);\n\t\t}\n\t}\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionField*\nves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)\n{\n\tgboolean found = FALSE;\n\tMonoClass *klass;\n\tMonoClass *k;\n\n\tg_assert (handle);\n\n\tif (!type) {\n\t\tklass = handle->parent;\n\t} else {\n\t\tklass = mono_class_from_mono_type (type);\n\n\t\t/* Check that the field belongs to the class */\n\t\tfor (k = klass; k; k = k->parent) {\n\t\t\tif (k == handle->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found)\n\t\t\t/* The managed code will throw the exception */\n\t\t\treturn NULL;\n\t}\n\n\treturn mono_field_get_object (mono_domain_get (), klass, handle);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *field, MonoBoolean optional)\n{\n\tMonoType *type = field->field->type;\n\n\treturn type_array_from_modifiers (field->field->parent->image, type, optional);\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoMethodSignature* sig;\n\tMONO_ARCH_SAVE_REGS;\n\n\tsig = mono_method_signature (method);\n\tif (!sig) {\n\t\tg_assert (mono_loader_get_last_error ());\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t}\n\n\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &method->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, ret, mono_type_get_object (domain, sig->ret));\n\tinfo->attrs = method->flags;\n\tinfo->implattrs = method->iflags;\n\tif (sig->call_convention == MONO_CALL_DEFAULT)\n\t\tinfo->callconv = sig->sentinelpos >= 0 ? 2 : 1;\n\telse {\n\t\tif (sig->call_convention == MONO_CALL_VARARG || sig->sentinelpos >= 0)\n\t\t\tinfo->callconv = 2;\n\t\telse\n\t\t\tinfo->callconv = 1;\n\t}\n\tinfo->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6); \n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\n\treturn mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionMarshal*\nves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoReflectionMarshal* res = NULL;\n\tMonoMarshalSpec **mspecs;\n\tint i;\n\n\tmspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);\n\tmono_method_get_marshal_info (method, mspecs);\n\n\tif (mspecs [0])\n\t\tres = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);\n\t\t\n\tfor (i = mono_method_signature (method)->param_count; i >= 0; i--)\n\t\tif (mspecs [i])\n\t\t\tmono_metadata_free_marshal_spec (mspecs [i]);\n\tg_free (mspecs);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)\n{\n\treturn field->field->offset - sizeof (MonoObject);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)\n{\n\tMonoClass *parent;\n\tMONO_ARCH_SAVE_REGS;\n\n\tparent = declaring? field->field->parent: field->klass;\n\n\treturn mono_type_get_object (mono_object_domain (field), &parent->byval_arg);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)\n{\t\n\tMonoObject *o;\n\tMonoClassField *cf = field->field;\n\tMonoClass *klass;\n\tMonoVTable *vtable;\n\tMonoType *t;\n\tMonoDomain *domain = mono_object_domain (field); \n\tgchar *v;\n\tgboolean is_static = FALSE;\n\tgboolean is_ref = FALSE;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\t\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tmono_class_init (field->klass);\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC)\n\t\tis_static = TRUE;\n\n\tif (obj && !is_static) {\n\t\t/* Check that the field belongs to the object */\n\t\tgboolean found = FALSE;\n\t\tMonoClass *k;\n\n\t\tfor (k = obj->vtable->klass; k; k = k->parent) {\n\t\t\tif (k == cf->parent) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tchar *msg = g_strdup_printf (\"Field '%s' defined on type '%s' is not a field on the target object which is of type '%s'.\", mono_field_get_name (cf), cf->parent->name, obj->vtable->klass->name);\n\t\t\tMonoException *ex = mono_get_exception_argument (NULL, msg);\n\t\t\tg_free (msg);\n\t\t\tmono_raise_exception (ex);\n\t\t}\n\t}\n\n\tt = mono_type_get_underlying_type (cf->type);\n\tswitch (t->type) {\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_OBJECT:\n\tcase MONO_TYPE_CLASS:\n\tcase MONO_TYPE_ARRAY:\n\tcase MONO_TYPE_SZARRAY:\n\t\tis_ref = TRUE;\n\t\tbreak;\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8:\n\tcase MONO_TYPE_VALUETYPE:\n\t\tis_ref = t->byref;\n\t\tbreak;\n\tcase MONO_TYPE_GENERICINST:\n\t\tif (mono_type_generic_inst_is_valuetype (t)) {\n\t\t\tis_ref = t->byref;\n\t\t} else {\n\t\t\tis_ref = TRUE;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t \"ves_icall_Monofield_GetValue\", t->type);\n\t\treturn NULL;\n\t}\n\n\tvtable = NULL;\n\tif (is_static) {\n\t\tvtable = mono_class_vtable_full (domain, cf->parent, TRUE);\n\t\tif (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))\n\t\t\tmono_runtime_class_init (vtable);\n\t}\n\t\n\tif (is_ref) {\n\t\tif (is_static) {\n\t\t\tmono_field_static_get_value (vtable, cf, &o);\n\t\t} else {\n\t\t\tmono_field_get_value (obj, cf, &o);\n\t\t}\n\t\treturn o;\n\t}\n\n\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\tguint8 *buf;\n\n\t\t/* Convert the Nullable structure into a boxed vtype */\n\t\tif (is_static)\n\t\t\tbuf = (guint8*)vtable->data + cf->offset;\n\t\telse\n\t\t\tbuf = (guint8*)obj + cf->offset;\n\n\t\treturn mono_nullable_box (buf, nklass);\n\t}\n\n\t/* boxed value type */\n\tklass = mono_class_from_mono_type (cf->type);\n\to = mono_object_new (domain, klass);\n\tv = ((gchar *) o) + sizeof (MonoObject);\n\tif (is_static) {\n\t\tmono_field_static_get_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_get_value (obj, cf, v);\n\t}\n\n\treturn o;\n}",
"target": 0
},
{
"function": "static void\nves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)\n{\n\tMonoClassField *cf = field->field;\n\tgchar *v;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (field->klass->image->assembly->ref_only)\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\n\t\t\t\t\t\"It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.\"));\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_field (cf);\n\n\tv = (gchar *) value;\n\tif (!cf->type->byref) {\n\t\tswitch (cf->type->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\tcase MONO_TYPE_BOOLEAN:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U:\n\t\tcase MONO_TYPE_I:\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\tcase MONO_TYPE_R4:\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\tcase MONO_TYPE_R8:\n\t\tcase MONO_TYPE_VALUETYPE:\n\t\t\tif (v != NULL)\n\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_STRING:\n\t\tcase MONO_TYPE_OBJECT:\n\t\tcase MONO_TYPE_CLASS:\n\t\tcase MONO_TYPE_ARRAY:\n\t\tcase MONO_TYPE_SZARRAY:\n\t\t\t/* Do nothing */\n\t\t\tbreak;\n\t\tcase MONO_TYPE_GENERICINST: {\n\t\t\tMonoGenericClass *gclass = cf->type->data.generic_class;\n\t\t\tg_assert (!gclass->context.class_inst->is_open);\n\n\t\t\tif (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {\n\t\t\t\tMonoClass *nklass = mono_class_from_mono_type (cf->type);\n\t\t\t\tMonoObject *nullable;\n\n\t\t\t\t/* \n\t\t\t\t * Convert the boxed vtype into a Nullable structure.\n\t\t\t\t * This is complicated by the fact that Nullables have\n\t\t\t\t * a variable structure.\n\t\t\t\t */\n\t\t\t\tnullable = mono_object_new (mono_domain_get (), nklass);\n\n\t\t\t\tmono_nullable_init (mono_object_unbox (nullable), value, nklass);\n\n\t\t\t\tv = mono_object_unbox (nullable);\n\t\t\t}\n\t\t\telse \n\t\t\t\tif (gclass->container_class->valuetype && (v != NULL))\n\t\t\t\t\tv += sizeof (MonoObject);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"type 0x%x not handled in \"\n\t\t\t\t \"ves_icall_FieldInfo_SetValueInternal\", cf->type->type);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\tMonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, TRUE);\n\t\tif (!vtable->initialized)\n\t\t\tmono_runtime_class_init (vtable);\n\t\tmono_field_static_set_value (vtable, cf, v);\n\t} else {\n\t\tmono_field_set_value (obj, cf, v);\n\t}\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this)\n{\t\n\tMonoObject *o = NULL;\n\tMonoClassField *field = this->field;\n\tMonoClass *klass;\n\tMonoDomain *domain = mono_object_domain (this); \n\tgchar *v;\n\tMonoTypeEnum def_type;\n\tconst char *def_value;\n\n\tMONO_ARCH_SAVE_REGS;\n\t\n\tmono_class_init (field->parent);\n\n\tif (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (NULL));\n\n\tif (field->parent->image->dynamic) {\n\t\t/* FIXME: */\n\t\tg_assert_not_reached ();\n\t}\n\n\tdef_value = mono_class_get_field_default_value (field, &def_type);\n\n\tswitch (def_type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1:\n\tcase MONO_TYPE_BOOLEAN:\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2:\n\tcase MONO_TYPE_CHAR:\n\tcase MONO_TYPE_U:\n\tcase MONO_TYPE_I:\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4:\n\tcase MONO_TYPE_R4:\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8:\n\tcase MONO_TYPE_R8: {\n\t\tMonoType *t;\n\n\t\t/* boxed value type */\n\t\tt = g_new0 (MonoType, 1);\n\t\tt->type = def_type;\n\t\tklass = mono_class_from_mono_type (t);\n\t\tg_free (t);\n\t\to = mono_object_new (domain, klass);\n\t\tv = ((gchar *) o) + sizeof (MonoObject);\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, v);\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_STRING:\n\tcase MONO_TYPE_CLASS:\n\t\tmono_get_constant_value_from_blob (domain, def_type, def_value, &o);\n\t\tbreak;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\n\treturn o;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)\n{\n\tMonoMethod *method = rmethod->method.method;\n\n\treturn mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)\n{\n\tMonoDomain *domain = mono_object_domain (property); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif ((req_info & PInfo_ReflectedType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg));\n\telse if ((req_info & PInfo_DeclaringType) != 0)\n\t\tMONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->property->parent->byval_arg));\n\n\tif ((req_info & PInfo_Name) != 0)\n\t\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, property->property->name));\n\n\tif ((req_info & PInfo_Attributes) != 0)\n\t\tinfo->attrs = property->property->attrs;\n\n\tif ((req_info & PInfo_GetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, get, property->property->get ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->get, property->klass): NULL);\n\t\n\tif ((req_info & PInfo_SetMethod) != 0)\n\t\tMONO_STRUCT_SETREF (info, set, property->property->set ?\n\t\t\t\t\t\t\tmono_method_get_object (domain, property->property->set, property->klass): NULL);\n\t/* \n\t * There may be other methods defined for properties, though, it seems they are not exposed \n\t * in the reflection API \n\t */\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (event); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg));\n\tMONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg));\n\n\tMONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));\n\tinfo->attrs = event->event->attrs;\n\tMONO_STRUCT_SETREF (info, add_method, event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, remove_method, event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL);\n\tMONO_STRUCT_SETREF (info, raise_method, event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL);\n\n\tif (event->event->other) {\n\t\tint i, n = 0;\n\t\twhile (event->event->other [n])\n\t\t\tn++;\n\t\tMONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));\n\n\t\tfor (i = 0; i < n; i++)\n\t\t\tmono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));\n\t}\t\t\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetInterfaces (MonoReflectionType* type)\n{\n\tMonoError error;\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoArray *intf;\n\tGPtrArray *ifaces = NULL;\n\tint i;\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *parent;\n\tMonoBitSet *slots;\n\tMonoGenericContext *context = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->generic_class && class->generic_class->context.class_inst->is_open) {\n\t\tcontext = mono_class_get_context (class);\n\t\tclass = class->generic_class->container_class;\n\t}\n\n\tmono_class_setup_vtable (class);\n\n\tslots = mono_bitset_new (class->max_interface_id + 1, 0);\n\n\tfor (parent = class; parent; parent = parent->parent) {\n\t\tGPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error);\n\t\tif (!mono_error_ok (&error)) {\n\t\t\tmono_bitset_free (slots);\n\t\t\tmono_error_raise_exception (&error);\n\t\t\treturn NULL;\n\t\t} else if (tmp_ifaces) {\n\t\t\tfor (i = 0; i < tmp_ifaces->len; ++i) {\n\t\t\t\tMonoClass *ic = g_ptr_array_index (tmp_ifaces, i);\n\n\t\t\t\tif (mono_bitset_test (slots, ic->interface_id))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tmono_bitset_set (slots, ic->interface_id);\n\t\t\t\tif (ifaces == NULL)\n\t\t\t\t\tifaces = g_ptr_array_new ();\n\t\t\t\tg_ptr_array_add (ifaces, ic);\n\t\t\t}\n\t\t\tg_ptr_array_free (tmp_ifaces, TRUE);\n\t\t}\n\t}\n\tmono_bitset_free (slots);\n\n\tif (!ifaces)\n\t\treturn mono_array_new_cached (domain, mono_defaults.monotype_class, 0);\n\t\t\n\tintf = mono_array_new_cached (domain, mono_defaults.monotype_class, ifaces->len);\n\tfor (i = 0; i < ifaces->len; ++i) {\n\t\tMonoClass *ic = g_ptr_array_index (ifaces, i);\n\t\tMonoType *ret = &ic->byval_arg, *inflated = NULL;\n\t\tif (context && ic->generic_class && ic->generic_class->context.class_inst->is_open)\n\t\t\tinflated = ret = mono_class_inflate_generic_type (ret, context);\n\t\t\n\t\tmono_array_setref (intf, i, mono_type_get_object (domain, ret));\n\t\tif (inflated)\n\t\t\tmono_metadata_free_type (inflated);\n\t}\n\tg_ptr_array_free (ifaces, TRUE);\n\n\treturn intf;\n}",
"target": 0
},
{
"function": "static void\nves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\tMonoClass *iclass = mono_class_from_mono_type (iface->type);\n\tMonoReflectionMethod *member;\n\tMonoMethod* method;\n\tgpointer iter;\n\tint i = 0, len, ioffset;\n\tMonoDomain *domain;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_class_setup_vtable (class);\n\n\t/* type doesn't implement iface: the exception is thrown in managed code */\n\tif (! MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))\n\t\t\treturn;\n\n\tlen = mono_class_num_methods (iclass);\n\tioffset = mono_class_interface_offset (class, iclass);\n\tdomain = mono_object_domain (type);\n\tmono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\tmono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (iclass, &iter))) {\n\t\tmember = mono_method_get_object (domain, method, iclass);\n\t\tmono_array_setref (*methods, i, member);\n\t\tmember = mono_method_get_object (domain, class->vtable [i + ioffset], class);\n\t\tmono_array_setref (*targets, i, member);\n\t\t\n\t\ti ++;\n\t}\n}",
"target": 0
},
{
"function": "static void\nves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\n\tif (klass->image->dynamic) {\n\t\tMonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type;\n\t\t*packing = tb->packing_size;\n\t\t*size = tb->class_size;\n\t} else {\n\t\tmono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_GetElementType (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY)\n\t\treturn mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg);\n\n\tclass = mono_class_from_mono_type (type->type);\n\n\t// GetElementType should only return a type for:\n\t// Array Pointer PassedByRef\n\tif (type->type->byref)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->byval_arg);\n\telse if (class->element_class && MONO_CLASS_IS_ARRAY (class))\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse if (class->element_class && type->type->type == MONO_TYPE_PTR)\n\t\treturn mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_get_type_parent (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_ispointer (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->type == MONO_TYPE_PTR;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_isprimitive (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_isbyref (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn type->type->byref;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_type_iscomobject (MonoReflectionType *type)\n{\n\tMonoClass *klass = mono_class_from_mono_type (type->type);\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn (klass && klass->is_com_object);\n}",
"target": 0
},
{
"function": "static MonoReflectionModule*\nves_icall_MonoType_get_Module (MonoReflectionType *type)\n{\n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_module_get_object (mono_object_domain (type), class->image);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_MonoType_get_Assembly (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_assembly_get_object (domain, class->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoClass *class;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\tif (type->type->type == MONO_TYPE_VAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.klass;\n\telse if (type->type->type == MONO_TYPE_MVAR)\n\t\tclass = mono_type_get_generic_param_owner (type->type)->owner.method->klass;\n\telse\n\t\tclass = mono_class_from_mono_type (type->type)->nested_in;\n\n\treturn class ? mono_type_get_object (domain, &class->byval_arg) : NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (class->enumtype && mono_class_enum_basetype (class)) /* types that are modified typebuilders may not have enum_basetype set */\n\t\treturn mono_type_get_object (domain, mono_class_enum_basetype (class));\n\telse if (class->element_class)\n\t\treturn mono_type_get_object (domain, &class->element_class->byval_arg);\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_MonoType_get_Name (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref) {\n\t\tchar *n = g_strdup_printf (\"%s&\", class->name);\n\t\tMonoString *res = mono_string_new (domain, n);\n\n\t\tg_free (n);\n\n\t\treturn res;\n\t} else {\n\t\treturn mono_string_new (domain, class->name);\n\t}\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_MonoType_get_Namespace (MonoReflectionType *type)\n{\n\tMonoDomain *domain = mono_domain_get (); \n\tMonoClass *class = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\twhile (class->nested_in)\n\t\tclass = class->nested_in;\n\n\tif (class->name_space [0] == '\\0')\n\t\treturn NULL;\n\telse\n\t\treturn mono_string_new (domain, class->name_space);\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_MonoType_GetArrayRank (MonoReflectionType *type)\n{\n\tMonoClass *class;\n\n\tif (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY)\n\t\tmono_raise_exception (mono_get_exception_argument (\"type\", \"Type must be an array type\"));\n\n\tclass = mono_class_from_mono_type (type->type);\n\treturn class->rank;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)\n{\n\tMonoArray *res;\n\tMonoClass *klass, *pklass;\n\tMonoDomain *domain = mono_object_domain (type);\n\tMonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE);\n\tint i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\tif (klass->generic_container) {\n\t\tMonoGenericContainer *container = klass->generic_container;\n\t\tres = mono_array_new_specific (array_vtable, container->type_argc);\n\t\tfor (i = 0; i < container->type_argc; ++i) {\n\t\t\tpklass = mono_class_from_generic_parameter (mono_generic_container_get_param (container, i), klass->image, FALSE);\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, &pklass->byval_arg));\n\t\t}\n\t} else if (klass->generic_class) {\n\t\tMonoGenericInst *inst = klass->generic_class->context.class_inst;\n\t\tres = mono_array_new_specific (array_vtable, inst->type_argc);\n\t\tfor (i = 0; i < inst->type_argc; ++i)\n\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\t} else {\n\t\tres = mono_array_new_specific (array_vtable, 0);\n\t}\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\treturn klass->generic_container != NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->generic_container) {\n\t\treturn type; /* check this one */\n\t}\n\tif (klass->generic_class) {\n\t\tMonoClass *generic_class = klass->generic_class->container_class;\n\n\t\tif (generic_class->wastypebuilder && generic_class->reflection_info)\n\t\t\treturn generic_class->reflection_info;\n\t\telse\n\t\t\treturn mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);\n\t}\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)\n{\n\tMonoClass *class;\n\tMonoType *geninst, **types;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tcount = mono_array_length (type_array);\n\ttypes = g_new0 (MonoType *, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionType *t = mono_array_get (type_array, gpointer, i);\n\t\ttypes [i] = t->type;\n\t}\n\n\tgeninst = mono_reflection_bind_generic_parameters (type, count, types);\n\tg_free (types);\n\tif (!geninst)\n\t\treturn NULL;\n\n\tclass = mono_class_from_mono_type (geninst);\n\n\t/*we might inflate to the GTD*/\n\tif (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class))\n\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"Invalid generic arguments\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), geninst);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_Type_get_IsGenericType (MonoReflectionType *type)\n{\n\tMonoClass *klass;\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn FALSE;\n\n\tif (type->type->byref)\n\t\treturn FALSE;\n\n\tklass = mono_class_from_mono_type (type->type);\n\treturn klass->generic_class != NULL || klass->generic_container != NULL;\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!IS_MONOTYPE (type))\n\t\treturn -1;\n\n\tif (is_generic_parameter (type->type))\n\t\treturn mono_type_get_generic_param_num (type->type);\n\treturn -1;\n}",
"target": 0
},
{
"function": "static GenericParameterAttributes\nves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\tg_assert (is_generic_parameter (type->type));\n\treturn mono_generic_param_info (type->type->data.generic_param)->flags;\n}",
"target": 0
},
{
"function": "static MonoArray *\nves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)\n{\n\tMonoGenericParamInfo *param_info;\n\tMonoDomain *domain;\n\tMonoClass **ptr;\n\tMonoArray *res;\n\tint i, count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (IS_MONOTYPE (type));\n\n\tdomain = mono_object_domain (type);\n\tparam_info = mono_generic_param_info (type->type->data.generic_param);\n\tfor (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++)\n\t\t;\n\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\tfor (i = 0; i < count; i++)\n\t\tmono_array_setref (res, i, mono_type_get_object (domain, &param_info->constraints [i]->byval_arg));\n\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (type->type);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)\n{\n\tMONO_ARCH_SAVE_REGS;\n\treturn is_generic_parameter (tb->type.type);\n}",
"target": 0
},
{
"function": "static void\nves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,\n\t\t\t\t\t\t\t\t\t MonoReflectionType *t)\n{\n\tenumtype->type = t->type;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, \n MonoReflectionMethod* generic)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoMethod *method;\n\tgpointer iter;\n\t\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\n\tklass = mono_class_from_mono_type (type->type);\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n if (method->token == generic->method->token)\n return mono_method_get_object (domain, method, klass);\n }\n\n return NULL;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)\n{\n\tMonoMethod *method;\n\tMonoType *type = ref_type->type;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR))\n\t\tmono_raise_exception (mono_get_exception_invalid_operation (\"DeclaringMethod can only be used on generic arguments\"));\n\tif (type->type == MONO_TYPE_VAR)\n\t\treturn NULL;\n\n\tmethod = mono_type_get_generic_param_owner (type)->owner.method;\n\tg_assert (method);\n\treturn mono_method_get_object (mono_object_domain (ref_type), method, method->klass);\n}",
"target": 0
},
{
"function": "static MonoReflectionDllImportAttribute*\nves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)\n{\n\tstatic MonoClass *DllImportAttributeClass = NULL;\n\tMonoDomain *domain = mono_domain_get ();\n\tMonoReflectionDllImportAttribute *attr;\n\tMonoImage *image = method->klass->image;\n\tMonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;\n\tMonoTableInfo *tables = image->tables;\n\tMonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];\n\tMonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];\n\tguint32 im_cols [MONO_IMPLMAP_SIZE];\n\tguint32 scope_token;\n\tconst char *import = NULL;\n\tconst char *scope = NULL;\n\tguint32 flags;\n\n\tif (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))\n\t\treturn NULL;\n\n\tif (!DllImportAttributeClass) {\n\t\tDllImportAttributeClass = \n\t\t\tmono_class_from_name (mono_defaults.corlib,\n\t\t\t\t\t\t\t\t \"System.Runtime.InteropServices\", \"DllImportAttribute\");\n\t\tg_assert (DllImportAttributeClass);\n\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tif (method->klass->image->dynamic) {\n\t\tMonoReflectionMethodAux *method_aux = \n\t\t\tg_hash_table_lookup (\n\t\t\t\t\t\t\t\t\t ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);\n\t\tif (method_aux) {\n\t\t\timport = method_aux->dllentry;\n\t\t\tscope = method_aux->dll;\n\t\t}\n\n\t\tif (!import || !scope) {\n\t\t\tmono_raise_exception (mono_get_exception_argument (\"method\", \"System.Reflection.Emit method with invalid pinvoke information\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (piinfo->implmap_idx) {\n\t\t\tmono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);\n\t\t\t\n\t\t\tpiinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];\n\t\t\timport = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);\n\t\t\tscope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);\n\t\t\tscope = mono_metadata_string_heap (image, scope_token);\n\t\t}\n\t}\n\tflags = piinfo->piflags;\n\t\n\tattr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);\n\n\tMONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));\n\tMONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, import));\n\tattr->call_conv = (flags & 0x700) >> 8;\n\tattr->charset = ((flags & 0x6) >> 1) + 1;\n\tif (attr->charset == 1)\n\t\tattr->charset = 2;\n\tattr->exact_spelling = (flags & 0x1) != 0;\n\tattr->set_last_error = (flags & 0x40) != 0;\n\tattr->best_fit_mapping = (flags & 0x30) == 0x10;\n\tattr->throw_on_unmappable = (flags & 0x3000) == 0x1000;\n\tattr->preserve_sig = FALSE;\n\n\treturn attr;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod *\nves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMonoMethodInflated *imethod;\n\tMonoMethod *result;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (method->method->is_generic)\n\t\treturn method;\n\n\tif (!method->method->is_inflated)\n\t\treturn NULL;\n\n\timethod = (MonoMethodInflated *) method->method;\n\n\tresult = imethod->declaring;\n\t/* Not a generic method. */\n\tif (!result->is_generic)\n\t\treturn NULL;\n\n\tif (method->method->klass->image->dynamic) {\n\t\tMonoDynamicImage *image = (MonoDynamicImage*)method->method->klass->image;\n\t\tMonoReflectionMethod *res;\n\n\t\t/*\n\t\t * FIXME: Why is this stuff needed at all ? Why can't the code below work for\n\t\t * the dynamic case as well ?\n\t\t */\n\t\tmono_loader_lock ();\n\t\tres = mono_g_hash_table_lookup (image->generic_def_objects, imethod);\n\t\tmono_loader_unlock ();\n\n\t\tif (res)\n\t\t\treturn res;\n\t}\n\n\tif (imethod->context.class_inst) {\n\t\tMonoClass *klass = ((MonoMethod *) imethod)->klass;\n\t\t/*Generic methods gets the context of the GTD.*/\n\t\tif (mono_class_get_context (klass))\n\t\t\tresult = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));\n\t}\n\n\treturn mono_method_get_object (mono_object_domain (method), result, NULL);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_signature (method->method)->generic_param_count != 0;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn method->method->is_generic;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)\n{\n\tMonoArray *res;\n\tMonoDomain *domain;\n\tint count, i;\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (method);\n\n\tif (method->method->is_inflated) {\n\t\tMonoGenericInst *inst = mono_method_get_context (method->method)->method_inst;\n\n\t\tif (inst) {\n\t\t\tcount = inst->type_argc;\n\t\t\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\t\t\tfor (i = 0; i < count; i++)\n\t\t\t\tmono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));\n\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tcount = mono_method_signature (method->method)->generic_param_count;\n\tres = mono_array_new (domain, mono_defaults.systemtype_class, count);\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoGenericContainer *container = mono_method_get_generic_container (method->method);\n\t\tMonoGenericParam *param = mono_generic_container_get_param (container, i);\n\t\tMonoClass *pklass = mono_class_from_generic_parameter (\n\t\t\tparam, method->method->klass->image, TRUE);\n\t\tmono_array_setref (res, i,\n\t\t\t\tmono_type_get_object (domain, &pklass->byval_arg));\n\t}\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoException **exc) \n{\n\t/* \n\t * Invoke from reflection is supposed to always be a virtual call (the API\n\t * is stupid), mono_runtime_invoke_*() calls the provided method, allowing\n\t * greater flexibility.\n\t */\n\tMonoMethod *m = method->method;\n\tint pcount;\n\tvoid *obj = this;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t*exc = NULL;\n\n\tif (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)\n\t\tmono_security_core_clr_ensure_reflection_access_method (m);\n\n\tif (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {\n\t\tif (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (this) {\n\t\t\tif (!mono_object_isinst (this, m->klass)) {\n\t\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Object does not match target type.\"));\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tm = mono_object_get_virtual_method (this, m);\n\t\t\t/* must pass the pointer to the value for valuetype methods */\n\t\t\tif (m->klass->valuetype)\n\t\t\t\tobj = mono_object_unbox (this);\n\t\t} else if (strcmp (m->name, \".ctor\") && !m->wrapper_type) {\n\t\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Non-static method requires a target.\"));\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tpcount = params? mono_array_length (params): 0;\n\tif (pcount != mono_method_signature (m)->param_count) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name (mono_defaults.corlib, \"System.Reflection\", \"TargetParameterCountException\"));\n\t\treturn NULL;\n\t}\n\n\tif ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, \".ctor\") && !this) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, \"System.Reflection\", \"TargetException\", \"Cannot invoke constructor of an abstract class.\"));\n\t\treturn NULL;\n\t}\n\n\tif (m->klass->image->assembly->ref_only) {\n\t\tmono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_get_exception_invalid_operation (\"It is illegal to invoke a method on a type loaded using the ReflectionOnly api.\"));\n\t\treturn NULL;\n\t}\n\t\n\tif (m->klass->rank && !strcmp (m->name, \".ctor\")) {\n\t\tint i;\n\t\tmono_array_size_t *lengths;\n\t\tmono_array_size_t *lower_bounds;\n\t\tpcount = mono_array_length (params);\n\t\tlengths = alloca (sizeof (mono_array_size_t) * pcount);\n\t\tfor (i = 0; i < pcount; ++i)\n\t\t\tlengths [i] = *(mono_array_size_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));\n\n\t\tif (m->klass->rank == pcount) {\n\t\t\t/* Only lengths provided. */\n\t\t\tlower_bounds = NULL;\n\t\t} else {\n\t\t\tg_assert (pcount == (m->klass->rank * 2));\n\t\t\t/* lower bounds are first. */\n\t\t\tlower_bounds = lengths;\n\t\t\tlengths += m->klass->rank;\n\t\t}\n\n\t\treturn (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);\n\t}\n\treturn mono_runtime_invoke_array (m, obj, params, NULL);\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs) \n{\n\tMonoDomain *domain = mono_object_domain (method); \n\tMonoMethod *m = method->method;\n\tMonoMethodSignature *sig = mono_method_signature (m);\n\tMonoArray *out_args;\n\tMonoObject *result;\n\tint i, j, outarg_count = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (m->klass == mono_defaults.object_class) {\n\n\t\tif (!strcmp (m->name, \"FieldGetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tif (field_klass->valuetype)\n\t\t\t\t\t\tresult = mono_value_box (domain, field_klass, (char *)this + field->offset);\n\t\t\t\t\telse \n\t\t\t\t\t\tresult = *((gpointer *)((char *)this + field->offset));\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 1);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\t\t\t\t\tmono_array_setref (out_args, 0, result);\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t} else if (!strcmp (m->name, \"FieldSetter\")) {\n\t\t\tMonoClass *k = this->vtable->klass;\n\t\t\tMonoString *name;\n\t\t\tguint32 size;\n\t\t\tgint32 align;\n\t\t\tchar *str;\n\t\t\t\n\t\t\t/* If this is a proxy, then it must be a CBO */\n\t\t\tif (k == mono_defaults.transparent_proxy_class) {\n\t\t\t\tMonoTransparentProxy *tp = (MonoTransparentProxy*) this;\n\t\t\t\tthis = tp->rp->unwrapped_server;\n\t\t\t\tg_assert (this);\n\t\t\t\tk = this->vtable->klass;\n\t\t\t}\n\t\t\t\n\t\t\tname = mono_array_get (params, MonoString *, 1);\n\t\t\tstr = mono_string_to_utf8 (name);\n\t\t\n\t\t\tdo {\n\t\t\t\tMonoClassField* field = mono_class_get_field_from_name (k, str);\n\t\t\t\tif (field) {\n\t\t\t\t\tMonoClass *field_klass = mono_class_from_mono_type (field->type);\n\t\t\t\t\tMonoObject *val = mono_array_get (params, gpointer, 2);\n\n\t\t\t\t\tif (field_klass->valuetype) {\n\t\t\t\t\t\tsize = mono_type_size (field->type, &align);\n#ifdef HAVE_SGEN_GC\n\t\t\t\t\t\tmono_gc_wbarrier_value_copy ((char *)this + field->offset, (char*)val + sizeof (MonoObject), 1, field_klass);\n#endif\n\t\t\t\t\t\tmemcpy ((char *)this + field->offset, \n\t\t\t\t\t\t\t((char *)val) + sizeof (MonoObject), size);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmono_gc_wbarrier_set_field (this, (char*)this + field->offset, val);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tout_args = mono_array_new (domain, mono_defaults.object_class, 0);\n\t\t\t\t\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\t\t\t\t\tg_free (str);\n\t\t\t\t\treturn NULL;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tk = k->parent;\n\t\t\t} while (k);\n\n\t\t\tg_free (str);\n\t\t\tg_assert_not_reached ();\n\n\t\t}\n\t}\n\n\tfor (i = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) \n\t\t\toutarg_count++;\n\t}\n\n\tout_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);\n\t\n\t/* handle constructors only for objects already allocated */\n\tif (!strcmp (method->method->name, \".ctor\"))\n\t\tg_assert (this);\n\n\t/* This can be called only on MBR objects, so no need to unbox for valuetypes. */\n\tg_assert (!method->method->klass->valuetype);\n\tresult = mono_runtime_invoke_array (method->method, this, params, NULL);\n\n\tfor (i = 0, j = 0; i < mono_array_length (params); i++) {\n\t\tif (sig->params [i]->byref) {\n\t\t\tgpointer arg;\n\t\t\targ = mono_array_get (params, gpointer, i);\n\t\t\tmono_array_setref (out_args, j, arg);\n\t\t\tj++;\n\t\t}\n\t}\n\n\tmono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static guint64\nread_enum_value (char *mem, int type)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\t\treturn *(guint8*)mem;\n\tcase MONO_TYPE_I1:\n\t\treturn *(gint8*)mem;\n\tcase MONO_TYPE_U2:\n\t\treturn *(guint16*)mem;\n\tcase MONO_TYPE_I2:\n\t\treturn *(gint16*)mem;\n\tcase MONO_TYPE_U4:\n\t\treturn *(guint32*)mem;\n\tcase MONO_TYPE_I4:\n\t\treturn *(gint32*)mem;\n\tcase MONO_TYPE_U8:\n\t\treturn *(guint64*)mem;\n\tcase MONO_TYPE_I8:\n\t\treturn *(gint64*)mem;\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static void\nwrite_enum_value (char *mem, int type, guint64 value)\n{\n\tswitch (type) {\n\tcase MONO_TYPE_U1:\n\tcase MONO_TYPE_I1: {\n\t\tguint8 *p = (guint8*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U2:\n\tcase MONO_TYPE_I2: {\n\t\tguint16 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U4:\n\tcase MONO_TYPE_I4: {\n\t\tguint32 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tcase MONO_TYPE_U8:\n\tcase MONO_TYPE_I8: {\n\t\tguint64 *p = (void*)mem;\n\t\t*p = value;\n\t\tbreak;\n\t}\n\tdefault:\n\t\tg_assert_not_reached ();\n\t}\n\treturn;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)\n{\n\tMonoDomain *domain; \n\tMonoClass *enumc, *objc;\n\tMonoObject *res;\n\tMonoType *etype;\n\tguint64 val;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_CHECK_ARG_NULL (enumType);\n\tMONO_CHECK_ARG_NULL (value);\n\n\tdomain = mono_object_domain (enumType); \n\tenumc = mono_class_from_mono_type (enumType->type);\n\tobjc = value->vtable->klass;\n\n\tif (!enumc->enumtype)\n\t\tmono_raise_exception (mono_get_exception_argument (\"enumType\", \"Type provided must be an Enum.\"));\n\tif (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))\n\t\tmono_raise_exception (mono_get_exception_argument (\"value\", \"The value passed in must be an enum base or an underlying type for an enum, such as an Int32.\"));\n\n\tetype = mono_class_enum_basetype (enumc);\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\tres = mono_object_new (domain, enumc);\n\tval = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);\n\twrite_enum_value ((char *)res + sizeof (MonoObject), etype->type, val);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoObject *\nves_icall_System_Enum_get_value (MonoObject *this)\n{\n\tMonoObject *res;\n\tMonoClass *enumc;\n\tgpointer dst;\n\tgpointer src;\n\tint size;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!this)\n\t\treturn NULL;\n\n\tg_assert (this->vtable->klass->enumtype);\n\t\n\tenumc = mono_class_from_mono_type (mono_class_enum_basetype (this->vtable->klass));\n\tres = mono_object_new (mono_object_domain (this), enumc);\n\tdst = (char *)res + sizeof (MonoObject);\n\tsrc = (char *)this + sizeof (MonoObject);\n\tsize = mono_class_value_size (enumc, NULL);\n\n\tmemcpy (dst, src, size);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)\n{\n\tMonoType *etype;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tetype = mono_class_enum_basetype (mono_class_from_mono_type (type->type));\n\tif (!etype)\n\t\t/* MS throws this for typebuilders */\n\t\tmono_raise_exception (mono_get_exception_argument (\"Type must be a type provided by the runtime.\", \"enumType\"));\n\n\treturn mono_type_get_object (mono_object_domain (type), etype);\n}",
"target": 0
},
{
"function": "static int\nves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)\n{\n\tgpointer tdata = (char *)this + sizeof (MonoObject);\n\tgpointer odata = (char *)other + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n#define COMPARE_ENUM_VALUES(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me > other ? 1 : -1; \\\n\t} while (0)\n\n#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \\\n\t\tENUM_TYPE me = *((ENUM_TYPE*)tdata); \\\n\t\tENUM_TYPE other = *((ENUM_TYPE*)odata); \\\n\t\tif (me == other) \\\n\t\t\treturn 0; \\\n\t\treturn me - other; \\\n\t} while (0)\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_U1:\n\t\t\tCOMPARE_ENUM_VALUES (guint8);\n\t\tcase MONO_TYPE_I1:\n\t\t\tCOMPARE_ENUM_VALUES (gint8);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\tCOMPARE_ENUM_VALUES_RANGE (guint16);\n\t\tcase MONO_TYPE_I2:\n\t\t\tCOMPARE_ENUM_VALUES (gint16);\n\t\tcase MONO_TYPE_U4:\n\t\t\tCOMPARE_ENUM_VALUES (guint32);\n\t\tcase MONO_TYPE_I4:\n\t\t\tCOMPARE_ENUM_VALUES (gint32);\n\t\tcase MONO_TYPE_U8:\n\t\t\tCOMPARE_ENUM_VALUES (guint64);\n\t\tcase MONO_TYPE_I8:\n\t\t\tCOMPARE_ENUM_VALUES (gint64);\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n#undef COMPARE_ENUM_VALUES_RANGE\n#undef COMPARE_ENUM_VALUES\n\treturn 0;\n}",
"target": 0
},
{
"function": "static int\nves_icall_System_Enum_get_hashcode (MonoObject *this)\n{\n\tgpointer data = (char *)this + sizeof (MonoObject);\n\tMonoType *basetype = mono_class_enum_basetype (this->vtable->klass);\n\tg_assert (basetype);\n\n\tswitch (basetype->type) {\n\t\tcase MONO_TYPE_I1:\t\n\t\t\treturn *((gint8*)data);\n\t\tcase MONO_TYPE_U1:\n\t\t\treturn *((guint8*)data);\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\t\treturn *((guint16*)data);\n\t\t\n\t\tcase MONO_TYPE_I2:\n\t\t\treturn *((gint16*)data);\n\t\tcase MONO_TYPE_U4:\n\t\t\treturn *((guint32*)data);\n\t\tcase MONO_TYPE_I4:\n\t\t\treturn *((gint32*)data);\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8: {\n\t\t\tgint64 value = *((gint64*)data);\n\t\t\treturn (gint)(value & 0xffffffff) ^ (int)(value >> 32);\n\t\t}\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_hashcode\", basetype->type);\n\t}\n\treturn 0;\n}",
"target": 0
},
{
"function": "static void\nves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)\n{\n\tMonoDomain *domain = mono_object_domain (type); \n\tMonoClass *enumc = mono_class_from_mono_type (type->type);\n\tguint j = 0, nvalues, crow;\n\tgpointer iter;\n\tMonoClassField *field;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc)));\n\tnvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;\n\tMONO_STRUCT_SETREF (info, names, mono_array_new (domain, mono_defaults.string_class, nvalues));\n\tMONO_STRUCT_SETREF (info, values, mono_array_new (domain, enumc, nvalues));\n\n\tcrow = -1;\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (enumc, &iter))) {\n\t\tconst char *p;\n\t\tint len;\n\t\tMonoTypeEnum def_type;\n\t\t\n\t\tif (strcmp (\"value__\", mono_field_get_name (field)) == 0)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tmono_array_setref (info->names, j, mono_string_new (domain, mono_field_get_name (field)));\n\n\t\tp = mono_class_get_field_default_value (field, &def_type);\n\t\tlen = mono_metadata_decode_blob_size (p, &p);\n\t\tswitch (mono_class_enum_basetype (enumc)->type) {\n\t\tcase MONO_TYPE_U1:\n\t\tcase MONO_TYPE_I1:\n\t\t\tmono_array_set (info->values, gchar, j, *p);\n\t\t\tbreak;\n\t\tcase MONO_TYPE_CHAR:\n\t\tcase MONO_TYPE_U2:\n\t\tcase MONO_TYPE_I2:\n\t\t\tmono_array_set (info->values, gint16, j, read16 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U4:\n\t\tcase MONO_TYPE_I4:\n\t\t\tmono_array_set (info->values, gint32, j, read32 (p));\n\t\t\tbreak;\n\t\tcase MONO_TYPE_U8:\n\t\tcase MONO_TYPE_I8:\n\t\t\tmono_array_set (info->values, gint64, j, read64 (p));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tg_error (\"Implement type 0x%02x in get_enum_info\", mono_class_enum_basetype (enumc)->type);\n\t\t}\n\t\t++j;\n\t}\n}",
"target": 0
},
{
"function": "static MonoReflectionField *\nves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass;\n\tint match;\n\tMonoClassField *field;\n\tgpointer iter;\n\tchar *utf8_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!name)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\tif (type->type->byref)\n\t\treturn NULL;\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\nhandle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\n\t\tif (field->type == NULL)\n\t\t\tcontinue;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\t\n\t\tutf8_name = mono_string_to_utf8 (name);\n\n\t\tif (compare_func (mono_field_get_name (field), utf8_name)) {\n\t\t\tg_free (utf8_name);\n\t\t\tcontinue;\n\t\t}\n\t\tg_free (utf8_name);\n\t\t\n\t\treturn mono_field_get_object (domain, klass, field);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter;\n\tMonoClassField *field;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.field_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tmono_ptr_array_init (tmp_array, 2);\n\t\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((field = mono_class_get_fields (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (mono_field_is_deleted (field))\n\t\t\tcontinue;\n\t\tif ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((klass == startklass) || (field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) != FIELD_ATTRIBUTE_PRIVATE) {\n\t\t\tif (bflags & BFLAGS_NonPublic) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_field_get_object (domain, refklass, field);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nmethod_nonpublic (MonoMethod* method, gboolean start_klass)\n{\n\tswitch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) {\n\t\tcase METHOD_ATTRIBUTE_ASSEM:\n\t\t\treturn (start_klass || mono_defaults.generic_ilist_class);\n\t\tcase METHOD_ATTRIBUTE_PRIVATE:\n\t\t\treturn start_klass;\n\t\tcase METHOD_ATTRIBUTE_PUBLIC:\n\t\t\treturn FALSE;\n\t\tdefault:\n\t\t\treturn TRUE;\n\t}\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tstatic MonoClass *MethodInfo_array;\n\tMonoDomain *domain; \n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tgpointer iter;\n\tMonoObject *member;\n\tint i, len, match, nslots;\n\t/*FIXME, use MonoBitSet*/\n\tguint32 method_slots_default [8];\n\tguint32 *method_slots = NULL;\n\tgchar *mname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMonoVTable *array_vtable;\n\tMonoException *ex;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!MethodInfo_array) {\n\t\tMonoClass *klass = mono_array_class_get (mono_defaults.method_info_class, 1);\n\t\tmono_memory_barrier ();\n\t\tMethodInfo_array = klass;\n\t}\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tarray_vtable = mono_class_vtable_full (domain, MethodInfo_array, TRUE);\n\tif (type->type->byref)\n\t\treturn mono_array_new_specific (array_vtable, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\tlen = 0;\n\tif (name != NULL) {\n\t\tmname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\t/* An optimization for calls made from Delegate:CreateDelegate () */\n\tif (klass->delegate && mname && !strcmp (mname, \"Invoke\") && (bflags == (BFLAGS_Public | BFLAGS_Static | BFLAGS_Instance))) {\n\t\tmethod = mono_get_delegate_invoke (klass);\n\t\tif (mono_loader_get_last_error ())\n\t\t\tgoto loader_error;\n\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tres = mono_array_new_specific (array_vtable, 1);\n\t\tmono_array_setref (res, 0, member);\n\t\tg_free (mname);\n\t\treturn res;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\n\n\tif (is_generic_parameter (type->type))\n\t\tnslots = mono_class_get_vtable_size (klass->parent);\n\telse\n\t\tnslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : mono_class_get_vtable_size (klass);\n\tif (nslots >= sizeof (method_slots_default) * 8) {\n\t\tmethod_slots = g_new0 (guint32, nslots / 32 + 1);\n\t} else {\n\t\tmethod_slots = method_slots_default;\n\t\tmemset (method_slots, 0, sizeof (method_slots_default));\n\t}\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())\n\t\tgoto loader_error;\t\t\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (method->slot != -1) {\n\t\t\tg_assert (method->slot < nslots);\n\t\t\tif (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))\n\t\t\t\tcontinue;\n\t\t\tif (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT))\n\t\t\t\tmethod_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);\n\t\t}\n\n\t\tif (method->name [0] == '.' && (strcmp (method->name, \".ctor\") == 0 || strcmp (method->name, \".cctor\") == 0))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if ((bflags & BFLAGS_NonPublic) && method_nonpublic (method, (klass == startklass))) {\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (mname, method->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tmatch = 0;\n\t\t\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\t\t\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\n\tres = mono_array_new_specific (array_vtable, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\treturn res;\n\nloader_error:\n\tg_free (mname);\n\tif (method_slots != method_slots_default)\n\t\tg_free (method_slots);\n\tmono_ptr_array_destroy (tmp_array);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tex = mono_class_get_exception_for_failure (klass);\n\t} else {\n\t\tex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\t\tmono_loader_clear_error ();\n\t}\n\tmono_raise_exception (ex);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_ConstructorInfo;\n\tMonoClass *startklass, *klass, *refklass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoObject *member;\n\tint i, match;\n\tgpointer iter = NULL;\n\tMonoPtrArray tmp_array;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, mono_defaults.method_info_class, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\trefklass = mono_class_from_mono_type (reftype->type);\n\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\tif (!System_Reflection_ConstructorInfo)\n\t\tSystem_Reflection_ConstructorInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"ConstructorInfo\");\n\n\titer = NULL;\n\twhile ((method = mono_class_get_methods (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif (strcmp (method->name, \".ctor\") && strcmp (method->name, \".cctor\"))\n\t\t\tcontinue;\n\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_method_get_object (domain, method, refklass);\n\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, System_Reflection_ConstructorInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static guint\nproperty_hash (gconstpointer data)\n{\n\tMonoProperty *prop = (MonoProperty*)data;\n\n\treturn g_str_hash (prop->name);\n}",
"target": 0
},
{
"function": "static gboolean\nproperty_equal (MonoProperty *prop1, MonoProperty *prop2)\n{\n\t// Properties are hide-by-name-and-signature\n\tif (!g_str_equal (prop1->name, prop2->name))\n\t\treturn FALSE;\n\n\tif (prop1->get && prop2->get && !mono_metadata_signature_equal (mono_method_signature (prop1->get), mono_method_signature (prop2->get)))\n\t\treturn FALSE;\n\tif (prop1->set && prop2->set && !mono_metadata_signature_equal (mono_method_signature (prop1->set), mono_method_signature (prop2->set)))\n\t\treturn FALSE;\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static gboolean\nproperty_accessor_nonpublic (MonoMethod* accessor, gboolean start_klass)\n{\n\tif (!accessor)\n\t\treturn FALSE;\n\n\treturn method_nonpublic (accessor, start_klass);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_PropertyInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoProperty *prop;\n\tint i, match;\n\tguint32 flags;\n\tgchar *propname = NULL;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tgpointer iter;\n\tGHashTable *properties;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/\n\n\tif (!System_Reflection_PropertyInfo)\n\t\tSystem_Reflection_PropertyInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"PropertyInfo\");\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_PropertyInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tif (name != NULL) {\n\t\tpropname = mono_string_to_utf8 (name);\n\t\tcompare_func = (ignore_case) ? mono_utf8_strcasecmp : strcmp;\n\t}\n\n\tmono_class_setup_vtable (klass);\n\n\tproperties = g_hash_table_new (property_hash, (GEqualFunc)property_equal);\nhandle_parent:\n\tmono_class_setup_vtable (klass);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE) {\n\t\tg_hash_table_destroy (properties);\n\t\tif (name != NULL)\n\t\t\tg_free (propname);\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\t}\n\n\titer = NULL;\n\twhile ((prop = mono_class_get_properties (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = prop->get;\n\t\tif (!method)\n\t\t\tmethod = prop->set;\n\t\tif (method)\n\t\t\tflags = method->flags;\n\t\telse\n\t\t\tflags = 0;\n\t\tif ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||\n\t\t\t(prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else if (bflags & BFLAGS_NonPublic) {\n\t\t\tif (property_accessor_nonpublic(prop->get, startklass == klass) ||\n\t\t\t\tproperty_accessor_nonpublic(prop->set, startklass == klass)) {\n\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch++;\n\t\t}\n\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\n\t\tif (name != NULL) {\n\t\t\tif (compare_func (propname, prop->name))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (g_hash_table_lookup (properties, prop))\n\t\t\tcontinue;\n\n\t\tmono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));\n\t\t\n\t\tg_hash_table_insert (properties, prop, prop);\n\t}\n\tif ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))\n\t\tgoto handle_parent;\n\n\tg_hash_table_destroy (properties);\n\tg_free (propname);\n\n\tres = mono_array_new_cached (domain, System_Reflection_PropertyInfo, mono_ptr_array_size (tmp_array));\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionEvent *\nves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain;\n\tMonoClass *klass, *startklass;\n\tgpointer iter;\n\tMonoEvent *event;\n\tMonoMethod *method;\n\tgchar *event_name;\n\tint (*compare_func) (const char *s1, const char *s2) = NULL;\n\tMONO_ARCH_SAVE_REGS;\n\n\tevent_name = mono_string_to_utf8 (name);\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\tdomain = mono_object_domain (type);\n\n\tcompare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp;\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tif (compare_func (event->name, event_name))\n\t\t\tcontinue;\n\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Public))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\t\tcontinue;\n\t\t\t\tif ((klass != startklass) && (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PRIVATE)\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (!(bflags & BFLAGS_Static))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (!(bflags & BFLAGS_FlattenHierarchy) && (klass != startklass))\n\t\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (!(bflags & BFLAGS_Instance))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else \n\t\t\tif (!(bflags & BFLAGS_NonPublic))\n\t\t\t\tcontinue;\n\t\t\n\t\tg_free (event_name);\n\t\treturn mono_event_get_object (domain, startklass, event);\n\t}\n\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tg_free (event_name);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)\n{\n\tMonoDomain *domain; \n\tstatic MonoClass *System_Reflection_EventInfo;\n\tMonoClass *startklass, *klass;\n\tMonoArray *res;\n\tMonoMethod *method;\n\tMonoEvent *event;\n\tint i, match;\n\tgpointer iter;\n\t\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_ptr_array_init (tmp_array, 4);\n\n\tif (!System_Reflection_EventInfo)\n\t\tSystem_Reflection_EventInfo = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"EventInfo\");\n\n\tdomain = mono_object_domain (type);\n\tif (type->type->byref)\n\t\treturn mono_array_new_cached (domain, System_Reflection_EventInfo, 0);\n\tklass = startklass = mono_class_from_mono_type (type->type);\n\nhandle_parent:\t\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\titer = NULL;\n\twhile ((event = mono_class_get_events (klass, &iter))) {\n\t\tmatch = 0;\n\t\tmethod = event->add;\n\t\tif (!method)\n\t\t\tmethod = event->remove;\n\t\tif (!method)\n\t\t\tmethod = event->raise;\n\t\tif (method) {\n\t\t\tif ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {\n\t\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\t\tmatch++;\n\t\t\t} else if ((klass == startklass) || (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) {\n\t\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmatch = 0;\n\t\tif (method) {\n\t\t\tif (method->flags & METHOD_ATTRIBUTE_STATIC) {\n\t\t\t\tif (bflags & BFLAGS_Static)\n\t\t\t\t\tif ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))\n\t\t\t\t\t\tmatch++;\n\t\t\t} else {\n\t\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\t\tmatch++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tif (bflags & BFLAGS_Instance)\n\t\t\t\tmatch ++;\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\n\tres = mono_array_new_cached (domain, System_Reflection_EventInfo, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType *\nves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoClass *nested;\n\tchar *str;\n\tgpointer iter;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (name == NULL)\n\t\tmono_raise_exception (mono_get_exception_argument_null (\"name\"));\n\t\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn NULL;\n\tklass = mono_class_from_mono_type (type->type);\n\tstr = mono_string_to_utf8 (name);\n\n handle_parent:\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially a\n\t * nested type of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tint match = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tif (strcmp (nested->name, str) == 0){\n\t\t\tg_free (str);\n\t\t\treturn mono_type_get_object (domain, &nested->byval_arg);\n\t\t}\n\t}\n\tif (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))\n\t\tgoto handle_parent;\n\tg_free (str);\n\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)\n{\n\tMonoDomain *domain; \n\tMonoClass *klass;\n\tMonoArray *res;\n\tMonoObject *member;\n\tint i, match;\n\tMonoClass *nested;\n\tgpointer iter;\n\tMonoPtrArray tmp_array;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = ((MonoObject *)type)->vtable->domain;\n\tif (type->type->byref)\n\t\treturn mono_array_new (domain, mono_defaults.monotype_class, 0);\n\tklass = mono_class_from_mono_type (type->type);\n\tif (klass->exception_type != MONO_EXCEPTION_NONE)\n\t\tmono_raise_exception (mono_class_get_exception_for_failure (klass));\n\n\t/*\n\t * If a nested type is generic, return its generic type definition.\n\t * Note that this means that the return value is essentially the set\n\t * of nested types of the generic type definition of @klass.\n\t *\n\t * A note in MSDN claims that a generic type definition can have\n\t * nested types that aren't generic. In any case, the container of that\n\t * nested type would be the generic type definition.\n\t */\n\tif (klass->generic_class)\n\t\tklass = klass->generic_class->container_class;\n\n\tmono_ptr_array_init (tmp_array, 1);\n\titer = NULL;\n\twhile ((nested = mono_class_get_nested_types (klass, &iter))) {\n\t\tmatch = 0;\n\t\tif ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {\n\t\t\tif (bflags & BFLAGS_Public)\n\t\t\t\tmatch++;\n\t\t} else {\n\t\t\tif (bflags & BFLAGS_NonPublic)\n\t\t\t\tmatch++;\n\t\t}\n\t\tif (!match)\n\t\t\tcontinue;\n\t\tmember = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);\n\t\tmono_ptr_array_append (tmp_array, member);\n\t}\n\n\tres = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array));\n\n\tfor (i = 0; i < mono_ptr_array_size (tmp_array); ++i)\n\t\tmono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));\n\n\tmono_ptr_array_destroy (tmp_array);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)\n{\n\tgchar *str;\n\tMonoType *type = NULL;\n\tMonoTypeNameParse info;\n\tgboolean type_resolve;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* On MS.NET, this does not fire a TypeResolve event */\n\ttype_resolve = TRUE;\n\tstr = mono_string_to_utf8 (name);\n\t/*g_print (\"requested type %s in %s\\n\", str, assembly->assembly->aname.name);*/\n\tif (!mono_reflection_parse_type (str, &info)) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) /* uhm: this is a parse error, though... */\n\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t/*g_print (\"failed parse\\n\");*/\n\t\treturn NULL;\n\t}\n\n\tif (info.assembly.name) {\n\t\tg_free (str);\n\t\tmono_reflection_free_type_info (&info);\n\t\tif (throwOnError) {\n\t\t\t/* 1.0 and 2.0 throw different exceptions */\n\t\t\tif (mono_defaults.generic_ilist_class)\n\t\t\t\tmono_raise_exception (mono_get_exception_argument (NULL, \"Type names passed to Assembly.GetType() must not specify an assembly.\"));\n\t\t\telse\n\t\t\t\tmono_raise_exception (mono_get_exception_type_load (name, NULL));\n\t\t}\n\t\treturn NULL;\n\t}\n\n\tif (module != NULL) {\n\t\tif (module->image)\n\t\t\ttype = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);\n\t\telse\n\t\t\ttype = NULL;\n\t}\n\telse\n\t\tif (assembly->assembly->dynamic) {\n\t\t\t/* Enumerate all modules */\n\t\t\tMonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;\n\t\t\tint i;\n\n\t\t\ttype = NULL;\n\t\t\tif (abuilder->modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->modules); ++i) {\n\t\t\t\t\tMonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!type && abuilder->loaded_modules) {\n\t\t\t\tfor (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {\n\t\t\t\t\tMonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);\n\t\t\t\t\ttype = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);\n\t\t\t\t\tif (type)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\ttype = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);\n\tg_free (str);\n\tmono_reflection_free_type_info (&info);\n\tif (!type) {\n\t\tMonoException *e = NULL;\n\t\t\n\t\tif (throwOnError)\n\t\t\te = mono_get_exception_type_load (name, NULL);\n\n\t\tif (mono_loader_get_last_error () && mono_defaults.generic_ilist_class)\n\t\t\te = mono_loader_error_prepare_exception (mono_loader_get_last_error ());\n\n\t\tmono_loader_clear_error ();\n\n\t\tif (e != NULL)\n\t\t\tmono_raise_exception (e);\n\n\t\treturn NULL;\n\t}\n\n\tif (type->type == MONO_TYPE_CLASS) {\n\t\tMonoClass *klass = mono_type_get_class (type);\n\n\t\tif (mono_is_security_manager_active () && !klass->exception_type)\n\t\t\t/* Some security problems are detected during generic vtable construction */\n\t\t\tmono_class_setup_vtable (klass);\n\t\t/* need to report exceptions ? */\n\t\tif (throwOnError && klass->exception_type) {\n\t\t\t/* report SecurityException (or others) that occured when loading the assembly */\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (klass);\n\t\t\tmono_loader_clear_error ();\n\t\t\tmono_raise_exception (exc);\n\t\t} else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\t/* g_print (\"got it\\n\"); */\n\treturn mono_type_get_object (mono_object_domain (assembly), type);\n}",
"target": 0
},
{
"function": "static gboolean\nreplace_shadow_path (MonoDomain *domain, gchar *dirname, gchar **filename)\n{\n\tgchar *content;\n\tgchar *shadow_ini_file;\n\tgsize len;\n\n\t/* Check for shadow-copied assembly */\n\tif (mono_is_shadow_copy_enabled (domain, dirname)) {\n\t\tshadow_ini_file = g_build_filename (dirname, \"__AssemblyInfo__.ini\", NULL);\n\t\tcontent = NULL;\n\t\tif (!g_file_get_contents (shadow_ini_file, &content, &len, NULL) ||\n\t\t\t!g_file_test (content, G_FILE_TEST_IS_REGULAR)) {\n\t\t\tif (content) {\n\t\t\t\tg_free (content);\n\t\t\t\tcontent = NULL;\n\t\t\t}\n\t\t}\n\t\tg_free (shadow_ini_file);\n\t\tif (content != NULL) {\n\t\t\tif (*filename)\n\t\t\t\tg_free (*filename);\n\t\t\t*filename = content;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\treturn FALSE;\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res = NULL;\n\tgchar *uri;\n\tgchar *absolute;\n\tgchar *dirname;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tabsolute = g_strdup (mass->image->name);\n\t\tdirname = g_path_get_dirname (absolute);\n\t} else {\n\t\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\t\tdirname = g_strdup (mass->basedir);\n\t}\n\n\treplace_shadow_path (domain, dirname, &absolute);\n\tg_free (dirname);\n#if PLATFORM_WIN32\n\t{\n\t\tgint i;\n\t\tfor (i = strlen (absolute) - 1; i >= 0; i--)\n\t\t\tif (absolute [i] == '\\\\')\n\t\t\t\tabsolute [i] = '/';\n\t}\n#endif\n\tif (escaped) {\n\t\turi = g_filename_to_uri (absolute, NULL, NULL);\n\t} else {\n\t\tconst char *prepend = \"file://\";\n#if PLATFORM_WIN32\n\t\tif (*absolute == '/' && *(absolute + 1) == '/') {\n\t\t\tprepend = \"file:\";\n\t\t} else {\n\t\t\tprepend = \"file:///\";\n\t\t}\n#endif\n\t\turi = g_strconcat (prepend, absolute, NULL);\n\t}\n\n\tif (uri) {\n\t\tres = mono_string_new (domain, uri);\n\t\tg_free (uri);\n\t}\n\tg_free (absolute);\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)\n{\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mass->in_gac;\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)\n{\n\tgchar *name;\n\tMonoAssembly *res;\n\tMonoImageOpenStatus status;\n\t\n\tMONO_ARCH_SAVE_REGS;\n\n\tname = mono_string_to_utf8 (mname);\n\tres = mono_assembly_load_with_partial_name (name, &status);\n\n\tg_free (name);\n\n\tif (res == NULL)\n\t\treturn NULL;\n\treturn mono_assembly_get_object (mono_domain_get (), res);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoString *res;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tres = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)\n{\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn assembly->assembly->ref_only;\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_string_new (domain, assembly->assembly->image->version);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) \n{\n\tguint32 token = mono_image_get_entry_point (assembly->assembly->image);\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!token)\n\t\treturn NULL;\n\treturn mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionModule*\nves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly) \n{\n\treturn mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tMonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);\n\tint i;\n\tconst char *val;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));\n\t\tmono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoObject*\ncreate_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)\n{\n\tstatic MonoClass *System_Version = NULL;\n\tstatic MonoMethod *create_version = NULL;\n\tMonoObject *result;\n\tgpointer args [4];\n\t\n\tif (!System_Version) {\n\t\tSystem_Version = mono_class_from_name (mono_defaults.corlib, \"System\", \"Version\");\n\t\tg_assert (System_Version);\n\t}\n\n\tif (!create_version) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\":.ctor(int,int,int,int)\", FALSE);\n\t\tcreate_version = mono_method_desc_search_in_class (desc, System_Version);\n\t\tg_assert (create_version);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\targs [0] = &major;\n\targs [1] = &minor;\n\targs [2] = &build;\n\targs [3] = &revision;\n\tresult = mono_object_new (domain, System_Version);\n\tmono_runtime_invoke (create_version, result, args, NULL);\n\n\treturn result;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly) \n{\n\tstatic MonoClass *System_Reflection_AssemblyName;\n\tMonoArray *result;\n\tMonoDomain *domain = mono_object_domain (assembly);\n\tint i, count = 0;\n\tstatic MonoMethod *create_culture = NULL;\n\tMonoImage *image = assembly->assembly->image;\n\tMonoTableInfo *t;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!System_Reflection_AssemblyName)\n\t\tSystem_Reflection_AssemblyName = mono_class_from_name (\n\t\t\tmono_defaults.corlib, \"System.Reflection\", \"AssemblyName\");\n\n\tt = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];\n\tcount = t->rows;\n\n\tresult = mono_array_new (domain, System_Reflection_AssemblyName, count);\n\n\tif (count > 0 && !create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\n\t\t\t\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tfor (i = 0; i < count; i++) {\n\t\tMonoReflectionAssemblyName *aname;\n\t\tguint32 cols [MONO_ASSEMBLYREF_SIZE];\n\n\t\tmono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);\n\n\t\taname = (MonoReflectionAssemblyName *) mono_object_new (\n\t\t\tdomain, System_Reflection_AssemblyName);\n\n\t\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));\n\n\t\taname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];\n\t\taname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];\n\t\taname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];\n\t\taname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];\n\t\taname->flags = cols [MONO_ASSEMBLYREF_FLAGS];\n\t\taname->versioncompat = 1; /* SameMachine (default) */\n\t\taname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));\n\n\t\tif (create_culture) {\n\t\t\tgpointer args [2];\n\t\t\tMonoBoolean assembly_ref = 1;\n\t\t\targs [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));\n\t\t\targs [1] = &assembly_ref;\n\t\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t\t}\n\t\t\n\t\tif (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {\n\t\t\tconst gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);\n\t\t\tguint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\t\tif ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {\n\t\t\t\t/* public key token isn't copied - the class library will \n\t\t \t\tautomatically generate it from the public key if required */\n\t\t\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t} else {\n\t\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\t\t\tmemcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);\n\t\t\t}\n\t\t} else {\n\t\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\t}\n\t\t\n\t\t/* note: this function doesn't return the codebase on purpose (i.e. it can\n\t\t be used under partial trust as path information isn't present). */\n\n\t\tmono_array_setref (result, i, aname);\n\t}\n\treturn result;\n}",
"target": 0
},
{
"function": "static void\nforeach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)\n{\n\tMonoString *name = mono_string_new (mono_object_domain (info->res), key);\n\n\tmono_array_setref (info->res, info->idx, name);\n\tinfo->idx++;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly) \n{\n\tMonoImage *img = assembly->assembly->image;\n\tMonoArray *res;\n\tNameSpaceInfo info;\n\tint len;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_image_lock (img);\n\tmono_image_init_name_cache (img);\n\nRETRY_LEN:\n\tlen = g_hash_table_size (img->name_cache);\n\tmono_image_unlock (img);\n\n\t/*we can't create objects holding the image lock */\n\tres = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, len);\n\n\tmono_image_lock (img);\n\t/*len might have changed, create a new array*/\n\tif (len != g_hash_table_size (img->name_cache))\n\t\tgoto RETRY_LEN;\n\n\tinfo.res = res;\n\tinfo.idx = 0;\n\tg_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);\n\tmono_image_unlock (img);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static char *\ng_concat_dir_and_file (const char *dir, const char *file)\n{\n\tg_return_val_if_fail (dir != NULL, NULL);\n\tg_return_val_if_fail (file != NULL, NULL);\n\n /*\n\t * If the directory name doesn't have a / on the end, we need\n\t * to add one so we get a proper path to the file\n\t */\n\tif (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)\n\t\treturn g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);\n\telse\n\t\treturn g_strconcat (dir, file, NULL);\n}",
"target": 0
},
{
"function": "static void *\nves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module) \n{\n\tchar *n = mono_string_to_utf8 (name);\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tguint32 i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 impl, file_idx;\n\tconst char *val;\n\tMonoImage *module;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn NULL;\n\t/* FIXME */\n\timpl = cols [MONO_MANIFEST_IMPLEMENTATION];\n\tif (impl) {\n\t\t/*\n\t\t * this code should only be called after obtaining the \n\t\t * ResourceInfo and handling the other cases.\n\t\t */\n\t\tg_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);\n\t\tfile_idx = impl >> MONO_IMPLEMENTATION_BITS;\n\n\t\tmodule = mono_image_load_file_for_image (assembly->assembly->image, file_idx);\n\t\tif (!module)\n\t\t\treturn NULL;\n\t}\n\telse\n\t\tmodule = assembly->assembly->image;\n\n\tmono_gc_wbarrier_generic_store (ref_module, (MonoObject*) mono_module_get_object (mono_domain_get (), module));\n\n\treturn (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)\n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];\n\tint i;\n\tguint32 cols [MONO_MANIFEST_SIZE];\n\tguint32 file_cols [MONO_FILE_SIZE];\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tn = mono_string_to_utf8 (name);\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);\n\t\tval = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);\n\t\tif (strcmp (val, n) == 0)\n\t\t\tbreak;\n\t}\n\tg_free (n);\n\tif (i == table->rows)\n\t\treturn FALSE;\n\n\tif (!cols [MONO_MANIFEST_IMPLEMENTATION]) {\n\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;\n\t}\n\telse {\n\t\tswitch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {\n\t\tcase MONO_IMPLEMENTATION_FILE:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\ttable = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\t\t\tmono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);\n\t\t\tMONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));\n\t\t\tif (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\t\tinfo->location = 0;\n\t\t\telse\n\t\t\t\tinfo->location = RESOURCE_LOCATION_EMBEDDED;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_ASSEMBLYREF:\n\t\t\ti = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;\n\t\t\tmono_assembly_load_reference (assembly->assembly->image, i - 1);\n\t\t\tif (assembly->assembly->image->references [i - 1] == (gpointer)-1) {\n\t\t\t\tchar *msg = g_strdup_printf (\"Assembly %d referenced from assembly %s not found \", i - 1, assembly->assembly->image->name);\n\t\t\t\tMonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);\n\t\t\t\tg_free (msg);\n\t\t\t\tmono_raise_exception (ex);\n\t\t\t}\n\t\t\tMONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));\n\n\t\t\t/* Obtain info recursively */\n\t\t\tves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);\n\t\t\tinfo->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;\n\t\t\tbreak;\n\n\t\tcase MONO_IMPLEMENTATION_EXP_TYPE:\n\t\t\tg_assert_not_reached ();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoObject*\nves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) \n{\n\tMonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];\n\tMonoArray *result = NULL;\n\tint i, count;\n\tconst char *val;\n\tchar *n;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\t/* check hash if needed */\n\tif (name) {\n\t\tn = mono_string_to_utf8 (name);\n\t\tfor (i = 0; i < table->rows; ++i) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tif (strcmp (val, n) == 0) {\n\t\t\t\tMonoString *fn;\n\t\t\t\tg_free (n);\n\t\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\t\tfn = mono_string_new (mono_object_domain (assembly), n);\n\t\t\t\tg_free (n);\n\t\t\t\treturn (MonoObject*)fn;\n\t\t\t}\n\t\t}\n\t\tg_free (n);\n\t\treturn NULL;\n\t}\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))\n\t\t\tcount ++;\n\t}\n\n\tresult = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);\n\n\tcount = 0;\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tval = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));\n\t\t\tn = g_concat_dir_and_file (assembly->assembly->basedir, val);\n\t\t\tmono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));\n\t\t\tg_free (n);\n\t\t\tcount ++;\n\t\t}\n\t}\n\treturn (MonoObject*)result;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_domain_get();\n\tMonoArray *res;\n\tMonoClass *klass;\n\tint i, j, file_count = 0;\n\tMonoImage **modules;\n\tguint32 module_count, real_module_count;\n\tMonoTableInfo *table;\n\tguint32 cols [MONO_FILE_SIZE];\n\tMonoImage *image = assembly->assembly->image;\n\n\tg_assert (image != NULL);\n\tg_assert (!assembly->assembly->dynamic);\n\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tfile_count = table->rows;\n\n\tmodules = image->modules;\n\tmodule_count = image->module_count;\n\n\treal_module_count = 0;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i])\n\t\t\treal_module_count ++;\n\n\tklass = mono_class_from_name (mono_defaults.corlib, \"System.Reflection\", \"Module\");\n\tres = mono_array_new (domain, klass, 1 + real_module_count + file_count);\n\n\tmono_array_setref (res, 0, mono_module_get_object (domain, image));\n\tj = 1;\n\tfor (i = 0; i < module_count; ++i)\n\t\tif (modules [i]) {\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, modules[i]));\n\t\t\t++j;\n\t\t}\n\n\tfor (i = 0; i < file_count; ++i, ++j) {\n\t\tmono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);\n\t\tif (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)\n\t\t\tmono_array_setref (res, j, mono_module_file_get_object (domain, image, i));\n\t\telse {\n\t\t\tMonoImage *m = mono_image_load_file_for_image (image, i + 1);\n\t\t\tif (!m) {\n\t\t\t\tMonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME]));\n\t\t\t\tmono_raise_exception (mono_get_exception_file_not_found2 (NULL, fname));\n\t\t\t}\n\t\t\tmono_array_setref (res, j, mono_module_get_object (domain, m));\n\t\t}\n\t}\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_GetCurrentMethod (void) \n{\n\tMonoMethod *m = mono_method_get_last_managed ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\treturn mono_method_get_object (mono_domain_get (), m, NULL);\n}",
"target": 0
},
{
"function": "static MonoMethod*\nmono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)\n{\n\tint offset = -1, i;\n\tif (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {\n\t\tMonoMethodInflated *inflated = (MonoMethodInflated*)method;\n\t\t//method is inflated, we should inflate it on the other class\n\t\tMonoGenericContext ctx;\n\t\tctx.method_inst = inflated->context.method_inst;\n\t\tctx.class_inst = inflated->context.class_inst;\n\t\tif (klass->generic_class)\n\t\t\tctx.class_inst = klass->generic_class->context.class_inst;\n\t\telse if (klass->generic_container)\n\t\t\tctx.class_inst = klass->generic_container->context.class_inst;\n\t\treturn mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx);\n\t}\n\n\tmono_class_setup_methods (method->klass);\n\tif (method->klass->exception_type)\n\t\treturn NULL;\n\tfor (i = 0; i < method->klass->method.count; ++i) {\n\t\tif (method->klass->methods [i] == method) {\n\t\t\toffset = i;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\tmono_class_setup_methods (klass);\n\tif (klass->exception_type)\n\t\treturn NULL;\n\tg_assert (offset >= 0 && offset < klass->method.count);\n\treturn klass->methods [offset];\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMethod *method, MonoType *type)\n{\n\tMonoClass *klass;\n\tif (type) {\n\t\tklass = mono_class_from_mono_type (type);\n\t\tif (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass)) \n\t\t\treturn NULL;\n\t\tif (method->klass != klass) {\n\t\t\tmethod = mono_method_get_equivalent_method (method, klass);\n\t\t\tif (!method)\n\t\t\t\treturn NULL;\n\t\t}\n\t} else\n\t\tklass = method->klass;\n\treturn mono_method_get_object (mono_domain_get (), method, klass);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethod*\nves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)\n{\n\treturn mono_method_get_object (mono_domain_get (), method, NULL);\n}",
"target": 0
},
{
"function": "static MonoReflectionMethodBody*\nves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)\n{\n\treturn mono_method_body_get_object (mono_domain_get (), method);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)\n{\n\tMonoMethod *dest = NULL;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tmono_stack_walk_no_il (get_executing, &dest);\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetEntryAssembly (void)\n{\n\tMonoDomain* domain = mono_domain_get ();\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!domain->entry_assembly)\n\t\treturn NULL;\n\n\treturn mono_assembly_get_object (domain, domain->entry_assembly);\n}",
"target": 0
},
{
"function": "static MonoReflectionAssembly*\nves_icall_System_Reflection_Assembly_GetCallingAssembly (void)\n{\n\tMonoMethod *m;\n\tMonoMethod *dest;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdest = NULL;\n\tmono_stack_walk_no_il (get_executing, &dest);\n\tm = dest;\n\tmono_stack_walk_no_il (get_caller, &dest);\n\tif (!dest)\n\t\tdest = m;\n\treturn mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,\n\t\t\t\t gboolean assembly_qualified)\n{\n\tMonoDomain *domain = mono_object_domain (object); \n\tMonoTypeNameFormat format;\n\tMonoString *res;\n\tgchar *name;\n\n\tMONO_ARCH_SAVE_REGS;\n\tif (full_name)\n\t\tformat = assembly_qualified ?\n\t\t\tMONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :\n\t\t\tMONO_TYPE_NAME_FORMAT_FULL_NAME;\n\telse\n\t\tformat = MONO_TYPE_NAME_FORMAT_REFLECTION;\n \n\tname = mono_type_get_name_full (object->type, format);\n\tif (!name)\n\t\treturn NULL;\n\n\tif (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR)) {\n\t\tg_free (name);\n\t\treturn NULL;\n\t}\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static void\nfill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)\n{\n\tstatic MonoMethod *create_culture = NULL;\n\tgpointer args [2];\n\tguint32 pkey_len;\n\tconst char *pkey_ptr;\n\tgchar *codebase;\n\tMonoBoolean assembly_ref = 0;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tMONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));\n\taname->major = name->major;\n\taname->minor = name->minor;\n\taname->build = name->build;\n\taname->flags = name->flags;\n\taname->revision = name->revision;\n\taname->hashalg = name->hash_alg;\n\taname->versioncompat = 1; /* SameMachine (default) */\n\n\tif (by_default_version)\n\t\tMONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));\n\n\tcodebase = NULL;\n\tif (absolute != NULL && *absolute != '\\0') {\n\t\tconst gchar *prepend = \"file://\";\n\t\tgchar *result;\n\n\t\tcodebase = g_strdup (absolute);\n\n#if PLATFORM_WIN32\n\t\t{\n\t\t\tgint i;\n\t\t\tfor (i = strlen (codebase) - 1; i >= 0; i--)\n\t\t\t\tif (codebase [i] == '\\\\')\n\t\t\t\t\tcodebase [i] = '/';\n\n\t\t\tif (*codebase == '/' && *(codebase + 1) == '/') {\n\t\t\t\tprepend = \"file:\";\n\t\t\t} else {\n\t\t\t\tprepend = \"file:///\";\n\t\t\t}\n\t\t}\n#endif\n\t\tresult = g_strconcat (prepend, codebase, NULL);\n\t\tg_free (codebase);\n\t\tcodebase = result;\n\t}\n\n\tif (codebase) {\n\t\tMONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));\n\t\tg_free (codebase);\n\t}\n\n\tif (!create_culture) {\n\t\tMonoMethodDesc *desc = mono_method_desc_new (\"System.Globalization.CultureInfo:CreateCulture(string,bool)\", TRUE);\n\t\tcreate_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);\n\t\tg_assert (create_culture);\n\t\tmono_method_desc_free (desc);\n\t}\n\n\tif (name->culture) {\n\t\targs [0] = mono_string_new (domain, name->culture);\n\t\targs [1] = &assembly_ref;\n\t\tMONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));\n\t}\n\n\tif (name->public_key) {\n\t\tpkey_ptr = (char*)name->public_key;\n\t\tpkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);\n\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));\n\t\tmemcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t} else if (default_publickey) {\n\t\tMONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t\taname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;\n\t}\n\n\t/* MonoAssemblyName keeps the public key token as an hexadecimal string */\n\tif (name->public_key_token [0]) {\n\t\tint i, j;\n\t\tchar *p;\n\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));\n\t\tp = mono_array_addr (aname->keyToken, char, 0);\n\n\t\tfor (i = 0, j = 0; i < 8; i++) {\n\t\t\t*p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;\n\t\t\t*p |= g_ascii_xdigit_value (name->public_key_token [j++]);\n\t\t\tp++;\n\t\t}\n\t} else if (default_token) {\n\t\tMONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));\n\t}\n}",
"target": 0
},
{
"function": "static MonoString *\nves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)\n{\n\tMonoDomain *domain = mono_object_domain (assembly); \n\tMonoAssembly *mass = assembly->assembly;\n\tMonoString *res;\n\tgchar *name;\n\n\tname = g_strdup_printf (\n\t\t\"%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s\",\n\t\tmass->aname.name,\n\t\tmass->aname.major, mass->aname.minor, mass->aname.build, mass->aname.revision,\n\t\tmass->aname.culture && *mass->aname.culture? mass->aname.culture: \"neutral\",\n\t\tmass->aname.public_key_token [0] ? (char *)mass->aname.public_key_token : \"null\",\n\t\t(mass->aname.flags & ASSEMBLYREF_RETARGETABLE_FLAG) ? \", Retargetable=Yes\" : \"\");\n\n\tres = mono_string_new (domain, name);\n\tg_free (name);\n\n\treturn res;\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)\n{\n\tgchar *absolute;\n\tMonoAssembly *mass = assembly->assembly;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (g_path_is_absolute (mass->image->name)) {\n\t\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\t\taname, &mass->aname, mass->image->name, TRUE,\n\t\t\tTRUE, mono_framework_version () >= 2);\n\t\treturn;\n\t}\n\tabsolute = g_build_filename (mass->basedir, mass->image->name, NULL);\n\n\tfill_reflection_assembly_name (mono_object_domain (assembly),\n\t\taname, &mass->aname, absolute, TRUE, TRUE,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (absolute);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)\n{\n\tchar *filename;\n\tMonoImageOpenStatus status = MONO_IMAGE_OK;\n\tgboolean res;\n\tMonoImage *image;\n\tMonoAssemblyName name;\n\tchar *dirname\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tfilename = mono_string_to_utf8 (fname);\n\n\tdirname = g_path_get_dirname (filename);\n\treplace_shadow_path (mono_domain_get (), dirname, &filename);\n\tg_free (dirname);\n\n\timage = mono_image_open (filename, &status);\n\n\tif (!image){\n\t\tMonoException *exc;\n\n\t\tg_free (filename);\n\t\tif (status == MONO_IMAGE_IMAGE_INVALID)\n\t\t\texc = mono_get_exception_bad_image_format2 (NULL, fname);\n\t\telse\n\t\t\texc = mono_get_exception_file_not_found2 (NULL, fname);\n\t\tmono_raise_exception (exc);\n\t}\n\n\tres = mono_assembly_fill_assembly_name (image, &name);\n\tif (!res) {\n\t\tmono_image_close (image);\n\t\tg_free (filename);\n\t\tmono_raise_exception (mono_get_exception_argument (\"assemblyFile\", \"The file does not contain a manifest\"));\n\t}\n\n\tfill_reflection_assembly_name (mono_domain_get (), aname, &name, filename,\n\t\tTRUE, mono_framework_version () == 1,\n\t\tmono_framework_version () >= 2);\n\n\tg_free (filename);\n\tmono_image_close (image);\n}",
"target": 0
},
{
"function": "static MonoBoolean\nves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,\n\tchar **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)\n{\n\tMonoBoolean result = FALSE;\n\tMonoDeclSecurityEntry entry;\n\n\t/* SecurityAction.RequestMinimum */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {\n\t\t*minimum = entry.blob;\n\t\t*minLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestOptional */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {\n\t\t*optional = entry.blob;\n\t\t*optLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\t/* SecurityAction.RequestRefuse */\n\tif (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {\n\t\t*refused = entry.blob;\n\t\t*refLength = entry.size;\n\t\tresult = TRUE;\n\t}\n\n\treturn result;\t\n}",
"target": 0
},
{
"function": "static MonoArray*\nmono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly)\n{\n\tMonoArray *res;\n\tMonoClass *klass;\n\tMonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];\n\tint i, count;\n\tguint32 attrs, visibility;\n\n\t/* we start the count from 1 because we skip the special type <Module> */\n\tif (exportedOnly) {\n\t\tcount = 0;\n\t\tfor (i = 1; i < tdef->rows; ++i) {\n\t\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\t\tif (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)\n\t\t\t\tcount++;\n\t\t}\n\t} else {\n\t\tcount = tdef->rows - 1;\n\t}\n\tres = mono_array_new (domain, mono_defaults.monotype_class, count);\n\t*exceptions = mono_array_new (domain, mono_defaults.exception_class, count);\n\tcount = 0;\n\tfor (i = 1; i < tdef->rows; ++i) {\n\t\tattrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);\n\t\tvisibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;\n\t\tif (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {\n\t\t\tklass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);\n\t\t\tif (klass) {\n\t\t\t\tmono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));\n\t\t\t} else {\n\t\t\t\tMonoLoaderError *error;\n\t\t\t\tMonoException *ex;\n\t\t\t\t\n\t\t\t\terror = mono_loader_get_last_error ();\n\t\t\t\tg_assert (error != NULL);\n\t\n\t\t\t\tex = mono_loader_error_prepare_exception (error);\n\t\t\t\tmono_array_setref (*exceptions, count, ex);\n\t\t\t}\n\t\t\tif (mono_loader_get_last_error ())\n\t\t\t\tmono_loader_clear_error ();\n\t\t\tcount++;\n\t\t}\n\t}\n\t\n\treturn res;\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)\n{\n\tMonoArray *res = NULL;\n\tMonoArray *exceptions = NULL;\n\tMonoImage *image = NULL;\n\tMonoTableInfo *table = NULL;\n\tMonoDomain *domain;\n\tGList *list = NULL;\n\tint i, len, ex_count;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tdomain = mono_object_domain (assembly);\n\n\tg_assert (!assembly->assembly->dynamic);\n\timage = assembly->assembly->image;\n\ttable = &image->tables [MONO_TABLE_FILE];\n\tres = mono_module_get_types (domain, image, &exceptions, exportedOnly);\n\n\t/* Append data from all modules in the assembly */\n\tfor (i = 0; i < table->rows; ++i) {\n\t\tif (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {\n\t\t\tMonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);\n\t\t\tif (loaded_image) {\n\t\t\t\tMonoArray *ex2;\n\t\t\t\tMonoArray *res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly);\n\t\t\t\t/* Append the new types to the end of the array */\n\t\t\t\tif (mono_array_length (res2) > 0) {\n\t\t\t\t\tguint32 len1, len2;\n\t\t\t\t\tMonoArray *res3, *ex3;\n\n\t\t\t\t\tlen1 = mono_array_length (res);\n\t\t\t\t\tlen2 = mono_array_length (res2);\n\n\t\t\t\t\tres3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (res3, 0, res, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (res3, len1, res2, 0, len2);\n\t\t\t\t\tres = res3;\n\n\t\t\t\t\tex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);\n\t\t\t\t\tmono_array_memcpy_refs (ex3, len1, ex2, 0, len2);\n\t\t\t\t\texceptions = ex3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* the ReflectionTypeLoadException must have all the types (Types property), \n\t * NULL replacing types which throws an exception. The LoaderException must\n\t * contain all exceptions for NULL items.\n\t */\n\n\tlen = mono_array_length (res);\n\n\tex_count = 0;\n\tfor (i = 0; i < len; i++) {\n\t\tMonoReflectionType *t = mono_array_get (res, gpointer, i);\n\t\tMonoClass *klass;\n\n\t\tif (t) {\n\t\t\tklass = mono_type_get_class (t->type);\n\t\t\tif ((klass != NULL) && klass->exception_type) {\n\t\t\t\t/* keep the class in the list */\n\t\t\t\tlist = g_list_append (list, klass);\n\t\t\t\t/* and replace Type with NULL */\n\t\t\t\tmono_array_setref (res, i, NULL);\n\t\t\t}\n\t\t} else {\n\t\t\tex_count ++;\n\t\t}\n\t}\n\n\tif (list || ex_count) {\n\t\tGList *tmp = NULL;\n\t\tMonoException *exc = NULL;\n\t\tMonoArray *exl = NULL;\n\t\tint j, length = g_list_length (list) + ex_count;\n\n\t\tmono_loader_clear_error ();\n\n\t\texl = mono_array_new (domain, mono_defaults.exception_class, length);\n\t\t/* Types for which mono_class_get () succeeded */\n\t\tfor (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {\n\t\t\tMonoException *exc = mono_class_get_exception_for_failure (tmp->data);\n\t\t\tmono_array_setref (exl, i, exc);\n\t\t}\n\t\t/* Types for which it don't */\n\t\tfor (j = 0; j < mono_array_length (exceptions); ++j) {\n\t\t\tMonoException *exc = mono_array_get (exceptions, MonoException*, j);\n\t\t\tif (exc) {\n\t\t\t\tg_assert (i < length);\n\t\t\t\tmono_array_setref (exl, i, exc);\n\t\t\t\ti ++;\n\t\t\t}\n\t\t}\n\t\tg_list_free (list);\n\t\tlist = NULL;\n\n\t\texc = mono_get_exception_reflection_type_load (res, exl);\n\t\tmono_loader_clear_error ();\n\t\tmono_raise_exception (exc);\n\t}\n\t\t\n\treturn res;\n}",
"target": 0
},
{
"function": "static gboolean\nves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)\n{\n\tMonoAssemblyName aname;\n\tMonoDomain *domain = mono_object_domain (name);\n\tchar *val;\n\tgboolean is_version_defined;\n\tgboolean is_token_defined;\n\n\taname.public_key = NULL;\n\tval = mono_string_to_utf8 (assname);\n\tif (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined, &is_token_defined)) {\n\t\tg_free ((guint8*) aname.public_key);\n\t\tg_free (val);\n\t\treturn FALSE;\n\t}\n\t\n\tfill_reflection_assembly_name (domain, name, &aname, \"\", is_version_defined,\n\t\tFALSE, is_token_defined);\n\n\tmono_assembly_name_free (&aname);\n\tg_free ((guint8*) aname.public_key);\n\tg_free (val);\n\n\treturn TRUE;\n}",
"target": 0
},
{
"function": "static MonoReflectionType*\nves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\tMonoClass *klass;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\n\tif (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)\n\t\t/* These images do not have a global type */\n\t\treturn NULL;\n\n\tklass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);\n\treturn mono_type_get_object (domain, &klass->byval_arg);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)\n{\n\t/*if (module->image)\n\t\tmono_image_close (module->image);*/\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)\n{\n\tMonoDomain *domain = mono_object_domain (module); \n\n\tMONO_ARCH_SAVE_REGS;\n\n\tg_assert (module->image);\n\treturn mono_string_new (domain, module->image->guid);\n}",
"target": 0
},
{
"function": "static gpointer\nves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModule *module)\n{\n#ifdef PLATFORM_WIN32\n\tif (module->image && module->image->is_module_handle)\n\t\treturn module->image->raw_data;\n#endif\n\n\treturn (gpointer) (-1);\n}",
"target": 0
},
{
"function": "static void\nves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)\n{\n\tif (image->dynamic) {\n\t\tMonoDynamicImage *dyn = (MonoDynamicImage*)image;\n\t\t*pe_kind = dyn->pe_kind;\n\t\t*machine = dyn->machine;\n\t}\n\telse {\n\t\t*pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;\n\t\t*machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;\n\t}\n}",
"target": 0
},
{
"function": "static gint32\nves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)\n{\n\treturn (image->md_version_major << 16) | (image->md_version_minor);\n}",
"target": 0
},
{
"function": "static MonoArray*\nves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)\n{\n\tMonoArray *exceptions;\n\tint i;\n\n\tMONO_ARCH_SAVE_REGS;\n\n\tif (!module->image)\n\t\treturn mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);\n\telse {\n\t\tMonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE);\n\t\tfor (i = 0; i < mono_array_length (exceptions); ++i) {\n\t\t\tMonoException *ex = mono_array_get (exceptions, MonoException *, i);\n\t\t\tif (ex)\n\t\t\t\tmono_raise_exception (ex);\n\t\t}\n\t\treturn res;\n\t}\n}",
"target": 0
},
{
"function": "static gboolean\nmono_metadata_memberref_is_method (MonoImage *image, guint32 token)\n{\n\tguint32 cols [MONO_MEMBERREF_SIZE];\n\tconst char *sig;\n\tmono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);\n\tsig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);\n\tmono_metadata_decode_blob_size (sig, &sig);\n\treturn (*sig != 0x6);\n}",
"target": 0
},
{
"function": "static void\ninit_generic_context_from_args (MonoGenericContext *context, MonoArray *type_args, MonoArray *method_args)\n{\n\tif (type_args)\n\t\tcontext->class_inst = mono_metadata_get_generic_inst (mono_array_length (type_args),\n\t\t\t\t\t\t\t\t mono_array_addr (type_args, MonoType*, 0));\n\telse\n\t\tcontext->class_inst = NULL;\n\tif (method_args)\n\t\tcontext->method_inst = mono_metadata_get_generic_inst (mono_array_length (method_args),\n\t\t\t\t\t\t\t\t mono_array_addr (method_args, MonoType*, 0));\n\telse\n\t\tcontext->method_inst = NULL;\n}",
"target": 0
},
{
"function": "static MonoType*\nves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && \n\t\t(table != MONO_TABLE_TYPESPEC)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\tklass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t\tif (!klass)\n\t\t\treturn NULL;\n\t\treturn &klass->byval_arg;\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tklass = mono_class_get_full (image, token, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\tif (klass)\n\t\treturn &klass->byval_arg;\n\telse\n\t\treturn NULL;\n}",
"target": 0
},
{
"function": "static MonoMethod*\nves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoMethod *method;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && \n\t\t(table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tmethod = mono_get_method_full (image, token, NULL, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\n\treturn method;\n}",
"target": 0
},
{
"function": "static MonoString*\nves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)\n{\n\tint index = mono_metadata_token_index (token);\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic)\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\n\tif ((index <= 0) || (index >= image->heap_us.size)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\n\t/* FIXME: What to do if the index points into the middle of a string ? */\n\n\treturn mono_ldstr (mono_domain_get (), image, index);\n}",
"target": 0
},
{
"function": "static MonoClassField*\nves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tMonoClass *klass;\n\tint table = mono_metadata_token_table (token);\n\tint index = mono_metadata_token_index (token);\n\tMonoGenericContext context;\n\tMonoClassField *field;\n\n\t*error = ResolveTokenError_Other;\n\n\t/* Validate token */\n\tif ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tif (image->dynamic) {\n\t\tif (type_args || method_args)\n\t\t\tmono_raise_exception (mono_get_exception_not_implemented (NULL));\n\t\t/* FIXME: validate memberref token type */\n\t\treturn mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);\n\t}\n\n\tif ((index <= 0) || (index > image->tables [table].rows)) {\n\t\t*error = ResolveTokenError_OutOfRange;\n\t\treturn NULL;\n\t}\n\tif ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {\n\t\t*error = ResolveTokenError_BadTable;\n\t\treturn NULL;\n\t}\n\n\tinit_generic_context_from_args (&context, type_args, method_args);\n\tfield = mono_field_from_token (image, token, &klass, &context);\n\n\tif (mono_loader_get_last_error ())\n\t\tmono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));\n\t\n\treturn field;\n}",
"target": 0
},
{
"function": "static MonoObject*\nves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)\n{\n\tint table = mono_metadata_token_table (token);\n\n\t*error = ResolveTokenError_Other;\n\n\tswitch (table) {\n\tcase MONO_TABLE_TYPEDEF:\n\tcase MONO_TABLE_TYPEREF:\n\tcase MONO_TABLE_TYPESPEC: {\n\t\tMonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);\n\t\tif (t)\n\t\t\treturn (MonoObject*)mono_type_get_object (mono_domain_get (), t);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_METHOD:\n\tcase MONO_TABLE_METHODSPEC: {\n\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\tif (m)\n\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\telse\n\t\t\treturn NULL;\n\t}\t\t\n\tcase MONO_TABLE_FIELD: {\n\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\tif (f)\n\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\telse\n\t\t\treturn NULL;\n\t}\n\tcase MONO_TABLE_MEMBERREF:\n\t\tif (mono_metadata_memberref_is_method (image, token)) {\n\t\t\tMonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);\n\t\t\tif (m)\n\t\t\t\treturn (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse {\n\t\t\tMonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);\n\t\t\tif (f)\n\t\t\t\treturn (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);\n\t\t\telse\n\t\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\t*error = ResolveTokenError_BadTable;\n\t}\n\n\treturn NULL;\n}",
"target": 0
},
{
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment