
/* std::wstring::wstring(std::wstring&&, std::allocator<wchar_t> const&) */

void __thiscall std::wstring::wstring(wstring *this,wstring *param_1,allocator *param_2)

{
  wstring *__s2;
  
  __s2 = param_1 + 0x10;
  *(wstring **)this = this + 0x10;
  if (__s2 != *(wstring **)param_1) {
    *(wstring **)this = *(wstring **)param_1;
    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);
    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);
    *(wstring **)param_1 = __s2;
    *(undefined8 *)(param_1 + 8) = 0;
    *(undefined4 *)(param_1 + 0x10) = 0;
    return;
  }
  wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4);
  *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);
  *(undefined8 *)(param_1 + 8) = 0;
  **(undefined4 **)param_1 = 0;
  return;
}



void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)

{
  wchar_t *__s2;
  
  __s2 = (wchar_t *)(param_2 + 2);
  *param_1 = param_1 + 2;
  if (__s2 != (wchar_t *)*param_2) {
    *param_1 = (wchar_t *)*param_2;
    param_1[1] = param_2[1];
    param_1[2] = param_2[2];
    *param_2 = __s2;
    param_2[1] = 0;
    *(undefined4 *)(param_2 + 2) = 0;
    return;
  }
  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);
  param_1[1] = param_2[1];
  param_2[1] = 0;
  *(undefined4 *)*param_2 = 0;
  return;
}


