Desiring bool any_key_pressed()

2023-03-02 Thread Daren Scot Wilson via Digitalmars-d-learn
Here is a very simple version of the program I'm working on.  Is 
there a way to write is_any_key_pressed() that doesn't block, 
doesn't require the Enter key, and doesn't require dragging in 
any complex libraries or dealing with low-level stuff like 
ioctl()? Is there nothing in Phobos that provides the needed 
functionality?


I won't go into the details, but I tried threading, putting the 
getchar() in a separate thread that sets a global bool 
g_keypressed variable. It was a disaster. Maybe there's a right 
way to use threading?  I am not talented at threads.


```
import core.thread;
import core.time;
import std.stdio;
import std.conv;


void light_on() {
write("on "); stdout.flush;
}
void light_off() {
write("off "); stdout.flush;
}

void wait()  {
Duration dur = dur!("seconds")( to!int(1) );
Thread.sleep(dur);
}


bool is_any_key_pressed()  {
getchar();  // nope, requires Enter key to be pressed, and is 
blocking

return true;
}

void main(string[] args)
{

while (true)  {
light_on();
wait();
light_off();
wait();

if (is_any_key_pressed())  {
break;
}
}
}
```


Some questions with D and webassembly

2023-03-02 Thread TheZipCreator via Digitalmars-d-learn
In webassembly, there's a type called `externref`, which opaquely 
represents a javascript object. So, you could do this for 
example, with this javascript:

```js
class Foo {
constructor(x) {
this.x = x;
}
}

const imports = {
env: {
fooNew: (x) => new Foo(x),
fooX: (foo) => foo.x,
fooSetX: (foo, x) => { foo.x = x; }
}
}

WebAssembly.instantiateStreaming(fetch("./foo.wasm"), 
imports).then(module => {

let foo = module.instance.exports.f();
console.log(foo.x); // 5
module.instance.exports.g(foo);
console.log(foo.x); // 8
});
```
and this webassembly:
```wat
(module
	(import "env" "fooNew" (func $fooNew (param i32) (result 
externref)))

(import "env" "fooX" (func $fooX (result i32)))
	(import "env" "fooSetX" (func $fooSetX (param externref) (param 
i32)))

(func (export "f") (result externref)
i32.const 5
call $fooNew)
(func (export "g") (param $foo externref)
local.get $foo
i32.const 8
call $fooSetX))
```
5 and 8 get logged. Equivalent D to the webassembly part would be:
```d
extern(C):

// how to get this externref type?
externref fooNew(int);
externref fooX(externref);
void fooSetX(externref, int);

externref f() {
return fooNew();
}

void g(externref foo) {
fooSetX(foo, 8);
}
```
problem being, there exists no `externref` type. So how would you 
achieve it with ldc2?


B) In the javascript WebAssembly API, you can pass in memory like 
so:

```js
const imports = {
"mem": new WebAssembly.Memory({ initial: 1 })
}

WebAssembly.instantiateStreaming(fetch("bar.wasm"), imports, 
module => { ... });

```
then in WebAssembly
```wat
(import "mem" (memory 1))
```
so how could I do that in D? That is, I want the memory that D 
uses to be accessible to javascript (this way I can pass pointers 
between JS and D)


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn
On Friday, 3 March 2023 at 01:37:42 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

On 03/03/2023 2:33 PM, ryuukk_ wrote:

So it is a DMD bug?


Yes and thanks to you I can now say that we can absolutely get 
rid of DllMain requirement for DLLs!


glad the outcome is positive, and i apologies about earlier 
comments, i may have sounded a little bit rude





Re: Bug in DMD?

2023-03-02 Thread Vladimir Panteleev via Digitalmars-d-learn

On Friday, 3 March 2023 at 01:21:52 UTC, ryuukk_ wrote:

I have some questions:

1. why does it work with LDC?
2. why does it work with DMD when build/link in 2 step?
3. why it doesn't work when DMD is invoked once for build/link


