add some extra try/except to some of the stream functions so the lua part error out properly. And start adding the java varscan scantype option
This commit is contained in:
parent
2d70b881cf
commit
262cbe39b3
@ -343,7 +343,7 @@ begin
|
||||
|
||||
lua_pushstring(l, e.Message);
|
||||
|
||||
if (GetCurrentThreadId=MainThreadID) and (e.Message='Access violation') and mainform.miEnableLCLDebug.checked then
|
||||
if (GetCurrentThreadId=MainThreadID) and mainform.miEnableLCLDebug.checked then
|
||||
begin
|
||||
DebugLn('Lua Exception: '+e.Message);
|
||||
lazlogger.DumpExceptionBackTrace;
|
||||
|
@ -130,7 +130,12 @@ var
|
||||
stream: Tstream;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
lua_pushinteger(L,stream.ReadByte);
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
@ -139,7 +144,11 @@ var
|
||||
stream: Tstream;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
stream.WriteByte(lua_tointeger(L,1));
|
||||
|
||||
finally
|
||||
end;
|
||||
result:=0;
|
||||
end;
|
||||
|
||||
@ -148,7 +157,12 @@ var
|
||||
stream: Tstream;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
lua_pushinteger(L,stream.ReadWord);
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
@ -166,7 +180,12 @@ var
|
||||
stream: Tstream;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
lua_pushinteger(L,stream.ReadDword);
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
@ -184,7 +203,12 @@ var
|
||||
stream: Tstream;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
lua_pushinteger(L,stream.ReadQword);
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
@ -203,7 +227,13 @@ var
|
||||
f: single;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
stream.Read(f,sizeof(f));
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
|
||||
lua_pushnumber(L,f);
|
||||
result:=1;
|
||||
end;
|
||||
@ -225,7 +255,13 @@ var
|
||||
d: double;
|
||||
begin
|
||||
stream:=luaclass_getClassObject(L);
|
||||
try
|
||||
stream.Read(d,sizeof(d));
|
||||
except
|
||||
lua_pushstring(L,'stream error');
|
||||
lua_error(L);
|
||||
end;
|
||||
|
||||
lua_pushnumber(L,d);
|
||||
result:=1;
|
||||
end;
|
||||
|
@ -56,6 +56,8 @@ JAVACMD_SETFIELDVALUES=42
|
||||
JAVACMD_GETOBJECTCLASSNAMES=43
|
||||
|
||||
|
||||
JAVACMD_GETFIELDSIGNATUREBYOBJECT=44
|
||||
|
||||
JAVACMD_TERMINATESERVER=255
|
||||
|
||||
|
||||
@ -1732,11 +1734,46 @@ function java_getFieldDeclaringClass(klass, fieldid)
|
||||
return result
|
||||
end
|
||||
|
||||
function java_getFieldSignature(fieldid)
|
||||
function java_getFieldSignatureByObject(object, fieldid)
|
||||
--slightly faster as 2 pipecalls can be skipped if you don't have the class (get class, release class)
|
||||
local result={}
|
||||
|
||||
local ms=createMemoryStream()
|
||||
ms.writeByte(JAVACMD_GETFIELDSIGNATUREBYOBJECT)
|
||||
ms.writeQword(object)
|
||||
ms.writeQword(fieldid)
|
||||
ms.Position=0
|
||||
|
||||
javapipe.lock()
|
||||
javapipe.writeFromStream(ms)
|
||||
ms.clear()
|
||||
local sz=javapipe.readDword()
|
||||
javapipe.readIntoStream(ms, sz)
|
||||
javapipe.unlock()
|
||||
|
||||
ms.position=0
|
||||
|
||||
|
||||
local length
|
||||
length=ms.readWord()
|
||||
result.name=ms.readString(length)
|
||||
|
||||
length=ms.readWord()
|
||||
result.signature=ms.readString(length)
|
||||
|
||||
length=ms.readWord()
|
||||
result.generic=ms.readString(length)
|
||||
|
||||
ms.destroy()
|
||||
return result
|
||||
end
|
||||
|
||||
function java_getFieldSignature(class, fieldid)
|
||||
local result={}
|
||||
|
||||
local ms=createMemoryStream()
|
||||
ms.writeByte(JAVACMD_GETFIELDSIGNATURE)
|
||||
ms.writeQword(class)
|
||||
ms.writeQword(fieldid)
|
||||
ms.Position=0
|
||||
|
||||
@ -1898,11 +1935,7 @@ end
|
||||
function java_getField(jObject, fieldid, signature)
|
||||
|
||||
if signature==nil then
|
||||
--I need to figure it out myself I guess...
|
||||
local klass=java_getObjectClass(jObject)
|
||||
signature=java_getFieldSignature(fieldid).signature
|
||||
|
||||
java_dereferenceLocalObject(klass)
|
||||
signature=java_getFieldSignatureByObject(jObject, fieldid).signature
|
||||
end
|
||||
|
||||
--parse the signature
|
||||
@ -1938,10 +1971,7 @@ end
|
||||
function java_setField(jObject, fieldid, signature, value)
|
||||
if signature==nil then
|
||||
--I need to figure it out myself I guess...
|
||||
local klass=java_getObjectClass(jObject)
|
||||
signature=java_getFieldSignature(fieldid).signature
|
||||
|
||||
java_dereferenceLocalObject(klass)
|
||||
signature=java_getFieldSignatureByObject(jObject, fieldid).signature
|
||||
end
|
||||
|
||||
local vartype=Java_TypeSigToIDConversion[string.sub(signature,1,1)]
|
||||
@ -2586,16 +2616,12 @@ function varscan_showResults(count)
|
||||
local fieldname='fieldindex '..java.varscan.currentresults[i].fieldindex
|
||||
|
||||
if fieldid then
|
||||
fieldname=string.format("%x (%s)", fieldid, fieldname)
|
||||
--[[
|
||||
local fieldsig=java_getFieldSignature(object, fieldid)
|
||||
local fieldsig=java_getFieldSignatureByObject(object, fieldid)
|
||||
if fieldsig.name then
|
||||
fieldname=fieldsig.name.. ' ('..fieldname..')'
|
||||
end
|
||||
--]]
|
||||
end
|
||||
|
||||
|
||||
java.varscan.Results.Items.Add('Obj('..classname..'::'..fieldname..')')
|
||||
end
|
||||
|
||||
@ -2694,11 +2720,21 @@ function miJavaVariableScanClick(sender)
|
||||
varscan.ValueText=createLabel(varscan.controls)
|
||||
varscan.ValueText.Caption=translate("Value")
|
||||
|
||||
varscan.ScanType=createComboBox(varscan.controls)
|
||||
varscan.ScanType.Items.add('Exact Value')
|
||||
varscan.ScanType.Items.add('Increased Value')
|
||||
varscan.ScanType.Items.add('Decreased Value')
|
||||
varscan.ScanType.Items.add('Changed Value')
|
||||
varscan.ScanType.Items.add('Unchanged Value')
|
||||
-- varscan.ScanType.visible=false
|
||||
|
||||
varscan.FirstScan=createButton(varscan.controls)
|
||||
varscan.FirstScan.Caption=translate("First Scan")
|
||||
varscan.FirstScan.AutoSize=true
|
||||
|
||||
varscan.NextScan=createButton(varscan.controls)
|
||||
varscan.NextScan.Caption=translate("Next Scan")
|
||||
varscan.NextScan.AutoSize=true
|
||||
|
||||
local width=6*dpim+math.max(varscan.form.Canvas.getTextWidth(varscan.FirstScan.Caption), varscan.form.Canvas.getTextWidth(varscan.NextScan.Caption)) --guess which one will be bigger... (just in case someone translates this)
|
||||
|
||||
@ -2720,6 +2756,13 @@ function miJavaVariableScanClick(sender)
|
||||
varscan.ValueText.AnchorSideBottom.Side=asrTop
|
||||
varscan.ValueText.Anchors="[akLeft, akBottom]"
|
||||
|
||||
varscan.ScanType.AnchorSideLeft.Control=varscan.ValueBox
|
||||
varscan.ScanType.AnchorSideLeft.Side=asrLeft
|
||||
varscan.ScanType.AnchorSideRight.Control=varscan.ValueBox
|
||||
varscan.ScanType.AnchorSideRight.Side=asrRight
|
||||
varscan.ScanType.AnchorSideTop.Control=varscan.ValueBox
|
||||
varscan.ScanType.AnchorSideTop.Side=asrBottom
|
||||
varscan.ScanType.Anchors="[akTop, akLeft, akRight]"
|
||||
|
||||
varscan.FirstScan.AnchorSideLeft.Control=varscan.ValueBox
|
||||
varscan.FirstScan.AnchorSideLeft.Side=asrLeft
|
||||
|
@ -94,6 +94,7 @@ int _ZN3art9ArtMethod18HasAnyCompiledCodeEv(void* ArtMethod);
|
||||
#define JAVAVMD_GETOBJECTCLASSNAME 41
|
||||
#define JAVACMD_SETFIELDVALUES 42
|
||||
#define JAVACMD_GETOBJECTCLASSNAMES 43
|
||||
#define JAVACMD_GETFIELDSIGNATUREBYOBJECT 44
|
||||
|
||||
|
||||
|
||||
@ -263,36 +264,22 @@ void js_getscanresults(PCEJVMTIAgent agent)
|
||||
|
||||
void js_getFieldSignature(PCEJVMTIAgent agent)
|
||||
{
|
||||
debug_log("js_getFieldSignature");
|
||||
/*
|
||||
jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe);
|
||||
|
||||
GetFieldDeclaringClass(jvmtiEnv* env,
|
||||
jclass klass,
|
||||
jfieldID field,
|
||||
jclass* declaring_class_ptr)
|
||||
|
||||
|
||||
debug_log("js_getFieldSignatureByObject");
|
||||
|
||||
jclass klass=_env->GetObjectClass(agent->env, object);
|
||||
jclass c=(jclass)ps_readQword(agent->pipe);
|
||||
jfieldID fid=(jfieldID)ps_readQword(agent->pipe);
|
||||
|
||||
PMemoryStream ms=ms_create(512);
|
||||
|
||||
if (klass)
|
||||
{
|
||||
jint error;
|
||||
char *name=NULL, *sig=NULL, *gen=NULL;
|
||||
int len;
|
||||
|
||||
if (_jvmti->GetFieldName(agent->jvmti, klass, fieldid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
|
||||
if (_jvmti->GetFieldName(agent->jvmti, c, fid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
|
||||
{
|
||||
if (name)
|
||||
{
|
||||
len=(int)strlen(name);
|
||||
ms_writeWord(ms, len);
|
||||
ms_write(ms, name, len);
|
||||
//debug_log("fieldname: %s", name);
|
||||
_jvmti->Deallocate(agent->jvmti, (unsigned char *)name);
|
||||
}
|
||||
else
|
||||
@ -326,11 +313,81 @@ GetFieldDeclaringClass(jvmtiEnv* env,
|
||||
ms_writeWord(ms, 0);
|
||||
}
|
||||
|
||||
ps_writeMemStream(agent->pipe, ms);
|
||||
ms_destroy(ms);
|
||||
}
|
||||
|
||||
void js_getFieldSignatureByObject(PCEJVMTIAgent agent)
|
||||
{
|
||||
debug_log("js_getFieldSignatureByObject");
|
||||
jobject object=(jobject)ps_readQword(agent->pipe);
|
||||
jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe);
|
||||
|
||||
debug_log("js_getFieldSignatureByObject");
|
||||
|
||||
jclass klass=_env->GetObjectClass(agent->env, object);
|
||||
|
||||
PMemoryStream ms=ms_create(512);
|
||||
|
||||
if (klass)
|
||||
{
|
||||
jint error;
|
||||
char *name=NULL, *sig=NULL, *gen=NULL;
|
||||
int len;
|
||||
|
||||
if (_jvmti->GetFieldName(agent->jvmti, klass, fieldid, &name, &sig, &gen)==JVMTI_ERROR_NONE)
|
||||
{
|
||||
if (name)
|
||||
{
|
||||
len=(int)strlen(name);
|
||||
ms_writeWord(ms, len);
|
||||
ms_write(ms, name, len);
|
||||
_jvmti->Deallocate(agent->jvmti, (unsigned char *)name);
|
||||
}
|
||||
else
|
||||
ms_writeWord(ms, 0);
|
||||
|
||||
if (sig)
|
||||
{
|
||||
len=(int)strlen(sig);
|
||||
ms_writeWord(ms, len);
|
||||
ms_write(ms, sig, len);
|
||||
_jvmti->Deallocate(agent->jvmti, (unsigned char *)sig);
|
||||
}
|
||||
else
|
||||
ms_writeWord(ms, 0);
|
||||
|
||||
if (gen)
|
||||
{
|
||||
len=(int)strlen(gen);
|
||||
ms_writeWord(ms, len);
|
||||
ms_write(ms, gen, len);
|
||||
_jvmti->Deallocate(agent->jvmti,(unsigned char *)gen);
|
||||
}
|
||||
else
|
||||
ms_writeWord(ms, 0);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_log("js_getFieldSignatureByObject: GetFieldName failed");
|
||||
ms_writeWord(ms, 0);
|
||||
ms_writeWord(ms, 0);
|
||||
ms_writeWord(ms, 0);
|
||||
}
|
||||
|
||||
_env->DeleteLocalRef(agent->env, klass);
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_log("js_getFieldSignatureByObject: invalid object");
|
||||
ms_writeWord(ms, 0);
|
||||
ms_writeWord(ms, 0);
|
||||
ms_writeWord(ms, 0);
|
||||
}
|
||||
|
||||
ps_writeMemStream(agent->pipe, ms);
|
||||
ms_destroy(ms); */
|
||||
ms_destroy(ms);
|
||||
}
|
||||
|
||||
|
||||
@ -2219,6 +2276,10 @@ void launchCEJVMTIServer(JNIEnv *env, jvmtiEnv *jvmti, void* soa)
|
||||
js_getFieldSignature(agent);
|
||||
break;
|
||||
|
||||
case JAVACMD_GETFIELDSIGNATUREBYOBJECT:
|
||||
js_getFieldSignatureByObject(agent);
|
||||
break;
|
||||
|
||||
default:
|
||||
debug_log("Invalid command. Terminating server");
|
||||
terminated=1;
|
||||
|
Loading…
Reference in New Issue
Block a user