122 lines
4.7 KiB
Java
122 lines
4.7 KiB
Java
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package art;
|
|
|
|
import java.lang.reflect.Executable;
|
|
import java.util.Objects;
|
|
|
|
public class Locals {
|
|
public static native void EnableLocalVariableAccess();
|
|
|
|
public static class VariableDescription {
|
|
public final long start_location;
|
|
public final int length;
|
|
public final String name;
|
|
public final String signature;
|
|
public final String generic_signature;
|
|
public final int slot;
|
|
|
|
public VariableDescription(
|
|
long start, int length, String name, String sig, String gen_sig, int slot) {
|
|
this.start_location = start;
|
|
this.length = length;
|
|
this.name = name;
|
|
this.signature = sig;
|
|
this.generic_signature = gen_sig;
|
|
this.slot = slot;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return String.format(
|
|
"VariableDescription { " +
|
|
"Sig: '%s', Name: '%s', Gen_sig: '%s', slot: %d, start: %d, len: %d" +
|
|
"}",
|
|
this.signature,
|
|
this.name,
|
|
this.generic_signature,
|
|
this.slot,
|
|
this.start_location,
|
|
this.length);
|
|
}
|
|
public boolean equals(Object other) {
|
|
if (!(other instanceof VariableDescription)) {
|
|
return false;
|
|
} else {
|
|
VariableDescription v = (VariableDescription)other;
|
|
return Objects.equals(v.signature, signature) &&
|
|
Objects.equals(v.name, name) &&
|
|
Objects.equals(v.generic_signature, generic_signature) &&
|
|
v.slot == slot &&
|
|
v.start_location == start_location &&
|
|
v.length == length;
|
|
}
|
|
}
|
|
public int hashCode() {
|
|
return Objects.hash(this.signature, this.name, this.generic_signature, this.slot,
|
|
this.start_location, this.length);
|
|
}
|
|
}
|
|
|
|
public static native VariableDescription[] GetLocalVariableTable(Executable e);
|
|
|
|
public static VariableDescription GetVariableAtLine(
|
|
Executable e, String name, String sig, int line) throws Exception {
|
|
return GetVariableAtLocation(e, name, sig, Breakpoint.lineToLocation(e, line));
|
|
}
|
|
|
|
public static VariableDescription GetVariableAtLocation(
|
|
Executable e, String name, String sig, long loc) {
|
|
VariableDescription[] vars = GetLocalVariableTable(e);
|
|
for (VariableDescription var : vars) {
|
|
if (var.start_location <= loc &&
|
|
var.length + var.start_location > loc &&
|
|
var.name.equals(name) &&
|
|
var.signature.equals(sig)) {
|
|
return var;
|
|
}
|
|
}
|
|
throw new Error(
|
|
"Unable to find variable " + name + " (sig: " + sig + ") in " + e + " at loc " + loc);
|
|
}
|
|
|
|
public static native int GetLocalVariableInt(Thread thr, int depth, int slot);
|
|
public static native long GetLocalVariableLong(Thread thr, int depth, int slot);
|
|
public static native float GetLocalVariableFloat(Thread thr, int depth, int slot);
|
|
public static native double GetLocalVariableDouble(Thread thr, int depth, int slot);
|
|
public static native Object GetLocalVariableObject(Thread thr, int depth, int slot);
|
|
public static native Object GetLocalInstance(Thread thr, int depth);
|
|
|
|
public static void SetLocalVariableInt(Thread thr, int depth, int slot, Object val) {
|
|
SetLocalVariableInt(thr, depth, slot, ((Number)val).intValue());
|
|
}
|
|
public static void SetLocalVariableLong(Thread thr, int depth, int slot, Object val) {
|
|
SetLocalVariableLong(thr, depth, slot, ((Number)val).longValue());
|
|
}
|
|
public static void SetLocalVariableFloat(Thread thr, int depth, int slot, Object val) {
|
|
SetLocalVariableFloat(thr, depth, slot, ((Number)val).floatValue());
|
|
}
|
|
public static void SetLocalVariableDouble(Thread thr, int depth, int slot, Object val) {
|
|
SetLocalVariableDouble(thr, depth, slot, ((Number)val).doubleValue());
|
|
}
|
|
public static native void SetLocalVariableInt(Thread thr, int depth, int slot, int val);
|
|
public static native void SetLocalVariableLong(Thread thr, int depth, int slot, long val);
|
|
public static native void SetLocalVariableFloat(Thread thr, int depth, int slot, float val);
|
|
public static native void SetLocalVariableDouble(Thread thr, int depth, int slot, double val);
|
|
public static native void SetLocalVariableObject(Thread thr, int depth, int slot, Object val);
|
|
}
|