I think these are probably coincidences and the answer can be 
summarized as "that's what ends up happening due to the details 
of the implementation".



4. is this a bug in DMD or my code is wrong?


I would say the code is wrong in principle, though as you've 
noted it can still work in some specific circumstances.



5. if it's wrong, then why does it compile/no error?


`extern(C) main` is a low-level feature, because it effectively 
turns off parts of the language. However, the rest of the program 
doesn't know that this is the case - currently the compiler 
simply assumes you know what you're doing. Maybe it's not OK that 
it's easy to use it by accident.




Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

I added a note here: https://issues.dlang.org/show_bug.cgi?id=20737


Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 03/03/2023 2:33 PM, ryuukk_ wrote:

So it is a DMD bug?


Yes and thanks to you I can now say that we can absolutely get rid of 
DllMain requirement for DLLs!


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn
On Friday, 3 March 2023 at 01:24:42 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

This works:

```d
extern(C) void main()
{
Stuff[5] temp = [
Stuff(),
Stuff(),
Stuff(),
Stuff(),
Stuff(),
];
stuffs = temp[];
stuffs[0].do_something();
}
```

```d
Stuff[] stuffs;
```

The problem here is dmd isn't initializing TLS with a value, 
but TLS itself is working.


So it is a DMD bug?


Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

This works:

```d
extern(C) void main()
{
Stuff[5] temp = [
Stuff(),
Stuff(),
Stuff(),
Stuff(),
Stuff(),
];
stuffs = temp[];
stuffs[0].do_something();
}
```

```d
Stuff[] stuffs;
```

The problem here is dmd isn't initializing TLS with a value, but TLS 
itself is working.


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn

On Friday, 3 March 2023 at 01:11:06 UTC, Vladimir Panteleev wrote:

On Friday, 3 March 2023 at 01:07:07 UTC, ryuukk_ wrote:
I couldn't figure out dustmite, so i started from 0 and 
managed to hit something:


https://github.com/ryuukk/dmd_bug

``Assertion failed: array index out of bounds, file 
game\app.d, line 5``


Wich indicates probably TLS problem?


Yeah... `rt.a.stuffs` is a TLS variable. The D runtime manages 
TLS. `extern(C) main` bypasses D runtime initialization.


I have some questions:

1. why does it work with LDC?
2. why does it work with DMD when build/link in 2 step?
3. why it doesn't work when DMD is invoked once for build/link
4. is this a bug in DMD or my code is wrong?
5. if it's wrong, then why does it compile/no error?


```sh
#!/usr/bin/env bash

set -e

build_dmd() {
echo "build dmd"
dmd \
-debug -g \
-m64 -vcolumns -betterC -w -i -i=-std -i=-core \
-Igame \
-Istuff/ \
stuff/rt/object.d \
game/app.d \
-of=game.exe
}

build_ldc() {
echo "build ldc"
ldc2 \
-d-debug -g \
-m64 -vcolumns -betterC -w -i -i=-std -i=-core \
-Igame \
-Istuff/ \
stuff/rt/object.d \
game/app.d \
-of=game.exe
}

build_dmd_and_link() {
echo "build dmd and link (2step)"
dmd \
-debug -g -c \
-m64 -vcolumns -betterC -w -i -i=-std -i=-core \
-Igame \
-Istuff/ \
stuff/rt/object.d \
game/app.d \
-of=game.obj

dmd \
-debug -g  \
-m64 -vcolumns -betterC -w -i -i=-std -i=-core \
-Igame \
-Istuff/ \
game.obj \
-of=game.exe
}


build_ldc
./game.exe
rm game.obj game.exe

build_dmd_and_link
./game.exe
rm game.obj game.exe

build_dmd
./game.exe
rm game.obj game.exe
```


Re: Bug in DMD?

2023-03-02 Thread Vladimir Panteleev via Digitalmars-d-learn

