Index: src/wasm/wasm-debug.cc |
diff --git a/src/wasm/wasm-debug.cc b/src/wasm/wasm-debug.cc |
index 414ce91af6ed0ce5f2e257893ac6be2710aa4cc7..f794323dca404cb3f7af2be08f03330d4f83291e 100644 |
--- a/src/wasm/wasm-debug.cc |
+++ b/src/wasm/wasm-debug.cc |
@@ -20,6 +20,7 @@ enum { |
kWasmDebugInfoWasmObj, |
kWasmDebugInfoWasmBytesHash, |
kWasmDebugInfoFunctionByteOffsets, |
+ kWasmDebugInfoFunctionScripts, |
kWasmDebugInfoNumEntries |
}; |
@@ -95,6 +96,11 @@ Handle<WasmDebugInfo> WasmDebugInfo::New(Handle<JSObject> wasm) { |
Handle<Object> hash_obj = factory->NewNumberFromInt(hash, TENURED); |
arr->set(kWasmDebugInfoWasmBytesHash, *hash_obj); |
+ int num_functions = wasm::GetNumberOfFunctions(*wasm); |
+ Handle<FixedArray> functionScripts = |
+ factory->NewFixedArray(num_functions, TENURED); |
+ arr->set(kWasmDebugInfoFunctionScripts, *functionScripts); |
+ |
return Handle<WasmDebugInfo>::cast(arr); |
} |
@@ -106,7 +112,9 @@ bool WasmDebugInfo::IsDebugInfo(Object *object) { |
IsWasmObject(arr->get(kWasmDebugInfoWasmObj)) && |
arr->get(kWasmDebugInfoWasmBytesHash)->IsNumber() && |
(arr->get(kWasmDebugInfoFunctionByteOffsets)->IsUndefined(isolate) || |
- arr->get(kWasmDebugInfoFunctionByteOffsets)->IsByteArray()); |
+ arr->get(kWasmDebugInfoFunctionByteOffsets)->IsByteArray()) && |
+ (arr->get(kWasmDebugInfoFunctionScripts)->IsUndefined(isolate) || |
+ arr->get(kWasmDebugInfoFunctionScripts)->IsFixedArray()); |
} |
WasmDebugInfo *WasmDebugInfo::cast(Object *object) { |
@@ -118,6 +126,40 @@ JSObject *WasmDebugInfo::wasm_object() { |
return JSObject::cast(get(kWasmDebugInfoWasmObj)); |
} |
+Script *WasmDebugInfo::GetFunctionScript(int func_index) { |
+ Isolate *isolate = GetIsolate(); |
+ FixedArray *scripts = FixedArray::cast(get(kWasmDebugInfoFunctionScripts)); |
+ DCHECK(func_index >= 0 && func_index < scripts->length()); |
+ Object *script_or_undef = scripts->get(func_index); |
+ if (!script_or_undef->IsUndefined(isolate)) { |
+ return Script::cast(script_or_undef); |
+ } |
+ |
+ JSObject *wasm0 = wasm_object(); |
+ Handle<JSObject> wasm(wasm0, isolate); |
+ |
+ Handle<Script> script = |
+ isolate->factory()->NewScript(isolate->factory()->empty_string()); |
+ scripts->set(func_index, *script); |
+ |
+ script->set_type(Script::TYPE_WASM); |
+ |
+ Handle<ByteArray> offset_arr(GetOrCreateFunctionOffsetTable(this), isolate); |
+ int func_bytes_len = offset_arr->get_int(2 * func_index + 1); |
ahaas
2016/06/17 07:25:44
I think it could be a good idea to add a wrapper f
Clemens Hammacher
2016/06/17 14:01:46
Done. This now calls GetFunctionOffsetAndLength.
|
+ Handle<FixedArray> line_ends = isolate->factory()->NewFixedArray(1, TENURED); |
+ line_ends->set(0, Smi::FromInt(func_bytes_len)); |
+ line_ends->set_map(isolate->heap()->fixed_cow_array_map()); |
+ script->set_line_ends(*line_ends); |
+ |
+ int hash = 0; |
+ get(kWasmDebugInfoWasmBytesHash)->ToInt32(&hash); |
+ |
+ // TODO(clemensh): Register this new script at the debugger. |
+ USE(hash); |
+ |
+ return *script; |
+} |
+ |
bool WasmDebugInfo::SetBreakPoint(int byte_offset) { |
// TODO(clemensh): Implement this. |
return false; |