DI Generation Needs your Help!

Adam Wilson flyboynw at gmail.com
Mon Dec 19 09:06:36 PST 2011


On Mon, 19 Dec 2011 03:53:27 -0800, so <so at so.so> wrote:

> Good work Adam!
>
> After class/struct/interface level "export" we shouldn't need it again.
> It already implies that everything (if not stated otherwise via private)  
> will be exported.

Well, I tried it that way and it didn't work on Windows. Without the  
export in front of the function declaration the function won't get  
exported to Windows in a shared library situation. I have verified this  
behavior with Walter and he assures me that, under Windows, this is the  
correct behavior. On other OS'es public works just fine and D treats  
export as public, but I work on Windows so I have to use export. I am  
working on an article for the site documenting my experiences with dynamic  
libraries and the pitfalls you can run into, including this one. Expect to  
see the initial draft after I finish DI generation.

> Removing them also would automagicaly solve the inconsistency below.
>
>> export class List : IList
>> {
>>      export void RemoveAt(ulong Index);
>>      protected int ProtectedTest(int d);
>> }
>
> On Mon, 19 Dec 2011 10:11:25 +0200, Adam Wilson <flyboynw at gmail.com>  
> wrote:
>
>> As you may all be aware, I've been trying to improve the automated  
>> generation of .di files and I now have something that I feel is  
>> testable. Currently the new code only makes the following changes.
>>
>> 1.	Function Implementations are removed
>> 2.	Private Function Declarations are removed.
>> 3.	Variable Initializers, except for const, are removed.
>>
>> Everything else is left alone. Templates and mixins are not addressed  
>> with this code and *should* not be modified. That's where I need your  
>> help, the test cases I have written cover some basic scenarios but I  
>> don't have the capability to test these changes with the diverse code  
>> base that the community has created.
>>
>> drey_ from IRC was kind enough to test build Derelict with the changes  
>> and has discovered a potential issue around private imports. Derelict  
>> uses private imports that contain types which are used in function  
>> alias declarations. As one would expect, this caused many compiler  
>> errors.  Currently, I feel that private imports should be stripped from  
>> the DI file as they are intended to be internal to the module. However,  
>> I want to put it to the community to decide, and I would especially  
>> appreciate Mr. Bright's opinion on private imports in DI files.
>>
>> If anyone wishes to test my changes against their code, you can  
>> download them from my git account here:  
>> https://LightBender@github.com/LightBender/dmd.git
>> I only ask that you inform me of anything broken and provide a test  
>> case that reproduces the error.
>>
>> The following is my current test case, it comes from a module in my  
>> project that has been modified to include the various tests I and  
>> others have been able to think of. I know for a fact that it is missing  
>> a great number of features available in D, and I would really  
>> appreciate any tests you might wish to add to this case.
>>
>> module Horizon.Collections.Basic;
>>
>> export void TestFunc(int a) {}
>> private void TestFunc2(int b) {}
>>
>> const gss = "__gshared";
>>
>> export interface IEnumerator
>> {
>> 	export @property Object Current();
>>
>> 	export bool MoveNext();
>> 	export void Reset();
>> }
>>
>> export interface ICollection
>> {
>> 	export @property uint Count();
>>
>> 	export int opApply(int delegate(ref Object) dg);
>> 	export IEnumerator GetEnumerator();
>> }
>>
>> export interface IList : ICollection
>> {
>> 	export @property bool IsFixedSize();
>> 	export @property bool IsReadOnly();
>>
>> 	export void Add(Object Value);
>> 	export void Clear();
>> 	export bool Contains(Object Value);
>> 	export Object opIndex(ulong Index);
>> 	export void opIndexAssign(Object Value, ulong Index);
>> 	export int IndexOf(Object Value);
>> 	export void Insert(ulong Index, Object Value);
>> 	export void Remove(Object Value);
>> 	export void RemoveAt(ulong Index);
>> }
>>
>> export struct StructTesting
>> {
>> 	private int i = 0;
>> 	protected int j = 1;
>>
>> 	export void ExportedStructFunc() {}
>> 	private void PrivateStructFunc() {}
>> }
>>
>> export class List : IList
>> {
>> 	export this(uint Capacity)
>> 	{
>> 		vCapacity = Capacity;
>> 		internal = new Object[4];
>> 	}
>>
>> 	private Object[] internal;
>>
>> 	private uint vCapacity = 0;
>> 	export @property uint Capacity()
>> 	{
>> 		return vCapacity;
>> 	}
>>
>> 	private uint vCount = 0;
>> 	export @property uint Count()
>> 	{
>> 		return vCount;
>> 	}
>>
>> 	export void Add(Object Value)
>> 	{
>> 		if(vCount == vCapacity) internal.length *= 2;
>>
>> 		internal[++vCount] = Value;
>> 	}
>>
>> 	export int opApply(int delegate(ref Object) dg) { return 0; }
>> 	export IEnumerator GetEnumerator() {return null;}
>>
>> 	export @property bool IsFixedSize() {return false;}
>> 	export @property bool IsReadOnly() {return false;}
>>
>> 	export void Clear() { return; }
>> 	export bool Contains(Object Value) {return false;}
>> 	export Object opIndex(ulong Index) {return null;}
>> 	export void opIndexAssign(Object Value, ulong Index) {}
>> 	export int IndexOf(Object Value) {return 0;}
>> 	export void Insert(ulong Index, Object Value) {}
>> 	export void Remove(Object Value) {}
>> 	export void RemoveAt(ulong Index) {}
>> 	private int FooTest(int c) { return c*2; }
>> 	protected int ProtectedTest(int d) { return d*3; }
>> }
>>
>>
>>
>> This is the DI file as exported with the generation changes:
>>
>> // D import file generated from 'Basic.d'
>> module Horizon.Collections.Basic;
>> export void TestFunc(int a);
>> const gss = "__gshared";
>> export interface IEnumerator
>> {
>>      export @property Object Current();
>>
>>      export bool MoveNext();
>>      export void Reset();
>> }
>>
>> export interface ICollection
>> {
>>      export @property uint Count();
>>
>>      export int opApply(int delegate(ref Object) dg);
>>      export IEnumerator GetEnumerator();
>> }
>>
>> export interface IList : ICollection
>> {
>>      export @property bool IsFixedSize();
>>
>>      export @property bool IsReadOnly();
>>
>>      export void Add(Object Value);
>>      export void Clear();
>>      export bool Contains(Object Value);
>>      export Object opIndex(ulong Index);
>>      export void opIndexAssign(Object Value, ulong Index);
>>      export int IndexOf(Object Value);
>>      export void Insert(ulong Index, Object Value);
>>      export void Remove(Object Value);
>>      export void RemoveAt(ulong Index);
>> }
>>
>> export struct StructTesting
>> {
>>      private int i;
>>
>>      protected int j;
>>
>>      export void ExportedStructFunc();
>> }
>>
>> export class List : IList
>> {
>>      export this(uint Capacity);
>>      private Object[] internal;
>>
>>      private uint vCapacity;
>>
>>      export @property uint Capacity();
>>
>>      private uint vCount;
>>
>>      export @property uint Count();
>>
>>      export void Add(Object Value);
>>      export int opApply(int delegate(ref Object) dg);
>>      export IEnumerator GetEnumerator();
>>      export @property bool IsFixedSize();
>>
>>      export @property bool IsReadOnly();
>>
>>      export void Clear();
>>      export bool Contains(Object Value);
>>      export Object opIndex(ulong Index);
>>      export void opIndexAssign(Object Value, ulong Index);
>>      export int IndexOf(Object Value);
>>      export void Insert(ulong Index, Object Value);
>>      export void Remove(Object Value);
>>      export void RemoveAt(ulong Index);
>>      protected int ProtectedTest(int d);
>> }
>>
>> Let me know what you think!


-- 
Adam Wilson
Project Coordinator
The Horizon Project
http://www.thehorizonproject.org/


More information about the Digitalmars-d mailing list