1 //===-- ExpressionSourceCode.cpp --------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Expression/ExpressionSourceCode.h" 11 12 #include "lldb/Core/StreamString.h" 13 14 using namespace lldb_private; 15 16 const char * 17 ExpressionSourceCode::g_expression_prefix = R"( 18 #undef NULL 19 #undef Nil 20 #undef nil 21 #undef YES 22 #undef NO 23 #define NULL (__null) 24 #define Nil (__null) 25 #define nil (__null) 26 #define YES ((BOOL)1) 27 #define NO ((BOOL)0) 28 typedef signed char BOOL; 29 typedef signed __INT8_TYPE__ int8_t; 30 typedef unsigned __INT8_TYPE__ uint8_t; 31 typedef signed __INT16_TYPE__ int16_t; 32 typedef unsigned __INT16_TYPE__ uint16_t; 33 typedef signed __INT32_TYPE__ int32_t; 34 typedef unsigned __INT32_TYPE__ uint32_t; 35 typedef signed __INT64_TYPE__ int64_t; 36 typedef unsigned __INT64_TYPE__ uint64_t; 37 typedef signed __INTPTR_TYPE__ intptr_t; 38 typedef unsigned __INTPTR_TYPE__ uintptr_t; 39 typedef __SIZE_TYPE__ size_t; 40 typedef __PTRDIFF_TYPE__ ptrdiff_t; 41 typedef unsigned short unichar; 42 )"; 43 44 45 bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method) const 46 { 47 if (m_wrap) 48 { 49 switch (wrapping_language) 50 { 51 default: 52 return false; 53 case lldb::eLanguageTypeC: 54 case lldb::eLanguageTypeC_plus_plus: 55 case lldb::eLanguageTypeObjC: 56 break; 57 } 58 59 StreamString wrap_stream; 60 61 switch (wrapping_language) 62 { 63 default: 64 break; 65 case lldb::eLanguageTypeC: 66 wrap_stream.Printf("%s \n" 67 "%s \n" 68 "void \n" 69 "%s(void *$__lldb_arg) \n" 70 "{ \n" 71 " %s; \n" 72 "} \n", 73 g_expression_prefix, 74 m_prefix.c_str(), 75 m_name.c_str(), 76 m_body.c_str()); 77 break; 78 case lldb::eLanguageTypeC_plus_plus: 79 wrap_stream.Printf("%s \n" 80 "%s \n" 81 "void \n" 82 "$__lldb_class::%s(void *$__lldb_arg) %s\n" 83 "{ \n" 84 " %s; \n" 85 "} \n", 86 g_expression_prefix, 87 m_prefix.c_str(), 88 m_name.c_str(), 89 (const_object ? "const" : ""), 90 m_body.c_str()); 91 break; 92 case lldb::eLanguageTypeObjC: 93 if (static_method) 94 { 95 wrap_stream.Printf("%s \n" 96 "%s \n" 97 "@interface $__lldb_objc_class ($__lldb_category) \n" 98 "+(void)%s:(void *)$__lldb_arg; \n" 99 "@end \n" 100 "@implementation $__lldb_objc_class ($__lldb_category) \n" 101 "+(void)%s:(void *)$__lldb_arg \n" 102 "{ \n" 103 " %s; \n" 104 "} \n" 105 "@end \n", 106 g_expression_prefix, 107 m_prefix.c_str(), 108 m_name.c_str(), 109 m_name.c_str(), 110 m_body.c_str()); 111 } 112 else 113 { 114 wrap_stream.Printf("%s \n" 115 "%s \n" 116 "@interface $__lldb_objc_class ($__lldb_category) \n" 117 "-(void)%s:(void *)$__lldb_arg; \n" 118 "@end \n" 119 "@implementation $__lldb_objc_class ($__lldb_category) \n" 120 "-(void)%s:(void *)$__lldb_arg \n" 121 "{ \n" 122 " %s; \n" 123 "} \n" 124 "@end \n", 125 g_expression_prefix, 126 m_prefix.c_str(), 127 m_name.c_str(), 128 m_name.c_str(), 129 m_body.c_str()); 130 } 131 break; 132 } 133 134 text = wrap_stream.GetString(); 135 } 136 else 137 { 138 text.append(m_body); 139 } 140 141 return true; 142 } 143