1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/devtools/rootAnalysis/utility.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,143 @@ 1.4 +/* -*- Mode: Javascript; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 + 1.6 +"use strict"; 1.7 + 1.8 +function assert(x, msg) 1.9 +{ 1.10 + if (x) 1.11 + return; 1.12 + debugger; 1.13 + if (msg) 1.14 + throw "assertion failed: " + msg + "\n" + (Error().stack); 1.15 + else 1.16 + throw "assertion failed: " + (Error().stack); 1.17 +} 1.18 + 1.19 +function defined(x) { 1.20 + return x !== undefined; 1.21 +} 1.22 + 1.23 +function xprint(x, padding) 1.24 +{ 1.25 + if (!padding) 1.26 + padding = ""; 1.27 + if (x instanceof Array) { 1.28 + print(padding + "["); 1.29 + for (var elem of x) 1.30 + xprint(elem, padding + " "); 1.31 + print(padding + "]"); 1.32 + } else if (x instanceof Object) { 1.33 + print(padding + "{"); 1.34 + for (var prop in x) { 1.35 + print(padding + " " + prop + ":"); 1.36 + xprint(x[prop], padding + " "); 1.37 + } 1.38 + print(padding + "}"); 1.39 + } else { 1.40 + print(padding + x); 1.41 + } 1.42 +} 1.43 + 1.44 +function sameBlockId(id0, id1) 1.45 +{ 1.46 + if (id0.Kind != id1.Kind) 1.47 + return false; 1.48 + if (!sameVariable(id0.Variable, id1.Variable)) 1.49 + return false; 1.50 + if (id0.Kind == "Loop" && id0.Loop != id1.Loop) 1.51 + return false; 1.52 + return true; 1.53 +} 1.54 + 1.55 +function sameVariable(var0, var1) 1.56 +{ 1.57 + assert("Name" in var0 || var0.Kind == "This" || var0.Kind == "Return"); 1.58 + assert("Name" in var1 || var1.Kind == "This" || var1.Kind == "Return"); 1.59 + if ("Name" in var0) 1.60 + return "Name" in var1 && var0.Name[0] == var1.Name[0]; 1.61 + return var0.Kind == var1.Kind; 1.62 +} 1.63 + 1.64 +function blockIdentifier(body) 1.65 +{ 1.66 + if (body.BlockId.Kind == "Loop") 1.67 + return body.BlockId.Loop; 1.68 + assert(body.BlockId.Kind == "Function", "body.Kind should be Function, not " + body.BlockId.Kind); 1.69 + return body.BlockId.Variable.Name[0]; 1.70 +} 1.71 + 1.72 +function collectBodyEdges(body) 1.73 +{ 1.74 + body.predecessors = []; 1.75 + body.successors = []; 1.76 + if (!("PEdge" in body)) 1.77 + return; 1.78 + 1.79 + for (var edge of body.PEdge) { 1.80 + var [ source, target ] = edge.Index; 1.81 + if (!(target in body.predecessors)) 1.82 + body.predecessors[target] = []; 1.83 + body.predecessors[target].push(edge); 1.84 + if (!(source in body.successors)) 1.85 + body.successors[source] = []; 1.86 + body.successors[source].push(edge); 1.87 + } 1.88 +} 1.89 + 1.90 +function getPredecessors(body) 1.91 +{ 1.92 + try { 1.93 + if (!('predecessors' in body)) 1.94 + collectBodyEdges(body); 1.95 + } catch (e) { 1.96 + debugger; 1.97 + printErr("body is " + body); 1.98 + } 1.99 + return body.predecessors; 1.100 +} 1.101 + 1.102 +function getSuccessors(body) 1.103 +{ 1.104 + if (!('successors' in body)) 1.105 + collectBodyEdges(body); 1.106 + return body.successors; 1.107 +} 1.108 + 1.109 +// Split apart a function from sixgill into its mangled and unmangled name. If 1.110 +// no mangled name was given, use the unmangled name as its mangled name 1.111 +function splitFunction(func) 1.112 +{ 1.113 + var split = func.indexOf("|"); 1.114 + if (split == -1) 1.115 + return [ func, func ]; 1.116 + return [ func.substr(0, split), func.substr(split+1) ]; 1.117 +} 1.118 + 1.119 +function mangled(fullname) 1.120 +{ 1.121 + var split = fullname.indexOf("|"); 1.122 + if (split == -1) 1.123 + return fullname; 1.124 + return fullname.substr(0, split); 1.125 +} 1.126 + 1.127 +function readable(fullname) 1.128 +{ 1.129 + var split = fullname.indexOf("|"); 1.130 + if (split == -1) 1.131 + return fullname; 1.132 + return fullname.substr(split+1); 1.133 +} 1.134 + 1.135 +function xdbLibrary() 1.136 +{ 1.137 + var lib = ctypes.open(environment['XDB']); 1.138 + return { 1.139 + open: lib.declare("xdb_open", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr), 1.140 + min_data_stream: lib.declare("xdb_min_data_stream", ctypes.default_abi, ctypes.int), 1.141 + max_data_stream: lib.declare("xdb_max_data_stream", ctypes.default_abi, ctypes.int), 1.142 + read_key: lib.declare("xdb_read_key", ctypes.default_abi, ctypes.char.ptr, ctypes.int), 1.143 + read_entry: lib.declare("xdb_read_entry", ctypes.default_abi, ctypes.char.ptr, ctypes.char.ptr), 1.144 + free_string: lib.declare("xdb_free", ctypes.default_abi, ctypes.void_t, ctypes.char.ptr) 1.145 + }; 1.146 +}