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;