You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/16 12:09:22 UTC

[4/5] incubator-weex git commit: * [core] Use gnustl runtime.

* [core] Use gnustl runtime.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/02d9983e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/02d9983e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/02d9983e

Branch: refs/heads/master
Commit: 02d9983e0044042fa7ad4d026af6e35e4ee9d3ff
Parents: ef12b7b
Author: miomin <69...@qq.com>
Authored: Tue May 15 19:39:08 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 19:34:37 2018 +0800

----------------------------------------------------------------------
 android/sdk/build.gradle                        |   5 +-
 android/sdk/libs/armeabi/libweexjsc.so          | Bin 948168 -> 1320820 bytes
 weex_core/Source/CMakeLists.txt                 |   1 -
 .../bridge/impl/weexcore_impl_android.cpp       |  54 ---
 weex_core/Source/base/Compatible.cpp            | 122 -------
 weex_core/Source/base/ViewUtils.h               |   8 +
 weex_core/Source/base/fpconv.cpp                | 332 -------------------
 weex_core/Source/base/fpconv.h                  |  33 --
 weex_core/Source/base/powers.h                  | 129 -------
 weex_core/Source/core/layout/layout.cpp         |   1 +
 weex_core/Source/core/parser/dom_parser.cpp     |  30 +-
 weex_core/Source/core/render/node/render_list.h |  12 +-
 weex_core/Source/core/render/node/render_mask.h |   4 +-
 .../Source/core/render/node/render_object.h     |   1 +
 .../Source/core/render/page/render_page.cpp     |  42 +--
 weex_core/Source/core/render/page/render_page.h |  13 +-
 16 files changed, 27 insertions(+), 760 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/android/sdk/build.gradle
----------------------------------------------------------------------
diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index 7eed76a..6fd1ee8 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -120,7 +120,7 @@ android {
             cmake {
                 arguments '-DANDROID_PLATFORM=android-19',
                         '-DANDROID_TOOLCHAIN=gcc',
-                        '-DANDROID_STL=c++_static',
+                        '-DANDROID_STL=gnustl_static',
                         '-DCMAKE_BUILD_TYPE=Release'
             }
         }
@@ -215,9 +215,6 @@ if(file('../license/LICENSE').exists()){
                          'Source/android/base/base64/**/*.h','Source/android/base/base64/**/*.cpp',
                          'Source/android/jniprebuild/jniheader/*.h',
                          'Source/base/Compatible.cpp',
-                         'Source/base/fpconv.cpp',
-                         'Source/base/fpconv.h',
-                         'Source/base/powers.h',
                          'Source/IPC/**/*.h','Source/IPC/**/*.cpp'])
     }
     preBuild.dependsOn licenseFormat

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
index bb45615..eb909cd 100644
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and b/android/sdk/libs/armeabi/libweexjsc.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index ef92a1f..77ba922 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -24,7 +24,6 @@ include_directories("include")
 
 add_library(weexjsc SHARED
 
-    ./base/fpconv.cpp
     ./android/jniprebuild/jni_load.cc
     ./android/base/jni/android_jni.cpp
     ./android/base/jni/scoped_java_ref.cpp

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
index d7bc154..ef79558 100644
--- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
@@ -189,60 +189,6 @@ static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring inst
   return jRet;
 }
 
