Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calling object prototype functions does not work. #25

Open
JernejL opened this issue Jan 10, 2020 · 3 comments
Open

Calling object prototype functions does not work. #25

JernejL opened this issue Jan 10, 2020 · 3 comments

Comments

@JernejL
Copy link

JernejL commented Jan 10, 2020

I'm really determined to use besen in my project, and am still working on my game with it and writing a tutorial for others to do so, but i have a odd issue which i cannot figure out how to do properly, but it's most likely a bug:

I have registered native object:

BesenInst.RegisterNativeObject('Actor', TActorInterface);
The object has a property for OnCreate:

property OnCreate : TBESENObjectFunction read FOnCreate write FOnCreate;
In Javascript i've created an additional function on class:

Actor.prototype.OnCreate = function(OtherPlayer, AIClass) {
	
	console.log('actor_stack pushing - Actor.OnCreate')
	actor_stack.push(self);
	
}

Inside the constructor, i am attempting to call this function:

procedure TActorInterface.ConstructObject(const ThisArgument: TBESENValue; Arguments: PPBESENValues; CountArguments: integer);

...

	if Assigned(FOnCreate) then begin

		TBESEN(BesenInst).GarbageCollector.Protect(OnCreate);

	    try

	        AResult.ValueType := bvtBOOLEAN;
		    OnCreate.Call(BESENObjectValue(OnCreate), @CallParams, 3, AResult);

	    except

	       on e: exception do HandleBesenException(e);

	    end;

		TBESEN(BesenInst).GarbageCollector.Unprotect(OnCreate);

	end; 

This however does not work as planned, it does seem to work if a function is added on an instance of class itself - but how do i call a prototype method added in javascript - Assigned(FOnCreate) check fails and nothing is called.

Omiting assigned check does not work either.

I've also tried to check prototype - Prototype.HasProperty('OnCreate') to no avail.

I'm not totally sure how i should be handling this, any help will be appreciated.

@Coldzer0
Copy link

@Coldzer0
Copy link

Plus you can check my project for QJS (is a JS Engine with Almost Complete ES2019 & Alot of ES2020 support)

https://github.com/Coldzer0/QuickJS-Pascal

It's very easy to use, I already updated my Cmulator project to use it.

@JernejL
Copy link
Author

JernejL commented Jan 10, 2020

@Coldzer0 thanks - i did find your project and am trying to learn from it as much as possible, as it is a rare project using besen.

I also use that approach that you described and it works, the problem that i have is, that this cannot be used to call prototype functions - it works well for individual instances only, and it means copying the function to each newly created object to achieve that.

I added a function to main instance of object - by appending a function to Actor.prototype - and that itself cannot be called or reached from inside besen.

quickjs looks interesting, but so far i'll try to stick with besen - i think it has a lot of potential, it just lacks more complete examples on integration and usage scenatios.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants