mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
More work on the recorder.
This commit is contained in:
parent
737e387076
commit
ee79053ae8
@ -66,6 +66,15 @@ record(JSContext* cx, const char* name, void* a, void* b, void* c)
|
|||||||
native_pointer_to_jsval(c));
|
native_pointer_to_jsval(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
record(JSContext* cx, const char* name, void* a, void* b, void* c, void* d)
|
||||||
|
{
|
||||||
|
js_CallRecorder(cx, name, native_pointer_to_jsval(a),
|
||||||
|
native_pointer_to_jsval(b),
|
||||||
|
native_pointer_to_jsval(c),
|
||||||
|
native_pointer_to_jsval(d));
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
record(JSContext* cx, const char* name, void* a, jsval v)
|
record(JSContext* cx, const char* name, void* a, jsval v)
|
||||||
{
|
{
|
||||||
@ -101,7 +110,7 @@ record(JSContext* cx, const char* name, void* a, jsdouble d)
|
|||||||
if (!JS_NewDoubleValue(cx, d, &v)) {
|
if (!JS_NewDoubleValue(cx, d, &v)) {
|
||||||
js_TriggerRecorderError(cx);
|
js_TriggerRecorderError(cx);
|
||||||
} else {
|
} else {
|
||||||
record(cx, name, a, v);
|
record(cx, name, a, &v);
|
||||||
}
|
}
|
||||||
JS_LeaveLocalRootScope(cx);
|
JS_LeaveLocalRootScope(cx);
|
||||||
}
|
}
|
||||||
@ -117,7 +126,7 @@ record(JSContext* cx, const char* name, void* a, void* b, jsdouble d)
|
|||||||
if (!JS_NewDoubleValue(cx, d, &v)) {
|
if (!JS_NewDoubleValue(cx, d, &v)) {
|
||||||
js_TriggerRecorderError(cx);
|
js_TriggerRecorderError(cx);
|
||||||
} else {
|
} else {
|
||||||
record(cx, name, a, b, v);
|
record(cx, name, a, b, &v);
|
||||||
}
|
}
|
||||||
JS_LeaveLocalRootScope(cx);
|
JS_LeaveLocalRootScope(cx);
|
||||||
}
|
}
|
||||||
@ -133,7 +142,7 @@ record(JSContext* cx, const char* name, void* a, void* b, void* c, jsdouble d)
|
|||||||
if (!JS_NewDoubleValue(cx, d, &v)) {
|
if (!JS_NewDoubleValue(cx, d, &v)) {
|
||||||
js_TriggerRecorderError(cx);
|
js_TriggerRecorderError(cx);
|
||||||
} else {
|
} else {
|
||||||
record(cx, name, a, b, c, v);
|
record(cx, name, a, b, c, &v);
|
||||||
}
|
}
|
||||||
JS_LeaveLocalRootScope(cx);
|
JS_LeaveLocalRootScope(cx);
|
||||||
}
|
}
|
||||||
@ -489,7 +498,7 @@ static inline bool
|
|||||||
guard_boolean_is_true(JSContext* cx, JSBool& cond)
|
guard_boolean_is_true(JSContext* cx, JSBool& cond)
|
||||||
{
|
{
|
||||||
bool ok = interp_guard_boolean_is_true(cx, cond);
|
bool ok = interp_guard_boolean_is_true(cx, cond);
|
||||||
record(cx, "boolean_is_true", &cond, BOOLEAN_TO_JSVAL(ok));
|
record(cx, "guard_boolean_is_true", &cond, BOOLEAN_TO_JSVAL(ok));
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,34 +53,208 @@
|
|||||||
track: function(from, to) {
|
track: function(from, to) {
|
||||||
this.map[to] = this.map[from];
|
this.map[to] = this.map[from];
|
||||||
},
|
},
|
||||||
/* emit an IR instruction */
|
|
||||||
emit: function(x, to) {
|
|
||||||
var x = this.code.push(x);
|
|
||||||
if (x)
|
|
||||||
this.map[to] = x;
|
|
||||||
},
|
|
||||||
/* register a change in the stack pointer */
|
/* register a change in the stack pointer */
|
||||||
setSP: function(sp) {
|
setSP: function(sp) {
|
||||||
this.SP = sp;
|
this.SP = sp;
|
||||||
},
|
},
|
||||||
|
/* emit an IR instruction */
|
||||||
|
emit: function(x, into) {
|
||||||
|
return this.code.push(x);
|
||||||
|
},
|
||||||
|
nullary: function(op, into, value) {
|
||||||
|
print("nullary=" + op + " into=" + into + " value=" + value);
|
||||||
|
var x = this.emit({ op: op, value: value});
|
||||||
|
if (into)
|
||||||
|
this.map[into] = x;
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
unary: function(op, operand, into, value) {
|
||||||
|
print("unary=" + op + " operand=" + operand + " into=" + into + " value=" + value);
|
||||||
|
var x = this.emit({ op: op, value: value, operand: operand });
|
||||||
|
if (into)
|
||||||
|
this.map[into] = x;
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
binary: function(op, left, right, into, value) {
|
||||||
|
print("binary=" + op + " left=" + left + " right=" + right + " into=" + into + " value=" + value);
|
||||||
|
var x = this.emit({ op: op, value: value, left: this.map[left], right: this.map[right] });
|
||||||
|
if (into)
|
||||||
|
this.map[into] = x;
|
||||||
|
return x;
|
||||||
|
},
|
||||||
/* create a constant and assign it to v */
|
/* create a constant and assign it to v */
|
||||||
generate_constant: function(v, vv) {
|
generate_constant: function(v, vv) {
|
||||||
this.emit({ op: "generate_constant", value: vv }, v);
|
this.nullary("generate_constant", v, vv);
|
||||||
},
|
},
|
||||||
boolean_to_jsval: function(b, v, vv) {
|
boolean_to_jsval: function(b, v, vv) {
|
||||||
this.emit({ op: "boolean_to_jsval", value: vv, operand: this.map[b] }, v);
|
this.unary("boolean_to_jsval", b, v, vv);
|
||||||
},
|
},
|
||||||
string_to_jsval: function(s, v, vv) {
|
string_to_jsval: function(s, v, vv) {
|
||||||
this.emit({ op: "string_to_jsval", value: vv, operand: this.map[s] }, v);
|
this.unary("string_to_jsval", s, v, vv);
|
||||||
},
|
},
|
||||||
object_to_jsval: function(o, v, vv) {
|
object_to_jsval: function(o, v, vv) {
|
||||||
this.emit({ op: "object_to_jsval", value: vv, operand: this.map[o] }, v);
|
this.unary("object_to_jsval", o, v, vv);
|
||||||
},
|
},
|
||||||
id_to_jsval: function(id, v, vv) {
|
id_to_jsval: function(id, v, vv) {
|
||||||
this.emit({ op: "id_to_jsval", value: vv, operand: this.map[id] }, v);
|
this.unary("id_to_jsval", id, v, vv);
|
||||||
},
|
},
|
||||||
guard_jsdouble_is_int_and_int_fits_in_jsval: function(d, i, vv, g) {
|
guard_jsdouble_is_int_and_int_fits_in_jsval: function(d, i, vv, g) {
|
||||||
this.emit({ op: "guard_jsdouble_is_int_and_int_fits_in_jsval", value: vv,
|
this.unary("guard_jsdouble_is_int_and_fits_in_jsval", d, i, vv).guard = g;
|
||||||
operand: this.map[d], state: g }, i);
|
},
|
||||||
|
int_to_jsval: function(i, v, vv) {
|
||||||
|
this.unary("int_to_jsval", i, v, vv);
|
||||||
|
},
|
||||||
|
new_double_in_rooted_value: function(d, v, vv) {
|
||||||
|
this.unary("new_double_in_rooted_value", d, v, vv);
|
||||||
|
},
|
||||||
|
guard_int_fits_in_jsval: function(i, g) {
|
||||||
|
this.unary("guard_int_fits_in_jsval", i).guard = g;
|
||||||
|
},
|
||||||
|
int_to_double: function(i, d, vv) {
|
||||||
|
this.unary("int_to_double", i, d, vv);
|
||||||
|
},
|
||||||
|
guard_uint_fits_in_jsval: function(u, g) {
|
||||||
|
this.unary("guard_uint_fits_in_jsval", u).guard = g;
|
||||||
|
},
|
||||||
|
uint_to_jsval: function(u, v, vv) {
|
||||||
|
this.unary(u, v, vv);
|
||||||
|
},
|
||||||
|
uint_to_double: function(u, d, vv) {
|
||||||
|
this.unary("uint_to_double", u, d, vv);
|
||||||
|
},
|
||||||
|
guard_jsval_is_int: function(v, g) {
|
||||||
|
this.unary("guard_jsval_is_int", v).guard = g;
|
||||||
|
},
|
||||||
|
jsval_to_int: function(v, i, vv) {
|
||||||
|
this.unary("jsval_to_int", v, i, vv);
|
||||||
|
},
|
||||||
|
guard_jsval_is_double: function(v, g) {
|
||||||
|
this.unary("guard_jsval_is_double", v).guard = g;
|
||||||
|
},
|
||||||
|
jsval_to_double: function(v, d, vv) {
|
||||||
|
this.unary("jsval_to_double", v, d, vv);
|
||||||
|
},
|
||||||
|
ValueToNumber: function(v, d, vv) {
|
||||||
|
this.unary("ValueToNumber", v, d, vv);
|
||||||
|
},
|
||||||
|
guard_jsval_is_null: function(v, g) {
|
||||||
|
this.unary("guard_jsval_is_null", v).guard = g;
|
||||||
|
},
|
||||||
|
ValueToECMAInt32: function(v, i, vv) {
|
||||||
|
this.unary("ValueToECMAInt32", v, i, vv);
|
||||||
|
},
|
||||||
|
int_to_uint: function(i, u, vv) {
|
||||||
|
this.unary("int_to_uint", i, u, vv);
|
||||||
|
},
|
||||||
|
ValueToECMAUint32: function(v, u, vv) {
|
||||||
|
this.unary("ValueToECMAUint32", v, u, vv);
|
||||||
|
},
|
||||||
|
generate_boolean_constant: function(b, vv) {
|
||||||
|
this.nullary("boolean_constant", b, vv);
|
||||||
|
},
|
||||||
|
guard_jsval_is_boolean: function(v, g) {
|
||||||
|
this.unary("guard_jsval_is_boolean", v).guard = g;
|
||||||
|
},
|
||||||
|
jsval_to_boolean: function(v, b, vv) {
|
||||||
|
this.unary("jsval_to_boolean", v, b, vv);
|
||||||
|
},
|
||||||
|
ValueToBoolean: function(v, b, vv) {
|
||||||
|
this.unary("ValueToBoolean", v, b, vv);
|
||||||
|
},
|
||||||
|
guard_jsval_is_primitive: function(v, g) {
|
||||||
|
this.unary("guard_jsval_is_primitive", v).guard = g;
|
||||||
|
},
|
||||||
|
jsval_to_object: function(v, obj, vv) {
|
||||||
|
this.unary("jsval_to_object", v, obj, vv);
|
||||||
|
},
|
||||||
|
guard_obj_is_null: function(obj, g) {
|
||||||
|
this.unary("guard_obj_is_null", obj).guard = g;
|
||||||
|
},
|
||||||
|
ValueToNonNullObject: function(v, obj, vv) {
|
||||||
|
this.unary("ValueToNonNullObject", v, obj, vv);
|
||||||
|
},
|
||||||
|
call_obj_default_value: function(obj, hint, v, vv) {
|
||||||
|
this.binary("obj_to_default_value", obj, hint, v, vv);
|
||||||
|
},
|
||||||
|
dadd: function(a, b, r, vv) {
|
||||||
|
this.binary("dadd", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dsub: function(a, b, r, vv) {
|
||||||
|
this.binary("dsub", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dmul: function(a, b, r, vv) {
|
||||||
|
this.binary("dmul", a, b, r, vv);
|
||||||
|
},
|
||||||
|
ior: function(a, b, r, vv) {
|
||||||
|
this.binary("ior", a, b, r, vv);
|
||||||
|
},
|
||||||
|
ixor: function(a, b, r, vv) {
|
||||||
|
this.binary("ixor", a, b, r, vv);
|
||||||
|
},
|
||||||
|
iand: function(a, b, r, vv) {
|
||||||
|
this.binary("iand", a, b, r, vv);
|
||||||
|
},
|
||||||
|
ilsh: function(a, b, r, vv) {
|
||||||
|
this.binary("ilsh", a, b, r, vv);
|
||||||
|
},
|
||||||
|
irsh: function(a, b, r, vv) {
|
||||||
|
this.binary("irsh", a, b, r, vv);
|
||||||
|
},
|
||||||
|
ursh: function(a, b, r, vv) {
|
||||||
|
this.binary("ursh", a, b, r, vv);
|
||||||
|
},
|
||||||
|
guard_boolean_is_true: function(b, g) {
|
||||||
|
this.unary("guard_boolean_is_true", b).guard = g;
|
||||||
|
},
|
||||||
|
icmp_lt: function(a, b, r, vv) {
|
||||||
|
this.binary("icmp_lt", a, b, r, vv);
|
||||||
|
},
|
||||||
|
icmp_le: function(a, b, r, vv) {
|
||||||
|
this.binary("icmp_le", a, b, r, vv);
|
||||||
|
},
|
||||||
|
icmp_gt: function(a, b, r, vv) {
|
||||||
|
this.binary("icmp_gt", a, b, r, vv);
|
||||||
|
},
|
||||||
|
icmp_ge: function(a, b, r, vv) {
|
||||||
|
this.binary("icmp_ge", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dcmp_lt: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_lt", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dcmp_le: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_le", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dcmp_gt: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_gt", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dcmp_ge: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_ge", a, b, r, vv);
|
||||||
|
},
|
||||||
|
dcmp_lt_ifnan: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_lt", a, b, r, vv).if_nan = true;
|
||||||
|
},
|
||||||
|
dcmp_le_ifnan: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_le", a, b, r, vv).if_nan = true;
|
||||||
|
},
|
||||||
|
dcmp_gt_ifnan: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_gt", a, b, r, vv).if_nan = true;
|
||||||
|
},
|
||||||
|
dcmp_ge_ifnan: function(a, b, r, vv) {
|
||||||
|
this.binary("dcmp_ge", a, b, r, vv).if_nan = true;
|
||||||
|
},
|
||||||
|
generate_int_constant: function(c, vv) {
|
||||||
|
this.nullary("generate_int_constant", c, vv);
|
||||||
|
},
|
||||||
|
jsval_to_string: function(v, s, vv) {
|
||||||
|
this.unary("jsval_to_string", v, s, vv);
|
||||||
|
},
|
||||||
|
CompareStrings: function(a, b, r, vv) {
|
||||||
|
this.binary("CompareStrings", a, b, r, vv);
|
||||||
|
},
|
||||||
|
guard_both_jsvals_are_int: function(a, b, g) {
|
||||||
|
this.binary("guard_both_jsvals_are_int", a, b).guard = g;
|
||||||
|
},
|
||||||
|
guard_both_jsvals_are_strings: function(a, b, g) {
|
||||||
|
this.binary("guard_both_jsvals_are_strings", a, b).guard = g;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user