[ 
https://issues.apache.org/jira/browse/WEEX-630?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16626752#comment-16626752
 ] 

ASF GitHub Bot commented on WEEX-630:
-------------------------------------

YorkShen closed pull request #1570: [WEEX-630] [core] fix data render dom diff 
error
URL: https://github.com/apache/incubator-weex/pull/1570
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/android/playground/app/build.gradle 
b/android/playground/app/build.gradle
index 941e624f0e..3a43ac2227 100755
--- a/android/playground/app/build.gradle
+++ b/android/playground/app/build.gradle
@@ -64,7 +64,9 @@ android {
     dexOptions {
         preDexLibraries false
     }
-
+    aaptOptions {
+        noCompress 'wasm'
+    }
 }
 
 
diff --git a/android/playground/app/src/main/assets/lite_template/card.wasm 
b/android/playground/app/src/main/assets/lite_template/card.wasm
new file mode 100644
index 0000000000..ad43e9eece
Binary files /dev/null and 
b/android/playground/app/src/main/assets/lite_template/card.wasm differ
diff --git a/android/playground/app/src/main/assets/lite_template/case.js 
b/android/playground/app/src/main/assets/lite_template/case.js
new file mode 100644
index 0000000000..90278f05d9
--- /dev/null
+++ b/android/playground/app/src/main/assets/lite_template/case.js
@@ -0,0 +1,406 @@
+/* eslint-disable react/react-in-jsx-scope */
+/* global __weex_data__, print, createElement */
+class Component {
+    constructor(props) {
+        this.props = props;
+    }
+    
+    setState(newData) {
+        this.state = { ...this.state,
+            ...newData
+        };
+        var prev = this.vcompoent_ptr;
+        var next = this.render();
+        updateElement(prev, next);
+        this.vcompoent_ptr = next;
+    }
+}
+var nativeModules = {};
+
+const registerModule = moduleName => {
+    var sourceKeys = Object.keys(moduleName);
+    var key;
+    
+    for (var i = 0; i < sourceKeys.length; i++) {
+        key = sourceKeys[i];
+        nativeModules[key] = moduleName[key];
+    }
+};
+
+const require = name => {
+    const requireModule = name => {
+        var methods = nativeModules[name];
+        var target = {};
+        var loop = function (methodName) {
+            target[methodName] = function () {
+                var args = __arguments.length > 2 ? __arguments.slice(2) : [];
+                __callNativeModule({
+                                   module: name,
+                                   method: __arguments[1],
+                                   args: args
+                                   });
+            };
+        };
+        if (methods && Array.isArray(methods)) {
+            for (var i = 0; i < methods.length; i++) {
+                loop(methods[i]);
+            }
+        }
+        log("register",methods);
+        return target;
+    };
+    
+    const MODULE_NAME_PREFIX = '@weex-module/';
+    
+    if (name.split(MODULE_NAME_PREFIX).length > 1) {
+        const weexModuleName = name.split(MODULE_NAME_PREFIX)[1];
+        return requireModule(weexModuleName);
+    }
+};
+
+__registerModules(['searchEvent']);
+
+const render = segment => <root>{segment}</root>;
+
+const View = props => <div {...props} />;
+
+const Touchable = props => {
+    return <div {...props} onClick={props.onPress} />;
+};
+
+const Text = props => <text {...props} />;
+
+const NXImage = props => <image {...props} />;
+
+const NXLink = props => <a {...props} />;
+
+const searchEvent = require('@weex-module/searchEvent');
+
+const WFWIDTH = 342;
+const waterfallStyles = {
+titleText: {
+maxWidth: 290,
+minWidth: 30,
+height: 30,
+marginLeft: 28,
+marginRight: 28,
+fontSize: 26,
+lineHeight: 30,
+color: '#444444'
+},
+divideLine: {
+width: 180,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+},
+wfDivideLine: {
+width: 90,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+},
+wfWrapper: {
+minHeight: 100,
+width: WFWIDTH,
+flexDirection: 'column',
+justifyContent: 'center',
+alignItems: 'center'
+},
+wfLineWrap: {
+width: WFWIDTH,
+height: 64,
+marginBottom: 20,
+paddingLeft: 9.5,
+paddingRight: 9.5,
+flexDirection: 'row',
+justifyContent: 'center',
+alignItems: 'center'
+},
+wfTitle: {
+width: WFWIDTH - 40,
+marginTop: 24,
+marginBottom: 16,
+flexDirection: 'row',
+alignItems: 'center',
+justifyContent: 'center'
+}
+};
+
+const styles = {
+tag: {
+flex: 1,
+backgroundColor: '#FFFFFF',
+marginLeft: 9,
+marginRight: 9,
+paddingLeft: 16,
+paddingRight: 16,
+height: 64,
+borderRadius: 32
+},
+tagText: {
+flex: 1,
+lineHeight: 64,
+textAlign: 'center',
+color: '#444444',
+fontSize: 26
+}
+};
+
+class TipTag extends Component {
+    constructor(props) {
+        super(props);
+    }
+    _onClick = e => {
+        log("click go");
+        let searchParams = {};
+        if (this.props.data.q) {
+            searchParams.q = this.props.data.q;
+        }
+        
+        if (this.props.data.params && this.props.data.params.length > 0) {
+            this.props.data.params.forEach(item => {
+                                           if (item.key) {
+                                           searchParams[item.key] = item.value;
+                                           }
+                                           });
+        }
+        if (this.props.tiptype && this.props.tiptype == 'voice_smarttips') {
+            searchParams['voiceFrom'] = '1';
+            log("se go");
+            searchEvent.searchOption("searchOption", {
+                                     params: searchParams
+                                     });
+        } else {
+            log("se go2");
+            searchEvent.search("search", {
+                               params: searchParams
+                               });
+        }
+    };
+    
+    render() {
+        let data = this.props.data;
+        let tagStyle = styles.tag;
+        
+        if (!this.props.isListMode) {
+            tagStyle = { ...styles.tag,
+            marginLeft: 5.5,
+            marginRight: 5.5
+            };
+        } else {
+            tagStyle = styles.tag;
+        }
+        return <View style={tagStyle} onClick={this._onClick}>
+        <Text style={styles.tagText}>{data.show}</Text>
+        </View>;
+    }
+    
+}
+
+const _tiptag_export = {
+default: TipTag
+};
+
+const TipTag_import_default_from__WidgetInWFStyle__tiptag = 
_tiptag_export.default;
+
+const WidgetInWFStyle = props => {
+    let tips = props.tips,
+    tiptype = props.tiptype;
+    
+    if (!tips || tips.length === 0) {
+        return null;
+    }
+    
+    if (tips.length > 8) {
+        tips = tips.slice(0, 8);
+    }
+    
+    let wfTitle = <View style={waterfallStyles.wfTitle}>
+    <View style={waterfallStyles.wfDivideLine} />
+    <Text style={waterfallStyles.titleText}>{props.topic || '相关搜索'}</Text>
+    <View style={waterfallStyles.wfDivideLine} />
+    </View>;
+    let wfLines = [];
+    let tipLength = tips.length;
+    
+    function createWfLine(leftTip, rightTip) {
+        let tag1 = <TipTag_import_default_from__WidgetInWFStyle__tiptag 
data={leftTip} isListMode={false} tiptype={tiptype} />;
+        let tag2 = rightTip ? 
<TipTag_import_default_from__WidgetInWFStyle__tiptag data={rightTip} 
isListMode={false} tiptype={tiptype} /> : null;
+        return <View style={waterfallStyles.wfLineWrap}>
+        {tag1}
+        {tag2}
+        </View>;
+    }
+    for (var i = 0; i < tipLength; i += 2) {
+        let wfLine = null;
+        if (tipLength === 2) {
+            wfLine = createWfLine(tips[i]);
+            wfLines.push(wfLine);
+            wfLine = createWfLine(tips[i + 1]);
+        }
+        else {
+            if (i + 1 === tipLength) {
+                wfLine = createWfLine(tips[i], null);
+            }
+            else {
+                wfLine = createWfLine(tips[i], tips[i + 1]);
+            }
+        }
+        wfLines.push(wfLine);
+    }
+    return <View style={waterfallStyles.wfWrapper}>
+    {wfTitle}
+    {wfLines}
+    </View>;
+};
+
+const _WidgetInWFStyle_export = {
+default: WidgetInWFStyle
+};
+
+
+const TipTag_import_default_from__WidgetInListStyle__tiptag = 
_tiptag_export.default;
+const listStyles = {
+listWrapper: {
+width: 750,
+minHeight: 162,
+flexDirection: 'column',
+justifyContent: 'center',
+alignItems: 'center',
+paddingBottom: 16
+},
+listLineWrap: {
+width: 750,
+height: 64,
+flexDirection: 'row',
+justifyContent: 'space-between',
+alignItems: 'center',
+marginBottom: 20,
+paddingLeft: 11,
+paddingRight: 11
+},
+listTitle: {
+width: 750,
+marginTop: 28,
+marginBottom: 20,
+flexDirection: 'row',
+alignItems: 'center',
+justifyContent: 'center'
+},
+titleText: {
+maxWidth: 290,
+minWidth: 30,
+height: 30,
+marginLeft: 28,
+marginRight: 28,
+fontSize: 26,
+lineHeight: 30,
+color: '#444444'
+},
+divideLine: {
+width: 180,
+height: 1.5,
+backgroundColor: '#cdcdcd'
+}
+};
+
+const WidgetInListStyle = props => {
+    let tips = props.tips,
+    tiptype = props.tiptype;
+    if (!tips || tips.length === 0) {
+        return null;
+    }
+    
+    if (tips.length > 8) {
+        tips = tips.slice(0, 8);
+    }
+    
+    const listTitle = <View style={listStyles.listTitle}>
+    <View style={listStyles.divideLine} />
+    <Text style={listStyles.titleText}>{props.topic || '相关搜索'}</Text>
+    <View style={listStyles.divideLine} />
+    </View>;
+    let firstLineTips = [];
+    let secondLineTips = [];
+    tips.forEach((tip, index) => {
+                 const tipTag = 
<TipTag_import_default_from__WidgetInListStyle__tiptag data={tip} 
isListMode={true} tiptype={tiptype} />;
+                 if (tips.length / 2 < 2) {
+                 firstLineTips.push(tipTag);
+                 } else {
+                 const firstLineCount = parseInt(tips.length / 2, 10) + 
tips.length % 2;
+                 
+                 if (index < firstLineCount) {
+                 firstLineTips.push(tipTag);
+                 } else if (index < 8) {
+                 secondLineTips.push(tipTag);
+                 } else {}
+                 }
+                 });
+    const firstLine = <View 
style={listStyles.listLineWrap}>{firstLineTips}</View>;
+    const secondLine = secondLineTips.length > 0 ? <View 
style={listStyles.listLineWrap}>{secondLineTips}</View> : null;
+    const listContent = [firstLine, secondLine];
+    return <View style={listStyles.listWrapper}>
+    {listTitle}
+    {listContent}
+    </View>;
+};
+
+const _WidgetInListStyle_export = {
+default: WidgetInListStyle
+};
+const WidgetInListStyle_import_default_from__lib__WidgetInListStyle = 
_WidgetInListStyle_export.default;
+const WidgetInWFStyle_import_default_from__lib__WidgetInWFStyle = 
_WidgetInWFStyle_export.default;
+const defaultStyle__lib = {
+container: {
+backgroundColor: '#f2f2f2'
+}
+};
+
+class Widget extends Component {
+    constructor(props) {
+        super(props);
+    }
+    render() {
+        const _this$props = this.props,
+        _this$props$model = _this$props.model,
+        model = _this$props$model === "undefined" ? {} : _this$props$model,
+        _this$props$status = _this$props.status,
+        status = _this$props$status === "undefined" ? {} : _this$props$status;
+        const _status$layoutStyle = status.layoutStyle,
+        layoutStyle = _status$layoutStyle === "undefined" ? 0 : 
_status$layoutStyle;
+        const content = parseInt(layoutStyle, 10) === 1 ? 
<WidgetInWFStyle_import_default_from__lib__WidgetInWFStyle {...model} /> : 
<WidgetInListStyle_import_default_from__lib__WidgetInListStyle {...model} />;
+        return <View style={{ ...defaultStyle__lib.container
+        }}>{content}</View>;
+    }
+    
+}
+
+const _lib_export = {
+default: Widget
+};
+const Widget_import_default_from___lib = _lib_export.default;
+const _data = __weex_data__;
+const defaultStyle = {
+container: {
+backgroundColor: '#ffffff'
+}
+};
+
+class Segment extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+        data: _data
+        };
+    }
+    render() {
+        const _this$state$data = this.state.data,
+        data = _this$state$data === "undefined" ? {} : _this$state$data;
+        return <View style={{ ...defaultStyle.container
+        }}>
+        <Widget_import_default_from___lib {...data} />
+        </View>;
+    }
+    
+}
+
+render(<Segment />);
diff --git a/android/playground/app/src/main/assets/lite_template/case.json 
b/android/playground/app/src/main/assets/lite_template/case.json
deleted file mode 100644
index bbc8a82e3f..0000000000
--- a/android/playground/app/src/main/assets/lite_template/case.json
+++ /dev/null
@@ -1,419 +0,0 @@
-{
-  "styles": {
-    "wrapper": {
-      "justifyContent": "center",
-      "alignItems": "center"
-    },
-    "logo": {
-      "width": "424px",
-      "height": "200px"
-    },
-    "greeting": {
-      "textAlign": "center",
-      "marginTop": "70px",
-      "fontSize": "50px",
-      "color": "#41b883"
-    },
-    "message": {
-      "margin": "30px",
-      "fontSize": "32px",
-      "color": "#727272"
-    },
-    "listContainer": {
-      "width": "750",
-      "backgroundColor": "#ffffff",
-      "flexDirection": "column",
-      "alignItems": "stretch",
-      "marginTop": "17",
-      "marginBottom": "17"
-    },
-    "wfContainer": {
-      "width": "345",
-      "backgroundColor": "#ffffff",
-      "flexDirection": "column",
-      "alignItems": "stretch",
-      "borderRadius": "12",
-      "overflow": "hidden"
-    },
-    "listContentContainer": {
-      "flexDirection": "row",
-      "marginTop": "13",
-      "marginLeft": "24",
-      "marginRight": "24",
-      "marginBottom": "24",
-      "justifyContent": "space-between"
-    },
-    "wfContentContainer": {
-      "paddingBottom": "17",
-      "flexDirection": "column"
-    },
-    "titleContainer": {
-      "flexDirection": "row",
-      "alignItems": "center",
-      "justifyContent": "center",
-      "marginLeft": "32",
-      "marginRight": "32",
-      "height": "78"
-    },
-    "titleText": {
-      "fontSize": "28",
-      "color": "#333333",
-      "marginLeft": "12",
-      "marginRight": "12",
-      "paddingTop": "27",
-      "paddingBottom": "27"
-    },
-    "titleLine": {
-      "height": "2",
-      "backgroundColor": "#9b9b9b",
-      "width": "28"
-    },
-    "tagItem": {
-      "flexDirection": "column",
-      "alignItems": "center"
-    },
-    "tagImage": {
-      "width": "142",
-      "height": "110",
-      "borderRadius": "55"
-    },
-    "tagImageMask": {
-      "width": "142",
-      "height": "110",
-      "borderRadius": "55",
-      "backgroundColor": "rgba(0, 0, 0, 0.04)",
-      "position": "absolute",
-      "left": "0",
-      "top": "0"
-    },
-    "tagText": {
-      "fontSize": "24",
-      "marginTop": "12",
-      "lineHeight": "37",
-      "maxWidth": "145",
-      "color": "#4b4b4b"
-    },
-    "tagLine": {
-      "flexDirection": "row",
-      "marginLeft": "18",
-      "marginRight": "18",
-      "marginTop": "20",
-      "justifyContent": "space-between"
-    }
-  },
-  "data": {},
-  "body": {
-    "tagName": "div",
-    "nodeId": "1",
-    "classList": [
-      "wrapper"
-    ],
-    "childNodes": [
-      {
-        "tagName": "div",
-        "nodeId": "2",
-        "control": {
-          "match": "status.layoutStyle < 0.5"
-        },
-        "classList": [
-          "listContainer"
-        ],
-        "childNodes": [
-          {
-            "tagName": "div",
-            "nodeId": "3",
-            "classList": [
-              "titleContainer"
-            ],
-            "childNodes": [
-              {
-                "tagName": "div",
-                "nodeId": "4",
-                "classList": [
-                  "titleLine"
-                ]
-              },
-              {
-                "tagName": "text",
-                "nodeId": "5",
-                "classList": [
-                  "titleText"
-                ],
-                "attributes": {
-                  "value": {
-                    "@binding": "model.topic"
-                  }
-                }
-              },
-              {
-                "tagName": "div",
-                "nodeId": "6",
-                "classList": [
-                  "titleLine"
-                ]
-              }
-            ]
-          },
-          {
-            "tagName": "div",
-            "nodeId": "7",
-            "control": {
-              "match": "sizeof(model.tips) >= 4"
-            },
-            "classList": [
-              "listContentContainer"
-            ],
-            "childNodes": [
-              {
-                "tagName": "a",
-                "nodeId": "8",
-                "control": {
-                  "repeat": {
-                    "for": "slice(model.tips,0,4)",
-                    "alias": "tag",
-                    "iterator1": "i"
-                  }
-                },
-                "attributes": {
-                  "key": {
-                    "@binding": "i"
-                  },
-                  "href": {
-                    "@binding": 
"appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
-                  }
-                },
-                "classList": [
-                  "tagItem"
-                ],
-                "childNodes": [
-                  {
-                    "tagName": "img",
-                    "nodeId": "9",
-                    "classList": [
-                      "tagImage"
-                    ],
-                    "attributes": {
-                      "src": {
-                        "@binding": "tag.picUrl"
-                      }
-                    }
-                  },
-                  {
-                    "tagName": "div",
-                    "nodeId": "10",
-                    "classList": [
-                      "tagImageMask"
-                    ]
-                  },
-                  {
-                    "tagName": "text",
-                    "nodeId": "11",
-                    "classList": [
-                      "tagText"
-                    ],
-                    "attributes": {
-                      "lines": "1",
-                      "value": {
-                        "@binding": "tag.show"
-                      }
-                    }
-                  }
-                ]
-              }
-            ]
-          }
-        ]
-      },
-      {
-        "tagName": "div",
-        "nodeId": "12",
-        "control": {
-          "match": "status.layoutStyle > 0.5"
-        },
-        "classList": [
-          "wfContainer"
-        ],
-        "childNodes": [
-          {
-            "tagName": "div",
-            "nodeId": "13",
-            "classList": [
-              "titleContainer"
-            ],
-            "childNodes": [
-              {
-                "tagName": "div",
-                "nodeId": "14",
-                "classList": [
-                  "titleLine"
-                ]
-              },
-              {
-                "tagName": "text",
-                "nodeId": "15",
-                "classList": [
-                  "titleText"
-                ],
-                "attributes": {
-                  "value": {
-                    "@binding": "model.topic"
-                  }
-                }
-              },
-              {
-                "tagName": "div",
-                "nodeId": "16",
-                "classList": [
-                  "titleLine"
-                ]
-              }
-            ]
-          },
-          {
-            "tagName": "div",
-            "nodeId": "17",
-            "control": {
-              "match": "sizeof(model.tips) >= 4"
-            },
-            "classList": [
-              "wfContentContainer"
-            ],
-            "childNodes": [
-              {
-                "tagName": "div",
-                "nodeId": "18",
-                "classList": [
-                  "tagLine"
-                ],
-                "childNodes": [
-                  {
-                    "tagName": "a",
-                    "nodeId": "19",
-                    "control": {
-                      "repeat": {
-                        "for": "slice(model.tips,0,2)",
-                        "alias": "tag",
-                        "iterator1": "i"
-                      }
-                    },
-                    "attributes": {
-                      "key": {
-                        "@binding": "i"
-                      },
-                      "href": {
-                        "@binding": 
"appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
-                      }
-                    },
-                    "classList": [
-                      "tagItem"
-                    ],
-                    "childNodes": [
-                      {
-                        "tagName": "img",
-                        "nodeId": "20",
-                        "classList": [
-                          "tagImage"
-                        ],
-                        "attributes": {
-                          "src": {
-                            "@binding": "tag.picUrl"
-                          }
-                        }
-                      },
-                      {
-                        "tagName": "div",
-                        "nodeId": "21",
-                        "classList": [
-                          "tagImageMask"
-                        ]
-                      },
-                      {
-                        "tagName": "text",
-                        "nodeId": "22",
-                        "classList": [
-                          "tagText"
-                        ],
-                        "attributes": {
-                          "lines": "1",
-                          "value": {
-                            "@binding": "tag.show"
-                          }
-                        }
-                      }
-                    ]
-                  }
-                ]
-              },
-              {
-                "tagName": "div",
-                "nodeId": "23",
-                "classList": [
-                  "tagLine"
-                ],
-                "childNodes": [
-                  {
-                    "tagName": "a",
-                    "nodeId": "24",
-                    "control": {
-                      "repeat": {
-                        "for": "slice(model.tips,2,4)",
-                        "alias": "tag",
-                        "iterator1": "i"
-                      }
-                    },
-                    "attributes": {
-                      "key": {
-                        "@binding": "i"
-                      },
-                      "href": {
-                        "@binding": 
"appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
-                      }
-                    },
-                    "classList": [
-                      "tagItem"
-                    ],
-                    "childNodes": [
-                      {
-                        "tagName": "img",
-                        "nodeId": "25",
-                        "classList": [
-                          "tagImage"
-                        ],
-                        "attributes": {
-                          "src": {
-                            "@binding": "tag.picUrl"
-                          }
-                        }
-                      },
-                      {
-                        "tagName": "div",
-                        "nodeId": "26",
-                        "classList": [
-                          "tagImageMask"
-                        ]
-                      },
-                      {
-                        "tagName": "text",
-                        "nodeId": "27",
-                        "classList": [
-                          "tagText"
-                        ],
-                        "attributes": {
-                          "lines": "1",
-                          "value": {
-                            "@binding": "tag.show"
-                          }
-                        }
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ]
-      }
-    ]
-  },
-  "components": []
-}
\ No newline at end of file
diff --git 
a/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java 
b/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java
index c9b1229e13..343d4e3ce1 100644
--- 
a/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java
+++ 
b/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java
@@ -18,6 +18,7 @@
  */
 package com.alibaba.weex;
 
+import android.content.res.AssetFileDescriptor;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v7.app.AppCompatActivity;
@@ -31,14 +32,19 @@
 import android.widget.FrameLayout;
 import android.widget.TextView;
 
+import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.WXSDKEngine;
 import com.taobao.weex.WXSDKInstance;
-import com.taobao.weex.common.WXRenderStrategy;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.common.WXException;
+import com.taobao.weex.common.WXModule;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -53,9 +59,21 @@
   private WXInstanceAdapter mAdapter;
   private final Set<WXSDKInstance> mInstances = new HashSet<>();
 
+  public static class SearchModule extends WXModule {
+    @JSMethod(uiThread = true)
+    public void search(JSONObject options) {
+      Log.e("TestModuel", options.toJSONString());
+    }
+  }
+
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
+    try {
+      WXSDKEngine.registerModule("searchEvent", SearchModule.class);
+    } catch (WXException e) {
+      e.printStackTrace();
+    }
     setContentView(R.layout.activity_slice_test);
     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
     mReportTextView = (TextView) findViewById(R.id.report_text);
@@ -69,6 +87,14 @@ protected void onCreate(Bundle savedInstanceState) {
   static int i = 0;
 
   public void addCellClick(View view) {
+    //rax case.js
+//    if (i++ % 2 == 0) {
+//      mData.add("{\"model\":{\"tips\":[{\"show\":\"雪纺\",\"q\":\"连衣裙 
雪纺\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"中长款\",\"q\":\"连衣裙
 
中长款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"假两件\",\"q\":\"连衣裙
 
假两件\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"A字款\",\"q\":\"连衣裙
 
A字款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%224%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"气质淑女\",\"q\":\"连衣裙
 
气质淑女\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%225%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]}],\"pos\":\"3\",\"src\":\"graph\",\"topic\":\"细选\",\"type\":\"1\",\"tItemType\":\"wx_text\",\"tShowTmpl\":\"wx_text\",\"rl\":\"query_type-1|tip_show_type-1|tip_show_page-2\"},\"status\":{\"layoutStyle\":0}}");
+//    } else {
+//      mData.add("{\"model\":{\"tips\":[{\"show\":\"雪纺\",\"q\":\"连衣裙 
雪纺\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"中长款\",\"q\":\"连衣裙
 
中长款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"假两件\",\"q\":\"连衣裙
 
假两件\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"A字款\",\"q\":\"连衣裙
 
A字款\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%224%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]},{\"show\":\"气质淑女\",\"q\":\"连衣裙
 
气质淑女\",\"params\":[{\"key\":\"from\",\"value\":\"tips_1\"},{\"key\":\"vClickTrace\",\"value\":\"%7B%22tips_oriq%22%3A%22%E8%BF%9E%E8%A1%A3%E8%A3%99%22%2C%22tips_srppage%22%3A%222%22%2C%22tips_type%22%3A%221%22%2C%22tips_pos%22%3A%225%22%2C%22pre_rn%22%3A%220189c4d06e11f32262fa896f5f364f76%22%7D\"}]}],\"pos\":\"3\",\"src\":\"graph\",\"topic\":\"细选\",\"type\":\"1\",\"tItemType\":\"wx_text\",\"tShowTmpl\":\"wx_text\",\"rl\":\"query_type-1|tip_show_type-1|tip_show_page-2\"},\"status\":{\"layoutStyle\":1}}");
+//    }
+
+    //card.wasm
     if (i++ % 2 == 0) {
       mData.add("{\n" +
           "    \"model\": {\n" +
@@ -400,126 +426,20 @@ public WXViewHolder(View itemView) {
     }
 
     public void render(String initData, int position) {
-      String template = "{\n" +
-          "  \"styles\": {\n" +
-          "    \"container\": {\n" +
-          "      \"backgroundColor\": \"#eee\",\n" +
-          "      \"flexDirection\": \"row\",\n" +
-          "      \"flexWrap\": \"wrap\",\n" +
-          "      \"alignItems\": \"flex-start\"\n" +
-          "    },\n" +
-          "    \"text\": {\n" +
-          "      \"fontSize\": \"70px\",\n" +
-          "      \"color\": \"#ff0000\"\n" +
-          "    },\n" +
-          "    \"top\": {\n" +
-          "      \"width\": \"750px\",\n" +
-          "      \"flexDirection\": \"row\",\n" +
-          "      \"justifyContent\": \"center\",\n" +
-          "      \"alignItems\": \"center\",\n" +
-          "      \"height\": \"60px\",\n" +
-          "      \"margin-top\": \"10px\"\n" +
-          "    },\n" +
-          "    \"lpixel\": {\n" +
-          "      \"height\": \"1px\",\n" +
-          "      \"width\": \"150px\",\n" +
-          "      \"backgroundColor\": \"black\",\n" +
-          "      \"marginRight\": \"20px\"\n" +
-          "    },\n" +
-          "    \"rpixel\": {\n" +
-          "      \"height\": \"1px\",\n" +
-          "      \"width\": \"150px\",\n" +
-          "      \"backgroundColor\": \"black\",\n" +
-          "      \"marginLeft\": \"20px\"\n" +
-          "    },\n" +
-          "    \"item\": {\n" +
-          "      \"marginTop\": \"10px\",\n" +
-          "      \"backgroundColor\": \"white\",\n" +
-          "      \"borderRadius\": \"30px\",\n" +
-          "      \"width\": \"150px\",\n" +
-          "      \"height\": \"60px\",\n" +
-          "      \"justifyContent\": \"center\",\n" +
-          "      \"alignItems\": \"center\",\n" +
-          "      \"marginLeft\": \"15px\",\n" +
-          "      \"marginRight\": \"15px\"\n" +
-          "    }\n" +
-          "  },\n" +
-          "  \"body\": {\n" +
-          "    \"tagName\": \"div\",\n" +
-          "    \"nodeId\": \"1\",\n" +
-          "    \"classList\": [\n" +
-          "      \"container\"\n" +
-          "    ],\n" +
-          "    \"childNodes\": [\n" +
-          "      {\n" +
-          "        \"tagName\": \"div\",\n" +
-          "        \"nodeId\": \"2\",\n" +
-          "        \"classList\": [\n" +
-          "          \"top\"\n" +
-          "        ],\n" +
-          "        \"childNodes\": [\n" +
-          "          {\n" +
-          "            \"tagName\": \"div\",\n" +
-          "            \"nodeId\": \"3\",\n" +
-          "            \"classList\": [\n" +
-          "              \"lpixel\"\n" +
-          "            ]\n" +
-          "          },\n" +
-          "          {\n" +
-          "            \"tagName\": \"text\",\n" +
-          "            \"nodeId\": \"4\",\n" +
-          "            \"attributes\": {\n" +
-          "              \"value\": \"细选\"\n" +
-          "            }\n" +
-          "          },\n" +
-          "          {\n" +
-          "            \"tagName\": \"div\",\n" +
-          "            \"nodeId\": \"5\",\n" +
-          "            \"classList\": [\n" +
-          "              \"rpixel\"\n" +
-          "            ]\n" +
-          "          }\n" +
-          "        ]\n" +
-          "      },\n" +
-          "      {\n" +
-          "        \"tagName\": \"div\",\n" +
-          "        \"nodeId\": \"6\",\n" +
-          "        \"control\": {\n" +
-          "          \"repeat\": {\n" +
-          "            \"for\": \"items\",\n" +
-          "            \"alias\": \"item\"\n" +
-          "          }\n" +
-          "        },\n" +
-          "        \"classList\": [\n" +
-          "          \"item\"\n" +
-          "        ],\n" +
-          "        \"childNodes\": [\n" +
-          "          {\n" +
-          "            \"tagName\": \"text\",\n" +
-          "            \"nodeId\": \"7\",\n" +
-          "            \"classList\": [\n" +
-          "              \"item-text\"\n" +
-          "            ],\n" +
-          "            \"attributes\": {\n" +
-          "              \"value\": {\"@binding\": \"item\"}\n" +
-          "            }\n" +
-          "          }\n" +
-          "        ]\n" +
-          "      }\n" +
-          "    ]\n" +
-          "  },\n" +
-          "  \"components\": [],\n" +
-          "  \"data\": {\n" +
-          "    \"items\": [\"修身\", \"潮流\", \"休闲\", \"弹力\", \"薄款\", \"中年\", 
\"超薄\", \"韩版\"]\n" +
-          "  }\n" +
-          "}";
-      template = loadAssets();
+//
+//      mInstance.render(
+//          "testPage",
+//          loadAssets(),
+//          null,
+//          initData,
+//          WXRenderStrategy.DATA_RENDER
+//      );
+//
       mInstance.render(
           "testPage",
-          template,
+          loadBytes(),
           null,
-          initData,
-          WXRenderStrategy.DATA_RENDER
+          initData
       );
       mRendered = true;
       mTextView.setText(String.valueOf(position));
@@ -558,7 +478,7 @@ public void onException(WXSDKInstance instance, String 
errCode, String msg) {
   private String loadAssets() {
     StringBuilder buf = new StringBuilder();
     try {
-      InputStream json = getAssets().open("lite_template/case.json");
+      InputStream json = getAssets().open("lite_template/case.js");
       BufferedReader in =
           new BufferedReader(new InputStreamReader(json, "UTF-8"));
       String str;
@@ -574,4 +494,19 @@ private String loadAssets() {
 
     return buf.toString();
   }
+
+  private byte[] loadBytes() {
+    try {
+      AssetFileDescriptor assetFileDescriptor = 
getAssets().openFd("lite_template/card.wasm");
+      long len = assetFileDescriptor.getDeclaredLength();
+      ByteBuffer buf = ByteBuffer.allocate((int) len);
+      InputStream json = assetFileDescriptor.createInputStream();
+      json.read(buf.array());
+      json.close();
+      return buf.array();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
 }
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJsFileLoaderAdapter.java 
b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJsFileLoaderAdapter.java
index d1173ef7e9..37bbf7f371 100644
--- 
a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJsFileLoaderAdapter.java
+++ 
b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJsFileLoaderAdapter.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package com.taobao.weex.adapter;
 
 public interface IWXJsFileLoaderAdapter {
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java 
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index eedc32a47e..57a247d9e1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -29,6 +29,7 @@
 import com.taobao.weex.base.CalledByNative;
 import com.taobao.weex.common.IWXBridge;
 import com.taobao.weex.common.WXErrorCode;
+import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.dom.CSSShorthand;
 import com.taobao.weex.layout.ContentBoxMeasurement;
 import com.taobao.weex.performance.WXInstanceApm;
@@ -66,7 +67,9 @@
 
   public native String nativeExecJSOnInstance(String instanceId, String 
script, int type);
 
-  public native void nativeFireEventOnDataRenderNode(String instanceId, String 
ref, String type, String data, String params);
+  public native void nativeFireEventOnDataRenderNode(String instanceId, String 
ref, String type, String data);
+
+  public native void nativeRegisterModuleOnDataRenderNode( String data);
 
   private native void nativeTakeHeapSnapshot(String filename);
 
@@ -233,9 +236,17 @@ public void reportJSException(String instanceId, String 
func, String exception)
   public Object callNativeModule(String instanceId, String module, String 
method, byte[] arguments, byte[] options) {
     try {
       long start = WXUtils.getFixUnixTime();
+      WXSDKInstance instance = 
WXSDKManager.getInstance().getSDKInstance(instanceId);
       JSONArray argArray = null;
-      if (arguments != null)
-        argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
+      if (arguments != null){
+        // TODO use a better way
+        if (instance!=null && (instance.getRenderStrategy()== 
WXRenderStrategy.DATA_RENDER
+                || instance.getRenderStrategy()== 
WXRenderStrategy.DATA_RENDER_BINARY)){
+          argArray = (JSONArray) JSON.parse(new String(arguments, "UTF-8"));
+        } else {
+          argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
+        }
+      }
       JSONObject optionsObj = null;
       if (options != null) {
         optionsObj = (JSONObject) WXWsonJSONSwitch.parseWsonOrJSON(options);
@@ -259,7 +270,6 @@ public Object callNativeModule(String instanceId, String 
module, String method,
 
       Object object = 
WXBridgeManager.getInstance().callNativeModule(instanceId, module, method, 
argArray, optionsObj);
 
-      WXSDKInstance instance = 
WXSDKManager.getInstance().getSDKInstance(instanceId);
       if (null != instance){
         
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_NUM,1);
         instance.getApmForInstance().updateFSDiffStats(
@@ -687,7 +697,11 @@ public void reportNativeInitStatus(String statusCode, 
String errorMsg) {
   }
 
   @Override
-  public void fireEventOnDataRenderNode(String instanceId, String ref, String 
type, String data, String params) {
-    nativeFireEventOnDataRenderNode(instanceId,ref,type,data,params);
+  public void fireEventOnDataRenderNode(String instanceId, String ref, String 
type, String data) {
+    nativeFireEventOnDataRenderNode(instanceId,ref,type,data);
+  }
+
+  public void registerModuleOnDataRenderNode(String data) {
+    nativeRegisterModuleOnDataRenderNode(data);
   }
 }
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java 
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 8d5054b936..acd676fb7a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -1143,7 +1143,7 @@ public void fireEventOnNode(final String instanceId, 
final String ref,
               "fireEvent must be called by main thread");
     }
     if (WXSDKManager.getInstance().getAllInstanceMap().get(instanceId)!=null 
&& 
WXSDKManager.getInstance().getAllInstanceMap().get(instanceId).getRenderStrategy()==
 WXRenderStrategy.DATA_RENDER) {
-      fireEventOnDataRenderNode(instanceId, ref, type, data, domChanges, 
params, callback);
+      fireEventOnDataRenderNode(instanceId, ref, type, data);
     } else {
       if(callback == null) {
         addJSEventTask(METHOD_FIRE_EVENT, instanceId, params, ref, type, data, 
domChanges);
@@ -1155,8 +1155,7 @@ public void fireEventOnNode(final String instanceId, 
final String ref,
   }
 
   private void fireEventOnDataRenderNode(final String instanceId, final String 
ref,
-                                         final String type, final Map<String, 
Object> data,
-                                         final Map<String, Object> domChanges, 
final List<Object> params, EventResult callback) {
+                                         final String type, final Map<String, 
Object> data) {
     mJSHandler.postDelayed(WXThread.secure(new Runnable() {
       @Override
       public void run() {
@@ -1167,7 +1166,7 @@ public void run() {
             WXLogUtils.d("fireEventOnDataRenderNode >>>> instanceId:" + 
instanceId
                 + ", data:" + data);
           }
-          mWXBridge.fireEventOnDataRenderNode(instanceId, 
ref,type,JSON.toJSONString(data),JSON.toJSONString(params));
+          mWXBridge.fireEventOnDataRenderNode(instanceId, 
ref,type,JSON.toJSONString(data));
           WXLogUtils.renderPerformanceLog("fireEventOnDataRenderNode", 
System.currentTimeMillis() - start);
         } catch (Throwable e) {
           String err = "[WXBridgeManager] fireEventOnDataRenderNode " + 
WXLogUtils.getStackTrace(e);
@@ -2108,6 +2107,14 @@ private void invokeRegisterModules(Map<String, Object> 
modules, List<Map<String,
 
     WXJSObject[] args = {WXWsonJSONSwitch.toWsonOrJsonWXJSObject(modules)};
     String errorMsg = null;
+    try{
+      // TODO use a better way
+      if (mWXBridge instanceof WXBridge) {
+        ((WXBridge) 
mWXBridge).registerModuleOnDataRenderNode(WXJsonUtils.fromObjectToJSONString(modules));
+      }
+    } catch (Throwable e){
+      WXLogUtils.e("Weex [data_render register err]", e);
+    }
     try {
         if(0 == mWXBridge.execJS("", null, METHOD_REGISTER_MODULES, args)) {
             errorMsg = "execJS error";
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java 
b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index efc9bff5cf..130e8795e1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -201,5 +201,6 @@ int callUpdateAttrs(String instanceId, String ref,
 
   void resetWXBridge(boolean remoteDebug);
 
-  void fireEventOnDataRenderNode(String instanceId, String ref, String type, 
String data, String params);
+  void fireEventOnDataRenderNode(String instanceId, String ref, String type, 
String data);
+
 }
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj 
b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index 205381841a..a591598222 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -87,10 +87,6 @@
                4547FD0E215392FA00E79971 /* js_common_function.cc in Sources */ 
= {isa = PBXBuildFile; fileRef = 4547FD0C215392F900E79971 /* 
js_common_function.cc */; };
                4547FD0F2153931000E79971 /* js_common_function.cc in Sources */ 
= {isa = PBXBuildFile; fileRef = 4547FD0C215392F900E79971 /* 
js_common_function.cc */; };
                4547FD102153932A00E79971 /* js_common_function.h in Headers */ 
= {isa = PBXBuildFile; fileRef = 4547FD0B215392F900E79971 /* 
js_common_function.h */; };
-               4547FD192153BC3D00E79971 /* 
render_action_call_native_module.cpp in Sources */ = {isa = PBXBuildFile; 
fileRef = 4547FD172153BC3C00E79971 /* render_action_call_native_module.cpp */; 
};
-               4547FD1A2153BC3D00E79971 /* render_action_call_native_module.h 
in Headers */ = {isa = PBXBuildFile; fileRef = 4547FD182153BC3C00E79971 /* 
render_action_call_native_module.h */; };
-               4547FD1B2153BC7600E79971 /* 
render_action_call_native_module.cpp in Sources */ = {isa = PBXBuildFile; 
fileRef = 4547FD172153BC3C00E79971 /* render_action_call_native_module.cpp */; 
};
-               4547FD1C2153BC8E00E79971 /* render_action_call_native_module.h 
in Headers */ = {isa = PBXBuildFile; fileRef = 4547FD182153BC3C00E79971 /* 
render_action_call_native_module.h */; };
                591324A31D49B7F1004E89ED /* WXTimerModuleTests.m in Sources */ 
= {isa = PBXBuildFile; fileRef = 591324A21D49B7F1004E89ED /* 
WXTimerModuleTests.m */; };
                591DD3311D23AD5800BE8709 /* WXErrorView.m in Sources */ = {isa 
= PBXBuildFile; fileRef = 591DD32F1D23AD5800BE8709 /* WXErrorView.m */; };
                591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */ = {isa 
= PBXBuildFile; fileRef = 591DD3301D23AD5800BE8709 /* WXErrorView.h */; 
settings = {ATTRIBUTES = (Public, ); }; };
@@ -1099,8 +1095,6 @@
                4547FD002152048600E79971 /* class_object.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
class_object.h; sourceTree = "<group>"; };
                4547FD0B215392F900E79971 /* js_common_function.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
js_common_function.h; sourceTree = "<group>"; };
                4547FD0C215392F900E79971 /* js_common_function.cc */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; 
path = js_common_function.cc; sourceTree = "<group>"; };
-               4547FD172153BC3C00E79971 /* 
render_action_call_native_module.cpp */ = {isa = PBXFileReference; fileEncoding 
= 4; lastKnownFileType = sourcecode.cpp.cpp; path = 
render_action_call_native_module.cpp; sourceTree = "<group>"; };
-               4547FD182153BC3C00E79971 /* render_action_call_native_module.h 
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.h; path = render_action_call_native_module.h; sourceTree = 
"<group>"; };
                591324A21D49B7F1004E89ED /* WXTimerModuleTests.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WXTimerModuleTests.m; sourceTree = "<group>"; };
                591DD32F1D23AD5800BE8709 /* WXErrorView.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WXErrorView.m; sourceTree = "<group>"; };
                591DD3301D23AD5800BE8709 /* WXErrorView.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
WXErrorView.h; sourceTree = "<group>"; };
@@ -2434,8 +2428,6 @@
                                B8D66B412125572F003960BD /* 
render_action_move_element.h */,
                                B8D66B422125572F003960BD /* 
render_action_update_attr.cpp */,
                                B8D66B432125572F003960BD /* 
render_action_layout.cpp */,
-                               4547FD172153BC3C00E79971 /* 
render_action_call_native_module.cpp */,
-                               4547FD182153BC3C00E79971 /* 
render_action_call_native_module.h */,
                                B8D66B442125572F003960BD /* 
render_action_update_style.h */,
                                B8D66B452125572F003960BD /* 
render_action_createfinish.h */,
                                B8D66B462125572F003960BD /* 
render_action_update_style.cpp */,
@@ -2688,7 +2680,6 @@
                                74915F471C8EB02B00BEBCC0 /* WXAssert.h in 
Headers */,
                                2A8E658A1C7C7AA20025C7B7 /* WXVideoComponent.h 
in Headers */,
                                59A5961C1CB630F10012CD52 /* 
WXComponent+Navigation.h in Headers */,
-                               4547FD1A2153BC3D00E79971 /* 
render_action_call_native_module.h in Headers */,
                                B8D66C3D21255730003960BD /* 
render_action_createfinish.h in Headers */,
                                775BEE6E1C1BD8F4008D1629 /* 
WXImgLoaderProtocol.h in Headers */,
                                B8D66C1321255730003960BD /* 
core_side_in_script.h in Headers */,
@@ -3000,7 +2991,6 @@
                                B8D66BC42125572F003960BD /* 
vnode_render_context.h in Headers */,
                                DCA445AF1EFA575D00D0CFA8 /* WXModuleProtocol.h 
in Headers */,
                                4547FD102153932A00E79971 /* 
js_common_function.h in Headers */,
-                               4547FD1C2153BC8E00E79971 /* 
render_action_call_native_module.h in Headers */,
                                4547FD032152049F00E79971 /* class_object.h in 
Headers */,
                                ED053501207F4DEB007B4568 /* JSContext+Weex.h in 
Headers */,
                                DCA4459F1EFA56EC00D0CFA8 /* 
WXURLRewriteProtocol.h in Headers */,
@@ -3590,7 +3580,6 @@
                                B8D66C3F21255730003960BD /* 
render_action_update_style.cpp in Sources */,
                                74915F481C8EB02B00BEBCC0 /* WXAssert.m in 
Sources */,
                                59A596251CB6311F0012CD52 /* WXStorageModule.m 
in Sources */,
-                               4547FD192153BC3D00E79971 /* 
render_action_call_native_module.cpp in Sources */,
                                2AFEB17C1C747139000507FA /* WXInstanceWrap.m in 
Sources */,
                                74A4BA5C1CABBBD000195969 /* WXDebugTool.m in 
Sources */,
                                742AD73B1DF98C8B007DC46C /* WXResourceLoader.m 
in Sources */,
@@ -3673,7 +3662,6 @@
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
-                               4547FD1B2153BC7600E79971 /* 
render_action_call_native_module.cpp in Sources */,
                                4547FD0F2153931000E79971 /* 
js_common_function.cc in Sources */,
                                4547FD04215204AB00E79971 /* class_object.cc in 
Sources */,
                                4532670D213FCFB400DAA620 /* 
WXDisplayLinkManager.m in Sources */,
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index e95c59657f..f1a1316a9e 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -44,7 +44,6 @@ set(COMMON_SRCS
   ./core/render/action/render_action_add_event.cpp
   ./core/render/action/render_action_remove_event.cpp
   ./core/render/action/render_action_add_element.cpp
-  ./core/render/action/render_action_call_native_module.cpp
   ./core/render/action/render_action_remove_element.cpp
   ./core/render/action/render_action_move_element.cpp
   ./core/render/action/render_action_createbody.cpp
diff --git a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h 
b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
index 70acd615f4..eae346e692 100644
--- a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
+++ b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
@@ -37,13 +37,6 @@ static void RefreshInstance(JNIEnv* env, jobject jcaller,
     jstring function,
     jobjectArray args);
 
-static void FireEventOnRenderNode(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring _namespace,
-    jstring function,
-    jstring event,
-    jstring ref, jstring args);
-
 static jint ExecJS(JNIEnv* env, jobject jcaller,
     jstring instanceId,
     jstring name,
@@ -76,6 +69,15 @@ static jstring ExecJSOnInstance(JNIEnv* env, jobject jcaller,
     jstring script,
     jint type);
 
+static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller,
+    jstring instanceId,
+    jstring ref,
+    jstring type,
+    jstring data);
+
+static void RegisterModuleOnDataRenderNode(JNIEnv* env, jobject jcaller,
+    jstring data);
+
 static void TakeHeapSnapshot(JNIEnv* env, jobject jcaller,
     jstring filename);
 
@@ -954,6 +956,19 @@ static const JNINativeMethod kMethodsWXBridge[] = {
 "I"
 ")"
 "Ljava/lang/String;", reinterpret_cast<void*>(ExecJSOnInstance) },
+    { "nativeFireEventOnDataRenderNode",
+"("
+"Ljava/lang/String;"
+"Ljava/lang/String;"
+"Ljava/lang/String;"
+"Ljava/lang/String;"
+")"
+"V", reinterpret_cast<void*>(FireEventOnDataRenderNode) },
+    { "nativeRegisterModuleOnDataRenderNode",
+"("
+"Ljava/lang/String;"
+")"
+"V", reinterpret_cast<void*>(RegisterModuleOnDataRenderNode) },
     { "nativeTakeHeapSnapshot",
 "("
 "Ljava/lang/String;"
diff --git a/weex_core/Source/android/wrap/wx_bridge.cpp 
b/weex_core/Source/android/wrap/wx_bridge.cpp
index c8e4ddd30a..954bea867c 100644
--- a/weex_core/Source/android/wrap/wx_bridge.cpp
+++ b/weex_core/Source/android/wrap/wx_bridge.cpp
@@ -19,6 +19,7 @@
 
 #include "android/wrap/wx_bridge.h"
 #include <fstream>
+#include "core/data_render/common_error.h"
 #include "android/base/jni_type.h"
 #include "android/base/jni/jbytearray_ref.h"
 #include "android/base/string/string_utils.h"
@@ -377,23 +378,6 @@ static void RefreshInstance(JNIEnv* env, jobject jcaller, 
jstring instanceId,
   freeParams(params);
 }
 
-static void FireEventOnRenderNode(JNIEnv* env, jobject jcaller, jstring 
instanceId,
-                            jstring _namespace, jstring _function,jstring 
_event,
-                            jstring _ref,
-                            jstring _args) {
-  ScopedJStringUTF8 instance_id(env, instanceId);
-  ScopedJStringUTF8 name_space(env, _namespace);
-  ScopedJStringUTF8 function(env, _function);
-  ScopedJStringUTF8 event(env, _event);
-  ScopedJStringUTF8 ref(env, _ref);
-  ScopedJStringUTF8 args(env, _args);
-
-  weex::core::data_render::VNodeRenderManager::GetInstance()->FireEvent(
-      instance_id.getChars(),
-      event.getChars(),ref.getChars(),args.getChars()
-  );
-}
-
 static jint ExecJSService(JNIEnv* env, jobject object, jstring script) {
   if (script == nullptr) return false;
   ScopedJStringUTF8 source(env, script);
@@ -467,8 +451,8 @@ static jbyteArray ExecJSWithResult(JNIEnv* env, jobject 
jcaller,
 
     auto wx_js_object = std::unique_ptr<WXJSObject>(
         new WXJSObject(env, base::android::ScopedLocalJavaRef<jobject>(
-                                env, env->GetObjectArrayElement(args, i))
-                                .Get()));
+            env, env->GetObjectArrayElement(args, i))
+            .Get()));
     addParamsFromJArgs(params, param, env, wx_js_object);
   }
 
@@ -479,7 +463,7 @@ static jbyteArray ExecJSWithResult(JNIEnv* env, jobject 
jcaller,
           ->ExecJSWithResult(instance_id.getChars(), name_space.getChars(),
                              function.getChars(), params);
 
-  if(result.get() == nullptr || result->data.get() == nullptr)
+  if (result.get() == nullptr || result->data.get() == nullptr)
     return nullptr;
 
   jbyteArray array = env->NewByteArray(result->length);
@@ -518,8 +502,8 @@ static jint CreateInstanceContext(JNIEnv* env, jobject 
jcaller,
   }
   auto arg1 = std::unique_ptr<WXJSObject>(
       new WXJSObject(env, base::android::ScopedLocalJavaRef<jobject>(
-                              env, env->GetObjectArrayElement(args, 1))
-                              .Get()));
+          env, env->GetObjectArrayElement(args, 1))
+          .Get()));
   auto jscript = arg1->GetData(env);
   auto opts = base::android::ScopedLocalJavaRef<jstring>(
       env, getJsonData(env, args, 2));
@@ -528,13 +512,13 @@ static jint CreateInstanceContext(JNIEnv* env, jobject 
jcaller,
       env, getJsonData(env, args, 3));
   auto arg4 = std::unique_ptr<WXJSObject>(
       new WXJSObject(env, base::android::ScopedLocalJavaRef<jobject>(
-                              env, env->GetObjectArrayElement(args, 4))
-                              .Get()));
+          env, env->GetObjectArrayElement(args, 4))
+          .Get()));
   // get render strategy
   auto render_strategy = std::unique_ptr<WXJSObject>(
       new WXJSObject(env, base::android::ScopedLocalJavaRef<jobject>(
-                              env, env->GetObjectArrayElement(args, 5))
-                              .Get()));
+          env, env->GetObjectArrayElement(args, 5))
+          .Get()));
   auto japi = arg4->GetData(env);
   ScopedJStringUTF8 scoped_id(env, instanceId);
   ScopedJStringUTF8 scoped_func(env, function);
@@ -550,21 +534,22 @@ static jint CreateInstanceContext(JNIEnv* env, jobject 
jcaller,
       && strcmp(scoped_render_strategy.getChars(), "DATA_RENDER_BINARY") == 0) 
{
     JByteArrayRef byte_array(env, static_cast<jbyteArray>(jscript.Get()));
     return WeexCoreManager::Instance()
-            ->getPlatformBridge()
-            ->core_side()
-            ->CreateInstance(scoped_id.getChars(), scoped_func.getChars(),
-                             byte_array.getBytes(), byte_array.length(), 
scoped_opts.getChars(),
-                             scoped_init_data.getChars(), 
scoped_api.getChars(),
-                             scoped_render_strategy.getChars());
+        ->getPlatformBridge()
+        ->core_side()
+        ->CreateInstance(scoped_id.getChars(), scoped_func.getChars(),
+                         byte_array.getBytes(), byte_array.length(), 
scoped_opts.getChars(),
+                         scoped_init_data.getChars(), scoped_api.getChars(),
+                         scoped_render_strategy.getChars());
   } else {
     ScopedJStringUTF8 scoped_script(env, static_cast<jstring>(jscript.Get()));
     return WeexCoreManager::Instance()
-            ->getPlatformBridge()
-            ->core_side()
-            ->CreateInstance(scoped_id.getChars(), scoped_func.getChars(),
-                             scoped_script.getChars(), 
strlen(scoped_script.getChars()), scoped_opts.getChars(),
-                             scoped_init_data.getChars(), 
scoped_api.getChars(),
-                             scoped_render_strategy.getChars());
+        ->getPlatformBridge()
+        ->core_side()
+        ->CreateInstance(scoped_id.getChars(), scoped_func.getChars(),
+                         scoped_script.getChars(), 
strlen(scoped_script.getChars()),
+                         scoped_opts.getChars(),
+                         scoped_init_data.getChars(), scoped_api.getChars(),
+                         scoped_render_strategy.getChars());
   }
 
 }
@@ -598,12 +583,56 @@ static jstring ExecJSOnInstance(JNIEnv* env, jobject 
jcaller,
           ->core_side()
           ->ExecJSOnInstance(idChar.getChars(), scriptChar.getChars());
 
-  if(result.get() == nullptr || result->data.get() == nullptr)
+  if (result.get() == nullptr || result->data.get() == nullptr)
     return nullptr;
 
   return env->NewStringUTF(result->data.get());
 }
 
+static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller,
+                                      jstring instanceId, jstring ref, jstring 
type, jstring data) {
+  if (instanceId == NULL || ref == NULL || type == NULL || data == NULL) {
+    return;
+  }
+
+  ScopedJStringUTF8 idChar(env, instanceId);
+  ScopedJStringUTF8 refChar(env, ref);
+  ScopedJStringUTF8 typeChar(env, type);
+  ScopedJStringUTF8 dataChar(env, data);
+
+  try {
+    weex::core::data_render::VNodeRenderManager::GetInstance()->FireEvent(
+        idChar.getChars(), refChar.getChars(), typeChar.getChars(), 
dataChar.getChars()
+    );
+  } catch (std::exception &e) {
+    auto error = static_cast<weex::core::data_render::Error *>(&e);
+    if (error) {
+      LOGE("Error on FireEventOnDataRenderNode %s", error->what());
+    }
+    return;
+  }
+}
+
+static void RegisterModuleOnDataRenderNode(JNIEnv* env, jobject jcaller,
+                                      jstring data) {
+  if (data == NULL) {
+    return;
+  }
+
+  ScopedJStringUTF8 dataChar(env, data);
+
+  try {
+    
weex::core::data_render::VNodeRenderManager::GetInstance()->RegisterModules(dataChar.getChars());
+  } catch (std::exception &e) {
+    auto error = static_cast<weex::core::data_render::Error *>(&e);
+    if (error) {
+      LOGE("Error on RegisterModuleOnDataRenderNode %s", error->what());
+
+    }
+    return;
+  }
+}
+
 namespace WeexCore {
 
 WXBridge* WXBridge::g_instance = nullptr;
@@ -778,19 +807,19 @@ int WXBridge::AddElement(JNIEnv* env, const char* page_id,
 
   auto jni_margins =
       0 == c_margins[0] && 0 == c_margins[1] && 0 == c_margins[2] &&
-              0 == c_margins[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_margins);
+      0 == c_margins[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_margins);
   auto jni_paddings =
       0 == c_paddings[0] && 0 == c_paddings[1] && 0 == c_paddings[2] &&
-              0 == c_paddings[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_paddings);
+      0 == c_paddings[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_paddings);
   auto jni_borders =
       0 == c_borders[0] && 0 == c_borders[1] && 0 == c_borders[2] &&
-              0 == c_borders[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_borders);
+      0 == c_borders[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_borders);
 
   jstring jni_component_type = getComponentTypeFromCache(component_type);
   if (jni_component_type == nullptr) {
@@ -843,19 +872,19 @@ int WXBridge::CreateBody(JNIEnv* env, const char* page_id,
 
   auto jni_margins =
       0 == c_margins[0] && 0 == c_margins[1] && 0 == c_margins[2] &&
-              0 == c_margins[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_margins);
+      0 == c_margins[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_margins);
   auto jni_paddings =
       0 == c_paddings[0] && 0 == c_paddings[1] && 0 == c_paddings[2] &&
-              0 == c_paddings[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_paddings);
+      0 == c_paddings[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_paddings);
   auto jni_borders =
       0 == c_borders[0] && 0 == c_borders[1] && 0 == c_borders[2] &&
-              0 == c_borders[3]
-          ? base::android::ScopedLocalJavaRef<jfloatArray>()
-          : base::android::JNIType::NewFloatArray(env, 4, c_borders);
+      0 == c_borders[3]
+      ? base::android::ScopedLocalJavaRef<jfloatArray>()
+      : base::android::JNIType::NewFloatArray(env, 4, c_borders);
 
   jstring jni_component_type = getComponentTypeFromCache(component_type);
   if (jni_component_type == nullptr) {
@@ -1029,7 +1058,7 @@ void WXBridge::ReportNativeInitStatus(JNIEnv* env, const 
char* statusCode,
 
 void WXBridge::reset_clazz(JNIEnv* env, const char* className) {
   LOGE("class Name is %s", className);
-  Java_WXBridge_reset_clazz(env,className);
+  Java_WXBridge_reset_clazz(env, className);
 }
 
 }  // namespace WeexCore
diff --git a/weex_core/Source/core/data_render/ast.h 
b/weex_core/Source/core/data_render/ast.h
index 43a384237c..d382a4ea8e 100644
--- a/weex_core/Source/core/data_render/ast.h
+++ b/weex_core/Source/core/data_render/ast.h
@@ -538,6 +538,12 @@ class ArrayConstant : public Expression {
  private:
   ProxyArray exprs_;
 };
+    
+enum class AssignOperation {
+    kAssign,
+    kAssignAdd,
+    kAssignSub
+};
 
 class AssignExpression : public Expression {
  public:
@@ -547,11 +553,13 @@ class AssignExpression : public Expression {
       : Expression(), lhs_(lhs), rhs_(rhs) {}
   Handle<Expression> lhs() { return lhs_; }
   Handle<Expression> rhs() { return rhs_; }
+  AssignOperation& op() { return op_; }
   DEFINE_NODE_TYPE(AssignExpression, Expression);
 
  private:
   Handle<Expression> lhs_;
   Handle<Expression> rhs_;
+  AssignOperation op_{AssignOperation::kAssign};
 };
 
 class UndefinedConstant : public Expression {
diff --git a/weex_core/Source/core/data_render/class_string.cc 
b/weex_core/Source/core/data_render/class_string.cc
index 9a518fe11f..2742d762cb 100644
--- a/weex_core/Source/core/data_render/class_string.cc
+++ b/weex_core/Source/core/data_render/class_string.cc
@@ -35,15 +35,62 @@ namespace data_render {
 static Value split(ExecState *exec_state);
 static Value trim(ExecState* exec_state);
 static Value indexOf(ExecState* exec_state);
+static Value replaceAll(ExecState *exec_state);
 
 ClassDescriptor *NewClassString() {
     ClassDescriptor *array_desc = new ClassDescriptor(nullptr);
     AddClassCFunc(array_desc, "split", split);
     AddClassCFunc(array_desc, "trim", trim);
     AddClassCFunc(array_desc, "indexOf", indexOf);
+    AddClassCFunc(array_desc, "replaceAll", replaceAll);
     return array_desc;
 }
     
+std::string& replace_all(std::string& str, std::string& old_value, 
std::string& new_value)
+{
+    while (true)
+    {
+        std::string::size_type pos(0);
+        if ((pos = str.find(old_value)) != std::string::npos) {
+            str.replace(pos, old_value.length(),new_value);
+        }
+        else {
+            break;
+        }
+    }
+    return str;
+}
+    
+static Value replaceAll(ExecState *exec_state) {
+    Value ret;
+    do {
+        size_t length = exec_state->GetArgumentCount();
+        if (length < 3) {
+            break;
+        }
+        Value *src = exec_state->GetArgument(0);
+        if (!IsString(src)) {
+            throw VMExecError("replaceAll caller isn't a string");
+        }
+        Value *oldValue = exec_state->GetArgument(1);
+        if (!IsString(oldValue)) {
+            throw VMExecError("old caller isn't a string");
+        }
+        Value *newValue = exec_state->GetArgument(2);
+        if (!IsString(newValue)) {
+            throw VMExecError("split caller isn't a string");
+        }
+        std::string srcstr = CStringValue(src);
+        std::string oldstr = CStringValue(oldValue);
+        std::string newstr = CStringValue(newValue);
+        std::string dststr = replace_all(srcstr, oldstr, newstr);
+        ret = exec_state->string_table()->StringFromUTF8(dststr);
+        
+    } while (0);
+    
+    return ret;
+}
+    
 template <class Container>
 void split_string(const std::string& str, Container& container, const 
std::string& delims = " ")
 {
diff --git a/weex_core/Source/core/data_render/code_generator.cc 
b/weex_core/Source/core/data_render/code_generator.cc
index 72e870465a..fab8367310 100644
--- a/weex_core/Source/core/data_render/code_generator.cc
+++ b/weex_core/Source/core/data_render/code_generator.cc
@@ -408,8 +408,8 @@ void CodeGenerator::Visit(BlockStatement* node, void* data) 
{
 void CodeGenerator::Visit(FunctionPrototype *node, void *data) {}
 
 void CodeGenerator::Visit(FunctionStatement *node, void *data) {
-    RegisterScope register_scope(block_);
     long ret = data == nullptr ? block_->NextRegisterId() : *static_cast<long 
*>(data);
+    RegisterScope register_scope(block_);
     Handle<FunctionPrototype> proto = node->proto();
     bool is_class_func = func_->parent() == nullptr && class_ ? true : false;
     // body
@@ -817,11 +817,33 @@ void CodeGenerator::Visit(AssignExpression *node, void 
*data) {
     }
     // a = b
     FuncState *func_state = func_->func_state();
-    if (class_ && node->lhs()->IsMemberExpression() && 
node->lhs()->AsMemberExpression()->expr()->IsThisExpression()) {
-        func_state->AddInstruction(CREATE_ABC(OP_SETMEMBERVAR, left, right, 
0));
-    }
-    else {
-        func_state->AddInstruction(CREATE_ABC(OP_MOVE, left, right, 0));
+    switch (node->op()) {
+        case AssignOperation::kAssign:
+        {
+            if (class_ && node->lhs()->IsMemberExpression() && 
node->lhs()->AsMemberExpression()->expr()->IsThisExpression()) {
+                func_state->AddInstruction(CREATE_ABC(OP_SETMEMBERVAR, left, 
right, 0));
+            }
+            else {
+                func_state->AddInstruction(CREATE_ABC(OP_MOVE, left, right, 
0));
+            }
+            break;
+        }
+        case AssignOperation::kAssignAdd:
+        {
+            long ret = block_->NextRegisterId();
+            func_state->AddInstruction(CREATE_ABC(OP_ADD, ret, left, right));
+            func_state->AddInstruction(CREATE_ABC(OP_MOVE, left, ret, 0));
+            break;
+        }
+        case AssignOperation::kAssignSub:
+        {
+            long ret = block_->NextRegisterId();
+            func_state->AddInstruction(CREATE_ABC(OP_SUB, ret, left, right));
+            func_state->AddInstruction(CREATE_ABC(OP_MOVE, left, ret, 0));
+            break;
+        }
+        default:
+        break;
     }
 }
 
diff --git a/weex_core/Source/core/data_render/exec_state.cc 
b/weex_core/Source/core/data_render/exec_state.cc
index f33ee01545..b438575ae5 100644
--- a/weex_core/Source/core/data_render/exec_state.cc
+++ b/weex_core/Source/core/data_render/exec_state.cc
@@ -108,9 +108,11 @@ void ExecState::Execute(std::string& err) {
   Value chunk;
   chunk.type = Value::Type::FUNC;
   chunk.f = func_state_.get();
-  **stack_->top() = chunk;
+  // reset stack top pointer when main call
+  *stack_->top() = stack_->base();
+  *stack_->base() = chunk;
   try {
-      CallFunction(*stack_->top(), 0, nullptr);
+      CallFunction(stack_->base(), 0, nullptr);
   } catch (std::exception &e) {
       auto error = static_cast<Error *>(&e);
       if (error) {
diff --git a/weex_core/Source/core/data_render/rax_parser.cc 
b/weex_core/Source/core/data_render/rax_parser.cc
index f507e2cbd1..b9ea584916 100644
--- a/weex_core/Source/core/data_render/rax_parser.cc
+++ b/weex_core/Source/core/data_render/rax_parser.cc
@@ -42,6 +42,8 @@ std::string("expected a ") + Token::Str(tok)); \
 Advance();  \
 } while (0)
     
+AssignOperation MapAssignOperation(Token& tok);
+    
 class ForInLoopParsingEnvironment {
 public:
     ForInLoopParsingEnvironment(RAXParser *parser)
@@ -109,12 +111,16 @@ Handle<Expression> RAXParser::ParseAssignExpression()
 
     // TODO: information about what kind of assignment is done here should
     //  be stored here. (in the AST?)
+    auto token = lex()->CurrentToken();
+    AssignOperation op = MapAssignOperation(token);
     Advance();
     if (lhs->IsMemberExpression()) {
         lhs->AsMemberExpression()->is_assignment() = true;
     }
     auto rhs = ParseAssignExpression();
-    return builder()->NewAssignExpression((lhs), (rhs));
+    Handle<AssignExpression>expr = builder()->NewAssignExpression((lhs), 
(rhs));
+    expr->op() = op;
+    return expr;
 }
     
 Handle<Expression> RAXParser::ParseTernaryExpression()
@@ -218,6 +224,21 @@ PrefixOperation MapTokenWithPrefixOperator(Token& tok) {
     return PrefixOperation::kUnknown;
 }
     
+AssignOperation MapAssignOperation(Token& tok) {
+    switch (tok.type()) {
+        case Token::ASSIGN_ADD:
+        return AssignOperation::kAssignAdd;
+        case Token::ASSIGN:
+        return AssignOperation::kAssign;
+        case Token::ASSIGN_SUB:
+        return AssignOperation::kAssignSub;
+        default:
+        LOGE("unexpected token as binary operator %s", tok.view().c_str());
+        throw SyntaxError(tok, "unexpected token as binary operator");
+    }
+    return AssignOperation::kAssign;
+}
+    
 Handle<Expression> RAXParser::ParseBinaryExpressionRhs(int prec, 
Handle<Expression> lhs)
 {
     while (true) {
@@ -1249,7 +1270,7 @@ Handle<Expression> RAXParser::ParseProgram()
 {
     Handle<ExpressionList> exprs = builder()->NewExpressionList();
     Handle<ChunkStatement> chunk = builder()->NewChunkStatement(exprs);
-    exprs->Insert(builder()->NewDeclaration(JSX_GLOBAL_VNODE_INDEX, 
builder()->NewIntegralConstant(0)));
+    exprs->Insert(builder()->NewDeclaration(JSX_GLOBAL_VNODE_INDEX, 
builder()->NewIntegralConstant(1)));
     exprs->Insert(builder()->NewDeclaration(JS_GLOBAL_ARGUMENTS, 
builder()->NewArrayConstant({})));
     try {
         while (Peek() != Token::EOS) {
diff --git a/weex_core/Source/core/data_render/vnode/vnode.cc 
b/weex_core/Source/core/data_render/vnode/vnode.cc
index 4fb66341ff..db192aa669 100644
--- a/weex_core/Source/core/data_render/vnode/vnode.cc
+++ b/weex_core/Source/core/data_render/vnode/vnode.cc
@@ -78,15 +78,15 @@ void VNode::AddEvent(const std::string &event, void *func, 
void *inst) {
     inst_ = inst;
 }
     
-VNode *VNode::FindNode(const std::string &ref) {
+VNode *VNode::FindNode(const std::string &node_id) {
     VNode *node = nullptr;
     do {
-        if (this->ref() == ref) {
+        if (this->node_id() == node_id) {
             node = this;
             break;
         }
         for (int i = 0; i < child_list_.size(); i++) {
-            node = child_list_[i]->FindNode(ref);
+            node = child_list_[i]->FindNode(node_id);
             if (node) {
                 break;
             }
diff --git a/weex_core/Source/core/data_render/vnode/vnode.h 
b/weex_core/Source/core/data_render/vnode/vnode.h
index db2d6b1079..3ffa3f87e5 100644
--- a/weex_core/Source/core/data_render/vnode/vnode.h
+++ b/weex_core/Source/core/data_render/vnode/vnode.h
@@ -50,12 +50,12 @@ class VNode {
     
   void InsertChild(VNode *child, int index);
 
-  VNode *FindNode(const std::string &ref);
+  VNode *FindNode(const std::string &node_id);
 
  public:
   inline const std::string &tag_name() const { return tag_name_; }
 
-  inline const std::string &node_id() const { return ref_; }
+  inline const std::string &node_id() const { return node_id_; }
 
   inline const std::string &ref() const { return ref_; }
 
diff --git a/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc 
b/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc
index 609b935f48..c3a3dd9682 100644
--- a/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc
+++ b/weex_core/Source/core/data_render/vnode/vnode_exec_env.cc
@@ -39,34 +39,36 @@ json11::Json ValueToJSON(const Value& value);
 
 static Value Log(ExecState *exec_state) {
   size_t length = exec_state->GetArgumentCount();
+  std::stringstream ss;
   for (int i = 0; i < length; ++i) {
     Value *a = exec_state->GetArgument(i);
     switch (a->type) {
       case Value::Type::NUMBER:
-        std::cout << "[log]:=>" << a->n << "\n";
+        ss << "[log]:=>" << a->n << "\n";
         break;
       case Value::Type::INT:
-        std::cout << "[log]:=>" << a->i << "\n";
+        ss << "[log]:=>" << a->i << "\n";
         break;
       case Value::Type::STRING:
-        std::cout << "[log]:=>" << a->str->c_str() << "\n";
+        ss << "[log]:=>" << a->str->c_str() << "\n";
         break;
       case Value::Type::TABLE:
-        std::cout << "[log]:=>" << TableToString(ValueTo<Table>(a)) << "\n";
+        ss << "[log]:=>" << TableToString(ValueTo<Table>(a)) << "\n";
         break;
       case Value::Type::ARRAY:
-        std::cout << "[log]:=>" << ArrayToString(ValueTo<Array>(a)) << "\n";
+        ss << "[log]:=>" << ArrayToString(ValueTo<Array>(a)) << "\n";
         break;
       case Value::Type::CPTR:
       {
           VNode *node = (VNode *)a->cptr;
-          std::cout << "[log]:=> cptr" << node->tag_name() <<"\n";
+          ss << "[log]:=> cptr" << node->tag_name() <<"\n";
           break;
       }
       default:
         break;
     }
   }
+  LOGD("%s",ss.str().c_str());
   return Value();
 }
 
@@ -178,7 +180,30 @@ static Value CallNativeModule(ExecState *exec_state) {
 }
     
 static Value RegisterModules(ExecState *exec_state) {
-    
weex::core::data_render::VNodeRenderManager::GetInstance()->ExecuteRegisterModules(exec_state);
+    do {
+        if (!exec_state->GetArgumentCount()) {
+            break;
+        }
+        Value *arg = exec_state->GetArgument(0);
+        if (!IsArray(arg)) {
+            break;
+        }
+        Array *array = ValueTo<Array>(arg);
+        if (array->items.size() > 0) {
+            std::vector<std::string> args;
+            for (int i = 0; i < array->items.size(); i++) {
+                Value item = array->items[i];
+                if (!IsString(&item)) {
+                    continue;
+                }
+                args.push_back(CStringValue(&item));
+            }
+            if (args.size() > 0) {
+                
weex::core::data_render::VNodeRenderManager::GetInstance()->ExecuteRegisterModules(exec_state,
 args);
+            }
+        }
+        
+    } while (0);
     return Value();
 }
 
@@ -302,30 +327,37 @@ static Value UpdateElement(ExecState *exec_state) {
     
     return Value();
 }
+    
+static size_t g_node_id = 0;
 
 // createElement("tag_name", "id", ref);
 static Value CreateElement(ExecState *exec_state) {
-    Value *arg_node_id = exec_state->GetArgument(1);
-    std::string node_id;
-    if (IsString(arg_node_id)) {
-        node_id = CStringValue(arg_node_id);
-    } else if (IsInt(arg_node_id)) {
+    std::string tag_name = exec_state->GetArgument(0)->str->c_str();
+    Value *arg_id = exec_state->GetArgument(1);
+    std::string arg_id_str;
+    if (IsString(arg_id)) {
+        arg_id_str = CStringValue(arg_id);
+    }
+    else if (IsInt(arg_id)) {
         std::ostringstream os;
-        os << IntValue(arg_node_id) ;
-        node_id = "vn_" + os.str();
-    } else {
+        os << IntValue(arg_id) ;
+        arg_id_str = "vn_" + os.str();
+    }
+    else {
         throw VMExecError("CreateElement only support int for string");
     }
-    std::string tag_name = exec_state->GetArgument(0)->str->c_str();
-    std::string ref = "";
-    if (exec_state->GetArgumentCount() > 2 &&
-        exec_state->GetArgument(2)->type == Value::Type::STRING) {
-      ref = exec_state->GetArgument(2)->str->c_str();
+    std::string node_id,ref;
+    std::ostringstream os;
+    os << g_node_id++;
+    node_id = "vn_" + os.str();
+    ref = arg_id_str;
+    if (exec_state->GetArgumentCount() > 2 && exec_state->GetArgument(2)->type 
== Value::Type::STRING) {
+        ref = exec_state->GetArgument(2)->str->c_str();
     }
     LOGD("[VM][VNode][CreateElement]: %s  %s\n", node_id.c_str(), 
tag_name.c_str());
     VNode *node = NULL;
     if (tag_name == "root") {
-        node = new VNode("div", node_id, ref);
+        node = new VNode("div", "vn_r", "vn_r");
         exec_state->context()->set_root(node);
     }
     else {
diff --git a/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc 
b/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc
index 405ad5e50a..db9bfdd4fe 100644
--- a/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc
+++ b/weex_core/Source/core/data_render/vnode/vnode_render_manager.cc
@@ -63,8 +63,8 @@ WeexCore::RenderObject* ParseVNode2RenderObject(VNode* vnode,
   std::string ref_str;
   if (isRoot) {
     ref_str = "_root";
-  } else if (!vnode->ref().empty()) {
-    ref_str = vnode->ref();
+  } else if (!vnode->node_id().empty()) {
+    ref_str = vnode->node_id();
   } else {
     ref_str = base::to_string(ref_id++);
   }
@@ -188,11 +188,16 @@ void VNodeRenderManager::CreatePage(const std::string 
&input, const std::string
     //auto compile_start = std::chrono::steady_clock::now();
     exec_state->Compile(err);
     if (!err.empty()) {
-        return;
+      LOGE("DATA_RENDER, compile err: %s",err.c_str());
+      return;
     }
+    auto compile_post = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()
 - start);
+    LOGD("[DATA_RENDER], Compile time:[%lld]\n", compile_post.count());
+
     //auto exec_start = std::chrono::steady_clock::now();
     exec_state->Execute(err);
     if (!err.empty()) {
+        LOGE("DATA_RENDER, exec err: %s",err.c_str());
         return;
     }
     if (exec_state->context()->root() == NULL) {
@@ -201,18 +206,24 @@ void VNodeRenderManager::CreatePage(const std::string 
&input, const std::string
     CreatePageInternal(page_id, exec_state->context()->root());
     auto duration_post = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()
 - start);
 
-    LOGE("DATA_RENDER, All time %lld", duration_post.count());
+    LOGD("DATA_RENDER, All time %lld\n", duration_post.count());
 }
     
-void VNodeRenderManager::ExecuteRegisterModules(ExecState *exec_state) {
+void VNodeRenderManager::ExecuteRegisterModules(ExecState *exec_state, 
std::vector<std::string>& registers) {
     do {
         if (!modules_.size()) {
             break;
         }
         const std::string func_name = "registerModule";
         for (auto iter = modules_.begin(); iter != modules_.end(); iter++) {
-            Value arg = StringToValue(exec_state, *iter);
-            exec_state->Call(func_name, {arg});
+            for (int j = 0; j < registers.size(); j++) {
+                std::string prefix = registers[j];
+                if ((*iter).find(prefix) <= 10) {
+                    Value arg = StringToValue(exec_state, *iter);
+                    exec_state->Call(func_name, {arg});
+                    break;
+                }
+            }
         }
         
     } while (0);
@@ -222,20 +233,19 @@ void VNodeRenderManager::CreatePage(const char *contents, 
unsigned long length,
     BinaryFile *file = BinaryFile::instance();
     file->set_input(contents);
     file->set_length(length);
-
     InitVM();
     auto start = std::chrono::steady_clock::now();
     ExecState *exec_state = new ExecState(g_vm);
     exec_states_.insert({page_id, exec_state});
     VNodeExecEnv::InitCFuncEnv(exec_state);
-
     std::string err;
     exec_state->startDecode();
     exec_state->endDecode();
     if (init_data.length() > 0) {
         VNodeExecEnv::InitInitDataValue(exec_state, init_data);
     }
-    //auto exec_start = std::chrono::steady_clock::now();
+    auto decoder_post = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()
 - start);
+    LOGD("[DATA_RENDER], Decoder time:[%lld]\n", decoder_post.count());
     exec_state->Execute(err);
     if (!err.empty()) {
         return;
@@ -244,10 +254,8 @@ void VNodeRenderManager::CreatePage(const char *contents, 
unsigned long length,
         return;
     }
     CreatePageInternal(page_id, exec_state->context()->root());
-    //exec_state->context()->Reset();
     auto duration_post = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now()
 - start);
-
-    LOGE("DATA_RENDER, All time %lld", duration_post.count());
+    LOGD("[DATA_RENDER], All time:[%lld]\n", duration_post.count());
 }
 
 bool VNodeRenderManager::RefreshPage(const std::string& page_id,
@@ -265,6 +273,9 @@ bool VNodeRenderManager::RefreshPage(const std::string& 
page_id,
         if (!err.empty()) {
             break;
         }
+        if (exec_state->context()->root() == NULL) {
+            break;
+        }
         RefreshPageInternal(page_id, exec_state->context()->root());
         WeexCore::WeexCoreManager::Instance()
         ->getPlatformBridge()
@@ -323,20 +334,25 @@ void VNodeRenderManager::FireEvent(const std::string 
&page_id, const std::string
         
     } while (0);
 }
-    
-void VNodeRenderManager::CallNativeModule(ExecState *exec_state, const 
std::string &module, const std::string &method, const std::string &args, int 
argc) {
-    do {
-        for (auto iter = exec_states_.begin(); iter != exec_states_.end(); 
iter++) {
-            if (iter->second == exec_state) {
-                RenderManager::GetInstance()->CallNativeModule(iter->first, 
module, method, args, argc);
-                break;
-            }
-        }
-        
-    } while (0);
 
+void VNodeRenderManager::CallNativeModule(ExecState* exec_state,
+                                          const std::string& module,
+                                          const std::string& method,
+                                          const std::string& args, int argc) {
+  for (auto iter = exec_states_.begin(); iter != exec_states_.end(); iter++) {
+    if (iter->second == exec_state) {
+      WeexCoreManager::Instance()
+          ->getPlatformBridge()
+          ->platform_side()
+          ->CallNativeModule(iter->first.c_str(), module.c_str(),
+                             method.c_str(),
+                             args.length() > 0 ? args.c_str() : nullptr,
+                             static_cast<int>(args.length()), nullptr, 0);
+      break;
+    }
+  }
 }
-    
+
 void VNodeRenderManager::PatchVNode(ExecState *exec_state, VNode *v_node, 
VNode *new_node) {
     do {
         for (auto iter = exec_states_.begin(); iter != exec_states_.end(); 
iter++) {
@@ -643,20 +659,29 @@ vector<pair<string, string>>* CompareMap(const 
map<string, string>& oldMap,
   }
   return p_vec;
 };
-
+ 
 void PatchVNode(const string& page_id, VNode* old_node, VNode* new_node) {
   // patch render object link
   new_node->set_render_object_ref(old_node->render_object_ref());
 
   // compare attr, ptr will be delete by RenderPage
   auto p_vec = CompareMap(*(old_node->attributes()), 
*(new_node->attributes()));
-  RenderManager::GetInstance()->UpdateAttr(
-      page_id, new_node->render_object_ref(), p_vec);
-
+  if (p_vec->size() > 0) {
+      RenderManager::GetInstance()->UpdateAttr(page_id, 
new_node->render_object_ref(), p_vec);
+  }
+  else {
+      delete p_vec;
+      p_vec = nullptr;
+  }
   // compare style, ptr will be delete by RenderPage
   p_vec = CompareMap(*(old_node->styles()), *(new_node->styles()));
-  RenderManager::GetInstance()->UpdateStyle(
-      page_id, new_node->render_object_ref(), p_vec);
+  if (p_vec->size()) {
+      RenderManager::GetInstance()->UpdateStyle(page_id, 
new_node->render_object_ref(), p_vec);
+  }
+  else {
+      delete p_vec;
+      p_vec = nullptr;
+  }
 
   // compare event
   // todo
@@ -674,7 +699,7 @@ void PatchVNode(const string& page_id, VNode* old_node, 
VNode* new_node) {
     int index = 0;
     for (auto it = new_node->child_list()->cbegin();
          it != new_node->child_list()->cend(); it++) {
-      WeexCore::RenderObject* root = VNode2RenderObject(*it, page_id);
+      WeexCore::RenderObject *root = VNode2RenderObject(*it, page_id);
       RenderManager::GetInstance()->AddRenderObject(
           page_id, (*it)->parent()->render_object_ref(), index, root);
       ++index;
diff --git a/weex_core/Source/core/data_render/vnode/vnode_render_manager.h 
b/weex_core/Source/core/data_render/vnode/vnode_render_manager.h
index e573016fe7..b309e8f5d0 100644
--- a/weex_core/Source/core/data_render/vnode/vnode_render_manager.h
+++ b/weex_core/Source/core/data_render/vnode/vnode_render_manager.h
@@ -49,7 +49,7 @@ class VNodeRenderManager {
   bool RefreshPage(const std::string &page_id, const std::string &init_data);
   bool ClosePage(const std::string &page_id);
   void FireEvent(const std::string &page_id, const std::string &ref, const 
std::string &event,const std::string &args);
-  void ExecuteRegisterModules(ExecState *exec_state);
+  void ExecuteRegisterModules(ExecState *exec_state, std::vector<std::string>& 
registers);
   void RegisterModules(const std::string &modules) { 
modules_.push_back(modules); }
   void PatchVNode(ExecState *exec_state, VNode *v_node, VNode *new_node);
   void CallNativeModule(ExecState *exec_state, const std::string &module, 
const std::string &method, const std::string &args, int argc = 0);
diff --git 
a/weex_core/Source/core/render/action/render_action_call_native_module.cpp 
b/weex_core/Source/core/render/action/render_action_call_native_module.cpp
deleted file mode 100644
index f6d476354c..0000000000
--- a/weex_core/Source/core/render/action/render_action_call_native_module.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "core/render/action/render_action_call_native_module.h"
-#include "core/manager/weex_core_manager.h"
-
-namespace WeexCore {
-
-RenderActionCallNativeModule::RenderActionCallNativeModule(const std::string 
&page_id,
-                                                           const std::string 
&module,
-                                                           const std::string 
&method,
-                                                           const std::string 
&args,
-                                                           int argc) {
-  this->page_id_ = page_id;
-  this->module_ = module;
-  this->method_ = method;
-  this->args_ = args;
-  this->argc_ = argc;
-}
-
-void RenderActionCallNativeModule::ExecuteAction() {
-  WeexCoreManager::Instance()
-      ->getPlatformBridge()
-      ->platform_side()
-    ->CallNativeModule(page_id_.c_str(), module_.c_str(), method_.c_str(), 
args_.length() > 0 ? args_.c_str() : nullptr, argc_, nullptr, 0);
-    
-}
-}  // namespace WeexCore
diff --git 
a/weex_core/Source/core/render/action/render_action_call_native_module.h 
b/weex_core/Source/core/render/action/render_action_call_native_module.h
deleted file mode 100644
index f21ee38391..0000000000
--- a/weex_core/Source/core/render/action/render_action_call_native_module.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#ifndef CORE_RENDER_ACTION_RENDER_ACTION_CALL_NATIVE_MODULE_H_
-#define CORE_RENDER_ACTION_RENDER_ACTION_CALL_NATIVE_MODULE_H_
-
-#include <string>
-
-#include "core/render/action/render_action_interface.h"
-
-namespace WeexCore {
-
-class RenderActionCallNativeModule: public RenderAction {
- public:
-  explicit RenderActionCallNativeModule(const std::string &page_id,
-                                   const std::string &module,
-                                   const std::string &method, const 
std::string &args, int argc = 0);
-
-  void ExecuteAction();
-
- public:
-  std::string page_id_;
-  std::string module_;
-  std::string method_;
-  std::string args_;
-  int argc_;
-};
-}  // namespace WeexCore
-
-#endif  // CORE_RENDER_ACTION_RENDER_ACTION_CALL_NATIVE_MODULE_H_
diff --git a/weex_core/Source/core/render/manager/render_manager.cpp 
b/weex_core/Source/core/render/manager/render_manager.cpp
index 73b403ce7a..de01a52114 100644
--- a/weex_core/Source/core/render/manager/render_manager.cpp
+++ b/weex_core/Source/core/render/manager/render_manager.cpp
@@ -306,13 +306,6 @@ void RenderManager::CallNativeModule(const char *page_id, 
const char *module, co
   }
 }
     
-void RenderManager::CallNativeModule(const std::string &page_id, const 
std::string &module, const std::string &method, const std::string &args, int 
argc) {
-    RenderPage *page = GetPage(page_id);
-    if (page) {
-        page->CallNativeModule(module, method, args, argc);
-    }
-}
-
 void RenderManager::CallMetaModule(const char *page_id, const char *method, 
const char *arguments) {
   if (strcmp(method, "setViewport") == 0) {
     wson_parser parser(arguments);
diff --git a/weex_core/Source/core/render/page/render_page.cpp 
b/weex_core/Source/core/render/page/render_page.cpp
index a9007a05e7..89195ed72c 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -40,7 +40,6 @@
 #include "core/render/action/render_action_update_attr.h"
 #include "core/render/action/render_action_update_style.h"
 #include "core/render/action/render_action_trigger_vsync.h"
-#include "core/render/action/render_action_call_native_module.h"
 #include "core/render/manager/render_manager.h"
 #include "core/render/node/factory/render_type.h"
 #include "core/render/node/render_list.h"
@@ -409,18 +408,11 @@ bool RenderPage::CreateFinish() {
   SendCreateFinishAction();
   // RenderSuccess means the Dom created after executing script finishes layout
   // and render, it will be trigger even though body not yet attaches to 
parent.
-#ifdef OS_ANDROID
   LayoutInner();
-#endif
   SendRenderSuccessAction();
   return true;
 }
     
-void RenderPage::CallNativeModule(const std::string &module,
-                      const std::string &method, const std::string &args, int 
argc) {
-  SendCallNativeModuleAction(module, method, args, argc);
-}
-
 void RenderPage::LayoutInner() {
   CalculateLayout();
   this->need_layout_.store(false);
@@ -570,12 +562,6 @@ void RenderPage::SendLayoutAction(RenderObject *render, 
int index) {
   PostRenderAction(action);
 }
     
-void RenderPage::SendCallNativeModuleAction(const std::string &module,
-                                const std::string &method, const std::string 
&args, int argc) {
-  RenderAction *action = new RenderActionCallNativeModule(page_id(), module, 
method, args, argc);
-  PostRenderAction(action);
-}
-
 void RenderPage::SendUpdateStyleAction(
     RenderObject *render,
     std::vector<std::pair<std::string, std::string>> *style,


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> [core] fix data render dom diff error
> -------------------------------------
>
>                 Key: WEEX-630
>                 URL: https://issues.apache.org/jira/browse/WEEX-630
>             Project: Weex
>          Issue Type: Bug
>            Reporter: yxp
>            Assignee: Adam Feng
>            Priority: Major
>




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to