Advertisement
Guest User

Angelscript by value

a guest
Oct 21st, 2012
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include "angelscriptAddOn/scriptbuilder/scriptbuilder.h"
  2. #include "stdio.h"
  3. #include <assert.h>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. void MessageCallback_(const asSMessageInfo *msg, void *param) {
  9.   const char *type = "ERR ";
  10.   if( msg->type == asMSGTYPE_WARNING )
  11.     type = "WARN";
  12.   else if( msg->type == asMSGTYPE_INFORMATION )
  13.     type = "INFO";
  14.   printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
  15. }
  16.  
  17. class Person {
  18.     public:
  19.         Person() {cout<<(int)this<<endl;this->counter = 1;}
  20.         void Constructor(void *memory) {new(memory) Person();}
  21.         void Destructor(void *memory) {((Person*)memory)->~Person();}
  22.         void printTwoInts(int a, int b) { cout << (int)this << " " << a << " " << b << endl; }
  23.         void AddRef() {cout<<this<<" 1 "<<this->counter;}
  24.         void ReleaseRef() {cout<<this<<" 2 "<<this->counter;}
  25.         static Person *refFactory() {
  26.             return new Person();
  27.         };
  28.         int counter;
  29.  
  30. };
  31.  
  32. int main() {
  33.     asIScriptEngine *scriptEngine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
  34.     int r = scriptEngine->SetMessageCallback(asFUNCTION(MessageCallback_), 0, asCALL_CDECL);assert( r >= 0 );
  35.     /*r = scriptEngine->RegisterObjectType("Person", sizeof(Person), asOBJ_REF); assert( r >= 0 );
  36.     r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_FACTORY, "Person @f()", asFUNCTION(Person::refFactory), asCALL_CDECL); assert( r >= 0 );
  37.     r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_ADDREF,  "void f()", asMETHOD(Person, AddRef), asCALL_THISCALL); assert( r >= 0 );
  38.     r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_RELEASE, "void f()", asMETHOD(Person, ReleaseRef), asCALL_THISCALL); assert( r >= 0 );*/
  39.     r = scriptEngine->RegisterObjectType("Person", sizeof(Person), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 );
  40.     r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_CONSTRUCT, "void f()", asMETHOD(Person, Constructor), asCALL_THISCALL); assert( r >= 0 );
  41.     r = scriptEngine->RegisterObjectBehaviour("Person", asBEHAVE_DESTRUCT, "void f()", asMETHOD(Person, Destructor), asCALL_THISCALL); assert( r >= 0 );
  42.  
  43.     r = scriptEngine->RegisterObjectMethod("Person", "void printTwoInts(int a, int b)", asMETHOD(Person, printTwoInts), asCALL_THISCALL);assert( r >= 0 );
  44.  
  45.     CScriptBuilder builder;
  46.     r = builder.StartNewModule(scriptEngine, "Test"); assert( r >= 0 );
  47.     r = builder.AddSectionFromMemory("void main() {\nPerson p;\np.printTwoInts(999,55);\n}"); assert( r >= 0 );
  48.     r = builder.BuildModule();if( r < 0 );  assert( r >= 0 );
  49.  
  50.     asIScriptModule *mod = scriptEngine->GetModule("Test");
  51.     asIScriptFunction *func = mod->GetFunctionByDecl("void main()");
  52.     asIScriptContext *ctx = scriptEngine->CreateContext();
  53.     ctx->Prepare(func);
  54.     r = ctx->Execute();
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement