Jump to page: 1 2
Thread overview
Weird error when compiling.
Oct 20, 2013
Agustin
Oct 20, 2013
Agustin
Oct 20, 2013
TheFlyingFiddle
Oct 20, 2013
Agustin
Oct 20, 2013
TheFlyingFiddle
Oct 20, 2013
Agustin
Oct 20, 2013
Agustin
Oct 20, 2013
Agustin
Oct 21, 2013
bearophile
Oct 21, 2013
Agustin
Oct 21, 2013
bearophile
October 20, 2013
I'm getting Assertion failure: 'thisval && thisval->op == TOKclassreference' on line 4067 in file 'interpret.c' when compiling this.

public class Component {
    ////////////////////////////////////////////////////////////
    /// Component's unique id.
    private hash_t id;
    ....
    ////////////////////////////////////////////////////////////
    /// \brief Default constructor.
    ///
    /// \param[in] id   The id of the component
    ////////////////////////////////////////////////////////////
    public this(hash_t id) {
        this.id = id;
        this.active = true;
        this.validated = true;
    }


}

public class ComponentDetail(T) : Component {
    ////////////////////////////////////////////////////////////
    /// Component's ID as static member.
    public static hash_t ID = typeid(T).toHash;

    ////////////////////////////////////////////////////////////
    /// \brief Default constructor.
    ////////////////////////////////////////////////////////////
    public this() {
        super(ID);
    }
}
October 20, 2013
On Sunday, 20 October 2013 at 01:41:58 UTC, Agustin wrote:
> I'm getting Assertion failure: 'thisval && thisval->op == TOKclassreference' on line 4067 in file 'interpret.c' when compiling this.
>
> public class Component {
>     ////////////////////////////////////////////////////////////
>     /// Component's unique id.
>     private hash_t id;
>     ....
>     ////////////////////////////////////////////////////////////
>     /// \brief Default constructor.
>     ///
>     /// \param[in] id   The id of the component
>     ////////////////////////////////////////////////////////////
>     public this(hash_t id) {
>         this.id = id;
>         this.active = true;
>         this.validated = true;
>     }
>
>
> }
>
> public class ComponentDetail(T) : Component {
>     ////////////////////////////////////////////////////////////
>     /// Component's ID as static member.
>     public static hash_t ID = typeid(T).toHash;
>
>     ////////////////////////////////////////////////////////////
>     /// \brief Default constructor.
>     ////////////////////////////////////////////////////////////
>     public this() {
>         super(ID);
>     }
> }

