HaxeFoundation / hxcpp

Runtime files for c++ backend for haxe
Other
298 stars 189 forks source link

cppia can't link extern abstract enum #639

Open ibilon opened 7 years ago

ibilon commented 7 years ago

Trying to use one from cppia results in an error like:

> ./host/Host script.cppia
 in Script::0x7fffd27d7cb0
   GetFieldByName at :0 main
Could not link static _Main.E_Impl_::N1 (3)
Error : Bad link

n.hpp

#pragma once

enum N {
    N1 = 7,
    N2 = -1 
};

Host.hx

@:enum @:unreflective extern abstract E (EImpl) {
     @:native("N1") var E1;
     @:native("N2") var E2;
}

@:include("./n.hpp") @:unreflective @:native("N") extern class EImpl {}

class Host {
    public static function main () {
        trace(E.E1);
        trace(E.E2);
    }
}

Script.hx

class Script {
    public static function main () {
        Host.main();
        trace(Host.E.E1);
        trace(Host.E.E2);
    }
}

Build the host haxe -main cpp.cppia.Host -cpp host Host -D scriptable, the script haxe -main Script -cppia script.cppia and run ./host/Host script.cppia. Using -jit doesn't change anything.

It can't access _Main.E_Impl_::N1 since it's not in the host.

Sorry for the multi file example, couldn't figure out how to reduce to a single file.

hughsando commented 7 years ago

Yes, native externs are not going to work in cppia, so I'm going to need to find some kind of solution. I could potentially export the integers somehow. One problem is that the enums are "unreflective" so cppia could have trouble setting or interacting with them. I think I will need to make extern enums first-class citizens.

On Thu, Sep 21, 2017 at 5:51 PM, Valentin Lemière notifications@github.com wrote:

Trying to use one from cppia results in an error like:

./host/Host script.cppia in Script::0x7fffd27d7cb0 GetFieldByName at :0 main Could not link static _Main.EImpl::N1 (3 https://maps.google.com/?q=N1+(3&entry=gmail&source=g) Error : Bad link

n.hpp

pragma once

enum N { N1 = 7, N2 = -1 };

Host.hx

@:enum @:unreflective extern abstract E (EImpl) { @:native("N1") var E1; @:native("N2") var E2; }

@:include("./n.hpp") @:unreflective @:native("N") extern class EImpl {}

class Host { public static function main () { trace(E.E1); trace(E.E2); } }

Script.hx

class Script { public static function main () { Host.main(); trace(Host.E.E1); trace(Host.E.E2); } }

Build the host haxe -main cpp.cppia.Host -cpp host Host -D scriptable, the script haxe -main Script -cppia script.cppia and run ./host/Host script.cppia. Using -jit doesn't change anything.

Sorry for the multi file example, couldn't figure out how to reduce to a single file.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/HaxeFoundation/hxcpp/issues/639, or mute the thread https://github.com/notifications/unsubscribe-auth/ABlp1gpjGmViKqYJjBbrLR153ICN-XU7ks5skjGYgaJpZM4PfElW .

ibilon commented 7 years ago

I could try and remove the @:unreflective, but I remember having a lot of can't convert Dynamic* to nativeType.

In this sample it's fine without it (doesn't resolve the cppia error ofc).