Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Flags: --expose-wasm | |
| 6 | |
| 7 load('test/mjsunit/wasm/wasm-constants.js'); | |
| 8 load('test/mjsunit/wasm/wasm-module-builder.js'); | |
| 9 | |
| 10 var builder = new WasmModuleBuilder(); | |
| 11 | |
| 12 // clang-format off | |
| 13 var func_idx = builder.addFunction('helper', kSig_v_v) | |
| 14 .addLocals({i32_count: 1}) | |
| 15 .addBody([ | |
| 16 kExprNop, | |
| 17 kExprI32Const, 12, | |
| 18 kExprSetLocal, 0, | |
| 19 ]).index; | |
| 20 | |
| 21 builder.addFunction('main', kSig_v_i) | |
| 22 .addBody([ | |
| 23 kExprGetLocal, 0, | |
| 24 kExprIf, kWasmStmt, | |
| 25 kExprBlock, kWasmStmt, | |
| 26 kExprCallFunction, func_idx, | |
| 27 kExprEnd, | |
| 28 kExprEnd | |
| 29 ]).exportAs('main'); | |
| 30 // clang-format on | |
| 31 | |
| 32 var module_bytes = builder.toArray(); | |
| 33 | |
| 34 function testFunction(bytes) { | |
| 35 var buffer = new ArrayBuffer(bytes.length); | |
| 36 var view = new Uint8Array(buffer); | |
| 37 for (var i = 0; i < bytes.length; i++) { | |
| 38 view[i] = bytes[i] | 0; | |
| 39 } | |
| 40 | |
| 41 var module = new WebAssembly.Module(buffer); | |
| 42 } | |
| 43 | |
| 44 var addSourceUrl = (code, url) => '//# sourceURL=' + url + '\n' + code; | |
| 45 | |
| 46 InspectorTest.addScript( | |
| 47 addSourceUrl(testFunction.toString(), 'v8://test/testFunction')); | |
| 48 InspectorTest.addScript('var module_bytes = ' + JSON.stringify(module_bytes)); | |
| 49 | |
| 50 Protocol.Debugger.enable(); | |
| 51 Protocol.Debugger.onScriptParsed(handleScriptParsed); | |
| 52 InspectorTest.log('Running testFunction...'); | |
| 53 Protocol.Runtime | |
| 54 .evaluate({ | |
| 55 'expression': addSourceUrl( | |
| 56 'testFunction(module_bytes)', 'v8://test/runTestFunction') | |
| 57 }) | |
| 58 .then(getBreakableLocationsForAllWasmScripts) | |
| 59 .then(() => InspectorTest.log('Finished!')) | |
| 60 .then(InspectorTest.completeTest); | |
| 61 | |
| 62 var numScripts = 0; | |
| 63 var wasmScripts = []; | |
| 64 function handleScriptParsed(messageObject) { | |
| 65 var scriptId = messageObject.params.scriptId; | |
| 66 var url = messageObject.params.url; | |
| 67 InspectorTest.log('Script nr ' + numScripts + ' parsed. URL: ' + url); | |
| 68 ++numScripts; | |
| 69 | |
| 70 if (url.startsWith('wasm://')) { | |
| 71 InspectorTest.log('This is a wasm script (nr ' + wasmScripts.length + ').'); | |
| 72 wasmScripts.push(scriptId); | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 function printBreakableLocations(message, expectedScriptId, source) { | |
| 77 if (!message.result || !message.result.locations) { | |
| 78 InspectorTest.logMessage(message); | |
| 79 return; | |
| 80 } | |
| 81 var lines = source.split('\n'); | |
| 82 var locations = message.result.locations; | |
| 83 InspectorTest.log(locations.length + ' breakable location(s):'); | |
| 84 for (var i = 0; i < locations.length; ++i) { | |
| 85 if (locations[i].scriptId != expectedScriptId) { | |
| 86 InspectorTest.log( | |
| 87 'SCRIPT ID MISMATCH!! ' + locations[i].scriptId + ' != ' + | |
| 88 expectedScriptId); | |
| 89 } | |
| 90 var line = '<illegal line number>'; | |
| 91 if (locations[i].lineNumber < lines.length) { | |
| 92 line = lines[locations[i].lineNumber]; | |
| 93 if (locations[i].columnNumber < line.length) { | |
| 94 line = line.substr(0, locations[i].columnNumber) + '>' + | |
| 95 line.substr(locations[i].columnNumber); | |
| 96 } | |
| 97 } | |
| 98 InspectorTest.log( | |
| 99 '[' + i + '] ' + locations[i].lineNumber + ':' + | |
| 100 locations[i].columnNumber + ' || ' + line); | |
| 101 } | |
| 102 } | |
| 103 | |
| 104 function getSourceFromMessage(message) { | |
| 105 if (!message.result || !message.result.scriptSource) { | |
|
kozy
2017/01/25 18:34:19
Why do you need this method? If you have only vali
Clemens Hammacher
2017/01/25 20:23:54
I thought it helps debugging in the error case. Re
| |
| 106 InspectorTest.logMessage(message); | |
| 107 return ''; | |
| 108 } | |
| 109 return message.result.scriptSource; | |
| 110 } | |
| 111 | |
| 112 function checkGetBreakableLocations(wasmScriptNr) { | |
| 113 InspectorTest.log( | |
| 114 'Requesting all breakable locations in wasm script ' + wasmScriptNr); | |
| 115 var scriptId = wasmScripts[wasmScriptNr]; | |
| 116 var source; | |
| 117 return Protocol.Debugger.getScriptSource({scriptId: scriptId}) | |
| 118 .then((message) => source = getSourceFromMessage(message)) | |
| 119 .then( | |
| 120 () => Protocol.Debugger.getPossibleBreakpoints( | |
| 121 {start: {lineNumber: 0, columnNumber: 0, scriptId: scriptId}})) | |
| 122 .then((message) => printBreakableLocations(message, scriptId, source)) | |
| 123 .then( | |
| 124 () => InspectorTest.log( | |
| 125 'Requesting breakable locations in lines [0,3)')) | |
| 126 .then(() => Protocol.Debugger.getPossibleBreakpoints({ | |
| 127 start: {lineNumber: 0, columnNumber: 0, scriptId: scriptId}, | |
| 128 end: {lineNumber: 3, columnNumber: 0, scriptId: scriptId} | |
| 129 })) | |
| 130 .then((message) => printBreakableLocations(message, scriptId, source)) | |
| 131 .then( | |
| 132 () => InspectorTest.log( | |
| 133 'Requesting breakable locations in lines [4,6)')) | |
| 134 .then(() => Protocol.Debugger.getPossibleBreakpoints({ | |
|
kozy
2017/01/25 18:34:19
Could we add following test:
getPossibleBreakpoint
Clemens Hammacher
2017/01/25 20:23:54
Fair enough :)
Added this test, moving over two fi
| |
| 135 start: {lineNumber: 4, columnNumber: 0, scriptId: scriptId}, | |
| 136 end: {lineNumber: 6, columnNumber: 0, scriptId: scriptId} | |
| 137 })) | |
| 138 .then((message) => printBreakableLocations(message, scriptId, source)); | |
| 139 } | |
| 140 | |
| 141 function getBreakableLocationsForAllWasmScripts() { | |
| 142 InspectorTest.log('Querying breakable locations for all wasm scripts now...'); | |
| 143 var promise = Promise.resolve(); | |
| 144 for (var wasmScriptNr = 0; wasmScriptNr < wasmScripts.length; | |
| 145 ++wasmScriptNr) { | |
| 146 promise = promise.then(checkGetBreakableLocations.bind(null, wasmScriptNr)); | |
| 147 } | |
| 148 return promise; | |
| 149 } | |
| OLD | NEW |