Sorry i clicked the post button :(. The full code is:

I'm getting Assertion failure: 'thisval && thisval->op ==
TOKclassreference' on line 4067 in file 'interpret.c' when
compiling this.

public class Component {
      ////////////////////////////////////////////////////////////
      /// Component's unique id.
      private hash_t id;
      ....
      ////////////////////////////////////////////////////////////
      /// \brief Default constructor.
      ///
      /// \param[in] id   The id of the component
      ////////////////////////////////////////////////////////////
      public this(hash_t id) {
          this.id = id;
          this.active = true;
          this.validated = true;
      }

      ....
}

public class ComponentDetail(T) : Component {
      ////////////////////////////////////////////////////////////
      /// Component's ID as static member.
      public static hash_t ID = typeid(T).toHash;

      ////////////////////////////////////////////////////////////
      /// \brief Default constructor.
      ////////////////////////////////////////////////////////////
      public this() {
          super(ID);
      }
}

private class InputComponent : ComponentDetail!InputComponent {
}

void main() {
      auto pComponent = new InputComponent();

      writeln(pComponent.getId());
      writeln(InputComponent.ID);
}
October 20, 2013
> public class ComponentDetail(T) : Component {
>       ////////////////////////////////////////////////////////////
>       /// Component's ID as static member.
>       public static hash_t ID = typeid(T).toHash;

typeid(T).toHash can not be evaluated by the compiler at compile-time.

Placing the ID initalization in a static this should fix the problem.

eg.

public static hash_t ID;

static this()
{
  ID = typeid(T).toHash;
}
October 20, 2013
On Sunday, 20 October 2013 at 01:56:39 UTC, TheFlyingFiddle wrote:
>> public class ComponentDetail(T) : Component {
>>      ////////////////////////////////////////////////////////////
>>      /// Component's ID as static member.
>>      public static hash_t ID = typeid(T).toHash;
>
> typeid(T).toHash can not be evaluated by the compiler at compile-time.
>
> Placing the ID initalization in a static this should fix the problem.
>
> eg.
>
> public static hash_t ID;
>
> static this()
> {
>   ID = typeid(T).toHash;
> }

Anyway to evaluate the name of the class and return its hash at compile time?
October 20, 2013
> Anyway to evaluate the name of the class and return its hash at compile time?

I couldn't find the built in hash unction for strings so i used the one from http://dlang.org/hash-map.html as an example. More advanced and better hash functions can be found online.

public class ComponentDetail(T) : Component {
	////////////////////////////////////////////////////////////
	/// Component's ID as static member.
	public static hash_t ID = hash!(T);
}

hash_t hash(T)()
{
    hash_t hash;
    foreach (char c; T.stringof)
        hash = (hash * 9) + c;
    return hash;
}
October 20, 2013
On Sunday, 20 October 2013 at 02:14:55 UTC, TheFlyingFiddle wrote:
>> Anyway to evaluate the name of the class and return its hash at compile time?
>
> I couldn't find the built in hash unction for strings so i used the one from http://dlang.org/hash-map.html as an example. More advanced and better hash functions can be found online.
>
> public class ComponentDetail(T) : Component {
> 	////////////////////////////////////////////////////////////
> 	/// Component's ID as static member.
> 	public static hash_t ID = hash!(T);
> }
>
> hash_t hash(T)()
> {
>     hash_t hash;
>     foreach (char c; T.stringof)
>         hash = (hash * 9) + c;
>     return hash;
> }

Works perfectly :), now if i want to implement the same but
rather do something like

template GetHash(string character, hash_t hash = 0, size_t index
= 0) {
	static if (character[index])
		enum GetHash = GetHash(character, hash = (hash * 9) +
character[index], ++index);
	else
		enum GetHash = hash;
}

How should i implement it?
October 20, 2013
On Sunday, 20 October 2013 at 21:54:37 UTC, Agustin wrote:
> On Sunday, 20 October 2013 at 02:14:55 UTC, TheFlyingFiddle wrote:
>>> Anyway to evaluate the name of the class and return its hash at compile time?
>>
>> I couldn't find the built in hash unction for strings so i used the one from http://dlang.org/hash-map.html as an example. More advanced and better hash functions can be found online.
>>
>> public class ComponentDetail(T) : Component {
>> 	////////////////////////////////////////////////////////////
>> 	/// Component's ID as static member.
>> 	public static hash_t ID = hash!(T);
>> }
>>
>> hash_t hash(T)()
>> {
>>    hash_t hash;
>>    foreach (char c; T.stringof)
>>        hash = (hash * 9) + c;
>>    return hash;
>> }
>
> Works perfectly :), now if i want to implement the same but
> rather do something like
>
> template GetHash(string character, hash_t hash = 0, size_t index
> = 0) {
> 	static if (character[index])
> 		enum GetHash = GetHash(character, hash = (hash * 9) +
> character[index], ++index);
> 	else
> 		enum GetHash = hash;
> }
>
> How should i implement it?

I came up with something like


template GetHash(string character, hash_t hash = 0, size_t index = 0) {
	static if (index < character.length)
		enum GetHash = GetHash!(character, (hash * 9) + character[index], index + 1);
	else
		enum GetHash = hash;
}
October 20, 2013
On Sunday, 20 October 2013 at 22:04:49 UTC, Agustin wrote:
> On Sunday, 20 October 2013 at 21:54:37 UTC, Agustin wrote:
>> On Sunday, 20 October 2013 at 02:14:55 UTC, TheFlyingFiddle wrote:
>>>> Anyway to evaluate the name of the class and return its hash at compile time?
>>>
>>> I couldn't find the built in hash unction for strings so i used the one from http://dlang.org/hash-map.html as an example. More advanced and better hash functions can be found online.
>>>
>>> public class ComponentDetail(T) : Component {
>>> 	////////////////////////////////////////////////////////////
>>> 	/// Component's ID as static member.
>>> 	public static hash_t ID = hash!(T);
>>> }
>>>
>>> hash_t hash(T)()
>>> {
>>>   hash_t hash;
>>>   foreach (char c; T.stringof)
>>>       hash = (hash * 9) + c;
>>>   return hash;
>>> }
>>
>> Works perfectly :), now if i want to implement the same but
>> rather do something like
>>
>> template GetHash(string character, hash_t hash = 0, size_t index
>> = 0) {
>> 	static if (character[index])
>> 		enum GetHash = GetHash(character, hash = (hash * 9) +
>> character[index], ++index);
>> 	else
>> 		enum GetHash = hash;
>> }
>>
>> How should i implement it?
>
> I came up with something like
>
>
> template GetHash(string character, hash_t hash = 0, size_t index = 0) {
> 	static if (index < character.length)
> 		enum GetHash = GetHash!(character, (hash * 9) + character[index], index + 1);
> 	else
> 		enum GetHash = hash;
> }

