Sign in to follow this  

"special" function calls (catch?)

This topic is 4492 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi there i've been trying AngelScript for a few days and find it so useful (and lack of documentation :P). Now, into the busyness: i need to make a different type of function call, which would create a new instance of that function, instead of the normal run. I explain: The main idea of this is create a pseudo multy-process management class, like the example "concurrent" that comes with AngelScript, with just a few differeces: -instead of stoping every Script (in my case: process) after a certain amount of time, every process can call a function Frame () to tell the manager it has done everything it needs to do in that frame, and thus, be sent to sleep In fact, this "frame" function is a refference to some function in the App which simply Suspends the context -Every Process is in fact, a Context. The Manager stores the Contexts into a vector, so we can do something like:
... 
for ("every Context")
   Manager.ContextVector[i]->Execute ();
End For
...
Remember: Scripts will pause themselves with a Call to Frame () My Problem: Well, i've already managed to implement the Frame () related stuff thanks to the functionality of angelscript: Register a Global Function: Frame, which simply calls ActiveContexts->Suspend (). What i CANT do and cant figure out how to do is: Catch Function Calls within the scripts. Everytime a script calls a function, this function call shoudld be taken by the App and passed to the Manager, which will then allocate the contexts and do the necessary stuff to create a new process. any ideas? EDIT: actually, what i need is a way to thell the App "hey, create a new instance of *this* Process using *this* parameters". Something like
Create_Process (MyHappyProcess, Param1, Param2, ... , ParamN)
where the N Parameters will be passed to MyHappyProcess when it is created [Edited by - ALRAZ on September 4, 2005 8:46:53 PM]

Share this post


Link to post
Share on other sites
Hi Alraz,

I'm happy you decided to stay with AngelScript, despite your feelings about the poor documentation (which I agree with).

It seems that what you want is co-routines, or at least something similar to them. Did you take a look at the co-routines example already? That sample shows how to register functions as CreateCoRoutine() and Yield() so that scripts can do the following:


struct ThreadArg
{
int count;
string str;
};
void main()
{
for(;;)
{
int count = 10;
ThreadArg a;
a.count = 3;
a.str = \" B\";
CreateCoRoutine(\"thread2\", any(@a));
while( count-- > 0 )
{
Print(\"A :\" + count + \"\\n\");
Yield();
}
}
}
void thread2(any &in arg) {
ThreadArg @a;
arg.retrieve(@a);
int count = a.count;
string str = a.str;
while( count-- > 0 )
{
Print(str + \":\" + count + \"\\n\");
Yield();
}
}



The CreateCoRoutine() function is implemented like this:


void ScriptCreateCoRoutine(string &func, asIScriptAny *arg)
{
asIScriptContext *ctx = asGetActiveContext();
if( ctx )
{
asIScriptEngine *engine = ctx->GetEngine();
string mod = engine->GetModuleNameFromIndex(ctx->GetCurrentFunction()>>16);

// We need to find the function that will be created as the co-routine
string decl = "void " + func + "(any &in)";
int funcId = engine->GetFunctionIDByDecl(mod.c_str(), decl.c_str());
if( funcId < 0 )
{
// No function could be found, raise an exception
ctx->SetException(("Function '" + decl + "' doesn't exist").c_str());
return;
}

// Create a new context for the co-routine
asIScriptContext *coctx = engine->CreateContext();
if( ctx == 0 )
{
// No context created, raise an exception
ctx->SetException("Failed to create context for co-routine");
return;
}

// Prepare the context
int r = coctx->Prepare(funcId);
if( r < 0 )
{
// Couldn't prepare the context
ctx->SetException("Failed to prepare the context for co-routine");
coctx->Release();
return;
}

// Pass the argument to the context
coctx->SetArgObject(0, arg);

// Join the current context with the new one, so that they can work together
contextManager.AddCoRoutine(coctx);
}
}



Regards,
Andreas

Share this post


Link to post
Share on other sites
Well, I don't.

AngelScript doesn't support variable parameters. So if you want to be able to send different types of parameters to different functions, you'll have to register several versions of the CreateCoRoutine() function (or whatever name you choose).

In my case, I choose to register only one version that takes a parameter of the any type. This allows the scripts to declare a structure with all the parameters they wish to pass to the other function, and the other function can safely obtain these parameters by retrieving the correct structure type.

Share this post


Link to post
Share on other sites
Thanks
Got a better understanding now

also noticed that there is no One-line assingment to struct
(dont know the name...)

i mean


struct Text
{
int X;
int Y;
string Name;
};

void InitialFunction ()
{
Text Msg;

Msg = {ScreenX / 2, 50, "Hello World"}; // THIS!!!!
}




it could save many lines of code for the script writter

Share this post


Link to post
Share on other sites
Yeah, I know. I'm not sure if it is the correct term but I call it initialization lists, and I may implement these for structs as well. But only after I have them working for arrays (which should hopefully be soon enough).

Share this post


Link to post
Share on other sites
going back into the "special function calls"

am still looking for a simplier way to implement an easy-to-use script function or reserved word to make something similar to fork (or create coroutine)

example:


void Enemy (int X, int Y, int ID)
{
while (1)
{
//do something ...
Frame (); //has done all it needs to do on a single frame
}
}

void Spawn_Enemies ()
{
spawn Enemy (10, 10, 200);
spawn Enemy (20, 75, 28);
spawn Enemy (30, 100, 40);
}






the "spawn" reserved word would call an APP function which would then create a context to the function (create a coroutine) with the apropiate params.

should i look at AngelScript's source? XD

[Edited by - ALRAZ on October 1, 2005 8:56:44 PM]

Share this post


Link to post
Share on other sites
If you want the syntax like that, then you have two choices:

1. Modify the AngelScript code to accept that kind of syntax and do what you need.

2. Use a preprocessor to convert that syntax into something that AngelScript can understand.

In a distant future version I might implement built-in co-routines like what you want. I say distant future, because there are lots of other more important features that needs to be implemented first, especially since co-routines can be added like it is done in the sample.

Share this post


Link to post
Share on other sites
Sign in to follow this