[PD-cvs] externals/clr/PureData DynamicMethod.cs, NONE, 1.1 Atom.cs, 1.2, 1.3 PureData.cs, 1.7, 1.8 PureData.csproj, 1.1, 1.2
Thomas Grill
xovo at users.sourceforge.net
Tue Apr 18 03:38:10 CEST 2006
- Previous message: [PD-cvs] externals/clr/test test-help.pd, 1.2, 1.3 test.cs, 1.3, 1.4 test.csproj, 1.1, 1.2
- Next message: [PD-cvs] doc/tutorials/intro 08.bang.pd, 1.4, 1.5 12.right_to_left_order.pd, 1.2, 1.3 15.inlets_and_outlets.pd, 1.2, 1.3 17.atomic_messages.pd, 1.2, 1.3 18.selectors.pd, 1.2, 1.3 20.inlets_and_outlets.pd, 1.2, 1.3 28.gui_objects.pd, 1.2, 1.3 TODO, 1.6, 1.7
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/pure-data/externals/clr/PureData
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29449/clr/PureData
Modified Files:
Atom.cs PureData.cs PureData.csproj
Added Files:
DynamicMethod.cs
Log Message:
implemented class-based method management
very fast native-to-managed transition
most of the logic transferred to the CLR side
Index: PureData.csproj
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/PureData/PureData.csproj,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** PureData.csproj 7 Mar 2006 13:18:31 -0000 1.1
--- PureData.csproj 18 Apr 2006 01:38:07 -0000 1.2
***************
*** 1,105 ****
! <VisualStudioProject>
! <CSHARP
! ProjectType = "Local"
! ProductVersion = "7.10.3077"
! SchemaVersion = "2.0"
! ProjectGuid = "{0015D5E7-B0FB-4F06-B334-225447D1F992}"
! >
! <Build>
! <Settings
! ApplicationIcon = ""
! AssemblyKeyContainerName = ""
! AssemblyName = "PureData"
! AssemblyOriginatorKeyFile = ""
! DefaultClientScript = "JScript"
! DefaultHTMLPageLayout = "Grid"
! DefaultTargetSchema = "IE50"
! DelaySign = "false"
! OutputType = "Library"
! PreBuildEvent = ""
! PostBuildEvent = ""
! RootNamespace = "PureData"
! RunPostBuildEvent = "OnBuildSuccess"
! StartupObject = ""
! >
! <Config
! Name = "Debug"
! AllowUnsafeBlocks = "true"
! BaseAddress = "285212672"
! CheckForOverflowUnderflow = "false"
! ConfigurationOverrideFile = ""
! DefineConstants = "DEBUG;TRACE"
! DocumentationFile = ""
! DebugSymbols = "true"
! FileAlignment = "4096"
! IncrementalBuild = "false"
! NoStdLib = "false"
! NoWarn = ""
! Optimize = "false"
! OutputPath = "bin\Debug\"
! RegisterForComInterop = "false"
! RemoveIntegerChecks = "false"
! TreatWarningsAsErrors = "false"
! WarningLevel = "4"
! />
! <Config
! Name = "Release"
! AllowUnsafeBlocks = "true"
! BaseAddress = "285212672"
! CheckForOverflowUnderflow = "false"
! ConfigurationOverrideFile = ""
! DefineConstants = "TRACE"
! DocumentationFile = ""
! DebugSymbols = "false"
! FileAlignment = "4096"
! IncrementalBuild = "false"
! NoStdLib = "false"
! NoWarn = ""
! Optimize = "true"
! OutputPath = "bin\Release\"
! RegisterForComInterop = "false"
! RemoveIntegerChecks = "false"
! TreatWarningsAsErrors = "false"
! WarningLevel = "4"
! />
! </Settings>
! <References>
! <Reference
! Name = "System"
! AssemblyName = "System"
! HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
! />
! <Reference
! Name = "System.Data"
! AssemblyName = "System.Data"
! HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
! />
! <Reference
! Name = "System.XML"
! AssemblyName = "System.XML"
! HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
! />
! </References>
! </Build>
! <Files>
! <Include>
! <File
! RelPath = "AssemblyInfo.cs"
! SubType = "Code"
! BuildAction = "Compile"
! />
! <File
! RelPath = "Atom.cs"
! SubType = "Code"
! BuildAction = "Compile"
! />
! <File
! RelPath = "PureData.cs"
! SubType = "Code"
! BuildAction = "Compile"
! />
! </Include>
! </Files>
! </CSHARP>
! </VisualStudioProject>
!
--- 1,108 ----
! <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
! <PropertyGroup>
! <ProjectType>Local</ProjectType>
! <ProductVersion>8.0.50727</ProductVersion>
! <SchemaVersion>2.0</SchemaVersion>
! <ProjectGuid>{0015D5E7-B0FB-4F06-B334-225447D1F992}</ProjectGuid>
! <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
! <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
! <ApplicationIcon>
! </ApplicationIcon>
! <AssemblyKeyContainerName>
! </AssemblyKeyContainerName>
! <AssemblyName>PureData</AssemblyName>
! <AssemblyOriginatorKeyFile>
! </AssemblyOriginatorKeyFile>
! <DefaultClientScript>JScript</DefaultClientScript>
! <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
! <DefaultTargetSchema>IE50</DefaultTargetSchema>
! <DelaySign>false</DelaySign>
! <OutputType>Library</OutputType>
! <RootNamespace>PureData</RootNamespace>
! <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
! <StartupObject>
! </StartupObject>
! <FileUpgradeFlags>
! </FileUpgradeFlags>
! <UpgradeBackupLocation>
! </UpgradeBackupLocation>
! </PropertyGroup>
! <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
! <OutputPath>bin\Debug\</OutputPath>
! <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
! <BaseAddress>285212672</BaseAddress>
! <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
! <ConfigurationOverrideFile>
! </ConfigurationOverrideFile>
! <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
! <DocumentationFile>
! </DocumentationFile>
! <DebugSymbols>true</DebugSymbols>
! <FileAlignment>4096</FileAlignment>
! <NoStdLib>false</NoStdLib>
! <NoWarn>
! </NoWarn>
! <Optimize>false</Optimize>
! <RegisterForComInterop>false</RegisterForComInterop>
! <RemoveIntegerChecks>false</RemoveIntegerChecks>
! <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
! <WarningLevel>4</WarningLevel>
! <DebugType>full</DebugType>
! <ErrorReport>prompt</ErrorReport>
! </PropertyGroup>
! <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
! <OutputPath>bin\Debug\</OutputPath>
! <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
! <BaseAddress>285212672</BaseAddress>
! <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
! <ConfigurationOverrideFile>
! </ConfigurationOverrideFile>
! <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
! <DocumentationFile>
! </DocumentationFile>
! <DebugSymbols>false</DebugSymbols>
! <FileAlignment>4096</FileAlignment>
! <NoStdLib>false</NoStdLib>
! <NoWarn>
! </NoWarn>
! <Optimize>false</Optimize>
! <RegisterForComInterop>false</RegisterForComInterop>
! <RemoveIntegerChecks>false</RemoveIntegerChecks>
! <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
! <WarningLevel>4</WarningLevel>
! <DebugType>none</DebugType>
! <ErrorReport>prompt</ErrorReport>
! </PropertyGroup>
! <ItemGroup>
! <Reference Include="System">
! <Name>System</Name>
! </Reference>
! <Reference Include="System.Data">
! <Name>System.Data</Name>
! </Reference>
! <Reference Include="System.Xml">
! <Name>System.XML</Name>
! </Reference>
! </ItemGroup>
! <ItemGroup>
! <Compile Include="AssemblyInfo.cs">
! <SubType>Code</SubType>
! </Compile>
! <Compile Include="Atom.cs">
! <SubType>Code</SubType>
! </Compile>
! <Compile Include="DynamicMethod.cs">
! <SubType>Code</SubType>
! </Compile>
! <Compile Include="PureData.cs">
! <SubType>Code</SubType>
! </Compile>
! </ItemGroup>
! <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
! <PropertyGroup>
! <PreBuildEvent>
! </PreBuildEvent>
! <PostBuildEvent>
! </PostBuildEvent>
! </PropertyGroup>
! </Project>
\ No newline at end of file
Index: PureData.cs
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/PureData/PureData.cs,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** PureData.cs 9 Mar 2006 17:27:37 -0000 1.7
--- PureData.cs 18 Apr 2006 01:38:07 -0000 1.8
***************
*** 2,195 ****
using System.Runtime.CompilerServices; // for extern import
using System.Runtime.InteropServices; // for structures
namespace PureData
{
// PD core functions
! public unsafe class Internal
{
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void *SymGen(string sym);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static string SymEval(void *sym);
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(void *obj,Symbol sel,Symbol to_sel);
// map to data member
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(void *obj,ref float f);
// map to data member
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(void *obj,ref Symbol s);
// map to data member
! // [MethodImplAttribute (MethodImplOptions.InternalCall)]
! // internal extern static void AddInlet(void *obj,ref Pointer f);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(void *obj,Symbol type); // create proxy inlet (typed)
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(void *obj); // create proxy inlet (anything)
// --------------------------------------------------------------------------
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void AddOutlet(void *obj,Symbol type);
// --------------------------------------------------------------------------
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n);
!
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,float f);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,Symbol s);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,Pointer p);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,Atom a);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,Symbol s,AtomList l);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(void *obj,int n,Symbol s,Atom[] l);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void OutletEx(void *obj,int n,object o);
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Bind(void *obj,Symbol dst);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Unbind(void *obj,Symbol dst);
}
-
- // This is the base class for a PD/CLR external
- public unsafe abstract class External
- {
- // PD object pointer
- private readonly void *ptr;
// to be returned by Setup function
! protected enum ClassType { Default = 0,PD = 1,GObj = 2,Patchable = 3,NoInlet = 8 }
// --------------------------------------------------------------------------
! protected readonly static Symbol _ = new Symbol("");
! protected readonly static Symbol _bang = new Symbol("bang");
! protected readonly static Symbol _float = new Symbol("float");
! protected readonly static Symbol _symbol = new Symbol("symbol");
! protected readonly static Symbol _pointer = new Symbol("pointer");
! protected readonly static Symbol _list = new Symbol("list");
! protected readonly static Symbol _anything = new Symbol("anything");
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void Post(string message);
! protected static void Post(string format,object arg0) { Post(String.Format(format,arg0)); }
! protected static void Post(string format,object arg0,object arg1) { Post(String.Format(format,arg0,arg1)); }
! protected static void Post(string format,object arg0,object arg1,object arg2) { Post(String.Format(format,arg0,arg1,arg2)); }
! protected static void Post(string format,params object[] args) { Post(String.Format(format,args)); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void PostError(string message);
! protected static void PostError(string format,object arg0) { PostError(String.Format(format,arg0)); }
! protected static void PostError(string format,object arg0,object arg1) { PostError(String.Format(format,arg0,arg1)); }
! protected static void PostError(string format,object arg0,object arg1,object arg2) { PostError(String.Format(format,arg0,arg1,arg2)); }
! protected static void PostError(string format,params object[] args) { PostError(String.Format(format,args)); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void PostVerbose(int lvl,string message);
! protected static void PostVerbose(int lvl,string format,object arg0) { PostVerbose(lvl,String.Format(format,arg0)); }
! protected static void PostVerbose(int lvl,string format,object arg0,object arg1) { PostVerbose(lvl,String.Format(format,arg0,arg1)); }
! protected static void PostVerbose(int lvl,string format,object arg0,object arg1,object arg2) { PostVerbose(lvl,String.Format(format,arg0,arg1,arg2)); }
! protected static void PostVerbose(int lvl,string format,params object[] args) { PostVerbose(lvl,String.Format(format,args)); }
// --------------------------------------------------------------------------
! protected delegate void Method();
! protected delegate void MethodFloat(float f);
! protected delegate void MethodSymbol(Symbol s);
! protected delegate void MethodPointer(Pointer p);
! protected delegate void MethodList(AtomList lst);
! protected delegate void MethodAnything(int inlet,Symbol tag,AtomList lst);
! protected delegate void MethodObject(int inlet,object o);
- // --------------------------------------------------------------------------
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Method m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodFloat m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodSymbol m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodPointer m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodList m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodAnything m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,Method m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,MethodFloat m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,MethodSymbol m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,MethodPointer m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,MethodList m);
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,Symbol sel,MethodAnything m);
! protected static void AddMethod(int inlet,string sel,Method m) { AddMethod(inlet,new Symbol(sel),m); }
! protected static void AddMethod(int inlet,string sel,MethodFloat m) { AddMethod(inlet,new Symbol(sel),m); }
! protected static void AddMethod(int inlet,string sel,MethodSymbol m) { AddMethod(inlet,new Symbol(sel),m); }
! protected static void AddMethod(int inlet,string sel,MethodPointer m) { AddMethod(inlet,new Symbol(sel),m); }
! protected static void AddMethod(int inlet,string sel,MethodList m) { AddMethod(inlet,new Symbol(sel),m); }
! protected static void AddMethod(int inlet,string sel,MethodAnything m) { AddMethod(inlet,new Symbol(sel),m); }
! [MethodImplAttribute (MethodImplOptions.InternalCall)]
! protected extern static void AddMethod(int inlet,MethodObject m);
// --------------------------------------------------------------------------
! protected void AddInlet(ref float f) { Internal.AddInlet(ptr,ref f); } // map to data member
! protected void AddInlet(ref Symbol s) { Internal.AddInlet(ptr,ref s); } // map to data member
! // protected void AddInlet(ref Pointer p) { Internal.AddInlet(ptr,ref p); } // map to data member
// protected void AddInlet(Symbol type) { Internal.AddInlet(ptr,type); } // create typed inlet
protected void AddInlet() { Internal.AddInlet(ptr); } // create inlet responding to any message
! protected void AddInlet(Symbol sel,Symbol to_sel) { Internal.AddInlet(ptr,sel,to_sel); } // redirect messages to defined selector
// --------------------------------------------------------------------------
! protected void AddOutlet(Symbol type) { Internal.AddOutlet(ptr,type); }
protected void AddOutletBang() { AddOutlet(_bang); }
--- 2,629 ----
using System.Runtime.CompilerServices; // for extern import
using System.Runtime.InteropServices; // for structures
+ using System.Reflection;
+ using System.Collections;
namespace PureData
{
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct ClassPtr
+ {
+ private IntPtr ptr;
+
+ public void Clear() { ptr = IntPtr.Zero; }
+ public bool Valid() { return ptr != IntPtr.Zero; }
+
+ public override string ToString() { return ptr.ToString(); }
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct ExternalPtr
+ {
+ private IntPtr ptr;
+
+ public void Clear() { ptr = IntPtr.Zero; }
+ public bool Valid() { return ptr != IntPtr.Zero; }
+
+ public override string ToString() { return ptr.ToString(); }
+ }
+
+ // data passed from/to native side
+ [StructLayout(LayoutKind.Sequential)]
+ internal class PassedData
+ {
+ public Class klass;
+ public External ext;
+ public object obj;
+ }
+
// PD core functions
! public class Internal
{
! // the ExternalPtr when initializing an External instance
! internal static ExternalPtr extptr;
! internal static PassedData pass;
// --------------------------------------------------------------------------
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static Symbol SymGen(string sym);
+
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static string SymEval(Symbol sym);
!
! // --------------------------------------------------------------------------
!
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj, Symbol sel, Symbol to_sel);
// map to data member
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj, ref float f);
// map to data member
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj, ref Symbol s);
// map to data member
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj,ref Pointer f);
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj, Symbol type); // create proxy inlet (typed)
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddInlet(ExternalPtr obj); // create proxy inlet (anything)
// --------------------------------------------------------------------------
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void AddOutlet(ExternalPtr obj, Symbol type);
// --------------------------------------------------------------------------
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n, float f);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n, Symbol s);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n, Pointer p);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n, Atom a);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Outlet(ExternalPtr obj, int n, Symbol s, Atom[] l);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void OutletEx(ExternalPtr obj, int n, object o);
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Bind(ExternalPtr obj, Symbol dst);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! internal extern static void Unbind(ExternalPtr obj, Symbol dst);
}
+
+ public abstract class Public
+ : Internal
+ {
// to be returned by Setup function
! protected enum ClassType { Default = 0, PD = 1, GObj = 2, Patchable = 3, NoInlet = 8 }
// --------------------------------------------------------------------------
! public delegate void MethodBang();
! public delegate void MethodFloat(float f);
! public delegate void MethodSymbol(Symbol s);
! public delegate void MethodPointer(Pointer p);
! public delegate void MethodList(Atom[] lst);
! public delegate void MethodAnything(int inlet, Symbol tag, Atom[] lst);
! public delegate void MethodObject(int inlet, object o);
!
! // --------------------------------------------------------------------------
!
! public readonly static Symbol _ = new Symbol("");
! public readonly static Symbol _bang = new Symbol("bang");
! public readonly static Symbol _float = new Symbol("float");
! public readonly static Symbol _symbol = new Symbol("symbol");
! public readonly static Symbol _pointer = new Symbol("pointer");
! public readonly static Symbol _list = new Symbol("list");
// --------------------------------------------------------------------------
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! public extern static void Post(string message);
! public static void Post(string format, object arg0) { Post(String.Format(format, arg0)); }
! public static void Post(string format, object arg0, object arg1) { Post(String.Format(format, arg0, arg1)); }
! public static void Post(string format, object arg0, object arg1, object arg2) { Post(String.Format(format, arg0, arg1, arg2)); }
! public static void Post(string format, params object[] args) { Post(String.Format(format, args)); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! public extern static void PostError(string message);
! public static void PostError(string format, object arg0) { PostError(String.Format(format, arg0)); }
! public static void PostError(string format, object arg0, object arg1) { PostError(String.Format(format, arg0, arg1)); }
! public static void PostError(string format, object arg0, object arg1, object arg2) { PostError(String.Format(format, arg0, arg1, arg2)); }
! public static void PostError(string format, params object[] args) { PostError(String.Format(format, args)); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
! public extern static void PostVerbose(int lvl, string message);
! public static void PostVerbose(int lvl, string format, object arg0) { PostVerbose(lvl, String.Format(format, arg0)); }
! public static void PostVerbose(int lvl, string format, object arg0, object arg1) { PostVerbose(lvl, String.Format(format, arg0, arg1)); }
! public static void PostVerbose(int lvl, string format, object arg0, object arg1, object arg2) { PostVerbose(lvl, String.Format(format, arg0, arg1, arg2)); }
! public static void PostVerbose(int lvl, string format, params object[] args) { PostVerbose(lvl, String.Format(format, args)); }
// --------------------------------------------------------------------------
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! public extern static string SearchPath(string file);
! }
! public sealed class Class
! : Public
! {
! // PD class pointer
! private readonly ClassPtr ptr;
! // class type
! private Type extclass;
! // --------------------------------------------------------------------------
! // simple methods for inlet 0
! private DynamicMethodBang m_bang = null;
! private DynamicMethodFloat m_float = null;
! private DynamicMethodSymbol m_symbol = null;
! private DynamicMethodPointer m_pointer = null;
! private DynamicMethodList m_list = null;
! private DynamicMethodAnything m_anything = null;
! private DynamicMethodObject m_object = null;
! // --------------------------------------------------------------------------
! private static void ResizeArray(ref Hashtable[] oldArray, int newSize)
! {
! int oldSize = oldArray.Length;
! System.Type elementType = oldArray.GetType().GetElementType();
! Hashtable[] newArray = (Hashtable[])System.Array.CreateInstance(elementType, newSize);
! int preserveLength = System.Math.Min(oldSize, newSize);
! if (preserveLength > 0)
! System.Array.Copy(oldArray, newArray, preserveLength);
! oldArray = newArray;
! }
! private struct MapValue
! {
! public MapValue(Kind k,Delegate d) { this.k = k; this.d = d; }
! public Kind k;
! public Delegate d;
! }
! private Hashtable[] m_map = new Hashtable[0];
! // --------------------------------------------------------------------------
! public override string ToString()
! {
! return extclass.Name;
! }
! // --------------------------------------------------------------------------
! private enum Kind { k_bang, k_float, k_symbol, k_pointer, k_list, k_anything, k_object }
! private enum MethodFlags { f_none = 0,f_bang = 0x01, f_float = 0x02, f_symbol = 0x04, f_pointer = 0x08, f_list = 0x10, f_anything = 0x20 }
!
! private static MethodFlags methodflags;
!
!
! // --------------------------------------------------------------------------
!
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! private extern static bool RegisterClass(ClassPtr ptr, Symbol sym, ClassType cflags, MethodFlags mflags);
!
! private void AddMethodIntern(int inlet, Symbol sel, Kind k, Delegate d)
! {
! // add to map
! if (m_map.Length <= inlet) ResizeArray(ref m_map, inlet + 1);
! Hashtable h = m_map[inlet];
! if(h == null) m_map[inlet] = h = new Hashtable();
! h[sel] = new MapValue(k, d);
!
! methodflags |= MethodFlags.f_anything;
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodBang d)
! {
! DynamicMethodBang dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _bang)
! {
! m_bang = dyn;
! methodflags |= MethodFlags.f_bang;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_bang, dyn);
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodFloat d)
! {
! DynamicMethodFloat dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _float)
! {
! m_float = dyn;
! methodflags |= MethodFlags.f_float;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_float, dyn);
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodSymbol d)
! {
! DynamicMethodSymbol dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _symbol)
! {
! m_symbol = dyn;
! methodflags |= MethodFlags.f_symbol;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_symbol, dyn);
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodPointer d)
! {
! DynamicMethodPointer dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _pointer)
! {
! m_pointer = dyn;
! methodflags |= MethodFlags.f_pointer;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_pointer, dyn);
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodList d)
! {
! DynamicMethodList dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _list)
! {
! m_list = dyn;
! methodflags |= MethodFlags.f_list;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_list, dyn);
! }
!
! public void AddMethod(int inlet, Symbol sel, MethodAnything d)
! {
! DynamicMethodAnything dyn = DynamicMethods.Create(d);
! if (inlet == 0 && sel == _)
! {
! m_anything = dyn;
! methodflags |= MethodFlags.f_anything;
! }
! else
! AddMethodIntern(inlet, sel, Kind.k_anything, dyn);
! }
!
! public void AddMethod(int inlet, MethodObject d)
! {
! DynamicMethodObject dyn = DynamicMethods.Create(d);
! m_object = dyn;
! methodflags |= MethodFlags.f_anything;
! }
!
! // --------------------------------------------------------------------------
!
! private Class(ClassPtr p,Type c)
! {
! ptr = p;
! extclass = c;
! }
!
! private delegate void DelegateClass(ClassPtr ptr, Symbol sym);
! private static void NewClass(ClassPtr ptr, Symbol sym)
! {
! Internal.pass.klass = null;
!
! try
! {
! string name = sym.ToString();
!
! // load assembly according to name
! string file = SearchPath(name + ".dll");
! if (file.Length == 0) return; // throw new ArgumentException("Assembly file " + name + " not found");
! Assembly assembly = Assembly.LoadFile(file);
! if (assembly == null) return; // throw new ArgumentException("Assembly " + name + " could not be loaded");
! Type exttp = assembly.GetType(name);
! if (exttp == null) throw new ArgumentException("Class " + name + " could not be found");
!
! Class klass = new Class(ptr, exttp);
!
! // create dummy external
! ConstructorInfo ctor = exttp.GetConstructor(System.Type.EmptyTypes);
! if (ctor == null) throw new MissingMethodException("External class must have a default constructor");
!
! Internal.pass.klass = klass;
! Internal.extptr.Clear();
!
! External dummy = (External)ctor.Invoke(null);
!
! // reset flags
! methodflags = MethodFlags.f_none;
!
! // call Setup method
! MethodInfo setup = exttp.GetMethod("Setup",BindingFlags.NonPublic|BindingFlags.Static,null, new Type[1] { exttp },null);
! if (setup == null) throw new MissingMethodException("External class must have a Setup function");
!
! object ret = setup.Invoke(exttp, new object[1] { dummy });
! ClassType classflags;
! try { classflags = (ClassType)ret; }
! catch { classflags = ClassType.Default; }
!
! // set callbacks
! RegisterClass(ptr, sym, classflags, methodflags);
! }
! catch (Exception exc)
! {
! Internal.pass.klass = null;
! PostError(exc.ToString());
! }
! }
!
! private delegate void DelegateNew(ExternalPtr ptr,AtomList args);
! private static void NewInstance(ExternalPtr ptr,AtomList args)
! {
! External instance;
!
! Class cl = Internal.pass.klass; // set by native side
! Internal.extptr = ptr;
!
! // Post("CLASS-NEW {0}",cl);
! try
! {
! // TODO: create dynamic delegate for that....
! System.Reflection.ConstructorInfo m = cl.extclass.GetConstructor(new Type[1] { typeof(Atom[]) });
! if (m != null)
! instance = (External)m.Invoke(new object[1] { (Atom[])args });
! else
! {
! // search for the argument-less constructor... it must exist, we searched before
! m = cl.extclass.GetConstructor(System.Type.EmptyTypes);
! instance = (External)m.Invoke(null);
! }
! }
! catch (Exception exc)
! {
! instance = null;
! PostError(exc.ToString());
! }
!
! #if DEBUG
! Internal.extptr.Clear();
! #endif
!
! Internal.pass.ext = instance; // back to native
! }
!
! private delegate void DelegateBang();
! private static void CallBang()
! {
! External e = Internal.pass.ext;
! try { e.klass.m_bang(e); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegateFloat(float f);
! private static void CallFloat(float f)
! {
! External e = Internal.pass.ext;
! try { e.klass.m_float(e, f); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegateSymbol(Symbol s);
! private static void CallSymbol(Symbol s)
! {
! External e = Internal.pass.ext;
! try { e.klass.m_symbol(e, s); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegatePointer(Pointer p);
! private static void CallPointer(Pointer p)
! {
! External e = Internal.pass.ext;
! try { e.klass.m_pointer(e, p); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegateList(AtomList l);
! private static void CallList(AtomList l)
! {
! External e = Internal.pass.ext;
! try { e.klass.m_list(e, (Atom[])l); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegateAnything(int inlet, Symbol s, AtomList l);
! private static void CallAnything(int inlet, Symbol s, AtomList l)
! {
! // Post("CLASS-ANYTHING {0}->{1}:{2}", inlet,s,l);
!
! try {
! External e = Internal.pass.ext;
! Class c = e.klass;
!
! Hashtable h;
! try { h = (Hashtable)c.m_map[inlet]; }
! catch (IndexOutOfRangeException) { h = null; }
!
! if(h != null)
! {
! object fnd = h[s];
! if (fnd != null)
! {
! MapValue mv = (MapValue)fnd;
! switch(mv.k)
! {
! case Kind.k_bang:
! {
! ((DynamicMethodBang)mv.d)(e);
! return;
! }
! case Kind.k_float:
! {
! float f = l.Count > 0 ? (float)l[0] : 0;
! ((DynamicMethodFloat)mv.d)(e, f);
! return;
! }
! case Kind.k_symbol:
! {
! Symbol sym = l.Count > 0 ? (Symbol)l[0] : _;
! ((DynamicMethodSymbol)mv.d)(e, sym);
! return;
! }
! case Kind.k_pointer:
! {
! Pointer p = l.Count > 0 ? (Pointer)l[0] : new Pointer();
! ((DynamicMethodPointer)mv.d)(e, p);
! return;
! }
! case Kind.k_list:
! ((DynamicMethodList)mv.d)(e,(Atom[])l);
! return;
! case Kind.k_anything:
! ((DynamicMethodAnything)mv.d)(e,inlet,s,(Atom[])l);
! return;
! default:
! throw new NotImplementedException("Selector " + s.ToString() + " not handled");
! }
! }
! }
!
! // no explicit method found...
! c.m_anything(e, inlet, s, (Atom[])l);
! }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! private delegate void DelegateObject(int inlet);
! private static void CallObject(int inlet)
! {
! // Post("CLASS-OBJECT {0}", inlet);
!
! External e = Internal.pass.ext;
! try { e.klass.m_object(e, inlet, Internal.pass.obj); }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
!
! // --------------------------------------------------------------------------
!
! [MethodImplAttribute(MethodImplOptions.InternalCall)]
! private extern static void Register(DelegateClass d_class, DelegateNew d_new, DelegateBang d_bang, DelegateFloat d_float, DelegateSymbol d_symbol, DelegatePointer d_pointer, DelegateList d_list, DelegateAnything d_anything, DelegateObject d_object);
!
! private static void Setup()
! {
! try
! {
! Internal.pass = new PassedData();
!
! Register(
! new DelegateClass(NewClass),
! new DelegateNew(NewInstance),
! new DelegateBang(CallBang),
! new DelegateFloat(CallFloat),
! new DelegateSymbol(CallSymbol),
! new DelegatePointer(CallPointer),
! new DelegateList(CallList),
! new DelegateAnything(CallAnything),
! new DelegateObject(CallObject)
! );
! }
! catch (Exception exc) { PostError(exc.ToString()); }
! }
! }
!
!
! // This is the base class for a PD/CLR external
! public abstract class External
! : Public
! {
! // PD object pointer
! internal readonly ExternalPtr ptr;
! // Class
! internal readonly Class klass;
// --------------------------------------------------------------------------
! protected External()
! {
! ptr = Internal.extptr;
! klass = Internal.pass.klass;
! }
!
! public override string ToString()
! {
! return ptr.Valid()?klass.ToString():"???";
! }
!
! // --------------------------------------------------------------------------
!
! protected static void AddMethod(int inlet, Symbol sel, MethodBang m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, Symbol sel, MethodFloat m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, Symbol sel, MethodSymbol m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, Symbol sel, MethodPointer m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, Symbol sel, MethodList m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, Symbol sel, MethodAnything m) { ((External)m.Target).klass.AddMethod(inlet, sel, m); }
! protected static void AddMethod(int inlet, MethodObject m) { ((External)m.Target).klass.AddMethod(inlet, m); }
!
! protected static void AddMethod(int inlet, MethodBang m) { AddMethod(inlet, _bang, m); }
! protected static void AddMethod(int inlet, MethodFloat m) { AddMethod(inlet, _float, m); }
! protected static void AddMethod(int inlet, MethodSymbol m) { AddMethod(inlet, _symbol, m); }
! protected static void AddMethod(int inlet, MethodPointer m) { AddMethod(inlet, _pointer, m); }
! protected static void AddMethod(int inlet, MethodList m) { AddMethod(inlet, _list, m); }
! protected static void AddMethod(int inlet, MethodAnything m) { AddMethod(inlet, _, m); }
!
! protected static void AddMethod(MethodBang m) { AddMethod(0, m); }
! protected static void AddMethod(MethodFloat m) { AddMethod(0, m); }
! protected static void AddMethod(MethodSymbol m) { AddMethod(0, m); }
! protected static void AddMethod(MethodPointer m) { AddMethod(0, m); }
! protected static void AddMethod(MethodList m) { AddMethod(0, m); }
! protected static void AddMethod(MethodAnything m) { AddMethod(0, m); }
! protected static void AddMethod(MethodObject m) { AddMethod(0, m); }
!
! protected static void AddMethod(int inlet, string sel, MethodBang m) { AddMethod(inlet, new Symbol(sel), m); }
! protected static void AddMethod(int inlet, string sel, MethodFloat m) { AddMethod(inlet, new Symbol(sel), m); }
! protected static void AddMethod(int inlet, string sel, MethodSymbol m) { AddMethod(inlet, new Symbol(sel), m); }
! protected static void AddMethod(int inlet, string sel, MethodPointer m) { AddMethod(inlet, new Symbol(sel), m); }
! protected static void AddMethod(int inlet, string sel, MethodList m) { AddMethod(inlet, new Symbol(sel), m); }
! protected static void AddMethod(int inlet, string sel, MethodAnything m) { AddMethod(inlet, new Symbol(sel), m); }
!
! // --------------------------------------------------------------------------
!
! protected void AddInlet(ref float f) { Internal.AddInlet(ptr, ref f); } // map to data member
! protected void AddInlet(ref Symbol s) { Internal.AddInlet(ptr, ref s); } // map to data member
! protected void AddInlet(ref Pointer p) { Internal.AddInlet(ptr,ref p); } // map to data member
// protected void AddInlet(Symbol type) { Internal.AddInlet(ptr,type); } // create typed inlet
protected void AddInlet() { Internal.AddInlet(ptr); } // create inlet responding to any message
! protected void AddInlet(Symbol sel, Symbol to_sel) { Internal.AddInlet(ptr, sel, to_sel); } // redirect messages to defined selector
// --------------------------------------------------------------------------
! protected void AddOutlet(Symbol type) { Internal.AddOutlet(ptr, type); }
protected void AddOutletBang() { AddOutlet(_bang); }
***************
*** 198,202 ****
protected void AddOutletPointer() { AddOutlet(_pointer); }
protected void AddOutletList() { AddOutlet(_list); }
! protected void AddOutletAnything() { AddOutlet(_anything); }
// --------------------------------------------------------------------------
--- 632,636 ----
protected void AddOutletPointer() { AddOutlet(_pointer); }
protected void AddOutletList() { AddOutlet(_list); }
! protected void AddOutletAnything() { AddOutlet(_); }
// --------------------------------------------------------------------------
***************
*** 207,213 ****
protected void Outlet(int n,Pointer p) { Internal.Outlet(ptr,n,p); }
protected void Outlet(int n,Atom a) { Internal.Outlet(ptr,n,a); }
- protected void Outlet(int n,AtomList l) { Internal.Outlet(ptr,n,_list,l); }
protected void Outlet(int n,Atom[] l) { Internal.Outlet(ptr,n,_list,l); }
- protected void Outlet(int n,Symbol s,AtomList l) { Internal.Outlet(ptr,n,s,l); }
protected void Outlet(int n,Symbol s,Atom[] l) { Internal.Outlet(ptr,n,s,l); }
--- 641,645 ----
***************
*** 224,238 ****
protected extern static void Send(Symbol sym,Atom a);
! protected static void Send(Symbol sym) { Send(sym,_bang,null); }
protected static void Send(Symbol sym,float f) { Send(sym,new Atom(f)); }
protected static void Send(Symbol sym,Symbol s) { Send(sym,new Atom(s)); }
protected static void Send(Symbol sym,Pointer p) { Send(sym,new Atom(p)); }
- protected static void Send(Symbol sym,AtomList l) { Send(sym,_list,l); }
protected static void Send(Symbol sym,Atom[] l) { Send(sym,_list,l); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- protected extern static void Send(Symbol sym,Symbol s,AtomList l);
-
- [MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Send(Symbol sym,Symbol s,Atom[] l);
--- 656,666 ----
protected extern static void Send(Symbol sym,Atom a);
! protected static void Send(Symbol sym) { Send(sym,_bang,new Atom[0]); }
protected static void Send(Symbol sym,float f) { Send(sym,new Atom(f)); }
protected static void Send(Symbol sym,Symbol s) { Send(sym,new Atom(s)); }
protected static void Send(Symbol sym,Pointer p) { Send(sym,new Atom(p)); }
protected static void Send(Symbol sym,Atom[] l) { Send(sym,_list,l); }
[MethodImplAttribute (MethodImplOptions.InternalCall)]
protected extern static void Send(Symbol sym,Symbol s,Atom[] l);
--- NEW FILE: DynamicMethod.cs ---
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace PureData
{
public delegate void DynamicMethodBang(External target);
public delegate void DynamicMethodFloat(External target,float f);
public delegate void DynamicMethodSymbol(External target,Symbol s);
public delegate void DynamicMethodPointer(External target,Pointer p);
public delegate void DynamicMethodList(External target,Atom[] l);
public delegate void DynamicMethodAnything(External target,int i,Symbol s,Atom[] l);
public delegate void DynamicMethodObject(External target,int i,object o);
class DynamicMethods
{
private static Delegate CreateIntern(Delegate del, Type dyntype)
{
MethodInfo dynmethod = dyntype.GetMethod("Invoke");
ParameterInfo[] dynparms = dynmethod.GetParameters();
MethodInfo method = del.Method;
#if DEBUG
if (dynmethod.ReturnType != typeof(void)) throw new ArgumentException("Return type must be void");
ParameterInfo[] parms = method.GetParameters();
int numparms = parms.Length;
if (dynparms.Length != numparms + 1) throw new ArgumentException("Number of parameters don't match");
for (int i = 0; i < numparms; ++i)
if (dynparms[i + 1].ParameterType != parms[i].ParameterType) throw new ArgumentException("Parameter types don't match");
#endif
Type[] argtypes = new Type[dynparms.Length];
for (int i = 0; i < dynparms.Length; ++i)
argtypes[i] = dynparms[i].ParameterType;
// Create dynamic method and obtain its IL generator to inject code.
DynamicMethod dynam = new DynamicMethod("dummy", typeof(void), argtypes, typeof(DynamicMethods));
ILGenerator il = dynam.GetILGenerator();
#region IL Code generation
// If method isn't static push target instance on top of stack.
if (!method.IsStatic)
// Argument 0 of dynamic method is target instance.
il.Emit(OpCodes.Ldarg_0);
// Push parameters onto the stack
for (int i = 0; i < dynparms.Length - 1; ++i)
il.Emit(OpCodes.Ldarg, i + 1);
// Perform actual call.
// If method is not final a callvirt is required otherwise a normal call will be emitted.
il.Emit(method.IsFinal ? OpCodes.Call : OpCodes.Callvirt, method);
// Emit return opcode.
il.Emit(OpCodes.Ret);
#endregion
return dynam.CreateDelegate(dyntype);
}
#region Specialized DynamicMethod makers
public static DynamicMethodBang Create(Public.MethodBang method)
{
return (DynamicMethodBang)CreateIntern(method, typeof(DynamicMethodBang));
}
public static DynamicMethodFloat Create(Public.MethodFloat method)
{
return (DynamicMethodFloat)CreateIntern(method,typeof(DynamicMethodFloat));
}
public static DynamicMethodSymbol Create(Public.MethodSymbol method)
{
return (DynamicMethodSymbol)CreateIntern(method,typeof(DynamicMethodSymbol));
}
public static DynamicMethodPointer Create(Public.MethodPointer method)
{
return (DynamicMethodPointer)CreateIntern(method,typeof(DynamicMethodPointer));
}
public static DynamicMethodList Create(Public.MethodList method)
{
return (DynamicMethodList)CreateIntern(method,typeof(DynamicMethodList));
}
public static DynamicMethodAnything Create(Public.MethodAnything method)
{
return (DynamicMethodAnything)CreateIntern(method,typeof(DynamicMethodAnything));
}
public static DynamicMethodObject Create(Public.MethodObject method)
{
return (DynamicMethodObject)CreateIntern(method, typeof(DynamicMethodObject));
}
#endregion
}
}
Index: Atom.cs
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/PureData/Atom.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** Atom.cs 8 Mar 2006 17:37:25 -0000 1.2
--- Atom.cs 18 Apr 2006 01:38:07 -0000 1.3
***************
*** 9,44 ****
{
[StructLayout (LayoutKind.Sequential)]
! public unsafe struct Symbol
{
// this should NOT be public (or at least read only)
! private readonly void *sym;
public Symbol(string s)
{
! sym = Internal.SymGen(s);
}
public override string ToString()
{
! return Internal.SymEval(sym);
}
}
[StructLayout (LayoutKind.Sequential)]
! public unsafe struct Pointer
{
! private readonly void *ptr;
public override string ToString()
{
! if(sizeof(void *) == 4)
! return ((int)ptr).ToString();
! else
! return ((long)ptr).ToString();
}
}
[StructLayout (LayoutKind.Sequential)]
! public unsafe struct Atom
{
private enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3};
--- 9,63 ----
{
[StructLayout (LayoutKind.Sequential)]
! public struct Symbol
{
// this should NOT be public (or at least read only)
! private readonly IntPtr sym;
public Symbol(string s)
{
! this = Internal.SymGen(s);
}
public override string ToString()
{
! return Internal.SymEval(this);
! }
!
! public static bool operator ==(Symbol s1,Symbol s2)
! {
! return s1.sym == s2.sym;
! }
!
! public static bool operator !=(Symbol s1, Symbol s2)
! {
! return s1.sym != s2.sym;
! }
!
! public override bool Equals(object o)
! {
! try { return this == (Symbol)o; }
! catch {}
! return false;
! }
!
! public override int GetHashCode()
! {
! return (int)sym;
}
}
[StructLayout (LayoutKind.Sequential)]
! public struct Pointer
{
! private readonly IntPtr ptr;
public override string ToString()
{
! return ptr.ToString();
}
}
[StructLayout (LayoutKind.Sequential)]
! public struct Atom
{
private enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3};
***************
*** 147,151 ****
}
! public class AtomListEnum
: IEnumerator
{
--- 166,170 ----
}
! internal class AtomListEnum
: IEnumerator
{
***************
*** 193,198 ****
[StructLayout (LayoutKind.Sequential)]
! unsafe public struct AtomList
! #if NET_2_0
: ICollection<Atom>
#else
--- 212,217 ----
[StructLayout (LayoutKind.Sequential)]
! internal unsafe struct AtomList
! #if xNET_2_0
: ICollection<Atom>
#else
***************
*** 204,208 ****
public int Count { get { return len; } }
! #if NET_2_0
public bool IsReadOnly { get { return false; } } // member of generic.ICollection<Atom> (C# 2.0)
#endif
--- 223,227 ----
public int Count { get { return len; } }
! #if xNET_2_0
public bool IsReadOnly { get { return false; } } // member of generic.ICollection<Atom> (C# 2.0)
#endif
***************
*** 213,217 ****
private AtomList(AtomList a) { len = 0; atoms = null; }
! #if NET_2_0
public void CopyTo(Atom[] array,int start)
#else
--- 232,236 ----
private AtomList(AtomList a) { len = 0; atoms = null; }
! #if xNET_2_0
public void CopyTo(Atom[] array,int start)
#else
***************
*** 247,251 ****
}
! #if !NET_2_0
public static explicit operator Atom[](AtomList l)
{
--- 266,270 ----
}
! //#if 1 // !NET_2_0
public static explicit operator Atom[](AtomList l)
{
***************
*** 255,259 ****
return ret;
}
! #endif
override public string ToString()
--- 274,278 ----
return ret;
}
! //#endif
override public string ToString()
- Previous message: [PD-cvs] externals/clr/test test-help.pd, 1.2, 1.3 test.cs, 1.3, 1.4 test.csproj, 1.1, 1.2
- Next message: [PD-cvs] doc/tutorials/intro 08.bang.pd, 1.4, 1.5 12.right_to_left_order.pd, 1.2, 1.3 15.inlets_and_outlets.pd, 1.2, 1.3 17.atomic_messages.pd, 1.2, 1.3 18.selectors.pd, 1.2, 1.3 20.inlets_and_outlets.pd, 1.2, 1.3 28.gui_objects.pd, 1.2, 1.3 TODO, 1.6, 1.7
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Pd-cvs
mailing list