And the final template is

template Hash(string text, hash_t hash = 0, size_t index = 0) {
	static if (index < text.length)
		enum Hash = Hash!(text, (hash ^ text[index]) * 1099511628211UL, index + 1);
	else
		enum Hash = hash;
}

:D
October 21, 2013
Agustin:

> Sorry i clicked the post button :(. The full code is:

I don't see your error with the following code, please give the code that gives the error, so we can fix the compiler bug:


public class Component {
      ////////////////////////////////////////////////////////////
      /// Component's unique id.
      private hash_t id;
      ....
      ////////////////////////////////////////////////////////////
      /// \brief Default constructor.
      ///
      /// \param[in] id   The id of the component
      ////////////////////////////////////////////////////////////
      public this(hash_t id) {
          this.id = id;
          this.active = true;
          this.validated = true;
      }

      ....
}

public class ComponentDetail(T) : Component {
      ////////////////////////////////////////////////////////////
      /// Component's ID as static member.
      public static hash_t ID = typeid(T).toHash;

      ////////////////////////////////////////////////////////////
      /// \brief Default constructor.
      ////////////////////////////////////////////////////////////
      public this() {
          super(ID);
      }
}

private class InputComponent : ComponentDetail!InputComponent {
}

void main() {
      auto pComponent = new InputComponent();

      writeln(pComponent.getId());
      writeln(InputComponent.ID);
}



Bye,
bearophile
October 21, 2013
On Monday, 21 October 2013 at 00:13:59 UTC, bearophile wrote:
> Agustin:
>
>> Sorry i clicked the post button :(. The full code is:
>
> I don't see your error with the following code, please give the code that gives the error, so we can fix the compiler bug:
>
>
> public class Component {
>       ////////////////////////////////////////////////////////////
>       /// Component's unique id.
>       private hash_t id;
>       ....Assertion failure: 'thisval && thisval->op ==
TOKclassreference' on line 4067 in file 'interpret.c' when
compiling this.
>       ////////////////////////////////////////////////////////////
>       /// \brief Default constructor.
>       ///
>       /// \param[in] id   The id of the component
>       ////////////////////////////////////////////////////////////
>       public this(hash_t id) {
>           this.id = id;
>           this.active = true;
>           this.validated = true;
>       }
>
>       ....
> }
>
> public class ComponentDetail(T) : Component {
>       ////////////////////////////////////////////////////////////
>       /// Component's ID as static member.
>       public static hash_t ID = typeid(T).toHash;
>
>       ////////////////////////////////////////////////////////////
>       /// \brief Default constructor.
>       ////////////////////////////////////////////////////////////
>       public this() {
>           super(ID);
>       }
> }
>
> private class InputComponent : ComponentDetail!InputComponent {
> }
>
> void main() {
>       auto pComponent = new InputComponent();
>
>       writeln(pComponent.getId());
>       writeln(InputComponent.ID);
> }
>
>
>
> Bye,
> bearophile

The code is: http://pastebin.com/510YK2Se
Using (LDC 0.12.0-beta 1 Ubuntu): http://pastebin.com/2gAWnYyr
Using (DMD Windows): Assertion failure: 'thisval && thisval->op ==
TOKclassreference' on line 4067 in file 'interpret.c' when
compiling this.
« First   ‹ Prev
1 2