Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
October 20, 2013 Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | > 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheFlyingFiddle | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | > 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheFlyingFiddle | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Agustin | 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 Re: Weird error when compiling. | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | 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. |
Copyright © 1999-2021 by the D Language Foundation