From 174a30454c7ad08c21d63ab5c43f23a129609d98 Mon Sep 17 00:00:00 2001 From: msridhar1 Date: Wed, 8 Feb 2012 15:32:15 +0000 Subject: [PATCH] Started to update the closure extractor to work with Rhino 1.7.3. git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4438 f5eafffb-2e1d-0410-98e4-8ec43c5233c4 --- .../extraction/ClosureExtractor.java | 24 ++++++++------ .../extraction/ForInBodyExtractionPolicy.java | 32 ++++++++++++++++--- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java index 341b66e5e..49baf5c28 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java @@ -172,6 +172,8 @@ import com.ibm.wala.util.debug.UnimplementedError; * */ public class ClosureExtractor extends CAstRewriterExt { + private static final boolean RHINO_1_7_2 = false; + private LinkedList policies = new LinkedList(); private final ExtractionPolicyFactory policyFactory; @@ -388,6 +390,8 @@ public class ClosureExtractor extends CAstRewriterExt { } private int anonymous_counter = 0; + + @SuppressWarnings("unused") private List extractRegion(CAstNode root, CAstControlFlowMap cfg, ExtractionPos context, Map, CAstNode> nodeMap) { CAstEntity entity = getCurrentEntity(); @@ -412,26 +416,28 @@ public class ClosureExtractor extends CAstRewriterExt { */ ArrayList prologue = new ArrayList(); ArrayList fun_body_stmts = new ArrayList(); - CAstNode self_ref = makeVarRef(name); - CAstNode self_assign = Ast.makeNode(ASSIGN, self_ref, makeVarRef(name)); - addFlow(self_ref, JavaScriptTypes.ReferenceError, CAstControlFlowMap.EXCEPTION_TO_EXIT, entity.getControlFlow()); - fun_body_stmts.add(self_assign); + if(RHINO_1_7_2) { + CAstNode self_ref = makeVarRef(name); + CAstNode self_assign = Ast.makeNode(ASSIGN, self_ref, makeVarRef(name)); + addFlow(self_ref, JavaScriptTypes.ReferenceError, CAstControlFlowMap.EXCEPTION_TO_EXIT, entity.getControlFlow()); + fun_body_stmts.add(self_assign); + } // if we are extracting a block, unwrap it if(extractingBlock) { CAstNode block = root.getChild(context.getStart()); for(int i=0;i extract(CAstNode node) { SomeConstant loopVar = new SomeConstant(); - /* matches the following pattern: + + /* + * matches Rhino 1.7.3 encoding of for-in loop bodies: + * + * BLOCK_STMT + * decl/assign of loop variable + * + */ + if(new NodeOfKind(BLOCK_STMT, + new Alt(new NodeOfKind(DECL_STMT, + loopVar, + new SubtreeOfKind(EACH_ELEMENT_GET)), + new NodeOfKind(ASSIGN, + new NodeOfKind(VAR, loopVar), + new SubtreeOfKind(EACH_ELEMENT_GET))), + new AnyNode(), + new SubtreeOfKind(LABEL_STMT)).matches(node)) { + return Collections.singletonList(new ExtractionRegion(1, 2, Collections.singletonList((String)loopVar.getLastMatch()))); + } + + /* matches Rhino < 1.7.3 encoding of for-in loop bodies: * * BLOCK_STMT * ASSIGN @@ -55,8 +81,6 @@ public class ForInBodyExtractionPolicy extends ExtractionPolicy { * EACH_ELEMENT_GET * VAR * - * - * TODO: this is too brittle; what if future versions of Rhino encode for-in loops differently? */ if(new NodeOfKind(BLOCK_STMT, new NodeOfKind(ASSIGN,