This is an automated email from the ASF dual-hosted git repository. kyork pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-weex.git
The following commit(s) were added to refs/heads/master by this push: new b8a5064 [core] add script section in opcode file (#1827) b8a5064 is described below commit b8a506437c4c79036b92b94b6ba70514b05fad04 Author: jianhan-he <41508406+jianhan...@users.noreply.github.com> AuthorDate: Tue Nov 27 15:51:01 2018 +0800 [core] add script section in opcode file (#1827) --- ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 4 +- weex_core/Source/core/data_render/exec_state.cc | 1 + .../Source/core/data_render/exec_state_binary.cc | 13 ++ .../Source/core/data_render/exec_state_section.cc | 150 ++++++++++++++++++++- .../Source/core/data_render/exec_state_section.h | 19 ++- .../core/data_render/vnode/vnode_exec_env.cc | 8 +- .../Source/core/data_render/vnode/vnode_exec_env.h | 1 + .../core/data_render/vnode/vnode_render_context.h | 7 + .../core/data_render/vnode/vnode_render_manager.cc | 1 + 9 files changed, 199 insertions(+), 5 deletions(-) diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m index deb383e..2baee25 100644 --- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m +++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m @@ -470,7 +470,7 @@ typedef enum : NSUInteger { newOptions[bundleUrlOptionKey] = url.absoluteString; } - if ([url.absoluteString hasSuffix:WEEX_LITE_URL_SUFFIX]) { + if ([url.absoluteString hasSuffix:WEEX_LITE_URL_SUFFIX] || [url.absoluteString containsString:@"__eagle=true"]) { newOptions[@"WLASM_RENDER"] = @(YES); } @@ -534,7 +534,7 @@ typedef enum : NSUInteger { return; } - if (([options[@"DATA_RENDER"] boolValue] && [options[@"RENDER_WITH_BINARY"] boolValue]) || [options[@"WLASM_RENDER"] boolValue]) { + if (([newOptions[@"DATA_RENDER"] boolValue] && [newOptions[@"RENDER_WITH_BINARY"] boolValue]) || [newOptions[@"WLASM_RENDER"] boolValue]) { [strongSelf _renderWithData:data]; return; } diff --git a/weex_core/Source/core/data_render/exec_state.cc b/weex_core/Source/core/data_render/exec_state.cc index 56aae72..6ba2054 100644 --- a/weex_core/Source/core/data_render/exec_state.cc +++ b/weex_core/Source/core/data_render/exec_state.cc @@ -92,6 +92,7 @@ void ExecState::Compile(std::string& err) { if (!context()->raw_json().is_null()) { VNodeExecEnv::ParseData(this); VNodeExecEnv::ParseStyle((this)); + VNodeExecEnv::ParseScript(this); ParseResult result = Parser::Parse(context()->raw_json(),err); generator.Visit(result.expr().get(), nullptr); } diff --git a/weex_core/Source/core/data_render/exec_state_binary.cc b/weex_core/Source/core/data_render/exec_state_binary.cc index 0b19a00..6c57c81 100644 --- a/weex_core/Source/core/data_render/exec_state_binary.cc +++ b/weex_core/Source/core/data_render/exec_state_binary.cc @@ -69,6 +69,11 @@ bool ExecStateEncoder::encoding(std::string &err) { err = "data section encoding error"; break; } + SectionScript script(this); + if (!script.encoding()) { + err = "script section encoding error"; + break; + } SectionFunction function(this, gs_op_code_bits); if (!function.encoding()) { err = "function section encoding error"; @@ -160,6 +165,14 @@ bool ExecStateDecoder::decoding(std::string &err) { } break; } + case ExecSection::EXEC_SECTION_SCRIPT: + { + SectionScript script(this, section_length); + if (!script.decoding()) { + throw EncoderError("script section decoding error"); + } + break; + } case ExecSection::EXEC_SECTION_FUNCTION: { SectionFunction function(this, gs_op_code_bits, section_length); diff --git a/weex_core/Source/core/data_render/exec_state_section.cc b/weex_core/Source/core/data_render/exec_state_section.cc index b68ea2f..c40df1c 100644 --- a/weex_core/Source/core/data_render/exec_state_section.cc +++ b/weex_core/Source/core/data_render/exec_state_section.cc @@ -1274,6 +1274,154 @@ bool SectionData::decoding() { return finished; } + +uint32_t SectionScript::size() { + uint32_t size = 0; + do { + const json11::Json& scripts = encoder()->exec_state()->context()->script_json(); + if (!scripts.array_items().size()) { + break; + } + size += GetFTLVLength(kValueScriptSize, sizeof(uint32_t)); + for (auto script : scripts.array_items()) { + const json11::Json::object& items = script.object_items(); + size += GetFTLVLength(kValueScriptItemSize, sizeof(uint32_t)); + for (auto iter = items.begin(); iter != items.end(); iter++) { + uint32_t key_length = static_cast<uint32_t>(iter->first.length()); + size += GetFTLVLength(kValueScriptKey, key_length); + uint32_t val_length = static_cast<uint32_t>(iter->second.string_value().length()); + size += GetFTLVLength(kValueScriptValue, val_length); + } + } + } while (0); + + return size; +} + +bool SectionScript::encoding() { + bool finished = false; + do { + uint32_t size = this->size(); + if (!size) { + finished = true; + break; + } + if (!Section::encoding((uint16_t)ExecSection::EXEC_SECTION_SCRIPT, size)) { + break; + } + const json11::Json& scripts = encoder()->exec_state()->context()->script_json(); + if (!scripts.is_array()) { + break; + } + uint32_t scripts_size = (uint32_t)scripts.array_items().size(); + if (!Section::encoding(kValueScriptSize, sizeof(uint32_t), &scripts_size)) { + break; + } + for (auto it = scripts.array_items().begin(); it != scripts.array_items().end(); it++) { + uint32_t script_item_size = (uint32_t)it->object_items().size(); + if (!Section::encoding(kValueScriptItemSize, sizeof(uint32_t), &script_item_size)) { + throw DecoderError("decoding script item size error"); + break; + } + for (auto item : it->object_items()) { + uint32_t length = static_cast<uint32_t>(item.first.length()); + uint8_t *pstr = (uint8_t *)item.first.c_str(); + if (!Section::encoding(kValueScriptKey, length, (uint8_t *)pstr)) { + throw DecoderError("decoding script item key error"); + break; + } + length = static_cast<uint32_t>(item.second.string_value().length()); + const char *pstr_val = item.second.string_value().c_str(); + if (!Section::encoding(kValueScriptValue, length, (uint8_t *)pstr_val)) { + throw DecoderError("decoding script item value error"); + break; + } + } + } + finished = true; + } while (0); + + return finished; +} + +bool SectionScript::decoding() { + bool finished = false; + do { + fStream *stream = Section::stream(); + if (!stream) { + break; + } + if (stream->Tell() < 0) { + break; + } + std::vector<json11::Json> scripts; + uint16_t target = 0; + uint32_t script_size = 0; + uint32_t size = sizeof(uint32_t); + uint32_t readbytes = stream->ReadTarget(&target, (uint8_t *)&script_size, &size); + if (!readbytes || target != kValueScriptSize) { + break; + } + for (uint32_t i = 0; i < script_size; i++) { + size = sizeof(uint32_t); + uint32_t items_size = 0; + readbytes = stream->ReadTarget(&target, (uint8_t *)&items_size, &size); + if (!readbytes || target != kValueScriptItemSize) { + throw DecoderError("decoding script items size error"); + break; + } + std::unordered_map<std::string, json11::Json> items; + for (uint32_t j = 0; j < items_size; j++) { + if ((readbytes = stream->ReadTarget(&target, NULL, NULL)) == 0) { + throw DecoderError("decoding script target error"); + break; + } + if (target != kValueScriptKey) { + throw DecoderError("decoding script target error"); + break; + } + char *pstr_key = (char *)malloc(readbytes + 1); + if (!pstr_key) { + throw DecoderError("decoding script low memory error"); + break; + } + memset(pstr_key, 0, readbytes + 1); + if (stream->Read(pstr_key, 1, readbytes) != readbytes) { + throw DecoderError("decoding script key error"); + break; + } + if ((readbytes = stream->ReadTarget(&target, NULL, NULL)) == 0) { + throw DecoderError("decoding script target error"); + break; + } + if (target != kValueScriptValue) { + throw DecoderError("decoding script target error"); + break; + } + char *pstr_value = (char *)malloc(readbytes + 1); + if (!pstr_value) { + throw DecoderError("decoding script low memory error"); + break; + } + memset(pstr_value, 0, readbytes + 1); + if (stream->Read(pstr_value, 1, readbytes) != readbytes) { + throw DecoderError("decoding script value error"); + break; + } + json11::Json json(pstr_value); + items.insert(std::make_pair(pstr_key, json)); + free(pstr_key); + free(pstr_value); + } + scripts.push_back(std::move(items)); + } + decoder()->exec_state()->context()->set_script_json(scripts); + finished = true; + + } while (0); + + return finished; +} uint32_t SectionFunction::GetInstructionsBytes(std::vector<Instruction>& instructions) { uint32_t numBits = 0; @@ -2312,7 +2460,7 @@ bool SectionStyles::decoding() { size = sizeof(uint32_t); uint32_t items_size = 0; readbytes = stream->ReadTarget(&target, (uint8_t *)&items_size, &size); - if (!readbytes || target != kValueStyleItemSize || !items_size) { + if (!readbytes || target != kValueStyleItemSize) { throw DecoderError("decoding styles items size error"); break; } diff --git a/weex_core/Source/core/data_render/exec_state_section.h b/weex_core/Source/core/data_render/exec_state_section.h index 1e1e3ce..2989ba1 100644 --- a/weex_core/Source/core/data_render/exec_state_section.h +++ b/weex_core/Source/core/data_render/exec_state_section.h @@ -44,7 +44,8 @@ enum ExecSection { EXEC_SECTION_GLOBAL_VARIABLES, EXEC_SECTION_STYLES, EXEC_SECTION_VALUEREF, - EXEC_SECTION_CLASS + EXEC_SECTION_CLASS, + EXEC_SECTION_SCRIPT }; class fStream; @@ -125,6 +126,22 @@ public: virtual bool decoding(); virtual uint32_t size(); }; + +class SectionScript : public Section { +public: + enum SectionKey { + kValueScriptSize, + kValueScriptKey, + kValueScriptValue, + kValueScriptItemSize, + }; + SectionScript(ExecStateEncoder *encoder) : Section(encoder) {} + SectionScript(ExecStateDecoder *decoder, uint32_t length) : Section(decoder, length) {} + virtual ~SectionScript() {}; + virtual bool encoding(); + virtual bool decoding(); + virtual uint32_t size(); +}; class SectionFunction : public Section { public: 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 68a5a3d..8eb42f0 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 @@ -740,7 +740,13 @@ void VNodeExecEnv::ParseStyle(ExecState *state) { } } - + +void VNodeExecEnv::ParseScript(ExecState *state) { + json11::Json& json = state->context()->raw_json(); + const json11::Json& script_array = json["script"]; + state->context()->set_script_json(script_array); +} + Value StringToValue(ExecState *exec_state,const std::string &str) { Value ret; do { diff --git a/weex_core/Source/core/data_render/vnode/vnode_exec_env.h b/weex_core/Source/core/data_render/vnode/vnode_exec_env.h index aad432e..daa7c3f 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_exec_env.h +++ b/weex_core/Source/core/data_render/vnode/vnode_exec_env.h @@ -32,6 +32,7 @@ class VNodeExecEnv { static void ImportExecData(ExecState *state, const std::string &init_data_str); static void ParseStyle(ExecState *state); static void ParseData(ExecState *state); + static void ParseScript(ExecState *state); }; Value StringToValue(ExecState *exec_state, const std::string &str); diff --git a/weex_core/Source/core/data_render/vnode/vnode_render_context.h b/weex_core/Source/core/data_render/vnode/vnode_render_context.h index 45769fb..b0a760a 100644 --- a/weex_core/Source/core/data_render/vnode/vnode_render_context.h +++ b/weex_core/Source/core/data_render/vnode/vnode_render_context.h @@ -46,6 +46,12 @@ class VNodeRenderContext { inline std::map<std::string, json11::Json>& style_json() { return style_json_; } + inline const json11::Json& script_json() { + return script_json_; + } + inline void set_script_json(const json11::Json& script_json) { + script_json_ = script_json; + } private: // node context @@ -56,6 +62,7 @@ class VNodeRenderContext { // script to execute std::string script_; std::map<std::string, json11::Json> style_json_; + json11::Json script_json_; }; } // namespace data_render } // namespace core 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 2d57415..3dad81b 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 @@ -189,6 +189,7 @@ std::string VNodeRenderManager::CreatePageWithContent(const std::string &input, exec_state->context()->raw_json() = json; VNodeExecEnv::ParseData(exec_state); VNodeExecEnv::ParseStyle(exec_state); + VNodeExecEnv::ParseScript(exec_state); } if (init_data.length() > 0) { VNodeExecEnv::ImportExecData(exec_state, init_data);