|
|
|
@@ -1016,36 +1016,36 @@ AnfNodePtr Parser::ParseDict(const FunctionBlockPtr &block, const py::object &no |
|
|
|
return block->func_graph()->NewCNode({make_dict_op, keys_tuple, values_tuple}); |
|
|
|
} |
|
|
|
|
|
|
|
// process a augment assign such as a += b; |
|
|
|
// process a augment assign such as a += b or mat[stride_slice] += b. |
|
|
|
FunctionBlockPtr Parser::ParseAugAssign(const FunctionBlockPtr &block, const py::object &node) { |
|
|
|
MS_LOG(DEBUG) << "Process ast AugAssign"; |
|
|
|
py::object op = python_adapter::GetPyObjAttr(node, "op"); |
|
|
|
|
|
|
|
MS_EXCEPTION_IF_NULL(block); |
|
|
|
// resolve the op |
|
|
|
AnfNodePtr op_node = block->MakeResolveAstOp(op); |
|
|
|
py::object target_node = python_adapter::GetPyObjAttr(node, "target"); |
|
|
|
MS_EXCEPTION_IF_NULL(ast_); |
|
|
|
auto ast_type = AstSubType(py::cast<int32_t>(ast_->CallParserObjMethod(PYTHON_PARSE_GET_AST_TYPE, target_node))); |
|
|
|
AnfNodePtr read_node = nullptr; |
|
|
|
|
|
|
|
py::object target_obj = python_adapter::GetPyObjAttr(node, "target"); |
|
|
|
py::object op_obj = python_adapter::GetPyObjAttr(node, "op"); |
|
|
|
py::object value_obj = python_adapter::GetPyObjAttr(node, "value"); |
|
|
|
AnfNodePtr target_node = nullptr; |
|
|
|
AnfNodePtr op_node = block->MakeResolveAstOp(op_obj); |
|
|
|
AnfNodePtr value_node = ParseExprNode(block, value_obj); |
|
|
|
auto ast_type = AstSubType(py::cast<int32_t>(ast_->CallParserObjMethod(PYTHON_PARSE_GET_AST_TYPE, target_obj))); |
|
|
|
|
|
|
|
if (ast_type == AST_SUB_TYPE_NAME) { |
|
|
|
read_node = ParseName(block, target_node); |
|
|
|
} else if (ast_->IsClassMember(target_node)) { |
|
|
|
read_node = ParseAttribute(block, target_node); |
|
|
|
target_node = ParseName(block, target_obj); |
|
|
|
} else if (ast_type == AST_SUB_TYPE_SUBSCRIPT) { |
|
|
|
target_node = ParseSubscript(block, target_obj); |
|
|
|
} else if (ast_->IsClassMember(target_obj)) { |
|
|
|
target_node = ParseAttribute(block, target_obj); |
|
|
|
} else { |
|
|
|
MS_LOG(EXCEPTION) << "Not supported augassign"; |
|
|
|
} |
|
|
|
if (read_node == nullptr) { |
|
|
|
if (target_node == nullptr) { |
|
|
|
MS_LOG(EXCEPTION) << "Can not get target node "; |
|
|
|
} |
|
|
|
|
|
|
|
py::object value = python_adapter::GetPyObjAttr(node, "value"); |
|
|
|
AnfNodePtr value_node = ParseExprNode(block, value); |
|
|
|
CNodePtr augassign_app = block->func_graph()->NewCNode({op_node, read_node, value_node}); |
|
|
|
WriteAssignVars(block, target_node, augassign_app); |
|
|
|
CNodePtr augassign_app = block->func_graph()->NewCNode({op_node, target_node, value_node}); |
|
|
|
WriteAssignVars(block, target_obj, augassign_app); |
|
|
|
return block; |
|
|
|
} |
|
|
|
|
|
|
|
// process global declaration such as 'global x'; |
|
|
|
FunctionBlockPtr Parser::ParseGlobal(const FunctionBlockPtr &block, const py::object &node) { |
|
|
|
MS_LOG(DEBUG) << "Process ast Global"; |
|
|
|
|