1 35 36 package com.google.gwt.dev.js.rhino; 37 38 45 public class IRFactory { 46 47 public IRFactory(TokenStream ts) { 48 this.ts = ts; 49 } 50 51 54 public Object createScript(Object body, String sourceName, 55 int baseLineno, int endLineno, Object source) 56 { 57 Node result = new Node(TokenStream.SCRIPT); 58 Node children = ((Node) body).getFirstChild(); 59 if (children != null) 60 result.addChildrenToBack(children); 61 62 result.putProp(Node.SOURCENAME_PROP, sourceName); 63 result.putIntProp(Node.BASE_LINENO_PROP, baseLineno); 64 result.putIntProp(Node.END_LINENO_PROP, endLineno); 65 if (source != null) 66 result.putProp(Node.SOURCE_PROP, source); 67 return result; 68 } 69 70 73 public Object createLeaf(int nodeType) { 74 return new Node(nodeType); 75 } 76 77 public Object createLeaf(int nodeType, int nodeOp) { 78 return new Node(nodeType, nodeOp); 79 } 80 81 public int getLeafType(Object leaf) { 82 Node n = (Node) leaf; 83 return n.getType(); 84 } 85 86 89 90 public Object createSwitch(int lineno) { 91 return new Node(TokenStream.SWITCH, lineno); 92 } 93 94 public Object createVariables(int lineno) { 95 return new Node(TokenStream.VAR, lineno); 96 } 97 98 public Object createExprStatement(Object expr, int lineno) { 99 return new Node(TokenStream.EXPRSTMT, (Node) expr, lineno); 100 } 101 102 105 public Object createName(String name) { 106 return Node.newString(TokenStream.NAME, name); 107 } 108 109 112 public Object createString(String string) { 113 return Node.newString(string); 114 } 115 116 119 public Object createNumber(double number) { 120 return Node.newNumber(number); 121 } 122 123 131 public Object createCatch(String varName, Object catchCond, Object stmts, 132 int lineno) 133 { 134 if (catchCond == null) { 135 catchCond = new Node(TokenStream.PRIMARY, TokenStream.TRUE); 136 } 137 return new Node(TokenStream.CATCH, (Node)createName(varName), 138 (Node)catchCond, (Node)stmts, lineno); 139 } 140 141 144 public Object createThrow(Object expr, int lineno) { 145 return new Node(TokenStream.THROW, (Node)expr, lineno); 146 } 147 148 151 public Object createReturn(Object expr, int lineno) { 152 return expr == null 153 ? new Node(TokenStream.RETURN, lineno) 154 : new Node(TokenStream.RETURN, (Node)expr, lineno); 155 } 156 157 160 public Object createLabel(String label, int lineno) { 161 Node result = new Node(TokenStream.LABEL, lineno); 162 Node name = Node.newString(TokenStream.NAME, label); 163 result.addChildToBack(name); 164 return result; 165 } 166 167 170 public Object createBreak(String label, int lineno) { 171 Node result = new Node(TokenStream.BREAK, lineno); 172 if (label == null) { 173 return result; 174 } else { 175 Node name = Node.newString(TokenStream.NAME, label); 176 result.addChildToBack(name); 177 return result; 178 } 179 } 180 181 184 public Object createContinue(String label, int lineno) { 185 Node result = new Node(TokenStream.CONTINUE, lineno); 186 if (label == null) { 187 return result; 188 } else { 189 Node name = Node.newString(TokenStream.NAME, label); 190 result.addChildToBack(name); 191 return result; 192 } 193 } 194 195 198 public Object createDebugger(int lineno) { 199 Node result = new Node(TokenStream.DEBUGGER, lineno); 200 return result; 201 } 202 203 208 public Object createBlock(int lineno) { 209 return new Node(TokenStream.BLOCK, lineno); 210 } 211 212 public Object createFunction(String name, Object args, Object statements, 213 String sourceName, int baseLineno, 214 int endLineno, Object source, 215 boolean isExpr) 216 { 217 Node f = new Node(TokenStream.FUNCTION, 218 Node.newString(TokenStream.NAME, 219 name == null ? "" : name), 220 (Node)args, (Node)statements, baseLineno); 221 222 f.putProp(Node.SOURCENAME_PROP, sourceName); 223 f.putIntProp(Node.BASE_LINENO_PROP, baseLineno); 224 f.putIntProp(Node.END_LINENO_PROP, endLineno); 225 if (source != null) 226 f.putProp(Node.SOURCE_PROP, source); 227 228 return f; 229 } 230 231 236 public void addChildToBack(Object parent, Object child) { 237 ((Node)parent).addChildToBack((Node)child); 238 } 239 240 243 public Object createWhile(Object cond, Object body, int lineno) { 244 return new Node(TokenStream.WHILE, (Node)cond, (Node)body, lineno); 245 } 246 247 250 public Object createDoWhile(Object body, Object cond, int lineno) { 251 return new Node(TokenStream.DO, (Node)body, (Node)cond, lineno); 252 } 253 254 257 public Object createFor(Object init, Object test, Object incr, 258 Object body, int lineno) 259 { 260 return new Node(TokenStream.FOR, (Node)init, (Node)test, (Node)incr, 261 (Node)body); 262 } 263 264 268 public Object createForIn(Object lhs, Object obj, Object body, int lineno) { 269 return new Node(TokenStream.FOR, (Node)lhs, (Node)obj, (Node)body); 270 } 271 272 275 public Object createTryCatchFinally(Object tryblock, Object catchblocks, 276 Object finallyblock, int lineno) 277 { 278 if (finallyblock == null) { 279 return new Node(TokenStream.TRY, (Node)tryblock, (Node)catchblocks); 280 } 281 return new Node(TokenStream.TRY, (Node)tryblock, 282 (Node)catchblocks, (Node)finallyblock); 283 } 284 285 288 289 292 public Object createWith(Object obj, Object body, int lineno) { 293 return new Node(TokenStream.WITH, (Node)obj, (Node)body, lineno); 294 } 295 296 299 public Object createArrayLiteral(Object obj) { 300 return obj; 301 } 302 303 306 public Object createObjectLiteral(Object obj) { 307 return obj; 308 } 309 310 313 public Object createRegExp(String string, String flags) { 314 return flags.length() == 0 315 ? new Node(TokenStream.REGEXP, 316 Node.newString(string)) 317 : new Node(TokenStream.REGEXP, 318 Node.newString(string), 319 Node.newString(flags)); 320 } 321 322 325 public Object createIf(Object cond, Object ifTrue, Object ifFalse, 326 int lineno) 327 { 328 if (ifFalse == null) 329 return new Node(TokenStream.IF, (Node)cond, (Node)ifTrue); 330 return new Node(TokenStream.IF, (Node)cond, (Node)ifTrue, (Node)ifFalse); 331 } 332 333 public Object createTernary(Object cond, Object ifTrue, Object ifFalse) { 334 return new Node(TokenStream.HOOK, 335 (Node)cond, (Node)ifTrue, (Node)ifFalse); 336 } 337 338 341 public Object createUnary(int nodeType, Object child) { 342 Node childNode = (Node) child; 343 return new Node(nodeType, childNode); 344 } 345 346 public Object createUnary(int nodeType, int nodeOp, Object child) { 347 return new Node(nodeType, (Node)child, nodeOp); 348 } 349 350 353 public Object createBinary(int nodeType, Object left, Object right) { 354 Node temp; 355 switch (nodeType) { 356 357 case TokenStream.DOT: 358 nodeType = TokenStream.GETPROP; 359 Node idNode = (Node) right; 360 idNode.setType(TokenStream.STRING); 361 String id = idNode.getString(); 362 if (id.equals("__proto__") || id.equals("__parent__")) { 363 Node result = new Node(nodeType, (Node) left); 364 result.putProp(Node.SPECIAL_PROP_PROP, id); 365 return result; 366 } 367 break; 368 369 case TokenStream.LB: 370 nodeType = TokenStream.GETELEM; 372 break; 373 } 374 return new Node(nodeType, (Node)left, (Node)right); 375 } 376 377 public Object createBinary(int nodeType, int nodeOp, Object left, 378 Object right) 379 { 380 if (nodeType == TokenStream.ASSIGN) { 381 return createAssignment(nodeOp, (Node) left, (Node) right, 382 null, false); 383 } 384 return new Node(nodeType, (Node) left, (Node) right, nodeOp); 385 } 386 387 public Object createAssignment(int nodeOp, Node left, Node right, 388 Class convert, boolean postfix) 389 { 390 int nodeType = left.getType(); 391 switch (nodeType) { 392 case TokenStream.NAME: 393 case TokenStream.GETPROP: 394 case TokenStream.GETELEM: 395 break; 396 default: 397 reportError("msg.bad.lhs.assign"); 400 } 401 402 return new Node(TokenStream.ASSIGN, left, right, nodeOp); 403 } 404 405 private Node createConvert(Class toType, Node expr) { 406 if (toType == null) 407 return expr; 408 Node result = new Node(TokenStream.CONVERT, expr); 409 result.putProp(Node.TYPE_PROP, Number .class); 410 return result; 411 } 412 413 public static boolean hasSideEffects(Node exprTree) { 414 switch (exprTree.getType()) { 415 case TokenStream.INC: 416 case TokenStream.DEC: 417 case TokenStream.SETPROP: 418 case TokenStream.SETELEM: 419 case TokenStream.SETNAME: 420 case TokenStream.CALL: 421 case TokenStream.NEW: 422 return true; 423 default: 424 Node child = exprTree.getFirstChild(); 425 while (child != null) { 426 if (hasSideEffects(child)) 427 return true; 428 else 429 child = child.getNext(); 430 } 431 break; 432 } 433 return false; 434 } 435 436 private void reportError(String msgResource) { 437 438 String message = Context.getMessage0(msgResource); 439 Context.reportError( 440 message, ts.getSourceName(), ts.getLineno(), 441 ts.getLine(), ts.getOffset()); 442 } 443 444 private TokenStream ts; 448 } 449 | Popular Tags |