Update of /cvsroot/pure-data/externals/clr/pd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28852/clr/pd
Modified Files: Atom.cs PureData.cs pd.csproj Log Message: many improvements: - efficient symbol and atom list handling - better control over function arguments
Index: PureData.cs =================================================================== RCS file: /cvsroot/pure-data/externals/clr/pd/PureData.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PureData.cs 28 Jan 2006 10:36:25 -0000 1.2 --- PureData.cs 6 Mar 2006 00:35:40 -0000 1.3 *************** *** 1,9 **** using System; using System.Runtime.CompilerServices; // for extern import
namespace PureData { // PD core functions ! public class Core { [MethodImplAttribute (MethodImplOptions.InternalCall)] --- 1,10 ---- using System; using System.Runtime.CompilerServices; // for extern import + using System.Runtime.InteropServices; // for structures
namespace PureData { // PD core functions ! public unsafe class Core { [MethodImplAttribute (MethodImplOptions.InternalCall)] *************** *** 20,35 ****
[MethodImplAttribute (MethodImplOptions.InternalCall)] ! public extern static IntPtr GenSym(string sym);
[MethodImplAttribute (MethodImplOptions.InternalCall)] ! public extern static string EvalSym(Symbol sym); }
// This is the base class for a PD/CLR external ! public class External : Core { ! private readonly IntPtr ptr; ! protected virtual void MethodBang() { Post("No bang handler"); }
--- 21,37 ----
[MethodImplAttribute (MethodImplOptions.InternalCall)] ! internal extern static void *SymGen(string sym);
[MethodImplAttribute (MethodImplOptions.InternalCall)] ! internal extern static string SymEval(void *sym); }
// This is the base class for a PD/CLR external ! public unsafe class External : Core { ! // PD object pointer ! private readonly void *ptr; ! protected virtual void MethodBang() { Post("No bang handler"); }
*************** *** 40,46 **** protected virtual void MethodPointer(Pointer p) { Post("No pointer handler");}
! protected virtual void MethodList(Atom[] lst) { Post("No list handler"); }
! protected virtual void MethodAnything(Atom[] lst) { Post("No list handler"); } } } --- 42,48 ---- protected virtual void MethodPointer(Pointer p) { Post("No pointer handler");}
! protected virtual void MethodList(AtomList lst) { Post("No list handler"); }
! protected virtual void MethodAnything(Symbol tag,AtomList lst) { Post("No anything handler"); } } }
Index: pd.csproj =================================================================== RCS file: /cvsroot/pure-data/externals/clr/pd/pd.csproj,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pd.csproj 27 Jan 2006 22:50:00 -0000 1.2 --- pd.csproj 6 Mar 2006 00:35:40 -0000 1.3 *************** *** 1,105 **** ! <VisualStudioProject> ! <CSHARP ! ProjectType = "Local" ! ProductVersion = "7.10.3077" ! SchemaVersion = "2.0" ! ProjectGuid = "{FFBC9D2E-1FB7-4E82-B5DC-46B31F8A58A2}" ! > ! <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 = "false" ! BaseAddress = "285212672" ! CheckForOverflowUnderflow = "false" ! ConfigurationOverrideFile = "" ! DefineConstants = "DEBUG;TRACE" ! DocumentationFile = "" ! DebugSymbols = "true" ! FileAlignment = "4096" ! IncrementalBuild = "false" ! NoStdLib = "false" ! NoWarn = "" ! Optimize = "false" ! OutputPath = ".." ! RegisterForComInterop = "false" ! RemoveIntegerChecks = "false" ! TreatWarningsAsErrors = "false" ! WarningLevel = "4" ! /> ! <Config ! Name = "Release" ! AllowUnsafeBlocks = "false" ! 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,105 ---- ! <VisualStudioProject> ! <CSHARP ! ProjectType = "Local" ! ProductVersion = "7.10.3077" ! SchemaVersion = "2.0" ! ProjectGuid = "{FFBC9D2E-1FB7-4E82-B5DC-46B31F8A58A2}" ! > ! <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 = ".." ! 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> !
Index: Atom.cs =================================================================== RCS file: /cvsroot/pure-data/externals/clr/pd/Atom.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Atom.cs 28 Jan 2006 10:36:25 -0000 1.5 --- Atom.cs 6 Mar 2006 00:35:40 -0000 1.6 *************** *** 1,61 **** using System; using System.Runtime.InteropServices; // for structures
namespace PureData { - public enum AtomType {Null = 0, Float = 1, Symbol = 2, Pointer = 3}; - [StructLayout (LayoutKind.Sequential)] ! sealed public class Symbol { ! // this should NOT be public ! readonly private IntPtr ptr; ! ! public Symbol(IntPtr p) ! { ! ptr = p; ! } ! ! public Symbol(Symbol s) ! { ! ptr = s.ptr; ! }
public Symbol(string s) { ! ptr = Core.GenSym(s); } ! ! override public string ToString() { ! return Core.EvalSym(this); } }
[StructLayout (LayoutKind.Sequential)] ! sealed public class Pointer { ! public IntPtr ptr; ! }
! [StructLayout (LayoutKind.Explicit)] ! public struct Word ! { ! [FieldOffset(0)] public float w_float; ! [FieldOffset(0)] public Symbol w_symbol; ! [FieldOffset(0)] public Pointer w_pointer; }
- //[StructLayout (LayoutKind.Explicit)] [StructLayout (LayoutKind.Sequential)] ! sealed public class Atom { ! ! public AtomType type; ! public Word word; public Atom(float f) { type = AtomType.Float; word.w_float = f; } --- 1,62 ---- using System; using System.Runtime.InteropServices; // for structures + using System.Collections; + #if NET_2_0 + using System.Collections.Generic; + #endif
namespace PureData { [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 = Core.SymGen(s); } ! ! public override string ToString() { ! return Core.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}; ! ! [StructLayout (LayoutKind.Explicit)] ! private struct Word ! { ! [FieldOffset(0)] public float w_float; ! [FieldOffset(0)] public Symbol w_sym; ! [FieldOffset(0)] public Pointer w_ptr; ! } ! ! private AtomType type; ! private Word word; public Atom(float f) { type = AtomType.Float; + word = new Word(); word.w_float = f; } *************** *** 64,67 **** --- 65,69 ---- { type = AtomType.Float; + word = new Word(); word.w_float = (float)i; } *************** *** 70,74 **** { type = AtomType.Symbol; ! word.w_symbol = s; }
--- 72,77 ---- { type = AtomType.Symbol; ! word = new Word(); ! word.w_sym = s; }
*************** *** 76,104 **** { type = AtomType.Symbol; ! word.w_symbol = new Symbol(s); } ! } ! ! // this struct is relative to this c struct, see clr.c
! /* ! // simplyfied atom ! typedef struct atom_simple atom_simple; ! typedef enum ! { ! A_S_NULL=0, ! A_S_FLOAT=1, ! A_S_SYMBOL=2, ! } t_atomtype_simple; ! typedef struct atom_simple ! { ! t_atomtype_simple a_type; ! union{ ! float float_value; ! MonoString *string_value; ! } stuff; ! }; ! */
! } \ No newline at end of file --- 79,270 ---- { type = AtomType.Symbol; ! word = new Word(); ! word.w_sym = new Symbol(s); } ! ! public Atom(Pointer p) ! { ! type = AtomType.Pointer; ! word = new Word(); ! word.w_ptr = p; ! } ! ! public bool IsFloat { get { return type == AtomType.Float; } } ! public bool IsSymbol { get { return type == AtomType.Symbol; } } ! public bool IsPointer { get { return type == AtomType.Pointer; } } ! ! public float ToFloat() ! { ! if(IsFloat) ! return word.w_float; ! else ! throw new System.InvalidCastException("Can't be cast to float."); ! } ! ! public Symbol ToSymbol() ! { ! if(IsSymbol) ! return word.w_sym; ! else ! throw new System.InvalidCastException("Can't be cast to Symbol."); ! } ! ! public Pointer ToPointer() ! { ! if(IsPointer) ! return word.w_ptr; ! else ! throw new System.InvalidCastException("Can't be cast to Pointer."); ! } ! ! override public string ToString() ! { ! if(IsFloat) ! return word.w_float.ToString(); ! else if(IsSymbol) ! return word.w_sym.ToString(); ! else if(IsPointer) ! return word.w_ptr.ToString(); ! else ! // should never happen ! throw new System.InvalidProgramException("Internal error."); ! } ! ! public static explicit operator float(Atom a) ! { ! return a.ToFloat(); ! } ! ! public static explicit operator Symbol(Atom a) ! { ! return a.ToSymbol(); ! } ! ! public static explicit operator Pointer(Atom a) ! { ! return a.ToPointer(); ! } ! } ! public class AtomListEnum ! : IEnumerator ! { ! public AtomList list;
! // Enumerators are positioned before the first element ! // until the first MoveNext() call. ! int position = -1;
! public AtomListEnum(AtomList l) ! { ! list = l; ! } ! ! public bool MoveNext() ! { ! return ++position < list.Count; ! } ! ! public void Reset() ! { ! position = -1; ! } ! ! public object Current ! { ! get ! { ! try ! { ! return list[position]; ! } ! catch (IndexOutOfRangeException) ! { ! throw new InvalidOperationException(); ! } ! } ! } ! } ! ! ! // attention: this is dangerous, because we could do the following ! // AtomList l2 = l; ! // with l also being an AtomList... the two private memebers will get copied, although atoms is only a temporary reference ! ! [StructLayout (LayoutKind.Sequential)] ! unsafe public struct AtomList ! #if NET_2_0 ! : ICollection<Atom> ! #else ! : ICollection ! #endif ! { ! private readonly int len; ! private readonly Atom *atoms; ! ! 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 ! public bool IsSynchronized { get { return false; } } ! public Object SyncRoot { get { return null; } } ! ! // protect this from being used ! private AtomList(AtomList a) { len = 0; atoms = null; } ! ! #if NET_2_0 ! public void CopyTo(Atom[] array,int start) ! #else ! public void CopyTo(Array array,int start) ! #endif ! { ! if(len > array.GetUpperBound(0)+1-start) ! throw new System.ArgumentException("Destination array is not long enough."); ! int i; ! for(i = 0; i < len-start; ++i) ! array.SetValue(atoms[start+i],i); ! } ! ! public IEnumerator GetEnumerator() ! { ! return new AtomListEnum(this); ! } ! ! public Atom this[int i] ! { ! get ! { ! if(i < 0 || i >= len) ! throw new System.IndexOutOfRangeException("Index outside array bounds."); ! return atoms[i]; ! } ! set ! { ! if(i < 0 || i >= len) ! throw new System.IndexOutOfRangeException("Index outside array bounds."); ! atoms[i] = value; ! } ! } ! ! #if !NET_2_0 ! public static explicit operator Atom[](AtomList l) ! { ! Atom[] ret = new Atom[l.Count]; ! int i; ! for(i = 0; i < l.Count; ++i) ret[i] = l.atoms[i]; ! return ret; ! } ! #endif ! ! override public string ToString() ! { ! string n = "{"; ! if(len > 0) { ! int i; ! for(i = 0; i < len-1; ++i) n += atoms[i].ToString()+","; ! n += atoms[i].ToString(); ! } ! return n+"}"; ! } ! } ! }