LEA RCX,[RDI + 0x10]
LEA RAX,[RSI + 0x10]
MOV qword ptr [RDI],RCX
MOV RDX,qword ptr [RSI]
CMP RAX,RDX
JZ 0x002f3fe0
MOV qword ptr [RDI],RDX
MOV RDX,qword ptr [RSI + 0x8]
MOV qword ptr [RDI + 0x8],RDX
MOV RDX,qword ptr [RSI + 0x10]
MOV qword ptr [RDI + 0x10],RDX
MOV qword ptr [RSI],RAX
MOV qword ptr [RSI + 0x8],0x0
MOV dword ptr [RSI + 0x10],0x0
RET
PUSH RBP
MOV EDX,0x4
MOV RBP,RDI
MOV RDI,RCX
PUSH RBX
MOV RBX,RSI
MOV RSI,RAX
SUB RSP,0x8
CALL 0x001490f0
MOV RAX,qword ptr [RBX + 0x8]
MOV qword ptr [RBP + 0x8],RAX
MOV RAX,qword ptr [RBX]
MOV qword ptr [RBX + 0x8],0x0
MOV dword ptr [RAX],0x0
ADD RSP,0x8
POP RBX
POP RBP
RET
(translation_unit "void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)\n\n{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}\n\n" (function_definition "void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)\n\n{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" primitive_type (function_declarator "FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)" identifier (parameter_list "(undefined8 *param_1,undefined8 *param_2)" ( (parameter_declaration "undefined8 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "undefined8 *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) ))) (compound_statement "{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" { (declaration "wchar_t *__s2;" type_identifier (pointer_declarator "*__s2" * identifier) ;) (expression_statement "__s2 = (wchar_t *)(param_2 + 2);" (assignment_expression "__s2 = (wchar_t *)(param_2 + 2)" identifier = (cast_expression "(wchar_t *)(param_2 + 2)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 2)" ( (binary_expression "param_2 + 2" identifier + number_literal) )))) ;) (expression_statement "*param_1 = param_1 + 2;" (assignment_expression "*param_1 = param_1 + 2" (pointer_expression "*param_1" * identifier) = (binary_expression "param_1 + 2" identifier + number_literal)) ;) (if_statement "if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" if (parenthesized_expression "(__s2 != (wchar_t *)*param_2)" ( (binary_expression "__s2 != (wchar_t *)*param_2" identifier != (cast_expression "(wchar_t *)*param_2" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) )) (compound_statement "{\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" { (expression_statement "*param_1 = (wchar_t *)*param_2;" (assignment_expression "*param_1 = (wchar_t *)*param_2" (pointer_expression "*param_1" * identifier) = (cast_expression "(wchar_t *)*param_2" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) ;) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (subscript_expression "param_2[1]" identifier [ number_literal ])) ;) (expression_statement "param_1[2] = param_2[2];" (assignment_expression "param_1[2] = param_2[2]" (subscript_expression "param_1[2]" identifier [ number_literal ]) = (subscript_expression "param_2[2]" identifier [ number_literal ])) ;) (expression_statement "*param_2 = __s2;" (assignment_expression "*param_2 = __s2" (pointer_expression "*param_2" * identifier) = identifier) ;) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "*(undefined4 *)(param_2 + 2) = 0;" (assignment_expression "*(undefined4 *)(param_2 + 2) = 0" (pointer_expression "*(undefined4 *)(param_2 + 2)" * (cast_expression "(undefined4 *)(param_2 + 2)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 2)" ( (binary_expression "param_2 + 2" identifier + number_literal) )))) = number_literal) ;) (return_statement "return;" return ;) })) (expression_statement "wmemcpy((wchar_t *)(param_1 + 2),__s2,4);" (call_expression "wmemcpy((wchar_t *)(param_1 + 2),__s2,4)" identifier (argument_list "((wchar_t *)(param_1 + 2),__s2,4)" ( (cast_expression "(wchar_t *)(param_1 + 2)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 2)" ( (binary_expression "param_1 + 2" identifier + number_literal) ))) , identifier , number_literal ))) ;) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (subscript_expression "param_2[1]" identifier [ number_literal ])) ;) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "*(undefined4 *)*param_2 = 0;" (assignment_expression "*(undefined4 *)*param_2 = 0" (pointer_expression "*(undefined4 *)*param_2" * (cast_expression "(undefined4 *)*param_2" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) = number_literal) ;) (return_statement "return;" return ;) })))
(translation_unit "/* std::wstring::wstring(std::wstring&&, std::allocator<wchar_t> const&) */\n\nvoid __thiscall std::wstring::wstring(wstring *this,wstring *param_1,allocator *param_2)\n\n{\n  wstring *__s2;\n  \n  __s2 = param_1 + 0x10;\n  *(wstring **)this = this + 0x10;\n  if (__s2 != *(wstring **)param_1) {\n    *(wstring **)this = *(wstring **)param_1;\n    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);\n    *(wstring **)param_1 = __s2;\n    *(undefined8 *)(param_1 + 8) = 0;\n    *(undefined4 *)(param_1 + 0x10) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4);\n  *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n  *(undefined8 *)(param_1 + 8) = 0;\n  **(undefined4 **)param_1 = 0;\n  return;\n}\n\n" comment (function_definition "void __thiscall std::wstring::wstring(wstring *this,wstring *param_1,allocator *param_2)\n\n{\n  wstring *__s2;\n  \n  __s2 = param_1 + 0x10;\n  *(wstring **)this = this + 0x10;\n  if (__s2 != *(wstring **)param_1) {\n    *(wstring **)this = *(wstring **)param_1;\n    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);\n    *(wstring **)param_1 = __s2;\n    *(undefined8 *)(param_1 + 8) = 0;\n    *(undefined4 *)(param_1 + 0x10) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4);\n  *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n  *(undefined8 *)(param_1 + 8) = 0;\n  **(undefined4 **)param_1 = 0;\n  return;\n}" primitive_type (ms_call_modifier "__thiscall" __thiscall) (ERROR "std::wstring::" identifier : : identifier : :) (function_declarator "wstring(wstring *this,wstring *param_1,allocator *param_2)" identifier (parameter_list "(wstring *this,wstring *param_1,allocator *param_2)" ( (parameter_declaration "wstring *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "wstring *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "allocator *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) ))) (compound_statement "{\n  wstring *__s2;\n  \n  __s2 = param_1 + 0x10;\n  *(wstring **)this = this + 0x10;\n  if (__s2 != *(wstring **)param_1) {\n    *(wstring **)this = *(wstring **)param_1;\n    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);\n    *(wstring **)param_1 = __s2;\n    *(undefined8 *)(param_1 + 8) = 0;\n    *(undefined4 *)(param_1 + 0x10) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4);\n  *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n  *(undefined8 *)(param_1 + 8) = 0;\n  **(undefined4 **)param_1 = 0;\n  return;\n}" { (declaration "wstring *__s2;" type_identifier (pointer_declarator "*__s2" * identifier) ;) (expression_statement "__s2 = param_1 + 0x10;" (assignment_expression "__s2 = param_1 + 0x10" identifier = (binary_expression "param_1 + 0x10" identifier + number_literal)) ;) (expression_statement "*(wstring **)this = this + 0x10;" (assignment_expression "*(wstring **)this = this + 0x10" (pointer_expression "*(wstring **)this" * (cast_expression "(wstring **)this" ( (type_descriptor "wstring **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier)) = (binary_expression "this + 0x10" identifier + number_literal)) ;) (if_statement "if (__s2 != *(wstring **)param_1) {\n    *(wstring **)this = *(wstring **)param_1;\n    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);\n    *(wstring **)param_1 = __s2;\n    *(undefined8 *)(param_1 + 8) = 0;\n    *(undefined4 *)(param_1 + 0x10) = 0;\n    return;\n  }" if (parenthesized_expression "(__s2 != *(wstring **)param_1)" ( (binary_expression "__s2 != *(wstring **)param_1" identifier != (pointer_expression "*(wstring **)param_1" * (cast_expression "(wstring **)param_1" ( (type_descriptor "wstring **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) )) (compound_statement "{\n    *(wstring **)this = *(wstring **)param_1;\n    *(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);\n    *(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);\n    *(wstring **)param_1 = __s2;\n    *(undefined8 *)(param_1 + 8) = 0;\n    *(undefined4 *)(param_1 + 0x10) = 0;\n    return;\n  }" { (expression_statement "*(wstring **)this = *(wstring **)param_1;" (assignment_expression "*(wstring **)this = *(wstring **)param_1" (pointer_expression "*(wstring **)this" * (cast_expression "(wstring **)this" ( (type_descriptor "wstring **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier)) = (pointer_expression "*(wstring **)param_1" * (cast_expression "(wstring **)param_1" ( (type_descriptor "wstring **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) ;) (expression_statement "*(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);" (assignment_expression "*(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8)" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = (pointer_expression "*(undefined8 *)(param_1 + 8)" * (cast_expression "(undefined8 *)(param_1 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (expression_statement "*(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10);" (assignment_expression "*(undefined8 *)(this + 0x10) = *(undefined8 *)(param_1 + 0x10)" (pointer_expression "*(undefined8 *)(this + 0x10)" * (cast_expression "(undefined8 *)(this + 0x10)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 0x10)" ( (binary_expression "this + 0x10" identifier + number_literal) )))) = (pointer_expression "*(undefined8 *)(param_1 + 0x10)" * (cast_expression "(undefined8 *)(param_1 + 0x10)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) ))))) ;) (expression_statement "*(wstring **)param_1 = __s2;" (assignment_expression "*(wstring **)param_1 = __s2" (pointer_expression "*(wstring **)param_1" * (cast_expression "(wstring **)param_1" ( (type_descriptor "wstring **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier)) = identifier) ;) (expression_statement "*(undefined8 *)(param_1 + 8) = 0;" (assignment_expression "*(undefined8 *)(param_1 + 8) = 0" (pointer_expression "*(undefined8 *)(param_1 + 8)" * (cast_expression "(undefined8 *)(param_1 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "*(undefined4 *)(param_1 + 0x10) = 0;" (assignment_expression "*(undefined4 *)(param_1 + 0x10) = 0" (pointer_expression "*(undefined4 *)(param_1 + 0x10)" * (cast_expression "(undefined4 *)(param_1 + 0x10)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) )))) = number_literal) ;) (return_statement "return;" return ;) })) (expression_statement "wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4);" (call_expression "wmemcpy((wchar_t *)(this + 0x10),(wchar_t *)__s2,4)" identifier (argument_list "((wchar_t *)(this + 0x10),(wchar_t *)__s2,4)" ( (cast_expression "(wchar_t *)(this + 0x10)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 0x10)" ( (binary_expression "this + 0x10" identifier + number_literal) ))) , (cast_expression "(wchar_t *)__s2" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier) , number_literal ))) ;) (expression_statement "*(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8);" (assignment_expression "*(undefined8 *)(this + 8) = *(undefined8 *)(param_1 + 8)" (pointer_expression "*(undefined8 *)(this + 8)" * (cast_expression "(undefined8 *)(this + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) )))) = (pointer_expression "*(undefined8 *)(param_1 + 8)" * (cast_expression "(undefined8 *)(param_1 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (expression_statement "*(undefined8 *)(param_1 + 8) = 0;" (assignment_expression "*(undefined8 *)(param_1 + 8) = 0" (pointer_expression "*(undefined8 *)(param_1 + 8)" * (cast_expression "(undefined8 *)(param_1 + 8)" ( (type_descriptor "undefined8 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) = number_literal) ;) (expression_statement "**(undefined4 **)param_1 = 0;" (assignment_expression "**(undefined4 **)param_1 = 0" (pointer_expression "**(undefined4 **)param_1" * (pointer_expression "*(undefined4 **)param_1" * (cast_expression "(undefined4 **)param_1" ( (type_descriptor "undefined4 **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) identifier))) = number_literal) ;) (return_statement "return;" return ;) })))
(translation_unit "void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)\n\n{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}\n\n" (function_definition "void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)\n\n{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" primitive_type (function_declarator "FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)" identifier (parameter_list "(undefined8 *param_1,undefined8 *param_2)" ( (parameter_declaration "undefined8 *param_1" type_identifier (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "undefined8 *param_2" type_identifier (pointer_declarator "*param_2" * identifier)) ))) (compound_statement "{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" { (declaration "wchar_t *__s2;" type_identifier (pointer_declarator "*__s2" * identifier) ;) (expression_statement "__s2 = (wchar_t *)(param_2 + 2);" (assignment_expression "__s2 = (wchar_t *)(param_2 + 2)" identifier = (cast_expression "(wchar_t *)(param_2 + 2)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 2)" ( (binary_expression "param_2 + 2" identifier + number_literal) )))) ;) (expression_statement "*param_1 = param_1 + 2;" (assignment_expression "*param_1 = param_1 + 2" (pointer_expression "*param_1" * identifier) = (binary_expression "param_1 + 2" identifier + number_literal)) ;) (if_statement "if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" if (parenthesized_expression "(__s2 != (wchar_t *)*param_2)" ( (binary_expression "__s2 != (wchar_t *)*param_2" identifier != (cast_expression "(wchar_t *)*param_2" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) )) (compound_statement "{\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" { (expression_statement "*param_1 = (wchar_t *)*param_2;" (assignment_expression "*param_1 = (wchar_t *)*param_2" (pointer_expression "*param_1" * identifier) = (cast_expression "(wchar_t *)*param_2" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) ;) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (subscript_expression "param_2[1]" identifier [ number_literal ])) ;) (expression_statement "param_1[2] = param_2[2];" (assignment_expression "param_1[2] = param_2[2]" (subscript_expression "param_1[2]" identifier [ number_literal ]) = (subscript_expression "param_2[2]" identifier [ number_literal ])) ;) (expression_statement "*param_2 = __s2;" (assignment_expression "*param_2 = __s2" (pointer_expression "*param_2" * identifier) = identifier) ;) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "*(undefined4 *)(param_2 + 2) = 0;" (assignment_expression "*(undefined4 *)(param_2 + 2) = 0" (pointer_expression "*(undefined4 *)(param_2 + 2)" * (cast_expression "(undefined4 *)(param_2 + 2)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_2 + 2)" ( (binary_expression "param_2 + 2" identifier + number_literal) )))) = number_literal) ;) (return_statement "return;" return ;) })) (expression_statement "wmemcpy((wchar_t *)(param_1 + 2),__s2,4);" (call_expression "wmemcpy((wchar_t *)(param_1 + 2),__s2,4)" identifier (argument_list "((wchar_t *)(param_1 + 2),__s2,4)" ( (cast_expression "(wchar_t *)(param_1 + 2)" ( (type_descriptor "wchar_t *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 2)" ( (binary_expression "param_1 + 2" identifier + number_literal) ))) , identifier , number_literal ))) ;) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" identifier [ number_literal ]) = (subscript_expression "param_2[1]" identifier [ number_literal ])) ;) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" identifier [ number_literal ]) = number_literal) ;) (expression_statement "*(undefined4 *)*param_2 = 0;" (assignment_expression "*(undefined4 *)*param_2 = 0" (pointer_expression "*(undefined4 *)*param_2" * (cast_expression "(undefined4 *)*param_2" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*param_2" * identifier))) = number_literal) ;) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = IDENT) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) = LIT) ;) (return_statement return ;) })) (expression_statement (call_expression IDENT (argument_list ( (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))) , IDENT , LIT ))) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = (subscript_expression IDENT [ LIT ])) ;) (expression_statement (assignment_expression (subscript_expression IDENT [ LIT ]) = LIT) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) = LIT) ;) (return_statement return ;) })))
(function_definition "void FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)\n\n{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" (primitive_type "void") (function_declarator "FUN_002f3fa0(undefined8 *param_1,undefined8 *param_2)" (identifier "FUN_002f3fa0") (parameter_list "(undefined8 *param_1,undefined8 *param_2)" (( "(") (parameter_declaration "undefined8 *param_1" (type_identifier "undefined8") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "undefined8 *param_2" (type_identifier "undefined8") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) () ")"))) (compound_statement "{\n  wchar_t *__s2;\n  \n  __s2 = (wchar_t *)(param_2 + 2);\n  *param_1 = param_1 + 2;\n  if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }\n  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);\n  param_1[1] = param_2[1];\n  param_2[1] = 0;\n  *(undefined4 *)*param_2 = 0;\n  return;\n}" ({ "{") (declaration "wchar_t *__s2;" (type_identifier "wchar_t") (pointer_declarator "*__s2" (* "*") (identifier "__s2")) (; ";")) (expression_statement "__s2 = (wchar_t *)(param_2 + 2);" (assignment_expression "__s2 = (wchar_t *)(param_2 + 2)" (identifier "__s2") (= "=") (cast_expression "(wchar_t *)(param_2 + 2)" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 2)" (( "(") (binary_expression "param_2 + 2" (identifier "param_2") (+ "+") (number_literal "2")) () ")")))) (; ";")) (expression_statement "*param_1 = param_1 + 2;" (assignment_expression "*param_1 = param_1 + 2" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (binary_expression "param_1 + 2" (identifier "param_1") (+ "+") (number_literal "2"))) (; ";")) (if_statement "if (__s2 != (wchar_t *)*param_2) {\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" (if "if") (parenthesized_expression "(__s2 != (wchar_t *)*param_2)" (( "(") (binary_expression "__s2 != (wchar_t *)*param_2" (identifier "__s2") (!= "!=") (cast_expression "(wchar_t *)*param_2" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_2" (* "*") (identifier "param_2")))) () ")")) (compound_statement "{\n    *param_1 = (wchar_t *)*param_2;\n    param_1[1] = param_2[1];\n    param_1[2] = param_2[2];\n    *param_2 = __s2;\n    param_2[1] = 0;\n    *(undefined4 *)(param_2 + 2) = 0;\n    return;\n  }" ({ "{") (expression_statement "*param_1 = (wchar_t *)*param_2;" (assignment_expression "*param_1 = (wchar_t *)*param_2" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (= "=") (cast_expression "(wchar_t *)*param_2" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_2" (* "*") (identifier "param_2")))) (; ";")) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]"))) (; ";")) (expression_statement "param_1[2] = param_2[2];" (assignment_expression "param_1[2] = param_2[2]" (subscript_expression "param_1[2]" (identifier "param_1") ([ "[") (number_literal "2") (] "]")) (= "=") (subscript_expression "param_2[2]" (identifier "param_2") ([ "[") (number_literal "2") (] "]"))) (; ";")) (expression_statement "*param_2 = __s2;" (assignment_expression "*param_2 = __s2" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (= "=") (identifier "__s2")) (; ";")) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0")) (; ";")) (expression_statement "*(undefined4 *)(param_2 + 2) = 0;" (assignment_expression "*(undefined4 *)(param_2 + 2) = 0" (pointer_expression "*(undefined4 *)(param_2 + 2)" (* "*") (cast_expression "(undefined4 *)(param_2 + 2)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_2 + 2)" (( "(") (binary_expression "param_2 + 2" (identifier "param_2") (+ "+") (number_literal "2")) () ")")))) (= "=") (number_literal "0")) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "wmemcpy((wchar_t *)(param_1 + 2),__s2,4);" (call_expression "wmemcpy((wchar_t *)(param_1 + 2),__s2,4)" (identifier "wmemcpy") (argument_list "((wchar_t *)(param_1 + 2),__s2,4)" (( "(") (cast_expression "(wchar_t *)(param_1 + 2)" (( "(") (type_descriptor "wchar_t *" (type_identifier "wchar_t") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 2)" (( "(") (binary_expression "param_1 + 2" (identifier "param_1") (+ "+") (number_literal "2")) () ")"))) (, ",") (identifier "__s2") (, ",") (number_literal "4") () ")"))) (; ";")) (expression_statement "param_1[1] = param_2[1];" (assignment_expression "param_1[1] = param_2[1]" (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]")) (= "=") (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]"))) (; ";")) (expression_statement "param_2[1] = 0;" (assignment_expression "param_2[1] = 0" (subscript_expression "param_2[1]" (identifier "param_2") ([ "[") (number_literal "1") (] "]")) (= "=") (number_literal "0")) (; ";")) (expression_statement "*(undefined4 *)*param_2 = 0;" (assignment_expression "*(undefined4 *)*param_2 = 0" (pointer_expression "*(undefined4 *)*param_2" (* "*") (cast_expression "(undefined4 *)*param_2" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*param_2" (* "*") (identifier "param_2")))) (= "=") (number_literal "0")) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}")))

/* std::wstring::wstring(std::wstring&&, std::allocator<wchar_t> const&) */

void __thiscall std::function_1::function_1(function_1 *var_2,function_1 *var_1,type_1 *param_2)

{
  function_1 *var_3;
  
  var_3 = var_1 + 0x10;
  *(function_1 **)var_2 = var_2 + 0x10;
  if (var_3 != *(function_1 **)var_1) {
    *(function_1 **)var_2 = *(function_1 **)var_1;
    *(type_2 *)(var_2 + 8) = *(type_2 *)(var_1 + 8);
    *(type_2 *)(var_2 + 0x10) = *(type_2 *)(var_1 + 0x10);
    *(function_1 **)var_1 = var_3;
    *(type_2 *)(var_1 + 8) = 0;
    *(type_3 *)(var_1 + 0x10) = 0;
    return;
  }
  var_4((type_4 *)(var_2 + 0x10),(type_4 *)var_3,4);
  *(type_2 *)(var_2 + 8) = *(type_2 *)(var_1 + 8);
  *(type_2 *)(var_1 + 8) = 0;
  **(type_3 **)var_1 = 0;
  return;
}


(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (identifier))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (number_literal))) (return_statement))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))) (identifier) (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (subscript_expression argument: (identifier) index: (number_literal)))) (expression_statement (assignment_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (number_literal))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))) right: (number_literal))) (return_statement))))

void MASKED(undefined8 *param_1,undefined8 *param_2)

{
  wchar_t *__s2;
  
  __s2 = (wchar_t *)(param_2 + 2);
  *param_1 = param_1 + 2;
  if (__s2 != (wchar_t *)*param_2) {
    *param_1 = (wchar_t *)*param_2;
    param_1[1] = param_2[1];
    param_1[2] = param_2[2];
    *param_2 = __s2;
    param_2[1] = 0;
    *(undefined4 *)(param_2 + 2) = 0;
    return;
  }
  wmemcpy((wchar_t *)(param_1 + 2),__s2,4);
  param_1[1] = param_2[1];
  param_2[1] = 0;
  *(undefined4 *)*param_2 = 0;
  return;
}

