GC.KeepAlive in D and insane stuff
Kyle Furlong
kylefurlong at gmail.com
Wed Mar 22 15:59:17 PST 2006
I'll top post so that people can actually see it!
He asked this question:
> QUESTION ABOUT D
> ================
>
> Intro
> -----
>
> I've got a question about the D programming language, and I compare it
> with what I know, so that will be C#.
>
> In C# when using Platform Invocation Services, (to call C) a managed
> type is not fully aware of this.
>
> Handle here is of type int
>
> Code below has a potential error.
>
> public void TestMethod() {
> FileStream fileStream = new FileStream("blabla");
> PinvokeStuff.PinvokeMethod(fileStream.Handle, "blabla");
> }
>
>
> That is when fileStream is no longer used the garbage collector
> can already start deleting the object wile in PinvokeMethod.
>
> Solution1 use GC.KeepAlive
> ---------
>
> public void TestMethod() {
> FileStream fileStream = new FileStream("blabla");
> PinvokeStuff.PinvokeMethod(fileStream.Handle, "blabla");
> GC.KeepAlive(fileStream); //or call fileStream.AnotherMethod()
> }
>
> Solution2 use of HandleRef
> ---------
>
> HandleRef keeps a reference to the object.
>
> Question
> --------
>
> My Question. What is the method in D? Or how does D handle this?
>
>
>
Disregard all the other post.
fakemail at hotmail.com wrote:
> ==================
> My insane thoughts
> ==================
>
> Definition
> ----------
>
> All my thoughts actually, sinds I'm insane.
> "Type Storage System", yeah I'm just dreaming.
>
> Usage
> -----
>
> Hmm, bad idea to use insane thoughts.
>
> ====================
> Programming Language
> ====================
>
> Definition
> ----------
> Some structure I format some text in, after which I use it to create a
> segmentation fault.
>
> Importing Specific Language files
> =================================
> import file;
>
> Alias on import
> ===============
> using target=boe;
>
>
>
> Including Header files
> ======================
> #include "boe.h"
>
>
> Procedures and Function overloading
> ===================================
>
> Defining
> --------
>
> Unique procedure names, when defining. When calling them the
> ambiguity can automatically be resolved, when in the right
> context.
> From C these functions can then easily be called, they
> do have a version number declared behind them.
>
> public static class Library
> {
> public static procedure DoStuff.Double (double a, double b)
> {
> }
> public static procedure DoStuff.Double.1 (double a, double b)
> {
> }
> public static procedure DoStuff.Int (int a, int b)
> {
> }
> public static procedure DoStuff.Whatever (int a, int b)
> {
> }
> public static procedure WriteLine.String (string boe)
> {
> }
> public static procedure WriteLine.Int(in boe)
> {
> }
> }
>
>
> Usage Source
> ------------
>
> double a, b;
> Library.DoStuff (a,b); //calls DoStuff.Double.1 the 1 is the version
> identifier.
>
>
> From C
> ------
>
> Darn, this won't work those are managed classes, hmm, how to expose
> those to C. No clue.
>
> Library_Add_Double_0 (a, b);
> Library_DoStuff_Whatever_0 (c, e);
>
> void Library_WriteLine_String_0(const Compiler_String * boe)
> {
> }
>
>
> Operator Overloading
> ====================
>
> Definition
> ----------
>
> Less typing, unique procedure or function names.
> Maybe get rid of const.
>
> Internals
> ---------
> public class Vector3
> {
> public static function Vector3 opMul.Vector( const Vector3 a, const Vector3 b)
> {
> }
> public static function Vector3 opMul.Scalar( const double a, const Vector3 b)
> {
> }
> }
>
> Usage
> -----
> double a; Vector3 b,c;
> c=a*b;
> c=Vector3.opMul(a,b);
> c=Vector3.opMul.Scalar(a,b);
>
> From C
> ------
> c=Library_Vector3_opMul_Vector_0 (a,b);
>
>
> Classes
> =======
>
> 1) Defining classes
> -------------------
>
> public class Test
> {
> private:
> int test;
> public:
> Test(int number)
> {
> this.test = number;
> }
> virtual procedure DoStuff(string boe)
> {
> }
> virtual function int Target()
> {
> return test;
> }
> ~Test() //Destructor
> {
> }
> }
>
> 2) Using classes
> -----------------
>
> Test a;
>
> Test a(10); //Create instance of class and call constructor on it. Test a = new
> Test(10);
>
> Test(10); //Create an instance of a class with auto naming.
>
>
> Templates
> =========
>
> Definition
> ----------
> Generics are created at runtime and templates
> must be templatized at compile time.
>
> Internals
> ---------
>
> public template class Test.[type T]
> {
> private:
> T boe;
> public:
> Test (string boe)
> {
> }
> }
>
> public generic class Collections.[type T]
> {
>
> }
>
> template class can inherit from a generic class but a
> generic class can not inherit from a template
> class.
>
> templatize Test.[int];
> templatize Test.[float];
> templatize Test.[double];
>
> public procedure string Test.[type T] (T a, T b)
> {
> return (a+b).ToString();
> }
>
> Test(a,b);
> Test.[int](a,b)
>
> type boe = Test[int];
> boe hello;
>
>
> Usage
> -----
>
> Test.[int] Hello("Assign");
> Hello[x] = boe;
>
> TypeWindow
> TypeUsage
> TypeUsage
>
> ValInt
> ValUint
>
> Test.[int]
> Test.[float];
>
>
> Test.[int] //Warning Test[int] has not been templatized,
> //warning templatization occured more than once.
>
> GNOME
> -----
>
> __Test();
>
> Library__Library(); //Destructor
> Library_Library(); //Constructor
>
>
>
> static interface
> =================
>
> Definition
> -----------
> Serves no other purpose than to give compile time errors and waste disk space.
> Sort of similar to interfaces but you can't pass it as parameter.
>
>
> Usage
> -----
>
> public static interface DesignApplicationMain
> {
> public static procedure Main();
> }
>
> public static interface class DesignStuff.[type T]
> {
> }
>
> public class MainClass: DesignApplicationMain
> {
> public static procedure Main()
> {
> }
> }
>
> public static procedure CannotAsParameter(DesignApplication parameter) //Error
> {
> }
>
> static interface and templates
> ==============================
>
> Definition
> ----------
> Static interfaces can be used with templates.
>
> Usage
> -----
> public template class Matrix.[StaticInterface T]
> {
> private T data;
> }
>
>
>
> opAppend Operator
> =================
>
> Definition
> ----------
> Very special Operator.
>
> The goal is to get rid of HTML, and change them into types.
> Sort of new script language.
>
> Limit usage of types defined in scripts can only be stored in
> volatile memory.
>
> Internal
> --------
> public class Body
> {
> public procedure opAppend.Heading1 (H1 heading) {}
> public procedure opAppend.Heading2 (H2 heading) {}
> public procedure opAppend.P (P paragraph) {}
> }
>
> Usage Source
> ------------
>
> H1 heading1;
> Body {
> heading1("The Book");
> H2("Chapter 1");
> H2("Chapter 2");
> }
> heading1.Onclick = this.HelloWorld;
>
>
> XML
> ===
>
> Xml, get rid of it. It eats up to much space.
>
> From:
>
> <html></html>
>
> To:
>
> Html {
> }
>
> And make Html a class type, with methods.
>
> Enforce Names
> =============
>
> Events start with Event
> ------------------------
> EventRightMouseButtonDown
> EventLeftMouseButtonDown
>
> Member events start with On
> ---------------------------
> public EventRightMouseButtonDown OnRightMouseButtonDown
>
> Enforce virtual or override for members calling an event start with Do
> ----------------------------------------------------------------------
>
> protected virtual procedure DoRightMouseButtonDown
> {
> if (OnRightButtonDown) OnRightButtonDown(self, blabla);
> }
>
> Maybe I'm pushing it with this enforcing.
>
> Naming Convention
> -----------------
> Never MainWindow but WindowMain, FormCustom, AttributeDllImport
>
>
> Storage Specifier
> =================
>
> Definition
> ----------
> Stores a certain type either on the disk or in memory in the current directory,
> visible only from the current computer.
>
> The names of everything stored in there must be unique, everything either
> it is stored in disk or in memory.
>
> Usage from Console
> ------------------
>
> computer permanent int Boe;
> computer memory int Hello;
>
>
> Storage Directory System
> ========================
>
> Definition
> ----------
> Storage of types and instances of types in permanent
> and volatile manner.
>
> Permanent memory is stored on a disk. When a method
> is called of a type on the disk a process is startup
> to execute the method but that won't be shown in
> the storage system.
>
> In volatile memory section are stored the instances
> of applications that are running. Methods of them
> can also be accessed from a remote machine.
>
>
> Internals
> ---------
>
> diskonly class ConsoleClass {
> console procedure Clear();
> }
>
> diskonly class Directory:ConsoleClass
> {
> diskonly private static string currentPath;
>
> console procedure Add.Directory (Directory directory)
> {
> }
> console procedure ChangeDirectory (string directory)
> {
> }
> }
>
> Usage from Console
> ------------------
>
> ChangeDirectory ("FirstDirectory");
> Clear();
>
>
> Console
> =======
>
> All the methods of the class Directory can be executed in the current directory.
> All other types can be added to a directory.
>
> Although Path can be defined as a string in memory, get rid of it. No more Path.
> Scripts starts by defining the path like
> using Library.Kernel.Routines;
>
> Oh, Code Completion in the Console, it uses the information from Reflection,
> Introspection
>
> In the console, just type everything. Use the mouse or other application if it
> becomes to hard. Wussy.
>
> Starting an Application
> =======================
>
> Definition
> ----------
>
> Starts an instance with constructor parameters, these instructions can be
> executed
> from the console as well from with the code.
>
> Note the WordApplication can only be started in memory.
>
> Usage from Console
> ------------------
>
> Applications.WordApplication; //Auto Naming of instance from console
>
> Applications.WordApplication first;
>
> computer memory Applications.WordApplication first("Mydocument"); //instance
> visible on local computer
> first.Terminate();
>
> computer memory WordApplication WordApplication; //Error names must be unique.
>
>
> need something for first &; //in background. hmm.
>
>
> ApplicationProject
> ==================
>
> Definition
> ----------
>
> Starting up a new application project from the console. Should
> be made fairly easily. No make files involved. Everything should
> already be included in the Projects.ApplicationProject, if not
> you can derive a new type from it.
>
> WordApplicationProject.Compile() of course starts up a new process, but
> this is entirely hidden from the user. From the users perspective
> it is just a type stored on the disk with a method or procedure
> Compile();
>
> Although you can derive from ApplicationProject it is difficult
> to modify once the instance is created. Auch.
>
> Usage from Console
> ------------------
>
> disk Projects.ApplicationProject WordApplicationProject;
> WordApplicationProject.AddSourceFile("");
> WordApplicationProject.EditSource("");
> WordApplicationProject.Compile();
>
> disk type WordApplication = WordApplicationProject.ExtractApplication;
>
>
> Documentation
> =============
>
> Definition
> ----------
>
> Provides information for the user and is compiled into the library.
> Reflection can get the information out of it. Every method can have
> its own documentation or any type derived from it.
>
> Package, Application, Documentation are all one single package.
>
> Example example1 {
> H1("This is an example of how to use Console.WriteLine");
> Code("
> Console.WriteLine("boe");
> ");
> }
>
>
> Internals
> ---------
>
> public class Documentation
> {
> public procedure opAppend.Header1 (H1 header);
> public procedure opAppend.Header2 (H2 header);
> }
>
> Usage
> -----
> Documentation ("This is documentation");
> Documentation boe ("This is the actual information");
>
> public procedure Dostuff()
> {
> public Documentation MyDocumentation
> {
> H1("First Chapter");
> H1("Second Chapter");
> P("This is the first
> Paragraph and I hope
> That it will work"
> );
> }
> public Documentation SecondDocumentation
> {
> }
> }
>
>
> GtkWindow ("Caption")
> {
> GtkVBox
> {
> GtkButton button1;
> GtkButton button2;
> }
> }
>
> Remote Computer
> ===============
>
> Definition
> ----------
>
> Define types and store them on a remote machine.
> A popup may appear asking the username and password.
> This can be executed in the console as well in the
> source code. Errors will occur when the type
> is not defined on the remote machine.
>
> 192.168.0.2 is actually really a fixed location
> must be able to replace it with a variable.
>
> Also a type of variable that specifies a location
> but that consists of multiple computers. A
> Type Storage System over multiple computers.
>
>
> Usage
> -----
>
> remote permanent string 192.168.0.2/Information.Boe = "Hello world";
>
>
> Transactions
> ============
>
>
>
> Package Maintainers
> ===================
>
> Definition
> ----------
> Dudes that create packages, we should try to make them go extinct.
> Seek way to make them go extinct. (not with weapons)
>
>
> Type Storage System
> ===================
>
> Definition
> ----------
> 1. Everything stored is a type or instance of a type.
> 2. Everything in that storage has a unique name.
> 3. Everything is stored in the default location defined
> by the developer.
>
> if Application.WordApplication depends on Library.Kernel.Console
> the directory defines it uniquely the package name and path.
> No extensions are needed. Console has a type.
>
> Application.InstallationManager.Install("Library.Kernel.Console");
> Application.InstallationManager.Install(200.200.200.200/Library.Kernel.Console);
>
> Possibly a layer over the existing file system.
>
> SQL
> ---
>
> Hmm, try to get rid of it.
> array.[int] list = {1,2,3,4,5};
> array.[int] numbersSmallerThan3 = list[]; //I don't know, but not SQL.
>
>
>
> Stored Procedures
> -----------------
>
> The types have methods, use those instead.
>
> //Hmm visual basic seems to be better for sql like methods.
> 192.168.0.3/thetype.Insert(address="", name=""); //Implement the code for
> referential constraints in there.
> thetype.Select(1, value<2 ); //column, expression ??
>
> Somebody else will figure it out, how this should be done.
>
> GUID
> ----
> Get rid of them. If it clashes just change the name.
>
> Library.Kernel.Boe;
> Library.Borland.Boe;
> Library.Microsoft.Boe;
> Library.Mozilla.Hehe;
>
> Application.Mozilla.MozillaBrowser;
>
>
> Versioning
> ==========
>
> Definition
> ----------
>
> In the type storage system everything is defined uniquely. That is how can we
> have
> two same types with different versioning. The version follows the name of the
> type.
>
> DirectoryMy.0
> DirectoryMy.2
> DirectoryMy.3
>
> Usage from Console
> ------------------
>
> ChangeDirectory( "DirectoryMy" ); //Goes to DirectoryMy.3
> ChangeDirectory( "DirectoryMy.2" ); //Goes to DirectoryMy.2
> CreateDirectory( "DirectoryMy" ); //Already exists error
> CreateDirectory( "DirectoryNew" ); //Creates DirectoryMy.0 but if there is only
> one
> //of them the 0 is not displayed
> disk Directory DirectoryNewer;
>
>
> Stability Level
> ===============
>
> Definition
> ----------
> Prevent libraries or applications to be linked. A new development
> project starts usually at stability level 2. Projects can be started
> with higher stability levels, such as a project to test a library.
>
> Stability level should be automatically modified by the project, from
> the moment you link your project your stability level is increased
> to the appropriate level.
>
> 0 Stable
> 1 Testing
> 2 Development Main development branch starts at dependency level 2
> 3 Experimental These are branches of the main development branch
>
>
> Package with stability level A can depend on packages of stability level B or
> lower.
> There is a distance of 2 for stability levels.
>
> A B
> -------
> 0 0
> 1 0
> 2 0
> 3 1
> 4 2
>
>
> Dependency Level
> ================
>
> Prevent libraries or applications to be linked.
> There is a distance of 1 for dependency levels.
>
> A B
> -------
> 1 0
> 2 1
> 3 2
>
> Package with dependency level A can depend on packages of dependency level B or
> lower.
>
> FUTURE DESIGN PROJECT
> =====================
>
> Definition
> ----------
>
> Define a project called specification. Design project.
> a TOP DOWN project of the entire operating system,
> starting from a users perspective.
>
> Set up a specification board, that will gather new idea's
> of an impossible unrealistic FUTURE operating system and
> programming language.
>
> Topaz of GNOME is still too realistic.
>
> Maybe a wikipedia project.
>
> Call it FUTURE DESIGN PROJECT, darn it is already a company I think.
>
>
>
>
> Distributions
> =============
>
> Package and library or more or less the same thing. They contain a list of all
> dependencies.
> and thus also in what directories these dependencies are stored.
>
> How to resolve these?
>
> Library.Kernel.MyLibrary386
> Library.Kernel.MyLibraryAMD64
>
> Above obviously suck, different names is a nono.
>
> Distribution.AMD64.Linux.Library.Kernel.MyLibrary
> Distribution.i386.Windows.Library.Kernel.MyLibrary
>
> The libraries must be in the correct directory before they can be used at all,
> because we
> are working with a fixed directory system.
>
> Distributions
> =============
> Documentation is in the source code.
>
>
> Login
> =====
> User
> Defines the user, like Users.Borland.Frederick
> Team
> Define the what is your function on this system, or team.
> (Teams.Administration, Teams.Backup)
> Password
> Password to enter the function or team.
>
> Team
> ====
>
> Definition
> ----------
>
> Team and project managed is fully integrated into the operating system,
> to login you must already join a team.
>
> Teams.Borland.DelphiTeam
>
> A: TeamLeader, TeamMember, TeamMember
> B: TeamLeader, TeamMember, TeamMember
>
> Deny
> Permit
> DenyButPermitAllow
> AllowButPermitDeny
>
> Like names Teams are structured in a tree. TeamMember can be a Team Owner.
> Team Onwer can set permissions.
>
> A user can join multiple teams.
>
> Internals
> ---------
>
> diskonly class Team
> {
> console static procedure AddUser() //blabla bla
> }
>
>
> Document Format
> ===============
>
>
> Definition
> ----------
> A Document Format based on the types on the system. Thus Html
> is a class and so is P, and any other tag.
>
> Usage
> -----
>
> using GreenParagraphs;
>
> P paragraph2;
>
> remote Html HtmlFirst {
> paragraph2 ("This is the first Paragraph");
> remote P ("This is the second Paragraph");
> P ("This is the third Paragraph");
> private P boe ("blablabla");
> A("Next Page", HtmlSecond, HtmlSecond.paragraph13);
> A("Remote Page", "212.165.156.200/HtmlPage");
> GreenParagraph("These are in green");
> P (
> "Wouldn't it be a bit
> strange to have the
> programming language
> and html integrated"
> );
> GtkWindow("Caption"); //Error could not opAppend GtkWindow to Html HtmlFirst.
> }
>
>
> GtkWindow & window = Windows[x];
> GtkWindow window = Windows[x];
>
> GtkWindow[int] & window;
>
> public class GtkWindow
> {
> private string text;
> public procedure Caption(string text)
> {
> this.text = text;
> }
> public procedure Caption.Value(string text);
> public procedure Caption.Ref(ref string text);
> {
> this.text = text;
> }
> public procedure Caption.Ref.1(ref string text)
> {
> }
> public function string Caption()
> {
> return test;
> }
> }
>
> Properties
> ==========
>
> Definition
> ----------
> The following means exactly the same, if you define the procedure
> and the function or the property.
>
> Usage
> -----
>
> public property string Caption {
> get {
> }
> set {
> }
> }
>
> public procedure Caption( string Caption)
> {
> }
>
> public function string Caption()
> {
> }
>
>
> Arrays
> ======
>
> Definition
> ----------
> Sort of a template thingy.
>
> Internals
> ---------
>
> public template TypeArray.[type T]
> {
> }
>
> Usage
> -----
> array.[int] boe;
> array.[int, 10] boe;
> array.[type] MyArray={int, string};
>
> hash.[int, string] boe = {1:"Hello", 2:"Boe"};
>
>
> Enumerated Types
> ================
>
> Usage
> -----
> boe(hello); //Copy constructor
>
> boe=hello;
>
> string
> boe = "terminal";
> boe("terminal");
>
> boe=target //only assigns reference
> boe("hehe") //Creates a new string
>
>
> public procedure Target() const
> {
> }
>
>
> public function string ReturnString.Hehe(string boe)
> {
> }
>
>
>
> Keywords
> ========
>
> Definition
> ----------
>
> Special words used by compiler such as function, public, class.
> All of them are actually enumerated types.
>
> Compiler.KeyWords.Public
> Compiler.KeyWords.Class
>
>
> Usage
> -----
>
> Keywords.Public Keywords.Procedure Target()
> {
> }
>
> Okay maybe pushing it again, overactive imagination, it serves no purpose.
>
>
> Disk Memory
> ===========
>
> perma string OnDiskText;
> memory string VolatileText("boe"); //default.
> unmanaged pointer int boe;
> managed pointer int boe;
>
> OnDiskText = VolatileText; //Creates a copy or a reference? Eh, a copy right?
>
> VolatileText = OnDiskText; //Eh pffew. maybe again a copy?
>
>
> Pointer to memory pointer to disk, instance in memory instance on disk.
> = permanew Test();
> = new Test();
>
> yeps, I don't know, need to think about this.
>
>
> Define
> ======
> A is defined using B, B is defined using C, C is defined using A.
>
> Naming Project
> ==============
>
> Give any object a unique name and classify it. This will
> give a name to every possible object, or concept.
>
> To be used in artificial intelligence, in the far future.
>
> Element.Animal.Mamal.Dog.Leg
> Element.Animal.Mamal.Cat.Leg
> Element.Animal.Mamal.Cat.Leg.LeftFrontLeg
> Element.Animal.Mamal.Cat.Leg.LeftBackLeg
> Element.Animal.Mamal.Cat.Leg.LeftBackLeg.LeftBackLegOfNeighboursCatSarah
> Element.Animal.Mamal.Cat.Leg.FrontLegs
>
>
> So given the right context Element.Animal.Mamal.Cat.Leg can refer
> to the left back leg of Sarah.
>
> Or we could use it in translation software. Instead of typing a document
> in English, French, the united nations type it in
>
> Element.Animal.Mamal.Cat
>
> Which than with an automated translator changes to
>
> to: cat
> to: kat
> to: chat
>
> Of course they can type
>
> using Element.Animal;
>
> on top of their document. :-)
>
> Environment Variables
> =====================
>
> Just volatile instantiated types in the Type Storage System. With the naming
> convention of the type storage system.
>
>
> UNIQUE
> ======
>
> Everything must be uniquely defined, but when using it, given the right context,
> ambiguity can be resolved.
>
> TYPE STORAGE SYSTEM
> ===================
>
> Eh virtual type system or type storage system or just type database.
>
> Store types and instances of types, either in permanent or volatile.
> It can store any type that you made, well ... if you can serialize it.
>
> Its usual structure is a tree of the class type Directory, which has
> methods. ChangeDirectory() is one of them.
>
>
> STOP TYPING THIS STUPID TEXT
> ============================
>
> You have been typing for more than 8 hours stop it.
> Yes, stop it now.
>
> Sorry for eating up your precious time.
>
>
> Maybe GNOME guys can implement such a system for GObject?
>
>
>
> QUESTION ABOUT D
> ================
>
> Intro
> -----
>
> I've got a question about the D programming language, and I compare it
> with what I know, so that will be C#.
>
> In C# when using Platform Invocation Services, (to call C) a managed
> type is not fully aware of this.
>
> Handle here is of type int
>
> Code below has a potential error.
>
> public void TestMethod() {
> FileStream fileStream = new FileStream("blabla");
> PinvokeStuff.PinvokeMethod(fileStream.Handle, "blabla");
> }
>
>
> That is when fileStream is no longer used the garbage collector
> can already start deleting the object wile in PinvokeMethod.
>
> Solution1 use GC.KeepAlive
> ---------
>
> public void TestMethod() {
> FileStream fileStream = new FileStream("blabla");
> PinvokeStuff.PinvokeMethod(fileStream.Handle, "blabla");
> GC.KeepAlive(fileStream); //or call fileStream.AnotherMethod()
> }
>
> Solution2 use of HandleRef
> ---------
>
> HandleRef keeps a reference to the object.
>
> Question
> --------
>
> My Question. What is the method in D? Or how does D handle this?
>
>
>
More information about the Digitalmars-d
mailing list