On Friday, 3 March 2023 at 01:07:07 UTC, ryuukk_ wrote:
I couldn't figure out dustmite, so i started from 0 and managed 
to hit something:


https://github.com/ryuukk/dmd_bug

``Assertion failed: array index out of bounds, file game\app.d, 
line 5``


Wich indicates probably TLS problem?


Yeah... `rt.a.stuffs` is a TLS variable. The D runtime manages 
TLS. `extern(C) main` bypasses D runtime initialization.




Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn
I couldn't figure out dustmite, so i started from 0 and managed 
to hit something:


https://github.com/ryuukk/dmd_bug

``Assertion failed: array index out of bounds, file game\app.d, 
line 5``


Wich indicates probably TLS problem?

This now reminds me of: 
https://issues.dlang.org/show_bug.cgi?id=23310


I am clueless what to do next, but at least now there is a small 
repro available for knowledgeable people


Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 03/03/2023 10:38 AM, ryuukk_ wrote:
On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

There isn't anything we can do without source.

But here is what I would do in this situation:

1. Look at the assembly at the point of debug break, from here it 
should give you hints as to why its trying to write to 
dawn.assets.Resource init array.

2. Dustmite, so we have something we can work with.


I have no idea what does 1. mean, as for 2. do you have a link for a 
guide how to setup "dustmite"?


When debugging, native debuggers i.e. Visual Studio, will provide you 
with the disassembly of the function currently being executed. Between 
this and other entries in the call stack, you can generally figure out 
what the statement is being executed just by looking at things like call 
instructions. The symbols there will be accurate.


Re: Bug in DMD?

2023-03-02 Thread Ali Çehreli via Digitalmars-d-learn

On 3/2/23 15:34, ryuukk_ wrote:

> the problem is not that it can run in the background, the problem is
> figuring out
>
> 1. how to install
> 2. how to setup
> 3. how to run

I haven't used it myself but dustmite seems to be integrated into dub. 
'dub dustmite <...>'


Ali



Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 03/03/2023 12:34 PM, ryuukk_ wrote:

1. how to install


Already is.

Comes with dmd and ldc.

You can also just do ``$ dub run digger -- args``.


2. how to setup > 3. how to run


It is a bit of a pain but the basics is you need some sort of 
compilation command, list of sources and a test to confirm if it still 
fails.


https://github.com/CyberShadow/DustMite/wiki#how-to-use-it


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn

On Thursday, 2 March 2023 at 22:24:11 UTC, H. S. Teoh wrote:
On Thu, Mar 02, 2023 at 09:55:55PM +, ryuukk_ via 
Digitalmars-d-learn wrote:

On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
> On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) 
> Andrew

> Cattermole wrote:

[...]

> > 2. Dustmite, so we have something we can work with.
> 
> [...] 2. do you have a link for a guide how to setup 
> "dustmite"?


https://dlang.org/blog/2020/04/13/dustmite-the-general-purpose-data-reduction-tool/

Dustmite automatically reduces your code to a minimal example 
that still exhibits the same problem, good for bug reports that 
are easily reproducible.  Also useful if you don't want to 
publicly share the code for whatever reason, but still want to 
provide enough information so that the dmd devs can find the 
problem and fix it.



[...]
That's is not something i like doing, it should just work, i 
shouldn't have to debug DMD, that aint my job


Dustmite can run in the background on a temporary copy of your 
code, you don't have to babysit it and can work on other things 
while it's doing its thing.



T


the problem is not that it can run in the background, the problem 
is figuring out


1. how to install
2. how to setup
3. how to run

i was initially working on my game, i shouldn't have to take a 1 
week break to debug dmd


Re: Bug in DMD?

2023-03-02 Thread H. S. Teoh via Digitalmars-d-learn
On Thu, Mar 02, 2023 at 09:55:55PM +, ryuukk_ via Digitalmars-d-learn wrote:
> On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
> > On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew
> > Cattermole wrote:
[...]
> > > 2. Dustmite, so we have something we can work with.
> > 
> > [...] 2. do you have a link for a guide how to setup "dustmite"?

