diff --git a/call_dynamic.cpp b/call_dynamic.cpp new file mode 100644 index 0000000..565db21 --- /dev/null +++ b/call_dynamic.cpp @@ -0,0 +1,46 @@ +#include "pbvm.h" + +// any Call_Dynamic( powerobject apow, "function_name", ... / * arguments * / ) +// With this function we can dynamically choose the name of the function to call. + +DWORD __declspec(dllexport) __stdcall Call_Dynamic (vm_state *vm, DWORD arg_count){ + value ret; + LONG _Result; + value * arguments = GET_EVALEDARGLIST( vm ); + pb_object * objInst = (pb_object*) arguments[0].value; + //TODO : check for valid instance of objInst + wchar_t* method = (wchar_t*)arguments[1].value; + DWORD *vmptr = (DWORD*)vm; + vmptr[ 0x0204 / 4 ] = arg_count; + vmptr[ 0x015c / 4 ] = 0; + vmptr[ 0x0158 / 4 ] = 0; + vmptr[ 0x0154 / 4 ] = (DWORD)&arguments[2];//skip first and second args + _Result = ob_invoke_dynamic ( + (value*)objInst, + NULL, + 0 ,//FUNCTION + method, + arg_count - 2, + (void*)&arguments[2], + &ret ); + //check for exception + if(GET_THROWNEXCEPTION(vm)){ + DWORD unk_struct_ptr = vmptr[ 0x0160 ]; + *((WORD*)(unk_struct_ptr + 6)) = 8; + WORD* unk_struct_mbr_ptr = (WORD*)(unk_struct_ptr + 4); + *unk_struct_mbr_ptr &= 0x0FFFE; + *unk_struct_mbr_ptr |= 1; + } + value * called_return_value = GET_CALLEDRETURNVALUE(vm); + if(ret.flags == 0x1d01){ //try to know if "ret" is valid or not + ot_no_return_val(vm); + } + else { + ot_set_return_val(vm, &ret); + } + return 1; +} + +//TODO: +//any Call_Dynamic_Event( powerobject apow, "event_name", ... / * arguments * / ) +//any Call_Dynamic_Transpose( powerobject apow, "method", any args[] ) : so that arguments can be pushed dynamically in powerscript. diff --git a/fastfuncs.def b/fastfuncs.def index 4738edb..e2aad86 100644 --- a/fastfuncs.def +++ b/fastfuncs.def @@ -31,3 +31,4 @@ Orca_Destroy Orca_Import Orca_Regenerate Orca_Rebuild +Call_Dynamic \ No newline at end of file diff --git a/fastfuncs.sln b/fastfuncs.sln index a22fd97..0a0d2f3 100644 --- a/fastfuncs.sln +++ b/fastfuncs.sln @@ -1,21 +1,28 @@  -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fastfuncs", "fastfuncs.vcproj", "{49C7C013-8F72-4D66-87B4-42F44AB496B0}" +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fastfuncs", "fastfuncs.vcxproj", "{49C7C013-8F72-4D66-87B4-42F44AB496B0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug105|Win32 = Debug105|Win32 Release100|Win32 = Release100|Win32 Release105|Win32 = Release105|Win32 Release110|Win32 = Release110|Win32 Release115|Win32 = Release115|Win32 Release120|Win32 = Release120|Win32 Release125|Win32 = Release125|Win32 + Release170|Win32 = Release170|Win32 + Release190|Win32 = Release190|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Debug|Win32.ActiveCfg = Debug|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Debug|Win32.Build.0 = Debug|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Debug105|Win32.ActiveCfg = Debug105|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Debug105|Win32.Build.0 = Debug105|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release100|Win32.ActiveCfg = Release100|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release100|Win32.Build.0 = Release100|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release105|Win32.ActiveCfg = Release105|Win32 @@ -28,8 +35,15 @@ Global {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release120|Win32.Build.0 = Release120|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release125|Win32.ActiveCfg = Release125|Win32 {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release125|Win32.Build.0 = Release125|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release170|Win32.ActiveCfg = Release170|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release170|Win32.Build.0 = Release170|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release190|Win32.ActiveCfg = Release190|Win32 + {49C7C013-8F72-4D66-87B4-42F44AB496B0}.Release190|Win32.Build.0 = Release190|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {81143B54-D5B5-48D2-87E2-AFEE03D49068} + EndGlobalSection EndGlobal diff --git a/fastfuncs.vcproj b/fastfuncs.vcproj index 60232c0..8263c89 100644 --- a/fastfuncs.vcproj +++ b/fastfuncs.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + @@ -595,6 +671,10 @@ RelativePath=".\blob_funcs.cpp" > + + @@ -659,6 +739,15 @@ CompileAsManaged="0" /> + + + index==0 || state->group_name==NULL) return; - wnsprintf(temp, 256, L"%s.%s.%s Line: %d",state->group_name, state->class_name, state->routine_name, line_no); + if (wcscmp(state->group_name, state->class_name) == 0) { + if (wcscmp(state->group_name, state->routine_name) == 0) { + wnsprintf(temp, 256, L"%s Line: %d", state->routine_name, line_no); + } else { + wnsprintf(temp, 256, L"%s.%s Line: %d", state->group_name, state->routine_name, line_no); + } + } else { + wnsprintf(temp, 256, L"%s.%s.%s Line: %d", state->group_name, state->class_name, state->routine_name, line_no); + } if (state->values != NULL){ value *val=ot_array_index(state->vm, state->values, state->index -1); set_string(state->vm, temp, val); @@ -79,7 +87,9 @@ DWORD __declspec(dllexport) __stdcall Stack_Trace (vm_state *vm, DWORD arg_count ret.type=7; ret.flags=0x0500; - stack_build_string(&state, -1); + current_stack_info* csti = ob_get_current_stack_location( vm ); + stack_build_string(&state, csti->current_line_no ); + pbstg_fee( vm, (void*) csti ); ot_assign_ref_array(vm, lv_values->ptr, state.values, 0, 0); ot_set_return_val(vm, &ret); @@ -99,7 +109,10 @@ int WINAPI filter(LPEXCEPTION_POINTERS ptrs){ void *stack_list = GET_STACKLIST(last_vm); shlist_traversal(stack_list, &state, callback); - stack_build_string(&state, -1); + current_stack_info* csti = ob_get_current_stack_location( last_vm ); + stack_build_string(&state, csti->current_line_no); + pbstg_fee( last_vm, (void*) csti ); + MessageBoxW(NULL, buffer, L"Unexpected GPF", MB_OK); } return EXCEPTION_EXECUTE_HANDLER;