Changeset 249445 in webkit
- Timestamp:
- Sep 3, 2019 4:37:12 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r249436 r249445 1 2019-09-03 Devin Rousso <drousso@apple.com> 2 3 REGRESSION (r249078): Flaky crash in com.apple.JavaScriptCore: Inspector::InjectedScriptModule::ensureInjected 4 https://bugs.webkit.org/show_bug.cgi?id=201201 5 <rdar://problem/54771560> 6 7 Reviewed by Joseph Pecoraro. 8 9 * inspector/debugger/tail-deleted-frames-this-value.html: 10 * inspector/debugger/tail-deleted-frames-this-value-expected.txt: 11 * inspector/debugger/resources/tail-deleted-frames-this-value.js: 12 * inspector/timeline/line-column-expected.txt: 13 1 14 2019-09-03 Jiewen Tan <jiewen_tan@apple.com> 2 15 -
trunk/LayoutTests/inspector/debugger/resources/tail-deleted-frames-this-value.js
r200981 r249445 7 7 function b() { 8 8 let y = 40; 9 return a.call({aThis: 2});9 return a.call({aThis: 3}); 10 10 } 11 11 function c() { 12 12 let z = 60; 13 return b.call({bThis: 1});13 return b.call({bThis: 2}); 14 14 } 15 15 function startABC() { 16 c.call({cThis: 0});16 c.call({cThis: 1}); 17 17 } -
trunk/LayoutTests/inspector/debugger/tail-deleted-frames-this-value-expected.txt
r200981 r249445 7 7 Hit breakpoint at line: 3, column: 4 8 8 ------------------------------------ 9 Expected frame: {"functionName":"a","thisValue":["aThis", 2],"isTailDeleted":false}9 Expected frame: {"functionName":"a","thisValue":["aThis",3],"isTailDeleted":false} 10 10 PASS: 'this' value should have expected property: aThis 11 11 PASS: Call Frame 0 'this' value is correct. 12 Expected frame: {"functionName":"b","thisValue":["bThis", 1],"isTailDeleted":true}12 Expected frame: {"functionName":"b","thisValue":["bThis",2],"isTailDeleted":true} 13 13 PASS: 'this' value should have expected property: bThis 14 14 PASS: Call Frame 1 'this' value is correct. 15 Expected frame: {"functionName":"c","thisValue":["cThis", 0],"isTailDeleted":true}15 Expected frame: {"functionName":"c","thisValue":["cThis",1],"isTailDeleted":true} 16 16 PASS: 'this' value should have expected property: cThis 17 17 PASS: Call Frame 2 'this' value is correct. -
trunk/LayoutTests/inspector/debugger/tail-deleted-frames-this-value.html
r249129 r249445 35 35 // top down list 36 36 let expectedFrames = [ 37 {functionName: 'a', thisValue: ['aThis', 2], isTailDeleted: false},38 {functionName: 'b', thisValue: ['bThis', 1], isTailDeleted: true},39 {functionName: 'c', thisValue: ['cThis', 0], isTailDeleted: true}37 {functionName: 'a', thisValue: ['aThis', 3], isTailDeleted: false}, 38 {functionName: 'b', thisValue: ['bThis', 2], isTailDeleted: true}, 39 {functionName: 'c', thisValue: ['cThis', 1], isTailDeleted: true} 40 40 ]; 41 41 -
trunk/LayoutTests/inspector/timeline/line-column-expected.txt
r249220 r249445 46 46 "url": "", 47 47 "scriptId": "<filtered>", 48 "lineNumber": 14 6,48 "lineNumber": 140, 49 49 "columnNumber": 97 50 50 } … … 108 108 "url": "", 109 109 "scriptId": "<filtered>", 110 "lineNumber": 14 6,110 "lineNumber": 140, 111 111 "columnNumber": 97 112 112 } … … 161 161 "url": "", 162 162 "scriptId": "<filtered>", 163 "lineNumber": 14 6,163 "lineNumber": 140, 164 164 "columnNumber": 97 165 165 } … … 221 221 "url": "", 222 222 "scriptId": "<filtered>", 223 "lineNumber": 14 6,223 "lineNumber": 140, 224 224 "columnNumber": 97 225 225 } -
trunk/Source/JavaScriptCore/ChangeLog
r249418 r249445 1 2019-09-03 Devin Rousso <drousso@apple.com> 2 3 REGRESSION (r249078): Flaky crash in com.apple.JavaScriptCore: Inspector::InjectedScriptModule::ensureInjected 4 https://bugs.webkit.org/show_bug.cgi?id=201201 5 <rdar://problem/54771560> 6 7 Reviewed by Joseph Pecoraro. 8 9 * inspector/InjectedScriptSource.js: 10 (let.InjectedScript.prototype.injectModule): 11 (let.InjectedScript.prototype._evaluateOn): 12 (CommandLineAPI): 13 (let.InjectedScript.prototype.setInspectObject): Deleted. 14 (let.InjectedScript.prototype.addCommandLineAPIGetter): Deleted. 15 (let.InjectedScript.prototype.addCommandLineAPIMethod.func.toString): Deleted. 16 (let.InjectedScript.prototype.addCommandLineAPIMethod): Deleted. 17 (InjectedScript.CommandLineAPI): Deleted. 18 Allow injected script "extensions" (e.g. CommandLineAPIModuleSource.js) to modify objects 19 directly, instead of having them call functions. 20 21 * inspector/InjectedScriptModule.cpp: 22 (Inspector::InjectedScriptModule::ensureInjected): 23 Make sure to reset `hadException` to `false` before making another call. 24 1 25 2019-09-03 Yusuke Suzuki <ysuzuki@apple.com> 2 26 -
trunk/Source/JavaScriptCore/inspector/InjectedScriptModule.cpp
r249078 r249445 73 73 function.appendArgument(source()); 74 74 function.appendArgument(host(injectedScriptManager, injectedScript.scriptState())); 75 hadException = false; 75 76 resultValue = injectedScript.callFunctionWithEvalEnabled(function, hadException); 76 77 if (hadException) { -
trunk/Source/JavaScriptCore/inspector/InjectedScriptSource.js
r249173 r249445 420 420 } 421 421 422 setInspectObject(callback)423 {424 this._inspectObject = callback;425 }426 427 addCommandLineAPIGetter(name, func)428 {429 InjectedScript.CommandLineAPI._getters.push({name, func});430 }431 432 addCommandLineAPIMethod(name, func)433 {434 func.toString = function() { return "function " + name + "() { [Command Line API] }" };435 InjectedScript.CommandLineAPI._methods.push({name, func});436 }437 438 422 // InjectedScriptModule C++ API 439 423 … … 450 434 if (typeof moduleFunction !== "function") 451 435 throw "Error: Web Inspector: a function was expected for injectModule"; 452 moduleFunction .call(inspectedGlobalObject, InjectedScriptHost, inspectedGlobalObject, injectedScriptId, this, RemoteObject, host);436 moduleFunction(InjectedScriptHost, inspectedGlobalObject, injectedScriptId, this, {RemoteObject, CommandLineAPI}, host); 453 437 454 438 this._modules[name] = true; … … 584 568 let commandLineAPI = null; 585 569 if (includeCommandLineAPI) 586 commandLineAPI = new InjectedScript.CommandLineAPI(isEvalOnCallFrame ? object : null);570 commandLineAPI = new CommandLineAPI(isEvalOnCallFrame ? object : null); 587 571 return evalFunction.call(object, expression, commandLineAPI); 588 572 } … … 1462 1446 // ------- 1463 1447 1464 InjectedScript.CommandLineAPI = class CommandLineAPI 1448 function CommandLineAPI(callFrame) 1465 1449 { 1466 constructor(callFrame) 1467 { 1468 let savedResultAlias = InjectedScriptHost.savedResultAlias; 1469 1470 let defineGetter = (key, value) => { 1471 if (typeof value !== "function") { 1472 let originalValue = value; 1473 value = function() { return originalValue; }; 1474 } 1475 1476 this.__defineGetter__("$" + key, value); 1477 if (savedResultAlias) 1478 this.__defineGetter__(savedResultAlias + key, value); 1479 }; 1480 1481 if ("_lastResult" in injectedScript) 1482 defineGetter("_", injectedScript._lastResult); 1483 1484 if ("_exceptionValue" in injectedScript) 1485 defineGetter("exception", injectedScript._exceptionValue); 1486 1487 if ("_eventValue" in injectedScript) 1488 defineGetter("event", injectedScript._eventValue); 1489 1490 // $1-$99 1491 for (let i = 1; i <= injectedScript._savedResults.length; ++i) { 1492 defineGetter(i, function() { 1493 return injectedScript._savedResults[i]; 1494 }); 1495 } 1496 1497 for (let i = 0; i < InjectedScript.CommandLineAPI._getters.length; ++i) { 1498 let {name, func} = InjectedScript.CommandLineAPI._getters[i]; 1499 defineGetter(name, func); 1500 } 1501 1502 for (let i = 0; i < InjectedScript.CommandLineAPI._methods.length; ++i) { 1503 let {name, func} = InjectedScript.CommandLineAPI._methods[i]; 1504 this[name] = func; 1505 } 1506 } 1507 }; 1508 1509 InjectedScript.CommandLineAPI._getters = []; 1510 InjectedScript.CommandLineAPI._methods = []; 1511 1512 injectedScript.addCommandLineAPIMethod("keys", function(object) { return Object.keys(object); }); 1513 injectedScript.addCommandLineAPIMethod("values", function(object) { return Object.values(object); }); 1514 1515 injectedScript.addCommandLineAPIMethod("queryInstances", function() { return InjectedScriptHost.queryInstances(...arguments); }); 1516 injectedScript.addCommandLineAPIMethod("queryObjects", function() { return InjectedScriptHost.queryInstances(...arguments); }); 1517 injectedScript.addCommandLineAPIMethod("queryHolders", function() { return InjectedScriptHost.queryHolders(...arguments); }); 1518 1519 injectedScript.addCommandLineAPIMethod("inspect", function(object) { return injectedScript.inspectObject(object); }); 1520 1521 injectedScript.addCommandLineAPIMethod("assert", function() { return inspectedGlobalObject.console.assert(...arguments); }); 1522 injectedScript.addCommandLineAPIMethod("clear", function() { return inspectedGlobalObject.console.clear(...arguments); }); 1523 injectedScript.addCommandLineAPIMethod("count", function() { return inspectedGlobalObject.console.count(...arguments); }); 1524 injectedScript.addCommandLineAPIMethod("countReset", function() { return inspectedGlobalObject.console.countReset(...arguments); }); 1525 injectedScript.addCommandLineAPIMethod("debug", function() { return inspectedGlobalObject.console.debug(...arguments); }); 1526 injectedScript.addCommandLineAPIMethod("dir", function() { return inspectedGlobalObject.console.dir(...arguments); }); 1527 injectedScript.addCommandLineAPIMethod("dirxml", function() { return inspectedGlobalObject.console.dirxml(...arguments); }); 1528 injectedScript.addCommandLineAPIMethod("error", function() { return inspectedGlobalObject.console.error(...arguments); }); 1529 injectedScript.addCommandLineAPIMethod("group", function() { return inspectedGlobalObject.console.group(...arguments); }); 1530 injectedScript.addCommandLineAPIMethod("groupCollapsed", function() { return inspectedGlobalObject.console.groupCollapsed(...arguments); }); 1531 injectedScript.addCommandLineAPIMethod("groupEnd", function() { return inspectedGlobalObject.console.groupEnd(...arguments); }); 1532 injectedScript.addCommandLineAPIMethod("info", function() { return inspectedGlobalObject.console.info(...arguments); }); 1533 injectedScript.addCommandLineAPIMethod("log", function() { return inspectedGlobalObject.console.log(...arguments); }); 1534 injectedScript.addCommandLineAPIMethod("profile", function() { return inspectedGlobalObject.console.profile(...arguments); }); 1535 injectedScript.addCommandLineAPIMethod("profileEnd", function() { return inspectedGlobalObject.console.profileEnd(...arguments); }); 1536 injectedScript.addCommandLineAPIMethod("record", function() { return inspectedGlobalObject.console.record(...arguments); }); 1537 injectedScript.addCommandLineAPIMethod("recordEnd", function() { return inspectedGlobalObject.console.recordEnd(...arguments); }); 1538 injectedScript.addCommandLineAPIMethod("screenshot", function() { return inspectedGlobalObject.console.screenshot(...arguments); }); 1539 injectedScript.addCommandLineAPIMethod("table", function() { return inspectedGlobalObject.console.table(...arguments); }); 1540 injectedScript.addCommandLineAPIMethod("takeHeapSnapshot", function() { return inspectedGlobalObject.console.takeHeapSnapshot(...arguments); }); 1541 injectedScript.addCommandLineAPIMethod("time", function() { return inspectedGlobalObject.console.time(...arguments); }); 1542 injectedScript.addCommandLineAPIMethod("timeEnd", function() { return inspectedGlobalObject.console.timeEnd(...arguments); }); 1543 injectedScript.addCommandLineAPIMethod("timeLog", function() { return inspectedGlobalObject.console.timeLog(...arguments); }); 1544 injectedScript.addCommandLineAPIMethod("timeStamp", function() { return inspectedGlobalObject.console.timeStamp(...arguments); }); 1545 injectedScript.addCommandLineAPIMethod("trace", function() { return inspectedGlobalObject.console.trace(...arguments); }); 1546 injectedScript.addCommandLineAPIMethod("warn", function() { return inspectedGlobalObject.console.warn(...arguments); }); 1450 let savedResultAlias = InjectedScriptHost.savedResultAlias; 1451 1452 let defineGetter = (key, value) => { 1453 if (typeof value !== "function") { 1454 let originalValue = value; 1455 value = function() { return originalValue; }; 1456 } 1457 1458 this.__defineGetter__("$" + key, value); 1459 if (savedResultAlias && savedResultAlias !== "$") 1460 this.__defineGetter__(savedResultAlias + key, value); 1461 }; 1462 1463 if ("_lastResult" in injectedScript) 1464 defineGetter("_", injectedScript._lastResult); 1465 1466 if ("_exceptionValue" in injectedScript) 1467 defineGetter("exception", injectedScript._exceptionValue); 1468 1469 if ("_eventValue" in injectedScript) 1470 defineGetter("event", injectedScript._eventValue); 1471 1472 // $1-$99 1473 for (let i = 1; i < injectedScript._savedResults.length; ++i) 1474 defineGetter(i, injectedScript._savedResults[i]); 1475 1476 for (let name in CommandLineAPI.getters) 1477 defineGetter(name, CommandLineAPI.getters[name]); 1478 1479 for (let name in CommandLineAPI.methods) 1480 this[name] = CommandLineAPI.methods[name]; 1481 } 1482 1483 CommandLineAPI.getters = {}; 1484 1485 CommandLineAPI.methods = {}; 1486 1487 CommandLineAPI.methods["keys"] = function(object) { return Object.keys(object); }; 1488 CommandLineAPI.methods["values"] = function(object) { return Object.values(object); }; 1489 1490 CommandLineAPI.methods["queryInstances"] = function() { return InjectedScriptHost.queryInstances(...arguments); }; 1491 CommandLineAPI.methods["queryObjects"] = function() { return InjectedScriptHost.queryInstances(...arguments); }; 1492 CommandLineAPI.methods["queryHolders"] = function() { return InjectedScriptHost.queryHolders(...arguments); }; 1493 1494 CommandLineAPI.methods["inspect"] = function(object) { return injectedScript.inspectObject(object); }; 1495 1496 CommandLineAPI.methods["assert"] = function() { return inspectedGlobalObject.console.assert(...arguments); }; 1497 CommandLineAPI.methods["clear"] = function() { return inspectedGlobalObject.console.clear(...arguments); }; 1498 CommandLineAPI.methods["count"] = function() { return inspectedGlobalObject.console.count(...arguments); }; 1499 CommandLineAPI.methods["countReset"] = function() { return inspectedGlobalObject.console.countReset(...arguments); }; 1500 CommandLineAPI.methods["debug"] = function() { return inspectedGlobalObject.console.debug(...arguments); }; 1501 CommandLineAPI.methods["dir"] = function() { return inspectedGlobalObject.console.dir(...arguments); }; 1502 CommandLineAPI.methods["dirxml"] = function() { return inspectedGlobalObject.console.dirxml(...arguments); }; 1503 CommandLineAPI.methods["error"] = function() { return inspectedGlobalObject.console.error(...arguments); }; 1504 CommandLineAPI.methods["group"] = function() { return inspectedGlobalObject.console.group(...arguments); }; 1505 CommandLineAPI.methods["groupCollapsed"] = function() { return inspectedGlobalObject.console.groupCollapsed(...arguments); }; 1506 CommandLineAPI.methods["groupEnd"] = function() { return inspectedGlobalObject.console.groupEnd(...arguments); }; 1507 CommandLineAPI.methods["info"] = function() { return inspectedGlobalObject.console.info(...arguments); }; 1508 CommandLineAPI.methods["log"] = function() { return inspectedGlobalObject.console.log(...arguments); }; 1509 CommandLineAPI.methods["profile"] = function() { return inspectedGlobalObject.console.profile(...arguments); }; 1510 CommandLineAPI.methods["profileEnd"] = function() { return inspectedGlobalObject.console.profileEnd(...arguments); }; 1511 CommandLineAPI.methods["record"] = function() { return inspectedGlobalObject.console.record(...arguments); }; 1512 CommandLineAPI.methods["recordEnd"] = function() { return inspectedGlobalObject.console.recordEnd(...arguments); }; 1513 CommandLineAPI.methods["screenshot"] = function() { return inspectedGlobalObject.console.screenshot(...arguments); }; 1514 CommandLineAPI.methods["table"] = function() { return inspectedGlobalObject.console.table(...arguments); }; 1515 CommandLineAPI.methods["takeHeapSnapshot"] = function() { return inspectedGlobalObject.console.takeHeapSnapshot(...arguments); }; 1516 CommandLineAPI.methods["time"] = function() { return inspectedGlobalObject.console.time(...arguments); }; 1517 CommandLineAPI.methods["timeEnd"] = function() { return inspectedGlobalObject.console.timeEnd(...arguments); }; 1518 CommandLineAPI.methods["timeLog"] = function() { return inspectedGlobalObject.console.timeLog(...arguments); }; 1519 CommandLineAPI.methods["timeStamp"] = function() { return inspectedGlobalObject.console.timeStamp(...arguments); }; 1520 CommandLineAPI.methods["trace"] = function() { return inspectedGlobalObject.console.trace(...arguments); }; 1521 CommandLineAPI.methods["warn"] = function() { return inspectedGlobalObject.console.warn(...arguments); }; 1522 1523 for (let name in CommandLineAPI.methods) 1524 CommandLineAPI.methods[name].toString = function() { return "function " + name + "() { [Command Line API] }"; }; 1547 1525 1548 1526 return injectedScript; -
trunk/Source/WebCore/ChangeLog
r249442 r249445 1 2019-09-03 Devin Rousso <drousso@apple.com> 2 3 REGRESSION (r249078): Flaky crash in com.apple.JavaScriptCore: Inspector::InjectedScriptModule::ensureInjected 4 https://bugs.webkit.org/show_bug.cgi?id=201201 5 <rdar://problem/54771560> 6 7 Reviewed by Joseph Pecoraro. 8 9 Tests: inspector/debugger/tail-deleted-frames-this-value.html 10 inspector/heap/getRemoteObject.html 11 12 * inspector/CommandLineAPIModuleSource.js: 13 Avoid executing functions when injecting. Instead, modify the `CommandLineAPI` directly. 14 1 15 2019-09-03 Zalan Bujtas <zalan@apple.com> 2 16 -
trunk/Source/WebCore/inspector/CommandLineAPIModuleSource.js
r249173 r249445 29 29 //# sourceURL=__InjectedScript_CommandLineAPIModuleSource.js 30 30 31 (function (InjectedScriptHost, inspectedGlobalObject, injectedScriptId, injectedScript, RemoteObject, CommandLineAPIHost) {31 (function (InjectedScriptHost, inspectedGlobalObject, injectedScriptId, injectedScript, {RemoteObject, CommandLineAPI}, CommandLineAPIHost) { 32 32 33 33 // FIXME: <https://webkit.org/b/152294> Web Inspector: Parse InjectedScriptSource as a built-in to get guaranteed non-user-overridden built-ins 34 34 35 injectedScript. setInspectObject(function(object) {35 injectedScript._inspectObject = function(object) { 36 36 if (arguments.length === 0) 37 37 return; … … 54 54 55 55 CommandLineAPIHost.inspect(objectId, hints); 56 } );56 }; 57 57 58 injectedScript.addCommandLineAPIGetter("0",function() {58 CommandLineAPI.getters["0"] = function() { 59 59 return CommandLineAPIHost.inspectedObject(); 60 } );60 }; 61 61 62 injectedScript.addCommandLineAPIMethod("copy",function(object) {62 CommandLineAPI.methods["copy"] = function(object) { 63 63 let string = null; 64 64 … … 71 71 string = "" + object; 72 72 else if (typeof object === "symbol") 73 string = String(object);73 string = inspectedGlobalObject.String(object); 74 74 else if (typeof object === "function") 75 75 string = "" + object; 76 76 else { 77 77 try { 78 string = JSON.stringify(object, null, " ");78 string = inspectedGlobalObject.JSON.stringify(object, null, " "); 79 79 } catch { 80 80 string = "" + object; … … 83 83 84 84 CommandLineAPIHost.copyText(string); 85 } );85 }; 86 86 87 injectedScript.addCommandLineAPIMethod("getEventListeners",function(target) {87 CommandLineAPI.methods["getEventListeners"] = function(target) { 88 88 return CommandLineAPIHost.getEventListeners(target); 89 } );89 }; 90 90 91 91 function normalizeEventTypes(types) { … … 116 116 } 117 117 118 injectedScript.addCommandLineAPIMethod("monitorEvents",function(object, types) {118 CommandLineAPI.methods["monitorEvents"] = function(object, types) { 119 119 if (!object || !object.addEventListener || !object.removeEventListener) 120 120 return; … … 124 124 object.addEventListener(types[i], logEvent, false); 125 125 } 126 } );126 }; 127 127 128 injectedScript.addCommandLineAPIMethod("unmonitorEvents",function(object, types) {128 CommandLineAPI.methods["unmonitorEvents"] = function(object, types) { 129 129 if (!object || !object.addEventListener || !object.removeEventListener) 130 130 return; … … 132 132 for (let i = 0; i < types.length; ++i) 133 133 object.removeEventListener(types[i], logEvent, false); 134 } );134 }; 135 135 136 136 if (inspectedGlobalObject.document && inspectedGlobalObject.Node) { … … 139 139 } 140 140 141 injectedScript.addCommandLineAPIMethod("$",function(selector, start) {141 CommandLineAPI.methods["$"] = function(selector, start) { 142 142 if (canQuerySelectorOnNode(start)) 143 143 return start.querySelector(selector); … … 156 156 157 157 return result; 158 } );158 }; 159 159 160 injectedScript.addCommandLineAPIMethod("$$",function(selector, start) {160 CommandLineAPI.methods["$$"] = function(selector, start) { 161 161 if (canQuerySelectorOnNode(start)) 162 return Array.from(start.querySelectorAll(selector));163 return Array.from(inspectedGlobalObject.document.querySelectorAll(selector));164 } );162 return inspectedGlobalObject.Array.from(start.querySelectorAll(selector)); 163 return inspectedGlobalObject.Array.from(inspectedGlobalObject.document.querySelectorAll(selector)); 164 }; 165 165 166 injectedScript.addCommandLineAPIMethod("$x",function(xpath, context) {166 CommandLineAPI.methods["$x"] = function(xpath, context) { 167 167 let doc = (context && context.ownerDocument) || inspectedGlobalObject.document; 168 var result = doc.evaluate(xpath, context || doc, null,XPathResult.ANY_TYPE, null);168 let result = doc.evaluate(xpath, context || doc, null, inspectedGlobalObject.XPathResult.ANY_TYPE, null); 169 169 switch (result.resultType) { 170 case XPathResult.NUMBER_TYPE:170 case inspectedGlobalObject.XPathResult.NUMBER_TYPE: 171 171 return result.numberValue; 172 case XPathResult.STRING_TYPE:172 case inspectedGlobalObject.XPathResult.STRING_TYPE: 173 173 return result.stringValue; 174 case XPathResult.BOOLEAN_TYPE:174 case inspectedGlobalObject.XPathResult.BOOLEAN_TYPE: 175 175 return result.booleanValue; 176 default:177 var nodes = [];178 var node;179 while (node = result.iterateNext())180 nodes.push(node);181 return nodes;182 176 } 183 }); 177 178 let nodes = []; 179 let node = null; 180 while (node = result.iterateNext()) 181 nodes.push(node); 182 return nodes; 183 }; 184 184 } 185 185 186 for (let name in CommandLineAPI.methods) 187 CommandLineAPI.methods[name].toString = function() { return "function " + name + "() { [Command Line API] }"; }; 188 186 189 })
Note: See TracChangeset
for help on using the changeset viewer.