| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /** |  | 
| 2  * This file presents various methods to create a JS typing system. |  | 
| 3  */ |  | 
| 4 |  | 
| 5 function divine_inheritance(clazz, constants) { |  | 
| 6   let aliases = {}; |  | 
| 7   for each (let c in constants) { |  | 
| 8     aliases[c.name] = c.init; |  | 
| 9   } |  | 
| 10 |  | 
| 11   // First, do we have a QueryInterface variable? |  | 
| 12   if ("QueryInterface" in clazz.variables) { |  | 
| 13     // Yes, it's a function, but the variable means that we found a XPCOMUtils |  | 
| 14     // utility. This'll be easy! |  | 
| 15     let xpcom = clazz.variables.QueryInterface.init; |  | 
| 16     assert(xpcom.op == JSOP_CALL && xpcom.kids[0].atom == "generateQI"); |  | 
| 17 |  | 
| 18     if (!clazz.inherits) |  | 
| 19       clazz.inherits = []; |  | 
| 20     for each (let iface in xpcom.kids[1].kids) |  | 
| 21       clazz.inherits.push(iface.atom); |  | 
| 22     return; |  | 
| 23   } |  | 
| 24 |  | 
| 25   if ("QueryInterface" in clazz.functions) { |  | 
| 26     if (!clazz.inherits) |  | 
| 27       clazz.inherits = []; |  | 
| 28     function findInterfaces(ast) { |  | 
| 29             if (ast.op == JSOP_GETPROP && ast.kids[0]) { |  | 
| 30                     let check = ast.kids[0]; |  | 
| 31                     if (check.atom == "interfaces" && check.kids[0] && |  | 
| 32                                 check.kids[0].atom == "Components") { |  | 
| 33           clazz.inherits.push(ast.atom); |  | 
| 34         } |  | 
| 35       } |  | 
| 36     } |  | 
| 37     visit(clazz.functions.QueryInterface.body, findInterfaces, aliases); |  | 
| 38     return; |  | 
| 39   } |  | 
| 40 } |  | 
| OLD | NEW | 
|---|