Skip to content

Commit

Permalink
Engine: tidy code in few places around script interpreter
Browse files Browse the repository at this point in the history
  • Loading branch information
ivan-mogilko committed Jan 31, 2025
1 parent edcc5f2 commit 321df67
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 73 deletions.
26 changes: 13 additions & 13 deletions Engine/ac/dynobj/dynobj_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,29 +31,29 @@ using namespace AGS; // FIXME later

// register a memory handle for the object and allow script
// pointers to point to it
extern int32_t ccRegisterManagedObject(void *object, IScriptObject *, ScriptValueType obj_type = kScValScriptObject);
int32_t ccRegisterManagedObject(void *object, IScriptObject *, ScriptValueType obj_type = kScValScriptObject);
// register a de-serialized object
extern int32_t ccRegisterUnserializedObject(int index, void *object, IScriptObject *, ScriptValueType obj_type = kScValScriptObject);
int32_t ccRegisterUnserializedObject(int index, void *object, IScriptObject *, ScriptValueType obj_type = kScValScriptObject);
// unregister a particular object
extern int ccUnRegisterManagedObject(void *object);
int ccUnRegisterManagedObject(void *object);
// remove all registered objects
extern void ccUnregisterAllObjects();
void ccUnregisterAllObjects();
// serialize all objects to disk
extern void ccSerializeAllObjects(Common::Stream *out);
void ccSerializeAllObjects(Common::Stream *out);
// un-serialise all objects (will remove all currently registered ones)
extern int ccUnserializeAllObjects(Common::Stream *in, ICCObjectCollectionReader *callback);
int ccUnserializeAllObjects(Common::Stream *in, ICCObjectCollectionReader *callback);
// dispose the object if RefCount==0
extern void ccAttemptDisposeObject(int32_t handle);
void ccAttemptDisposeObject(int32_t handle);
// translate between object handles and memory addresses
extern int32_t ccGetObjectHandleFromAddress(void *address);
extern void *ccGetObjectAddressFromHandle(int32_t handle);
extern ScriptValueType ccGetObjectAddressAndManagerFromHandle(int32_t handle, void *&object, IScriptObject *&manager);
int32_t ccGetObjectHandleFromAddress(void *address);
void *ccGetObjectAddressFromHandle(int32_t handle);
ScriptValueType ccGetObjectAddressAndManagerFromHandle(int32_t handle, void *&object, IScriptObject *&manager);

extern int ccAddObjectReference(int32_t handle);
extern int ccReleaseObjectReference(int32_t handle);
int ccAddObjectReference(int32_t handle);
int ccReleaseObjectReference(int32_t handle);

typedef void (*PfnProcessManagedObject)(int handle, IScriptObject *obj);
// Iterates all managed objects identified by their Type ID, and runs a callback for each of them
extern void ccTraverseManagedObjects(const AGS::Common::String &type, PfnProcessManagedObject proc);
void ccTraverseManagedObjects(const AGS::Common::String &type, PfnProcessManagedObject proc);

#endif // __AGS_EE_DYNOBJ__DYNOBJMANAGER_H
91 changes: 31 additions & 60 deletions Engine/script/cc_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2263,79 +2263,50 @@ RuntimeScriptValue ccInstance::CallPluginFunction(void *fn_addr, const RuntimeSc
// Needless to say that such approach would require a breaking change in plugin API.
//

typedef intptr_t(*fntype0) ();
typedef intptr_t(*fntype1) (intptr_t);
typedef intptr_t(*fntype2) (intptr_t, intptr_t);
typedef intptr_t(*fntype3) (intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype4) (intptr_t, intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype5) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype6) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype7) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype8) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
typedef intptr_t(*fntype9) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);

intptr_t result;
switch (param_count)
{
case 0:
{
intptr_t (*fparam) ();
fparam = (intptr_t (*)())fn_addr;
result = fparam();
break;
}
result = reinterpret_cast<fntype0>(fn_addr)();
break;
case 1:
{
intptr_t (*fparam) (intptr_t);
fparam = (intptr_t (*)(intptr_t))fn_addr;
result = fparam(parm_value[0]);
break;
}
result = reinterpret_cast<fntype1>(fn_addr)(parm_value[0]);
break;
case 2:
{
intptr_t (*fparam) (intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1]);
break;
}
result = reinterpret_cast<fntype2>(fn_addr)(parm_value[0], parm_value[1]);
break;
case 3:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2]);
break;
}
result = reinterpret_cast<fntype3>(fn_addr)(parm_value[0], parm_value[1], parm_value[2]);
break;
case 4:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3]);
break;
}
result = reinterpret_cast<fntype4>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3]);
break;
case 5:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4]);
break;
}
result = reinterpret_cast<fntype5>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4]);
break;
case 6:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5]);
break;
}
result = reinterpret_cast<fntype6>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5]);
break;
case 7:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6]);
break;
}
result = reinterpret_cast<fntype7>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6]);
break;
case 8:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6], parm_value[7]);
break;
}
result = reinterpret_cast<fntype8>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6], parm_value[7]);
break;
case 9:
{
intptr_t (*fparam) (intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t);
fparam = (intptr_t (*)(intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t, intptr_t))fn_addr;
result = fparam(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6], parm_value[7], parm_value[8]);
break;
}
result = reinterpret_cast<fntype9>(fn_addr)(parm_value[0], parm_value[1], parm_value[2], parm_value[3], parm_value[4], parm_value[5], parm_value[6], parm_value[7], parm_value[8]);
break;
default:
cc_error("Too many arguments in call to plugin function");
return {};
Expand Down

0 comments on commit 321df67

Please sign in to comment.