//--------------------------------------------------------------------------- void tTJS::EvalExpression(const ttstr &expression, tTJSVariant *result, iTJSDispatch2 *context, const ttstr *name, tjs_int lineofs) { TJSSetFPUE(); if(Cache) Cache->EvalExpression(expression, result, context, name, lineofs); }
//--------------------------------------------------------------------------- void tTJS::ExecScript(const ttstr &script, tTJSVariant *result, iTJSDispatch2 *context, const ttstr *name, tjs_int lineofs) { TJSSetFPUE(); if(Cache) Cache->ExecScript(script, result, context, name, lineofs); }
//--------------------------------------------------------------------------- // for Bytecode void tTJS::LoadByteCode( const tjs_uint8* buff, size_t len, tTJSVariant *result, iTJSDispatch2 *context, const tjs_char *name ) { TJS_F_TRACE("tTJS::LoadByteCode"); TJSSetFPUE(); if(Cache) Cache->LoadByteCode(buff, len, result, context, name); }
//--------------------------------------------------------------------------- void tTJS::ExecScript(const tjs_char *script, tTJSVariant *result, iTJSDispatch2 *context, const tjs_char *name, tjs_int lineofs) { TJS_F_TRACE("tTJS::ExecScript"); TJSSetFPUE(); if(Cache) Cache->ExecScript(script, result, context, name, lineofs); }
//--------------------------------------------------------------------------- void TVPDumpOSContext(const CONTEXT &ctx) { // dump OS context block tjs_char buf[256]; // mask FP exception TJSSetFPUE(); // - context flags ttstr line; TJS_sprintf(buf, TJS_W("Context Flags : 0x%08X [ "), ctx.ContextFlags); line += buf; if(ctx.ContextFlags & CONTEXT_DEBUG_REGISTERS) line += TJS_W("CONTEXT_DEBUG_REGISTERS "); if(ctx.ContextFlags & CONTEXT_FLOATING_POINT) line += TJS_W("CONTEXT_FLOATING_POINT "); if(ctx.ContextFlags & CONTEXT_SEGMENTS) line += TJS_W("CONTEXT_SEGMENTS "); if(ctx.ContextFlags & CONTEXT_INTEGER) line += TJS_W("CONTEXT_INTEGER "); if(ctx.ContextFlags & CONTEXT_CONTROL) line += TJS_W("CONTEXT_CONTROL "); if(ctx.ContextFlags & CONTEXT_EXTENDED_REGISTERS) line += TJS_W("CONTEXT_EXTENDED_REGISTERS "); line += TJS_W("]"); TVPAddLog(line); // - debug registers TJS_sprintf(buf, TJS_W( "Debug Registers : " "0:0x%08X " "1:0x%08X " "2:0x%08X " "3:0x%08X " "6:0x%08X " "7:0x%08X "), ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr6, ctx.Dr7); TVPAddLog(buf); // - Segment registers TJS_sprintf(buf, TJS_W("Segment Registers : GS:0x%04X FS:0x%04X ES:0x%04X DS:0x%04X CS:0x%04X SS:0x%04X"), ctx.SegGs, ctx.SegFs, ctx.SegEs, ctx.SegDs, ctx.SegCs, ctx.SegSs); TVPAddLog(buf); // - Generic Integer Registers TJS_sprintf(buf, TJS_W("Integer Registers : EAX:0x%08X EBX:0x%08X ECX:0x%08X EDX:0x%08X"), ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx); TVPAddLog(buf); // - Index Registers TJS_sprintf(buf, TJS_W("Index Registers : ESI:0x%08X EDI:0x%08X"), ctx.Esi, ctx.Edi); TVPAddLog(buf); // - Pointer Registers TJS_sprintf(buf, TJS_W("Pointer Registers : EBP:0x%08X ESP:0x%08X EIP:0x%08X"), ctx.Ebp, ctx.Esp, ctx.Eip); TVPAddLog(buf); // - Flag Register TJS_sprintf(buf, TJS_W("Flag Register : 0x%08X [ "), ctx.EFlags); line = buf; TVPDumpCPUFlags(line, ctx.EFlags, (1<< 0), TJS_W("CF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 2), TJS_W("PF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 4), TJS_W("AF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 6), TJS_W("ZF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 7), TJS_W("SF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 8), TJS_W("TF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<< 9), TJS_W("IF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<10), TJS_W("DF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<11), TJS_W("OF")); TJS_sprintf(buf, TJS_W("IO%d "), (ctx.EFlags >> 12) & 0x03); line += buf; TVPDumpCPUFlags(line, ctx.EFlags, (1<<14), TJS_W("NF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<16), TJS_W("RF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<17), TJS_W("VM")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<18), TJS_W("AC")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<19), TJS_W("VF")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<20), TJS_W("VP")); TVPDumpCPUFlags(line, ctx.EFlags, (1<<21), TJS_W("ID")); line += TJS_W("]"); TVPAddLog(line); // - FP registers // -- control words TJS_sprintf(buf, TJS_W("FP Control Word : 0x%08X FP Status Word : 0x%08X FP Tag Word : 0x%08X"), ctx.FloatSave.ControlWord, ctx.FloatSave.StatusWord, ctx.FloatSave.TagWord); TVPAddLog(buf); // -- offsets/selectors TJS_sprintf(buf, TJS_W("FP Error Offset : 0x%08X FP Error Selector : 0x%08X"), ctx.FloatSave.ErrorOffset, ctx.FloatSave.ErrorSelector); TJS_sprintf(buf, TJS_W("FP Data Offset : 0x%08X FP Data Selector : 0x%08X"), ctx.FloatSave.DataOffset, ctx.FloatSave.DataSelector); // -- registers long double *ptr = (long double *)&(ctx.FloatSave.RegisterArea[0]); for(tjs_int i = 0; i < 8; i++) { TJS_sprintf(buf, TJS_W("FP ST(%d) : %28.20Lg 0x%04X%016I64X"), i, ptr[i], (unsigned int)*(tjs_uint16*)(((tjs_uint8*)(ptr + i)) + 8), *(tjs_uint64*)(ptr + i)); TVPAddLog(buf); } // -- Cr0NpxState TJS_sprintf(buf, TJS_W("FP CR0 NPX State : 0x%08X"), ctx.FloatSave.Cr0NpxState); TVPAddLog(buf); // -- SSE/SSE2 registers if(ctx.ContextFlags & CONTEXT_EXTENDED_REGISTERS) { // ExtendedRegisters is a area which meets fxsave and fxrstor instruction? #pragma pack(push,1) union xmm_t { struct { float sA; float sB; float sC; float sD; }; struct { double dA; double dB; }; struct { tjs_uint64 i64A; tjs_uint64 i64B; }; }; #pragma pack(pop) for(tjs_int i = 0; i < 8; i++) { xmm_t * xmm = (xmm_t *)(ctx.ExtendedRegisters + i * 16+ 0xa0); TJS_sprintf(buf, TJS_W("XMM %d : [ %15.8g %15.8g %15.8g %15.8g ] [ %24.16lg %24.16lg ] [ 0x%016I64X-0x%016I64X ]"), i, xmm->sD, xmm->sC, xmm->sB, xmm->sA, xmm->dB, xmm->dA, xmm->i64B, xmm->i64A); TVPAddLog(buf); } TJS_sprintf(buf, TJS_W("MXCSR : 0x%08X"), *(DWORD*)(ctx.ExtendedRegisters + 0x18)); TVPAddLog(buf); } }