| 84 | asQWORD GetReturnedDouble(); |
| 85 | |
| 86 | asQWORD CallSystemFunctionNative(asCContext *context, asCScriptFunction *descr, void *obj, asDWORD *args, void *retPointer, asQWORD &/*retQW2*/, void *secondObject) |
| 87 | { |
| 88 | asCScriptEngine *engine = context->m_engine; |
| 89 | asSSystemFunctionInterface *sysFunc = descr->sysFuncIntf; |
| 90 | int callConv = sysFunc->callConv; |
| 91 | |
| 92 | asQWORD retQW = 0; |
| 93 | |
| 94 | void *func = (void*)sysFunc->func; |
| 95 | void **vftable; |
| 96 | |
| 97 | asDWORD argBuffer[128]; // Ought to be big enough |
| 98 | asASSERT( sysFunc->paramSize < 128 ); |
| 99 | |
| 100 | asDWORD argOffset = 0; |
| 101 | |
| 102 | SFloatRegs floatRegs; |
| 103 | asDWORD floatOffset = 0; |
| 104 | |
| 105 | // If the application function returns the value in memory then |
| 106 | // the first argument must be the pointer to that memory |
| 107 | if( sysFunc->hostReturnInMemory ) |
| 108 | { |
| 109 | asASSERT( retPointer ); |
| 110 | argBuffer[argOffset++] = (asPWORD)retPointer; |
| 111 | } |
| 112 | |
| 113 | if( callConv == ICC_CDECL_OBJFIRST || callConv == ICC_CDECL_OBJFIRST_RETURNINMEM || |
| 114 | callConv == ICC_THISCALL || callConv == ICC_THISCALL_RETURNINMEM || |
| 115 | callConv == ICC_VIRTUAL_THISCALL || callConv == ICC_VIRTUAL_THISCALL_RETURNINMEM || |
| 116 | callConv == ICC_THISCALL_OBJFIRST || callConv == ICC_VIRTUAL_THISCALL_OBJFIRST || |
| 117 | callConv == ICC_THISCALL_OBJFIRST_RETURNINMEM || callConv == ICC_VIRTUAL_THISCALL_OBJFIRST_RETURNINMEM || |
| 118 | callConv == ICC_THISCALL_OBJLAST || callConv == ICC_VIRTUAL_THISCALL_OBJLAST || |
| 119 | callConv == ICC_THISCALL_OBJLAST_RETURNINMEM || callConv == ICC_VIRTUAL_THISCALL_OBJLAST_RETURNINMEM ) |
| 120 | { |
| 121 | // Add the object pointer as the first argument |
| 122 | argBuffer[argOffset++] = (asPWORD)obj; |
| 123 | } |
| 124 | |
| 125 | if( callConv == ICC_THISCALL_OBJFIRST || callConv == ICC_VIRTUAL_THISCALL_OBJFIRST || |
| 126 | callConv == ICC_THISCALL_OBJFIRST_RETURNINMEM || callConv == ICC_VIRTUAL_THISCALL_OBJFIRST_RETURNINMEM ) |
| 127 | { |
| 128 | // Add the second object pointer |
| 129 | argBuffer[argOffset++] = (asPWORD)secondObject; |
| 130 | } |
| 131 | |
| 132 | int spos = 0; |
| 133 | for( asUINT n = 0; n < descr->parameterTypes.GetLength(); n++ ) |
| 134 | { |
| 135 | asCDataType ¶mType = descr->parameterTypes[n]; |
| 136 | if( paramType.IsObject() && !paramType.IsObjectHandle() && !paramType.IsReference() ) |
| 137 | { |
| 138 | if( paramType.GetTypeInfo()->flags & COMPLEX_MASK ) |
| 139 | { |
| 140 | // The object is passed by reference |
| 141 | argBuffer[argOffset++] = args[spos++]; |
| 142 | } |
| 143 | else |
nothing calls this directly
no test coverage detected