https://dlang.org/blog/2020/04/13/dustmite-the-general-purpose-data-reduction-tool/

Dustmite automatically reduces your code to a minimal example that still
exhibits the same problem, good for bug reports that are easily
reproducible.  Also useful if you don't want to publicly share the code
for whatever reason, but still want to provide enough information so
that the dmd devs can find the problem and fix it.


[...]
> That's is not something i like doing, it should just work, i shouldn't
> have to debug DMD, that aint my job

Dustmite can run in the background on a temporary copy of your code, you
don't have to babysit it and can work on other things while it's doing
its thing.


T

-- 
Written on the window of a clothing store: No shirt, no shoes, no service.


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn

On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) 
Andrew Cattermole wrote:

There isn't anything we can do without source.

But here is what I would do in this situation:

1. Look at the assembly at the point of debug break, from here 
it should give you hints as to why its trying to write to 
dawn.assets.Resource init array.

2. Dustmite, so we have something we can work with.


I have no idea what does 1. mean, as for 2. do you have a link 
for a guide how to setup "dustmite"?


Better, can i send you a zip of my project? i'm not sure i'm 
willing to waste any more time trying to figure out what is wrong


That's is not something i like doing, it should just work, i 
shouldn't have to debug DMD, that aint my job


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn
On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

There isn't anything we can do without source.

But here is what I would do in this situation:

1. Look at the assembly at the point of debug break, from here 
it should give you hints as to why its trying to write to 
dawn.assets.Resource init array.

2. Dustmite, so we have something we can work with.


I have no idea what does 1. mean, as for 2. do you have a link 
for a guide how to setup "dustmite"?


Re: Bug in DMD?

2023-03-02 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

There isn't anything we can do without source.

But here is what I would do in this situation:

1. Look at the assembly at the point of debug break, from here it should 
give you hints as to why its trying to write to dawn.assets.Resource 
init array.

2. Dustmite, so we have something we can work with.


Re: Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn
It crashes with a weird message, address doesn't match the 
mangled name:


``C:\dev\kdom\projects\dawn\gl\glad\loader.d``

inside: ``module dawn.gl.glad.loader;``

![screenshot](https://i.imgur.com/sY2KcgR.png)


Bug in DMD?

2023-03-02 Thread ryuukk_ via Digitalmars-d-learn

Hello,

I encountered a weird issue, my program segfault when i feed DMD 
with my files and static libs


It doesn't when i compile with LDC

If i split the compile/link in 2 different steps, then all works 
correctly



DMD (1step: ⛔): 
https://gist.github.com/ryuukk/f0ae2ae0c8980219c04d0c6d8678940d


LDC (1step: ✅): 
https://gist.github.com/ryuukk/4c7706697583431389d5e2074548f7c4


DMD (2step: ✅): 
https://gist.github.com/ryuukk/a0373339e590ecdae91e3f05b2d81bf4



Looks like DMD is messing things up when mixing code with static 
libraries?




Toolchains:
  - DMD32 D Compiler v2.102.1
  - LDC - the LLVM D compiler (1.32.0-beta1):


Re: foreach with assoc. array

2023-03-02 Thread Salih Dincer via Digitalmars-d-learn

On Wednesday, 1 March 2023 at 19:05:10 UTC, DLearner wrote:


```
Error: variable `wk_Idx` is shadowing variable 
`for3.main.wk_Idx`

```
Why is this usage wrong?


Or use the `each` template which is almost the same as `foreach` 
to avoid the shadowing variable issue.


```d
import std.algorithm, std.range, std.stdio;

enum len = 10;
void main()
{
  int[len] IntArr, i, n;
  len.iota.each!((i, n) => IntArr[i] = n);

  IntArr.writeln; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  assert(IntArr == len.iota.array);
}
```
SDB@79