-static jlong GetFirstScreenCallBridgeTime(JNIEnv* env, jobject jcaller,
-                                          jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenCallBridgeTime();
-}
-
-static jlong GetFirstScreenCssLayoutTime(JNIEnv* env, jobject jcaller,
-                                         jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenCssLayoutTime();
-}
-
-static jlong GetFirstScreenParseJsonTime(JNIEnv* env, jobject jcaller,
-                                         jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenParseJsonTime();
-}
-
-static jlong GetOnRenderSuccessCallBridgeTime(JNIEnv* env, jobject jcaller,
-                                              jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessCallBridgeTime();
-}
-
-static jlong GetOnRenderSuccessCssLayoutTime(JNIEnv* env, jobject jcaller,
-                                             jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessCssLayoutTime();
-}
-
-static jlong GetOnRenderSuccessParseJsonTime(JNIEnv* env, jobject jcaller,
-                                             jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessParseJsonTime();
-}
-
 //Notice that this method is invoked from main thread.
 static jboolean NotifyLayout(JNIEnv* env, jobject jcaller, jstring instanceId) {
   RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/Compatible.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/Compatible.cpp b/weex_core/Source/base/Compatible.cpp
deleted file mode 100644
index 3fb0e5c..0000000
--- a/weex_core/Source/base/Compatible.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <grp.h>
-#include <math.h>
-#include <mntent.h>
-#include <netdb.h>
-#include <pthread.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-namespace WeexCore {
-int sigemptyset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, 0, sizeof(sigset_t));
-  return 0;
-}
-
-int sigfillset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, ~0, sizeof(sigset_t));
-  return 0;
-}
-
-int sigaddset(sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  unsigned long *local_set = reinterpret_cast<unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
-  return 0;
-}
-
-int sigdelset(sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  unsigned long *local_set = reinterpret_cast<unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT));
-  return 0;
-}
-
-int getpagesize() {
-  // We dont use sysconf(3) here because that drags in stdio, which makes static binaries fat.
-  return PAGE_SIZE;
-}
-
-void srandom(unsigned int __s) { srand48(__s); }
-
-int isinf(double n) {
-  return __builtin_isinf(n);
-}
-
-int posix_memalign(void **memptr, size_t alignment, size_t bytes) {
-  if (!memptr)
-    return EINVAL;
-  *memptr = memalign(alignment, bytes);
-  if (!*memptr)
-    return ENOMEM;
-  return 0;
-}
-
-int sigismember(const sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  const unsigned long *local_set = reinterpret_cast<const unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  return static_cast<int>((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1);
-}
-
-int abs(int j) {
-  return (j < 0 ? -j : j);
-}
-
-long labs(long j) {
-  return (j < 0 ? -j : j);
-}
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/ViewUtils.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/ViewUtils.h b/weex_core/Source/base/ViewUtils.h
index 8983326..f73aeca 100644
--- a/weex_core/Source/base/ViewUtils.h
+++ b/weex_core/Source/base/ViewUtils.h
@@ -22,6 +22,7 @@
 #include <core/config/core_environment.h>
 #include <cmath>
 #include <cstdlib>
+#include <sstream>
 
 namespace WeexCore {
 
@@ -32,6 +33,13 @@ namespace WeexCore {
   const std::string AUTO_UNIT("auto");
   const std::string NONE("none");
 
+  template<typename T>
+  inline std::string to_string(const T &n) {
+    std::ostringstream stm;
+    stm << n;
+    return stm.str();
+  }
+
   inline std::string &Trim(std::string &s) {
     if (s.empty()) {
       return s;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/fpconv.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/fpconv.cpp b/weex_core/Source/base/fpconv.cpp
deleted file mode 100755
index 3fbd55a..0000000
--- a/weex_core/Source/base/fpconv.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-#include <stdbool.h>
-#include <string.h>
-
-#include "fpconv.h"
-#include "powers.h"
-
-#define fracmask  0x000FFFFFFFFFFFFFU
-#define expmask   0x7FF0000000000000U
-#define hiddenbit 0x0010000000000000U
-#define signmask  0x8000000000000000U
-#define expbias   (1023 + 52)
-
-#define absv(n) ((n) < 0 ? -(n) : (n))
-#define minv(a, b) ((a) < (b) ? (a) : (b))
-
-static uint64_t tens[] = {
-    10000000000000000000U, 1000000000000000000U, 100000000000000000U,
-    10000000000000000U, 1000000000000000U, 100000000000000U,
-    10000000000000U, 1000000000000U, 100000000000U,
-    10000000000U, 1000000000U, 100000000U,
-    10000000U, 1000000U, 100000U,
-    10000U, 1000U, 100U,
-    10U, 1U
-};
-
-static inline uint64_t get_dbits(double d)
-{
-    union {
-        double   dbl;
-        uint64_t i;
-    } dbl_bits = { d };
-
-    return dbl_bits.i;
-}
-
-static Fp build_fp(double d)
-{
-    uint64_t bits = get_dbits(d);
-
-    Fp fp;
-    fp.frac = bits & fracmask;
-    fp.exp = (bits & expmask) >> 52;
-
-    if(fp.exp) {
-        fp.frac += hiddenbit;
-        fp.exp -= expbias;
-
-    } else {
-        fp.exp = -expbias + 1;
-    }
-
-    return fp;
-}
-
-static void normalize(Fp* fp)
-{
-    while ((fp->frac & hiddenbit) == 0) {
-        fp->frac <<= 1;
-        fp->exp--;
-    }
-
-    int shift = 64 - 52 - 1;
-    fp->frac <<= shift;
-    fp->exp -= shift;
-}
-
-static void get_normalized_boundaries(Fp* fp, Fp* lower, Fp* upper)
-{
-    upper->frac = (fp->frac << 1) + 1;
-    upper->exp  = fp->exp - 1;
-
-    while ((upper->frac & (hiddenbit << 1)) == 0) {
-        upper->frac <<= 1;
-        upper->exp--;
-    }
-
-    int u_shift = 64 - 52 - 2;
-
-    upper->frac <<= u_shift;
-    upper->exp = upper->exp - u_shift;
-
-
-    int l_shift = fp->frac == hiddenbit ? 2 : 1;
-
-    lower->frac = (fp->frac << l_shift) - 1;
-    lower->exp = fp->exp - l_shift;
-
-
-    lower->frac <<= lower->exp - upper->exp;
-    lower->exp = upper->exp;
-}
-
-static Fp multiply(Fp* a, Fp* b)
-{
-    const uint64_t lomask = 0x00000000FFFFFFFF;
-
-    uint64_t ah_bl = (a->frac >> 32)    * (b->frac & lomask);
-    uint64_t al_bh = (a->frac & lomask) * (b->frac >> 32);
-    uint64_t al_bl = (a->frac & lomask) * (b->frac & lomask);
-    uint64_t ah_bh = (a->frac >> 32)    * (b->frac >> 32);
-
-    uint64_t tmp = (ah_bl & lomask) + (al_bh & lomask) + (al_bl >> 32); 
-    /* round up */
-    tmp += 1U << 31;
-
-    Fp fp = {
-        ah_bh + (ah_bl >> 32) + (al_bh >> 32) + (tmp >> 32),
-        a->exp + b->exp + 64
-    };
-
-    return fp;
-}
-
-static void round_digit(char* digits, int ndigits, uint64_t delta, uint64_t rem, uint64_t kappa, uint64_t frac)
-{
-    while (rem < frac && delta - rem >= kappa &&
-           (rem + kappa < frac || frac - rem > rem + kappa - frac)) {
-
-        digits[ndigits - 1]--;
-        rem += kappa;
-    }
-}
-
-static int generate_digits(Fp* fp, Fp* upper, Fp* lower, char* digits, int* K)
-{
-    uint64_t wfrac = upper->frac - fp->frac;
-    uint64_t delta = upper->frac - lower->frac;
-
-    Fp one;
-    one.frac = 1ULL << -upper->exp;
-    one.exp  = upper->exp;
-
-    uint64_t part1 = upper->frac >> -one.exp;
-    uint64_t part2 = upper->frac & (one.frac - 1);
-
-    int idx = 0, kappa = 10;
-    uint64_t* divp;
-    /* 1000000000 */
-    for(divp = tens + 10; kappa > 0; divp++) {
-
-        uint64_t div = *divp;
-        unsigned digit = part1 / div;
-
-        if (digit || idx) {
-            digits[idx++] = digit + '0';
-        }
-
-        part1 -= digit * div;
-        kappa--;
-
-        uint64_t tmp = (part1 <<-one.exp) + part2;
-        if (tmp <= delta) {
-            *K += kappa;
-            round_digit(digits, idx, delta, tmp, div << -one.exp, wfrac);
-
-            return idx;
-        }
-    }
-
-    /* 10 */
-    uint64_t* unit = tens + 18;
-
-    while(true) {
-        part2 *= 10;
-        delta *= 10;
-        kappa--;
-
-        unsigned digit = part2 >> -one.exp;
-        if (digit || idx) {
-            digits[idx++] = digit + '0';
-        }
-
-        part2 &= one.frac - 1;
-        if (part2 < delta) {
-            *K += kappa;
-            round_digit(digits, idx, delta, part2, one.frac, wfrac * *unit);
-
-            return idx;
-        }
-
-        unit--;
-    }
-}
-
-static int grisu2(double d, char* digits, int* K)
-{
-    Fp w = build_fp(d);
-
-    Fp lower, upper;
-    get_normalized_boundaries(&w, &lower, &upper);
-
-    normalize(&w);
-
-    int k;
-    Fp cp = find_cachedpow10(upper.exp, &k);
-
-    w     = multiply(&w,     &cp);
-    upper = multiply(&upper, &cp);
-    lower = multiply(&lower, &cp);
-
-    lower.frac++;
-    upper.frac--;
-
-    *K = -k;
-
-    return generate_digits(&w, &upper, &lower, digits, K);
-}
-
-static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg)
-{
-    int exp = absv(K + ndigits - 1);
-
-    /* write plain integer */
-    if(K >= 0 && (exp < (ndigits + 7))) {
-        memcpy(dest, digits, ndigits);
-        memset(dest + ndigits, '0', K);
-
-        return ndigits + K;
-    }
-
-    /* write decimal w/o scientific notation */
-    if(K < 0 && (K > -7 || exp < 4)) {
-        int offset = ndigits - absv(K);
-        /* fp < 1.0 -> write leading zero */
-        if(offset <= 0) {
-            offset = -offset;
-            dest[0] = '0';
-            dest[1] = '.';
-            memset(dest + 2, '0', offset);
-            memcpy(dest + offset + 2, digits, ndigits);
-
-            return ndigits + 2 + offset;
-
-        /* fp > 1.0 */
-        } else {
-            memcpy(dest, digits, offset);
-            dest[offset] = '.';
-            memcpy(dest + offset + 1, digits + offset, ndigits - offset);
-
-            return ndigits + 1;
-        }
-    }
-
-    /* write decimal w/ scientific notation */
-    ndigits = minv(ndigits, 18 - neg);
-
-    int idx = 0;
-    dest[idx++] = digits[0];
-
-    if(ndigits > 1) {
-        dest[idx++] = '.';
-        memcpy(dest + idx, digits + 1, ndigits - 1);
-        idx += ndigits - 1;
-    }
-
-    dest[idx++] = 'e';
-
-    char sign = K + ndigits - 1 < 0 ? '-' : '+';
-    dest[idx++] = sign;
-
-    int cent = 0;
-
-    if(exp > 99) {
-        cent = exp / 100;
-        dest[idx++] = cent + '0';
-        exp -= cent * 100;
-    }
-    if(exp > 9) {
-        int dec = exp / 10;
-        dest[idx++] = dec + '0';
-        exp -= dec * 10;
-
-    } else if(cent) {
-        dest[idx++] = '0';
-    }
-
-    dest[idx++] = exp % 10 + '0';
-
-    return idx;
-}
-
-static int filter_special(double fp, char* dest)
-{
-    if(fp == 0.0) {
-        dest[0] = '0';
-        return 1;
-    }
-
-    uint64_t bits = get_dbits(fp);
-
-    bool nan = (bits & expmask) == expmask;
-
-    if(!nan) {
-        return 0;
-    }
-
-    if(bits & fracmask) {
-        dest[0] = 'n'; dest[1] = 'a'; dest[2] = 'n';
-
-    } else {
-        dest[0] = 'i'; dest[1] = 'n'; dest[2] = 'f';
-    }
-
-    return 3;
-}
-
-int fpconv_dtoa(double d, char dest[24])
-{
-    char digits[18];
-
-    int str_len = 0;
-    bool neg = false;
-
-    if(get_dbits(d) & signmask) {
-        dest[0] = '-';
-        str_len++;
-        neg = true;
-    }
-
-    int spec = filter_special(d, dest + str_len);
-
-    if(spec) {
-        return str_len + spec;
-    }
-
-    int K = 0;
-    int ndigits = grisu2(d, digits, &K);
-
-    str_len += emit_digits(digits, ndigits, dest + str_len, K, neg);
-
-    return str_len;
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/fpconv.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/fpconv.h b/weex_core/Source/base/fpconv.h
deleted file mode 100755
index 58bbccc..0000000
--- a/weex_core/Source/base/fpconv.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef FPCONV_H
-#define FPCONV_H
-
-/* Fast and accurate double to string conversion based on Florian Loitsch's
- * Grisu-algorithm[1].
- *
- * Input:
- * fp -> the double to convert, dest -> destination buffer.
- * The generated string will never be longer than 24 characters.
- * Make sure to pass a pointer to at least 24 bytes of memory.
- * The emitted string will not be null terminated.
- *
- * Output:
- * The number of written characters.
- *
- * Exemplary usage:
- *
- * void print(double d)
- * {
- *      char buf[24 + 1] // plus null terminator
- *      int str_len = fpconv_dtoa(d, buf);
- *
- *      buf[str_len] = '\0';
- *      printf("%s", buf);
- * }
- *
- */
-
-int fpconv_dtoa(double fp, char dest[24]);
-
-#endif
-
-/* [1] http://florian.loitsch.com/publications/dtoa-pldi2010.pdf */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/powers.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/powers.h b/weex_core/Source/base/powers.h
deleted file mode 100755
index 52e5da5..0000000
--- a/weex_core/Source/base/powers.h
+++ /dev/null
@@ -1,129 +0,0 @@
-#include <stdint.h>
-
-#define npowers     87
-#define steppowers  8
-#define firstpower -348 /* 10 ^ -348 */
-
-#define expmax     -32
-#define expmin     -60
-
-
-typedef struct Fp {
-    uint64_t frac;
-    int exp;
-} Fp;
-
-static Fp powers_ten[] = {
-        {18054884314459144840U, -1220},
-        {13451937075301367670U, -1193},
-        {10022474136428063862U, -1166},
-        {14934650266808366570U, -1140},
-        {11127181549972568877U, -1113},
-        {16580792590934885855U, -1087},
-        {12353653155963782858U, -1060},
-        {18408377700990114895U, -1034},
-        {13715310171984221708U, -1007},
-        {10218702384817765436U, -980},
-        {15227053142812498563U, -954},
-        {11345038669416679861U, -927},
-        {16905424996341287883U, -901},
-        {12595523146049147757U, -874},
-        {9384396036005875287U,  -847},
-        {13983839803942852151U, -821},
-        {10418772551374772303U, -794},
-        {15525180923007089351U, -768},
-        {11567161174868858868U, -741},
-        {17236413322193710309U, -715},
-        {12842128665889583758U, -688},
-        {9568131466127621947U,  -661},
-        {14257626930069360058U, -635},
-        {10622759856335341974U, -608},
-        {15829145694278690180U, -582},
-        {11793632577567316726U, -555},
-        {17573882009934360870U, -529},
-        {13093562431584567480U, -502},
-        {9755464219737475723U,  -475},
-        {14536774485912137811U, -449},
-        {10830740992659433045U, -422},
-        {16139061738043178685U, -396},
-        {12024538023802026127U, -369},
-        {17917957937422433684U, -343},
-        {13349918974505688015U, -316},
-        {9946464728195732843U,  -289},
-        {14821387422376473014U, -263},
-        {11042794154864902060U, -236},
-        {16455045573212060422U, -210},
-        {12259964326927110867U, -183},
-        {18268770466636286478U, -157},
-        {13611294676837538539U, -130},
-        {10141204801825835212U, -103},
-        {15111572745182864684U, -77},
-        {11258999068426240000U, -50},
-        {16777216000000000000U, -24},
-        {12500000000000000000U, 3},
-        {9313225746154785156U,  30},
-        {13877787807814456755U, 56},
-        {10339757656912845936U, 83},
-        {15407439555097886824U, 109},
-        {11479437019748901445U, 136},
-        {17105694144590052135U, 162},
-        {12744735289059618216U, 189},
-        {9495567745759798747U,  216},
-        {14149498560666738074U, 242},
-        {10542197943230523224U, 269},
-        {15709099088952724970U, 295},
-        {11704190886730495818U, 322},
-        {17440603504673385349U, 348},
-        {12994262207056124023U, 375},
-        {9681479787123295682U,  402},
-        {14426529090290212157U, 428},
-        {10748601772107342003U, 455},
-        {16016664761464807395U, 481},
-        {11933345169920330789U, 508},
-        {17782069995880619868U, 534},
-        {13248674568444952270U, 561},
-        {9871031767461413346U,  588},
-        {14708983551653345445U, 614},
-        {10959046745042015199U, 641},
-        {16330252207878254650U, 667},
-        {12166986024289022870U, 694},
-        {18130221999122236476U, 720},
-        {13508068024458167312U, 747},
-        {10064294952495520794U, 774},
-        {14996968138956309548U, 800},
-        {11173611982879273257U, 827},
-        {16649979327439178909U, 853},
-        {12405201291620119593U, 880},
-        {9242595204427927429U,  907},
-        {13772540099066387757U, 933},
-        {10261342003245940623U, 960},
-        {15290591125556738113U, 986},
-        {11392378155556871081U, 1013},
-        {16975966327722178521U, 1039},
-        {12648080533535911531U, 1066}
-};
-
-static Fp find_cachedpow10(int exp, int *k) {
-  const double one_log_ten = 0.30102999566398114;
-
-  int approx = -(exp + npowers) * one_log_ten;
-  int idx = (approx - firstpower) / steppowers;
-
-  while (1) {
-    int current = exp + powers_ten[idx].exp + 64;
-
-    if (current < expmin) {
-      idx++;
-      continue;
-    }
-
-    if (current > expmax) {
-      idx--;
-      continue;
-    }
-
-    *k = (firstpower + idx * steppowers);
-
-    return powers_ten[idx];
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/layout/layout.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/layout/layout.cpp b/weex_core/Source/core/layout/layout.cpp
index a2fc800..cbccbab 100644
--- a/weex_core/Source/core/layout/layout.cpp
+++ b/weex_core/Source/core/layout/layout.cpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 #include "layout.h"
+#include <tuple>
 
 using namespace WeexCore;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/parser/dom_parser.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_parser.cpp b/weex_core/Source/core/parser/dom_parser.cpp
index 89aac39..13d9132 100644
--- a/weex_core/Source/core/parser/dom_parser.cpp
+++ b/weex_core/Source/core/parser/dom_parser.cpp
@@ -18,10 +18,10 @@
  */
 
 #include "dom_parser.h"
-#include <base/fpconv.h>
 #include <core/render/node/render_object.h>
 #include <core/render/page/render_page.h>
 #include <core/render/node/factory/render_creator.h>
+#include <base/ViewUtils.h>
 
 using namespace std;
 using namespace rapidjson;
@@ -365,23 +365,10 @@ namespace WeexCore {
         while (const char *key2 = r.NextObjectKey()) {
           if (r.PeekType() == kNumberType) {
             RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-            char *temp = new char[65];
             if (0 == strcmp(key, "attr")) {
-              int len = fpconv_dtoa(r.GetDouble(), temp);
-              temp[len] = '\0';
-              char value[len + 1];
-              strcpy(value, temp);
-              render->AddAttr(key2, value);
+              render->AddAttr(key2, to_string(r.GetDouble()));
             } else if (0 == strcmp(key, "style")) {
-              int len = fpconv_dtoa(r.GetDouble(), temp);
-              temp[len] = '\0';
-              char value[len + 1];
-              strcpy(value, temp);
-              render->AddStyle(key2, value);
-            }
-            if (temp != nullptr) {
-              delete[]temp;
-              temp = nullptr;
+              render->AddStyle(key2, to_string(r.GetDouble()));
             }
           } else if (r.PeekType() == kStringType) {
             RAPIDJSON_ASSERT(r.PeekType() == kStringType);
@@ -499,17 +486,8 @@ namespace WeexCore {
     while (const char *key = r.NextObjectKey()) {
       if (r.PeekType() == kNumberType) {
         RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-        char *temp = new char[65];
-        int len = fpconv_dtoa(r.GetDouble(), temp);
-        temp[len] = '\0';
-        char value[len + 1];
-        strcpy(value, temp);
-        std::pair<std::string, std::string> myPair(key, value);
+        std::pair<std::string, std::string> myPair(key, to_string(r.GetDouble()));
         pairs->insert(pairs->end(), myPair);
-        if (temp != nullptr) {
-          delete[]temp;
-          temp = nullptr;
-        }
       } else if (r.PeekType() == kStringType) {
         RAPIDJSON_ASSERT(r.PeekType() == kStringType);
         const char *value = r.GetString();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_list.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_list.h b/weex_core/Source/core/render/node/render_list.h
index 2e985bf..a1cb190 100644
--- a/weex_core/Source/core/render/node/render_list.h
+++ b/weex_core/Source/core/render/node/render_list.h
@@ -156,9 +156,9 @@ namespace WeexCore {
 
             mIsPreCalculateCellWidth = true;
             if(getColumnCount() > 0 || getColumnWidth() > 0 || mColumnCount > COLUMN_COUNT_NORMAL){
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_COUNT, std::to_string(mColumnCount)));
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_GAP, std::to_string(mColumnGap)));
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_WIDTH, std::to_string(mColumnWidth)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_COUNT, to_string(mColumnCount)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_GAP, to_string(mColumnGap)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_WIDTH, to_string(mColumnWidth)));
             }
         }
         return attrs;
@@ -205,11 +205,11 @@ namespace WeexCore {
     void AddRenderObjectWidth(RenderObject *child, const bool updating) {
         if (Type() == kRenderWaterfall || Type() == kRenderRecycleList) {
             if(child->Type() == kRenderHeader || child->Type() == kRenderFooter) {
-                child->ApplyStyle(WIDTH, std::to_string(mAvailableWidth), updating);
+                child->ApplyStyle(WIDTH, to_string(mAvailableWidth), updating);
             } else if (child->getStypePositionType() == kSticky) {
-                child->ApplyStyle(WIDTH, std::to_string(GetViewPortWidth()), updating);
+                child->ApplyStyle(WIDTH, to_string(GetViewPortWidth()), updating);
             } else if (child->Type() == kRenderCell || child->Type() == kRenderCellSlot){
-                child->ApplyStyle(WIDTH, std::to_string(mColumnWidth), updating);
+                child->ApplyStyle(WIDTH, to_string(mColumnWidth), updating);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_mask.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_mask.h b/weex_core/Source/core/render/node/render_mask.h
index 690acdb..da7250a 100644
--- a/weex_core/Source/core/render/node/render_mask.h
+++ b/weex_core/Source/core/render/node/render_mask.h
@@ -45,8 +45,8 @@ namespace WeexCore {
       }
 
       style->insert(std::pair<std::string, std::string>(POSITION, "absolute"));
-      style->insert(std::pair<std::string, std::string>(WIDTH, std::to_string(getWebPxByWidth(width, GetViewPortWidth()))));
-      style->insert(std::pair<std::string, std::string>(HEIGHT, std::to_string(getWebPxByWidth(height, GetViewPortWidth()))));
+      style->insert(std::pair<std::string, std::string>(WIDTH, to_string(getWebPxByWidth(width, GetViewPortWidth()))));
+      style->insert(std::pair<std::string, std::string>(HEIGHT, to_string(getWebPxByWidth(height, GetViewPortWidth()))));
       style->insert(std::pair<std::string, std::string>(TOP, "0"));
       return style;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_object.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_object.h b/weex_core/Source/core/render/node/render_object.h
index 2671fe1..15d3f8c 100644
--- a/weex_core/Source/core/render/node/render_object.h
+++ b/weex_core/Source/core/render/node/render_object.h
@@ -32,6 +32,7 @@
 #include <core/render/page/render_page.h>
 #include <core/css/constants_value.h>
 #include <android/base/log_utils.h>
+#include <functional>
 
 
 #define JSON_OBJECT_MARK_CHAR  '{'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/page/render_page.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp
index b01050b..f0c6a05 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -264,7 +264,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       margin->insert(margin->end(), (*iter)),
                                   flag = true;
                                 });
@@ -277,7 +277,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       padding->insert(padding->end(), (*iter)),
                                   flag = true;
                                 });
@@ -290,7 +290,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       border->insert(border->end(), (*iter)),
                                   flag = true;
                                 });
@@ -573,52 +573,16 @@ namespace WeexCore {
       mWXCorePerformance->cssLayoutTime += time;
   }
 
-  long long RenderPage::GetFirstScreenCssLayoutTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenCssLayoutTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessCssLayoutTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessCssLayoutTime;
-    return 0;
-  }
-
   void RenderPage::ParseJsonTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
       mWXCorePerformance->parseJsonTime += time;
   }
 
-  long long RenderPage::GetFirstScreenParseJsonTime() {
-if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenParseJsonTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessParseJsonTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessParseJsonTime;
-    return 0;
-  }
-
   void RenderPage::CallBridgeTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
       mWXCorePerformance->callBridgeTime += time;
   }
 
-  long long RenderPage::GetFirstScreenCallBridgeTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenCallBridgeTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessCallBridgeTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessCallBridgeTime;
-    return 0;
-  }
-
   std::vector<long> RenderPage::PrintFirstScreenLog() {
     std::vector<long> ret;
     if (mWXCorePerformance != nullptr)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/page/render_page.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.h b/weex_core/Source/core/render/page/render_page.h
index 6a52b11..4a96a87 100644
--- a/weex_core/Source/core/render/page/render_page.h
+++ b/weex_core/Source/core/render/page/render_page.h
@@ -24,6 +24,7 @@
 #include <map>
 #include <jni.h>
 #include <cmath>
+#include <atomic>
 
 namespace WeexCore {
 
@@ -104,22 +105,10 @@ namespace WeexCore {
 
     void CssLayoutTime(const long long &time);
 
-    long long GetFirstScreenCssLayoutTime();
-
-    long long GetOnRenderSuccessCssLayoutTime();
-
     void ParseJsonTime(const long long &time);
 
-    long long GetFirstScreenParseJsonTime();
-
-    long long GetOnRenderSuccessParseJsonTime();
-
     void CallBridgeTime(const long long &time);
 
-    long long GetFirstScreenCallBridgeTime();
-
-    long long GetOnRenderSuccessCallBridgeTime();
-
     std::vector<long> PrintFirstScreenLog();
 
     std::vector<long> PrintRenderSuccessLog();