30 #include "TClingUtils.h"
36 #include "cling/Interpreter/CompilationOptions.h"
37 #include "cling/Interpreter/Interpreter.h"
38 #include "cling/Interpreter/LookupHelper.h"
39 #include "cling/Interpreter/Transaction.h"
40 #include "cling/Interpreter/Value.h"
41 #include "cling/Utils/AST.h"
43 #include "clang/AST/ASTContext.h"
44 #include "clang/AST/Decl.h"
45 #include "clang/AST/DeclCXX.h"
46 #include "clang/AST/GlobalDecl.h"
47 #include "clang/AST/PrettyPrinter.h"
48 #include "clang/AST/RecordLayout.h"
49 #include "clang/AST/Type.h"
50 #include "clang/Frontend/CompilerInstance.h"
51 #include "clang/Lex/Preprocessor.h"
52 #include "clang/Sema/Sema.h"
53 #include "clang/Sema/Lookup.h"
55 #include "llvm/ADT/APInt.h"
56 #include "llvm/ExecutionEngine/ExecutionEngine.h"
57 #include "llvm/ExecutionEngine/GenericValue.h"
58 #include "llvm/Support/Casting.h"
59 #include "llvm/Support/raw_ostream.h"
60 #include "llvm/IR/LLVMContext.h"
61 #include "llvm/IR/DerivedTypes.h"
62 #include "llvm/IR/Function.h"
63 #include "llvm/IR/GlobalValue.h"
64 #include "llvm/IR/Module.h"
65 #include "llvm/IR/Type.h"
67 #include "clang/Sema/SemaInternal.h"
76 using namespace clang;
79 static unsigned long long gWrapperSerial = 0LL;
80 static const string kIndentString(
" ");
82 static map<const FunctionDecl *, void *> gWrapperStore;
83 static map<const Decl *, void *> gCtorWrapperStore;
84 static map<const Decl *, void *> gDtorWrapperStore;
89 indent(ostringstream &buf,
int indent_level)
91 for (
int i = 0; i < indent_level; ++i) {
98 EvaluateExpr(cling::Interpreter &interp,
const Expr *E, cling::Value &V)
101 ASTContext &C = interp.getCI()->getASTContext();
103 if (E->EvaluateAsInt(res, C, Expr::SE_NoSideEffects)) {
105 V = cling::Value(C.IntTy, interp);
109 V.getLL() = res.getSExtValue();
111 V.getULL() = res.getZExtValue();
116 PrintingPolicy Policy(C.getPrintingPolicy());
117 Policy.SuppressTagKeyword =
true;
118 Policy.SuppressUnwrittenScope =
false;
119 Policy.SuppressInitializers =
false;
120 Policy.AnonymousTagLocations =
false;
122 raw_string_ostream out(buf);
123 E->printPretty(out, 0, Policy, 0);
127 interp.evaluate(buf, V);
131 template <
typename returnType>
132 returnType sv_to(
const cling::Value &val)
134 QualType QT = val.getType().getCanonicalType();
135 if (
const BuiltinType *BT =
136 dyn_cast<BuiltinType>(&*QT)) {
144 switch (BT->getKind()) {
145 case BuiltinType::Void:
147 return (returnType) 0;
152 case BuiltinType::Bool:
153 case BuiltinType::Char_U:
154 case BuiltinType::UChar:
155 return (returnType) val.getULL();
158 case BuiltinType::WChar_U:
162 return (returnType)(wchar_t) val.getULL();
165 case BuiltinType::Char16:
166 case BuiltinType::Char32:
167 case BuiltinType::UShort:
168 case BuiltinType::UInt:
169 case BuiltinType::ULong:
170 case BuiltinType::ULongLong:
171 return (returnType) val.getULL();
174 case BuiltinType::UInt128:
181 case BuiltinType::Char_S:
182 case BuiltinType::SChar:
183 return (returnType) val.getLL();
186 case BuiltinType::WChar_S:
190 return (returnType)(wchar_t) val.getLL();
193 case BuiltinType::Short:
194 case BuiltinType::Int:
195 case BuiltinType::Long:
196 case BuiltinType::LongLong:
197 return (returnType) val.getLL();
200 case BuiltinType::Int128:
203 case BuiltinType::Half:
207 case BuiltinType::Float:
208 return (returnType) val.getFloat();
210 case BuiltinType::Double:
211 return (returnType) val.getDouble();
213 case BuiltinType::LongDouble:
214 return (returnType) val.getLongDouble();
217 case BuiltinType::NullPtr:
218 return (returnType) 0;
225 if (QT->isPointerType() || QT->isArrayType() || QT->isRecordType() ||
226 QT->isReferenceType()) {
227 return (returnType)(long) val.getPtr();
229 if (
const EnumType *ET = dyn_cast<EnumType>(&*QT)) {
230 if (ET->getDecl()->getIntegerType()->hasSignedIntegerRepresentation())
231 return (returnType) val.getLL();
233 return (returnType) val.getULL();
235 if (QT->isMemberPointerType()) {
236 const MemberPointerType *MPT = QT->getAs<MemberPointerType>();
237 if (MPT->isMemberDataPointer()) {
238 return (returnType)(ptrdiff_t)val.getPtr();
240 return (returnType)(long) val.getPtr();
242 ::Error(
"TClingCallFunc::sv_to",
"Invalid Type!");
248 long long sv_to_long_long(
const cling::Value &val)
250 return sv_to<long long>(val);
253 unsigned long long sv_to_ulong_long(
const cling::Value &val)
255 return sv_to<unsigned long long>(val);
260 size_t TClingCallFunc::CalculateMinRequiredArguments()
263 return GetDecl()->getMinRequiredArguments();
266 void *TClingCallFunc::compile_wrapper(
const string &wrapper_name,
const string &wrapper,
267 bool withAccessControl)
269 return fInterp->compileFunction(wrapper_name, wrapper,
false ,
273 void TClingCallFunc::collect_type_info(QualType &QT, ostringstream &typedefbuf, std::ostringstream &callbuf,
274 string &type_name, EReferenceType &refType,
bool &isPointer,
int indent_level,
281 const FunctionDecl *FD = GetDecl();
282 PrintingPolicy Policy(FD->getASTContext().getPrintingPolicy());
283 refType = kNotReference;
284 if (QT->isRecordType() && forArgument) {
285 ROOT::TMetaUtils::GetNormalizedName(type_name, QT, *fInterp, fNormCtxt);
288 if (QT->isFunctionPointerType()) {
289 string fp_typedef_name;
292 nm <<
"FP" << gWrapperSerial++;
293 type_name = nm.str();
294 raw_string_ostream OS(fp_typedef_name);
295 QT.print(OS, Policy, type_name);
298 for (
int i = 0; i < indent_level; ++i) {
299 typedefbuf << kIndentString;
301 typedefbuf <<
"typedef " << fp_typedef_name <<
";\n";
303 }
else if (QT->isMemberPointerType()) {
304 string mp_typedef_name;
307 nm <<
"MP" << gWrapperSerial++;
308 type_name = nm.str();
309 raw_string_ostream OS(mp_typedef_name);
310 QT.print(OS, Policy, type_name);
313 for (
int i = 0; i < indent_level; ++i) {
314 typedefbuf << kIndentString;
316 typedefbuf <<
"typedef " << mp_typedef_name <<
";\n";
318 }
else if (QT->isPointerType()) {
320 QT = cast<clang::PointerType>(QT)->getPointeeType();
321 }
else if (QT->isReferenceType()) {
322 if (QT->isRValueReferenceType()) refType = kRValueReference;
323 else refType = kLValueReference;
324 QT = cast<ReferenceType>(QT)->getPointeeType();
327 if (QT->isArrayType()) {
328 string ar_typedef_name;
331 ar <<
"AR" << gWrapperSerial++;
332 type_name = ar.str();
333 raw_string_ostream OS(ar_typedef_name);
334 QT.print(OS, Policy, type_name);
337 for (
int i = 0; i < indent_level; ++i) {
338 typedefbuf << kIndentString;
340 typedefbuf <<
"typedef " << ar_typedef_name <<
";\n";
343 ROOT::TMetaUtils::GetNormalizedName(type_name, QT, *fInterp, fNormCtxt);
346 void TClingCallFunc::make_narg_ctor(
const unsigned N, ostringstream &typedefbuf,
347 ostringstream &callbuf,
const string &class_name,
354 const FunctionDecl *FD = GetDecl();
356 callbuf <<
"new " << class_name <<
"(";
357 for (
unsigned i = 0U; i < N; ++i) {
358 const ParmVarDecl *PVD = FD->getParamDecl(i);
359 QualType Ty = PVD->getType();
360 QualType QT = Ty.getCanonicalType();
362 EReferenceType refType = kNotReference;
363 bool isPointer =
false;
364 collect_type_info(QT, typedefbuf, callbuf, type_name,
365 refType, isPointer, indent_level,
true);
372 for (
int j = 0; j <= indent_level; ++j) {
373 callbuf << kIndentString;
377 if (refType != kNotReference) {
378 callbuf <<
"(" << type_name.c_str() <<
379 (refType == kLValueReference ?
"&" :
"&&") <<
")*(" << type_name.c_str() <<
"*)args["
381 }
else if (isPointer) {
382 callbuf <<
"*(" << type_name.c_str() <<
"**)args["
385 callbuf <<
"*(" << type_name.c_str() <<
"*)args[" << i <<
"]";
391 void TClingCallFunc::make_narg_call(
const std::string &return_type,
const unsigned N, ostringstream &typedefbuf,
392 ostringstream &callbuf,
const string &class_name,
int indent_level)
399 const FunctionDecl *FD = GetDecl();
412 bool ShouldCastFunction = !isa<CXXMethodDecl>(FD) && N == FD->getNumParams();
413 if (ShouldCastFunction) {
416 callbuf << return_type <<
" (&)";
419 for (
unsigned i = 0U; i < N; ++i) {
426 for (
int j = 0; j <= indent_level; ++j) {
427 callbuf << kIndentString;
431 const ParmVarDecl *PVD = FD->getParamDecl(i);
432 QualType Ty = PVD->getType();
433 QualType QT = Ty.getCanonicalType();
434 std::string arg_type;
435 ROOT::TMetaUtils::GetNormalizedName(arg_type, QT, *fInterp, fNormCtxt);
438 if (FD->isVariadic())
446 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
449 callbuf <<
"((const " << class_name <<
"*)obj)->";
451 callbuf <<
"((" << class_name <<
"*)obj)->";
452 }
else if (
const NamedDecl *ND =
453 dyn_cast<NamedDecl>(FD->getDeclContext())) {
456 callbuf << class_name <<
"::";
462 llvm::raw_string_ostream stream(name);
463 FD->getNameForDiagnostic(stream, FD->getASTContext().getPrintingPolicy(),
false);
467 if (ShouldCastFunction) callbuf <<
")";
470 for (
unsigned i = 0U; i < N; ++i) {
471 const ParmVarDecl *PVD = FD->getParamDecl(i);
472 QualType Ty = PVD->getType();
473 QualType QT = Ty.getCanonicalType();
475 EReferenceType refType = kNotReference;
476 bool isPointer =
false;
477 collect_type_info(QT, typedefbuf, callbuf, type_name, refType, isPointer, indent_level,
true);
485 for (
int j = 0; j <= indent_level; ++j) {
486 callbuf << kIndentString;
491 if (refType != kNotReference) {
492 callbuf <<
"(" << type_name.c_str() <<
493 (refType == kLValueReference ?
"&" :
"&&") <<
")*(" << type_name.c_str() <<
"*)args["
495 }
else if (isPointer) {
496 callbuf <<
"*(" << type_name.c_str() <<
"**)args["
501 callbuf <<
"*(" << type_name.c_str() <<
"*)args[" << i <<
"]";
507 void TClingCallFunc::make_narg_ctor_with_return(
const unsigned N,
const string &class_name,
508 ostringstream &buf,
int indent_level)
519 for (
int i = 0; i < indent_level; ++i) {
520 buf << kIndentString;
522 buf <<
"if (ret) {\n";
525 ostringstream typedefbuf;
526 ostringstream callbuf;
530 for (
int i = 0; i < indent_level; ++i) {
531 callbuf << kIndentString;
533 callbuf <<
"(*(" << class_name <<
"**)ret) = ";
537 make_narg_ctor(N, typedefbuf, callbuf, class_name, indent_level);
542 for (
int i = 0; i < indent_level; ++i) {
543 callbuf << kIndentString;
545 callbuf <<
"return;\n";
549 buf << typedefbuf.str() << callbuf.str();
552 for (
int i = 0; i < indent_level; ++i) {
553 buf << kIndentString;
556 for (
int i = 0; i < indent_level; ++i) {
557 buf << kIndentString;
562 ostringstream typedefbuf;
563 ostringstream callbuf;
564 for (
int i = 0; i < indent_level; ++i) {
565 callbuf << kIndentString;
567 make_narg_ctor(N, typedefbuf, callbuf, class_name, indent_level);
569 for (
int i = 0; i < indent_level; ++i) {
570 callbuf << kIndentString;
572 callbuf <<
"return;\n";
573 buf << typedefbuf.str() << callbuf.str();
576 for (
int i = 0; i < indent_level; ++i) {
577 buf << kIndentString;
582 int TClingCallFunc::get_wrapper_code(std::string &wrapper_name, std::string &wrapper)
584 const FunctionDecl *FD = GetDecl();
585 assert(FD &&
"generate_wrapper called without a function decl!");
586 ASTContext &Context = FD->getASTContext();
587 PrintingPolicy Policy(Context.getPrintingPolicy());
592 if (
const TypeDecl *TD = dyn_cast<TypeDecl>(FD->getDeclContext())) {
594 QualType QT(TD->getTypeForDecl(), 0);
595 ROOT::TMetaUtils::GetNormalizedName(class_name, QT, *fInterp, fNormCtxt);
596 }
else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(FD->getDeclContext())) {
598 raw_string_ostream stream(class_name);
599 ND->getNameForDiagnostic(stream, Policy,
true);
606 bool needInstantiation =
false;
607 const FunctionDecl *Definition = 0;
608 if (!FD->isDefined(Definition)) {
609 FunctionDecl::TemplatedKind TK = FD->getTemplatedKind();
611 case FunctionDecl::TK_NonTemplate: {
621 case FunctionDecl::TK_FunctionTemplate: {
624 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a function template!");
627 case FunctionDecl::TK_MemberSpecialization: {
634 if (!FD->isTemplateInstantiation()) {
647 const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern();
649 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a member function "
650 "instantiation with no pattern!");
653 FunctionDecl::TemplatedKind PTK = Pattern->getTemplatedKind();
654 TemplateSpecializationKind PTSK = Pattern->getTemplateSpecializationKind();
657 (PTK == FunctionDecl::TK_NonTemplate) ||
660 ((PTK != FunctionDecl::TK_FunctionTemplate) &&
661 ((PTSK == TSK_Undeclared) || (PTSK == TSK_ExplicitSpecialization)))) {
666 }
else if (!Pattern->hasBody()) {
667 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a member function "
668 "instantiation with no body!");
671 if (FD->isImplicitlyInstantiable()) {
672 needInstantiation =
true;
675 case FunctionDecl::TK_FunctionTemplateSpecialization: {
680 if (!FD->isTemplateInstantiation()) {
693 const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern();
695 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a function template"
696 "instantiation with no pattern!");
699 FunctionDecl::TemplatedKind PTK = Pattern->getTemplatedKind();
700 TemplateSpecializationKind PTSK = Pattern->getTemplateSpecializationKind();
703 (PTK == FunctionDecl::TK_NonTemplate) ||
706 ((PTK != FunctionDecl::TK_FunctionTemplate) &&
707 ((PTSK == TSK_Undeclared) || (PTSK == TSK_ExplicitSpecialization)))) {
713 if (!Pattern->hasBody()) {
714 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a function template"
715 "instantiation with no body!");
718 if (FD->isImplicitlyInstantiable()) {
719 needInstantiation =
true;
722 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
730 if (!FD->isTemplateInstantiation()) {
743 const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern();
745 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a dependent function template"
746 "instantiation with no pattern!");
749 FunctionDecl::TemplatedKind PTK = Pattern->getTemplatedKind();
750 TemplateSpecializationKind PTSK = Pattern->getTemplateSpecializationKind();
753 (PTK == FunctionDecl::TK_NonTemplate) ||
756 ((PTK != FunctionDecl::TK_FunctionTemplate) &&
757 ((PTSK == TSK_Undeclared) || (PTSK == TSK_ExplicitSpecialization)))) {
763 if (!Pattern->hasBody()) {
764 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a dependent function template"
765 "instantiation with no body!");
768 if (FD->isImplicitlyInstantiable()) {
769 needInstantiation =
true;
775 ::Error(
"TClingCallFunc::make_wrapper",
"Unhandled template kind!");
797 if (needInstantiation) {
798 clang::FunctionDecl *FDmod =
const_cast<clang::FunctionDecl *
>(FD);
799 clang::Sema &S = fInterp->getSema();
801 cling::Interpreter::PushTransactionRAII RAII(fInterp);
802 S.InstantiateFunctionDefinition(SourceLocation(), FDmod,
805 if (!FD->isDefined(Definition)) {
806 ::Error(
"TClingCallFunc::make_wrapper",
"Failed to force template instantiation!");
811 FunctionDecl::TemplatedKind TK = Definition->getTemplatedKind();
813 case FunctionDecl::TK_NonTemplate: {
815 if (Definition->isDeleted()) {
816 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a deleted function!");
818 }
else if (Definition->isLateTemplateParsed()) {
819 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a late template parsed "
830 case FunctionDecl::TK_FunctionTemplate: {
833 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a function template!");
836 case FunctionDecl::TK_MemberSpecialization: {
840 if (Definition->isDeleted()) {
841 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a deleted member function "
842 "of a specialization!");
844 }
else if (Definition->isLateTemplateParsed()) {
845 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a late template parsed "
846 "member function of a specialization!");
856 case FunctionDecl::TK_FunctionTemplateSpecialization: {
861 if (Definition->isDeleted()) {
862 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a deleted function "
863 "template specialization!");
865 }
else if (Definition->isLateTemplateParsed()) {
866 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a late template parsed "
867 "function template specialization!");
877 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
885 if (Definition->isDeleted()) {
886 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a deleted dependent function "
887 "template specialization!");
889 }
else if (Definition->isLateTemplateParsed()) {
890 ::Error(
"TClingCallFunc::make_wrapper",
"Cannot make wrapper for a late template parsed "
891 "dependent function template specialization!");
904 ::Error(
"TClingCallFunc::make_wrapper",
"Unhandled template kind!");
909 unsigned min_args = GetMinRequiredArguments();
910 unsigned num_params = FD->getNumParams();
921 buf <<
'_' << gWrapperSerial++;
922 wrapper_name = buf.str();
928 int indent_level = 0;
930 buf <<
"#pragma clang diagnostic push\n"
931 "#pragma clang diagnostic ignored \"-Wformat-security\"\n"
932 "__attribute__((used)) "
933 "extern \"C\" void ";
935 buf <<
"(void* obj, int nargs, void** args, void* ret)\n"
938 if (min_args == num_params) {
940 make_narg_call_with_return(num_params, class_name, buf, indent_level);
944 for (
unsigned N = min_args; N <= num_params; ++N) {
945 for (
int i = 0; i < indent_level; ++i) {
946 buf << kIndentString;
948 buf <<
"if (nargs == " << N <<
") {\n";
950 make_narg_call_with_return(N, class_name, buf, indent_level);
952 for (
int i = 0; i < indent_level; ++i) {
953 buf << kIndentString;
960 "#pragma clang diagnostic pop";
965 void TClingCallFunc::make_narg_call_with_return(
const unsigned N,
const string &class_name,
966 ostringstream &buf,
int indent_level)
977 const FunctionDecl *FD = GetDecl();
978 if (
const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) {
980 make_narg_ctor_with_return(N, class_name, buf, indent_level);
983 QualType QT = FD->getReturnType().getCanonicalType();
984 if (QT->isVoidType()) {
985 ostringstream typedefbuf;
986 ostringstream callbuf;
987 for (
int i = 0; i < indent_level; ++i) {
988 callbuf << kIndentString;
990 make_narg_call(
"void", N, typedefbuf, callbuf, class_name, indent_level);
992 for (
int i = 0; i < indent_level; ++i) {
993 callbuf << kIndentString;
995 callbuf <<
"return;\n";
996 buf << typedefbuf.str() << callbuf.str();
998 for (
int i = 0; i < indent_level; ++i) {
999 buf << kIndentString;
1003 EReferenceType refType = kNotReference;
1004 bool isPointer =
false;
1006 buf <<
"if (ret) {\n";
1009 ostringstream typedefbuf;
1010 ostringstream callbuf;
1014 for (
int i = 0; i < indent_level; ++i) {
1015 callbuf << kIndentString;
1017 callbuf <<
"new (ret) ";
1018 collect_type_info(QT, typedefbuf, callbuf, type_name,
1019 refType, isPointer, indent_level,
false);
1023 callbuf <<
"(" << type_name.c_str();
1024 if (refType != kNotReference) {
1027 }
else if (isPointer) {
1036 make_narg_call(type_name, N, typedefbuf, callbuf, class_name, indent_level);
1041 for (
int i = 0; i < indent_level; ++i) {
1042 callbuf << kIndentString;
1044 callbuf <<
"return;\n";
1048 buf << typedefbuf.str() << callbuf.str();
1051 for (
int i = 0; i < indent_level; ++i) {
1052 buf << kIndentString;
1055 for (
int i = 0; i < indent_level; ++i) {
1056 buf << kIndentString;
1061 ostringstream typedefbuf;
1062 ostringstream callbuf;
1063 for (
int i = 0; i < indent_level; ++i) {
1064 callbuf << kIndentString;
1066 make_narg_call(type_name, N, typedefbuf, callbuf, class_name, indent_level);
1068 for (
int i = 0; i < indent_level; ++i) {
1069 callbuf << kIndentString;
1071 callbuf <<
"return;\n";
1072 buf << typedefbuf.str() << callbuf.str();
1075 for (
int i = 0; i < indent_level; ++i) {
1076 buf << kIndentString;
1082 tcling_callfunc_Wrapper_t TClingCallFunc::make_wrapper()
1084 R__LOCKGUARD_CLING(gInterpreterMutex);
1086 const FunctionDecl *FD = GetDecl();
1087 string wrapper_name;
1090 if (get_wrapper_code(wrapper_name, wrapper) == 0)
return 0;
1096 void *F = compile_wrapper(wrapper_name, wrapper);
1098 gWrapperStore.insert(make_pair(FD, F));
1100 ::Error(
"TClingCallFunc::make_wrapper",
1101 "Failed to compile\n ==== SOURCE BEGIN ====\n%s\n ==== SOURCE END ====",
1104 return (tcling_callfunc_Wrapper_t)F;
1107 tcling_callfunc_ctor_Wrapper_t TClingCallFunc::make_ctor_wrapper(
const TClingClassInfo *info)
1148 ASTContext &Context = info->GetDecl()->getASTContext();
1149 PrintingPolicy Policy(Context.getPrintingPolicy());
1150 Policy.SuppressTagKeyword =
true;
1151 Policy.SuppressUnwrittenScope =
true;
1156 if (
const TypeDecl *TD = dyn_cast<TypeDecl>(info->GetDecl())) {
1158 QualType QT(TD->getTypeForDecl(), 0);
1159 ROOT::TMetaUtils::GetNormalizedName(class_name, QT, *fInterp, fNormCtxt);
1160 }
else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(info->GetDecl())) {
1162 raw_string_ostream stream(class_name);
1163 ND->getNameForDiagnostic(stream, Policy,
true);
1169 string wrapper_name;
1177 buf <<
'_' << gWrapperSerial++;
1178 wrapper_name = buf.str();
1183 int indent_level = 0;
1185 buf <<
"__attribute__((used)) ";
1186 buf <<
"extern \"C\" void ";
1187 buf << wrapper_name;
1188 buf <<
"(void** ret, void* arena, unsigned long nary)\n";
1199 indent(buf, indent_level);
1200 buf <<
"if (!arena) {\n";
1202 indent(buf, indent_level);
1203 buf <<
"if (!nary) {\n";
1205 indent(buf, indent_level);
1206 buf <<
"*ret = new " << class_name <<
";\n";
1208 indent(buf, indent_level);
1210 indent(buf, indent_level);
1213 indent(buf, indent_level);
1214 buf <<
"*ret = new " << class_name <<
"[nary];\n";
1216 indent(buf, indent_level);
1219 indent(buf, indent_level);
1229 indent(buf, indent_level);
1232 indent(buf, indent_level);
1233 buf <<
"if (!nary) {\n";
1235 indent(buf, indent_level);
1236 buf <<
"*ret = new (arena) " << class_name <<
";\n";
1238 indent(buf, indent_level);
1240 indent(buf, indent_level);
1243 indent(buf, indent_level);
1244 buf <<
"*ret = new (arena) " << class_name <<
"[nary];\n";
1246 indent(buf, indent_level);
1249 indent(buf, indent_level);
1255 string wrapper(buf.str());
1260 void *F = compile_wrapper(wrapper_name, wrapper,
1263 gCtorWrapperStore.insert(make_pair(info->GetDecl(), F));
1265 ::Error(
"TClingCallFunc::make_ctor_wrapper",
1266 "Failed to compile\n ==== SOURCE BEGIN ====\n%s\n ==== SOURCE END ====",
1269 return (tcling_callfunc_ctor_Wrapper_t)F;
1272 tcling_callfunc_dtor_Wrapper_t
1273 TClingCallFunc::make_dtor_wrapper(
const TClingClassInfo *info)
1302 ASTContext &Context = info->GetDecl()->getASTContext();
1303 PrintingPolicy Policy(Context.getPrintingPolicy());
1304 Policy.SuppressTagKeyword =
true;
1305 Policy.SuppressUnwrittenScope =
true;
1310 if (
const TypeDecl *TD = dyn_cast<TypeDecl>(info->GetDecl())) {
1312 QualType QT(TD->getTypeForDecl(), 0);
1313 ROOT::TMetaUtils::GetNormalizedName(class_name, QT, *fInterp, fNormCtxt);
1314 }
else if (
const NamedDecl *ND = dyn_cast<NamedDecl>(info->GetDecl())) {
1316 raw_string_ostream stream(class_name);
1317 ND->getNameForDiagnostic(stream, Policy,
true);
1323 string wrapper_name;
1331 buf <<
'_' << gWrapperSerial++;
1332 wrapper_name = buf.str();
1337 int indent_level = 0;
1339 buf <<
"__attribute__((used)) ";
1340 buf <<
"extern \"C\" void ";
1341 buf << wrapper_name;
1342 buf <<
"(void* obj, unsigned long nary, int withFree)\n";
1353 indent(buf, indent_level);
1354 buf <<
"if (withFree) {\n";
1356 indent(buf, indent_level);
1357 buf <<
"if (!nary) {\n";
1359 indent(buf, indent_level);
1360 buf <<
"delete (" << class_name <<
"*) obj;\n";
1362 indent(buf, indent_level);
1364 indent(buf, indent_level);
1367 indent(buf, indent_level);
1368 buf <<
"delete[] (" << class_name <<
"*) obj;\n";
1370 indent(buf, indent_level);
1373 indent(buf, indent_level);
1386 indent(buf, indent_level);
1389 indent(buf, indent_level);
1390 buf <<
"typedef " << class_name <<
" Nm;\n";
1391 buf <<
"if (!nary) {\n";
1393 indent(buf, indent_level);
1394 buf <<
"((Nm*)obj)->~Nm();\n";
1396 indent(buf, indent_level);
1398 indent(buf, indent_level);
1401 indent(buf, indent_level);
1404 indent(buf, indent_level);
1405 buf <<
"(((Nm*)obj)+(--nary))->~Nm();\n";
1407 indent(buf, indent_level);
1408 buf <<
"} while (nary);\n";
1410 indent(buf, indent_level);
1413 indent(buf, indent_level);
1419 string wrapper(buf.str());
1424 void *F = compile_wrapper(wrapper_name, wrapper,
1427 gDtorWrapperStore.insert(make_pair(info->GetDecl(), F));
1429 ::Error(
"TClingCallFunc::make_dtor_wrapper",
1430 "Failed to compile\n ==== SOURCE BEGIN ====\n%s\n ==== SOURCE END ====",
1434 return (tcling_callfunc_dtor_Wrapper_t)F;
1445 unsigned long long ull;
1465 void TClingCallFunc::exec(
void *address,
void *ret)
1467 SmallVector<ValHolder, 8> vh_ary;
1468 SmallVector<void *, 8> vp_ary;
1470 unsigned num_args = fArgVals.size();
1472 R__LOCKGUARD_CLING(gInterpreterMutex);
1474 const FunctionDecl *FD = GetDecl();
1481 unsigned num_params = FD->getNumParams();
1483 if (num_args < GetMinRequiredArguments()) {
1484 ::Error(
"TClingCallFunc::exec",
1485 "Not enough arguments provided for %s (%d instead of the minimum %d)",
1487 num_args, (int)GetMinRequiredArguments());
1490 if (address == 0 && dyn_cast<CXXMethodDecl>(FD)
1491 && !(dyn_cast<CXXMethodDecl>(FD))->isStatic()
1492 && !dyn_cast<CXXConstructorDecl>(FD)) {
1493 ::Error(
"TClingCallFunc::exec",
1494 "The method %s is called without an object.",
1498 vh_ary.reserve(num_args);
1499 vp_ary.reserve(num_args);
1500 for (
unsigned i = 0U; i < num_args; ++i) {
1502 if (i < num_params) {
1503 const ParmVarDecl *PVD = FD->getParamDecl(i);
1504 Ty = PVD->getType();
1506 Ty = fArgVals[i].getType();
1508 QualType QT = Ty.getCanonicalType();
1509 if (
const BuiltinType *BT =
1510 dyn_cast<BuiltinType>(&*QT)) {
1518 switch (BT->getKind()) {
1522 case BuiltinType::Void: {
1524 ::Error(
"TClingCallFunc::exec(void*)",
1525 "Invalid type 'Void'!");
1532 case BuiltinType::Bool: {
1535 vh.u.b = (bool) sv_to_ulong_long(fArgVals[i]);
1536 vh_ary.push_back(vh);
1537 vp_ary.push_back(&vh_ary.back());
1540 case BuiltinType::Char_U: {
1543 vh.u.c = (char) sv_to_ulong_long(fArgVals[i]);
1544 vh_ary.push_back(vh);
1545 vp_ary.push_back(&vh_ary.back());
1548 case BuiltinType::UChar: {
1551 vh.u.uc = (
unsigned char) sv_to_ulong_long(fArgVals[i]);
1552 vh_ary.push_back(vh);
1553 vp_ary.push_back(&vh_ary.back());
1556 case BuiltinType::WChar_U: {
1561 vh.u.wc = (wchar_t) sv_to_ulong_long(fArgVals[i]);
1562 vh_ary.push_back(vh);
1563 vp_ary.push_back(&vh_ary.back());
1566 case BuiltinType::Char16: {
1574 case BuiltinType::Char32: {
1582 case BuiltinType::UShort: {
1585 vh.u.us = (
unsigned short) sv_to_ulong_long(fArgVals[i]);
1586 vh_ary.push_back(vh);
1587 vp_ary.push_back(&vh_ary.back());
1590 case BuiltinType::UInt: {
1593 vh.u.ui = (
unsigned int) sv_to_ulong_long(fArgVals[i]);
1594 vh_ary.push_back(vh);
1595 vp_ary.push_back(&vh_ary.back());
1598 case BuiltinType::ULong: {
1601 vh.u.ul = (
unsigned long) sv_to_ulong_long(fArgVals[i]);
1602 vh_ary.push_back(vh);
1603 vp_ary.push_back(&vh_ary.back());
1606 case BuiltinType::ULongLong: {
1609 vh.u.ull = (
unsigned long long) sv_to_ulong_long(fArgVals[i]);
1610 vh_ary.push_back(vh);
1611 vp_ary.push_back(&vh_ary.back());
1614 case BuiltinType::UInt128: {
1624 case BuiltinType::Char_S: {
1627 vh.u.c = (char) sv_to_long_long(fArgVals[i]);
1628 vh_ary.push_back(vh);
1629 vp_ary.push_back(&vh_ary.back());
1632 case BuiltinType::SChar: {
1635 vh.u.sc = (
signed char) sv_to_long_long(fArgVals[i]);
1636 vh_ary.push_back(vh);
1637 vp_ary.push_back(&vh_ary.back());
1640 case BuiltinType::WChar_S: {
1645 vh.u.wc = (wchar_t) sv_to_long_long(fArgVals[i]);
1646 vh_ary.push_back(vh);
1647 vp_ary.push_back(&vh_ary.back());
1650 case BuiltinType::Short: {
1653 vh.u.s = (short) sv_to_long_long(fArgVals[i]);
1654 vh_ary.push_back(vh);
1655 vp_ary.push_back(&vh_ary.back());
1658 case BuiltinType::Int: {
1661 vh.u.i = (int) sv_to_long_long(fArgVals[i]);
1662 vh_ary.push_back(vh);
1663 vp_ary.push_back(&vh_ary.back());
1666 case BuiltinType::Long: {
1669 vh.u.l = (long) sv_to_long_long(fArgVals[i]);
1670 vh_ary.push_back(vh);
1671 vp_ary.push_back(&vh_ary.back());
1674 case BuiltinType::LongLong: {
1677 vh.u.ll = (
long long) sv_to_long_long(fArgVals[i]);
1678 vh_ary.push_back(vh);
1679 vp_ary.push_back(&vh_ary.back());
1682 case BuiltinType::Int128: {
1684 ::Error(
"TClingCallFunc::exec(void*)",
1685 "Invalid type 'Int128'!");
1689 case BuiltinType::Half: {
1691 ::Error(
"TClingCallFunc::exec(void*)",
1692 "Invalid type 'Half'!");
1696 case BuiltinType::Float: {
1699 vh.u.flt = sv_to<float>(fArgVals[i]);
1700 vh_ary.push_back(vh);
1701 vp_ary.push_back(&vh_ary.back());
1704 case BuiltinType::Double: {
1707 vh.u.dbl = sv_to<double>(fArgVals[i]);
1708 vh_ary.push_back(vh);
1709 vp_ary.push_back(&vh_ary.back());
1712 case BuiltinType::LongDouble: {
1715 vh.u.ldbl = sv_to<long double>(fArgVals[i]);
1716 vh_ary.push_back(vh);
1717 vp_ary.push_back(&vh_ary.back());
1723 case BuiltinType::NullPtr: {
1726 vh.u.vp = fArgVals[i].getPtr();
1727 vh_ary.push_back(vh);
1728 vp_ary.push_back(&vh_ary.back());
1734 ::Error(
"TClingCallFunc::exec(void*)",
1735 "Unhandled builtin type!");
1741 }
else if (QT->isReferenceType()) {
1744 vp_ary.push_back((
void *) sv_to_ulong_long(fArgVals[i]));
1745 }
else if (QT->isPointerType() || QT->isArrayType()) {
1747 vh.u.vp = (
void *) sv_to_ulong_long(fArgVals[i]);
1748 vh_ary.push_back(vh);
1749 vp_ary.push_back(&vh_ary.back());
1750 }
else if (QT->isRecordType()) {
1753 vp_ary.push_back((
void *) sv_to_ulong_long(fArgVals[i]));
1754 }
else if (
const EnumType *ET =
1755 dyn_cast<EnumType>(&*QT)) {
1760 vh.u.i = (int) sv_to_long_long(fArgVals[i]);
1761 vh_ary.push_back(vh);
1762 vp_ary.push_back(&vh_ary.back());
1763 }
else if (QT->isMemberPointerType()) {
1765 vh.u.vp = (
void *) sv_to_ulong_long(fArgVals[i]);
1766 vh_ary.push_back(vh);
1767 vp_ary.push_back(&vh_ary.back());
1769 ::Error(
"TClingCallFunc::exec(void*)",
1770 "Invalid type (unrecognized)!");
1776 (*fWrapper)(address, (int)num_args, (
void **)vp_ary.data(), ret);
1779 template <
typename T>
1780 void TClingCallFunc::execWithLL(
void *address, cling::Value *val)
1783 exec(address, &ret);
1787 template <
typename T>
1788 void TClingCallFunc::execWithULL(
void *address, cling::Value *val)
1791 exec(address, &ret);
1792 val->getULL() = ret;
1797 TClingCallFunc::ExecWithRetFunc_t TClingCallFunc::InitRetAndExecIntegral(QualType QT, cling::Value &ret)
1799 ret = cling::Value::Create<T>(QT.getAsOpaquePtr(), *fInterp);
1800 static_assert(std::is_integral<T>::value,
"Must be called with integral T");
1801 if (std::is_signed<T>::value)
1802 return [
this](
void* address, cling::Value& ret) { execWithLL<T>(address, &ret); };
1804 return [
this](
void* address, cling::Value& ret) { execWithULL<T>(address, &ret); };
1808 TClingCallFunc::ExecWithRetFunc_t
1809 TClingCallFunc::InitRetAndExecBuiltin(QualType QT,
const clang::BuiltinType *BT, cling::Value &ret) {
1810 switch (BT->getKind()) {
1811 case BuiltinType::Void: {
1812 ret = cling::Value::Create<void>(QT.getAsOpaquePtr(), *fInterp);
1813 return [
this](
void* address, cling::Value& ret) { exec(address, 0); };
1820 case BuiltinType::Bool:
1821 return InitRetAndExecIntegral<bool>(QT, ret);
1823 case BuiltinType::Char_U:
1824 case BuiltinType::UChar:
1825 return InitRetAndExecIntegral<char>(QT, ret);
1827 case BuiltinType::WChar_U:
1828 return InitRetAndExecIntegral<wchar_t>(QT, ret);
1830 case BuiltinType::Char16:
1831 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1832 "Invalid type 'char16_t'!");
1835 case BuiltinType::Char32:
1836 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1837 "Invalid type 'char32_t'!");
1840 case BuiltinType::UShort:
1841 return InitRetAndExecIntegral<unsigned short>(QT, ret);
1843 case BuiltinType::UInt:
1844 return InitRetAndExecIntegral<unsigned int>(QT, ret);
1846 case BuiltinType::ULong:
1847 return InitRetAndExecIntegral<unsigned long>(QT, ret);
1849 case BuiltinType::ULongLong:
1850 return InitRetAndExecIntegral<unsigned long long>(QT, ret);
1852 case BuiltinType::UInt128: {
1853 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1854 "Invalid type '__uint128_t'!");
1862 case BuiltinType::Char_S:
1863 case BuiltinType::SChar:
1864 return InitRetAndExecIntegral<signed char>(QT, ret);
1866 case BuiltinType::WChar_S:
1870 return InitRetAndExecIntegral<wchar_t>(QT, ret);
1872 case BuiltinType::Short:
1873 return InitRetAndExecIntegral<short>(QT, ret);
1875 case BuiltinType::Int:
1876 return InitRetAndExecIntegral<int>(QT, ret);
1878 case BuiltinType::Long:
1879 return InitRetAndExecIntegral<long>(QT, ret);
1881 case BuiltinType::LongLong:
1882 return InitRetAndExecIntegral<long long>(QT, ret);
1884 case BuiltinType::Int128:
1885 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1886 "Invalid type '__int128_t'!");
1889 case BuiltinType::Half:
1891 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1892 "Invalid type 'Half'!");
1895 case BuiltinType::Float: {
1896 ret = cling::Value::Create<float>(QT.getAsOpaquePtr(), *fInterp);
1897 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getFloat()); };
1900 case BuiltinType::Double: {
1901 ret = cling::Value::Create<double>(QT.getAsOpaquePtr(), *fInterp);
1902 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getDouble()); };
1905 case BuiltinType::LongDouble: {
1906 ret = cling::Value::Create<long double>(QT.getAsOpaquePtr(), *fInterp);
1907 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getLongDouble()); };
1913 case BuiltinType::NullPtr:
1915 ::Error(
"TClingCallFunc::InitRetAndExecBuiltin",
1916 "Invalid type 'nullptr'!");
1926 TClingCallFunc::ExecWithRetFunc_t
1927 TClingCallFunc::InitRetAndExecNoCtor(clang::QualType QT, cling::Value &ret) {
1928 if (QT->isReferenceType()) {
1929 ret = cling::Value(QT, *fInterp);
1930 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getPtr()); };
1931 }
else if (QT->isMemberPointerType()) {
1932 const MemberPointerType *MPT = QT->getAs<MemberPointerType>();
1933 if (MPT->isMemberDataPointer()) {
1939 ret = cling::Value(QT, *fInterp);
1940 return [
this](
void* address, cling::Value& ret) { exec(address, ret.getPtr()); };
1943 ret = cling::Value(QT, *fInterp);
1944 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getPtr()); };
1945 }
else if (QT->isPointerType() || QT->isArrayType()) {
1947 ret = cling::Value::Create<void*>(QT.getAsOpaquePtr(), *fInterp);
1948 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getPtr()); };
1949 }
else if (QT->isRecordType()) {
1950 ret = cling::Value(QT, *fInterp);
1951 return [
this](
void* address, cling::Value& ret) { exec(address, ret.getPtr()); };
1952 }
else if (
const EnumType *ET = dyn_cast<EnumType>(&*QT)) {
1956 ret = cling::Value(QT, *fInterp);
1957 return [
this](
void* address, cling::Value& ret) { execWithLL<int>(address, &ret); };
1958 }
else if (
const BuiltinType *BT = dyn_cast<BuiltinType>(&*QT)) {
1959 return InitRetAndExecBuiltin(QT, BT, ret);
1961 ::Error(
"TClingCallFunc::exec_with_valref_return",
1962 "Unrecognized return type!");
1967 TClingCallFunc::ExecWithRetFunc_t
1968 TClingCallFunc::InitRetAndExec(
const clang::FunctionDecl *FD, cling::Value &ret) {
1969 if (
const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) {
1970 ASTContext &Context = FD->getASTContext();
1971 const TypeDecl *TD = dyn_cast<TypeDecl>(CD->getDeclContext());
1972 QualType ClassTy(TD->getTypeForDecl(), 0);
1973 QualType QT = Context.getLValueReferenceType(ClassTy);
1974 ret = cling::Value(QT, *fInterp);
1976 return [
this](
void* address, cling::Value& ret) { exec(address, &ret.getPtr()); };
1978 QualType QT = FD->getReturnType().getCanonicalType();
1979 return InitRetAndExecNoCtor(QT, ret);
1983 void TClingCallFunc::exec_with_valref_return(
void *address, cling::Value *ret)
1989 std::function<void(void*, cling::Value&)> execFunc;
1993 R__LOCKGUARD_CLING(gInterpreterMutex);
1994 execFunc = InitRetAndExec(GetDecl(), *ret);
1998 execFunc(address, *ret);
2002 void TClingCallFunc::EvaluateArgList(
const string &ArgList)
2004 R__LOCKGUARD_CLING(gInterpreterMutex);
2006 SmallVector<Expr *, 4> exprs;
2007 fInterp->getLookupHelper().findArgList(ArgList, exprs,
2008 gDebug > 5 ? cling::LookupHelper::WithDiagnostics
2009 : cling::LookupHelper::NoDiagnostics);
2010 for (SmallVectorImpl<Expr *>::const_iterator I = exprs.begin(),
2011 E = exprs.end(); I != E; ++I) {
2013 EvaluateExpr(*fInterp, *I, val);
2014 if (!val.isValid()) {
2016 ::Error(
"TClingCallFunc::EvaluateArgList",
2017 "Bad expression in parameter %d of '%s'!",
2018 (
int)(I - exprs.begin()),
2022 fArgVals.push_back(val);
2026 void TClingCallFunc::Exec(
void *address, TInterpreterValue *interpVal)
2030 ::Error(
"TClingCallFunc::Exec(address, interpVal)",
2031 "Called with no wrapper, not implemented!");
2038 cling::Value *val =
reinterpret_cast<cling::Value *
>(interpVal->GetValAddr());
2039 exec_with_valref_return(address, val);
2042 template <
typename T>
2043 T TClingCallFunc::ExecT(
void *address)
2047 ::Error(
"TClingCallFunc::ExecT",
2048 "Called with no wrapper, not implemented!");
2052 exec_with_valref_return(address, &ret);
2053 if (!ret.isValid()) {
2058 if (fReturnIsRecordType)
2059 ((TCling *)gCling)->RegisterTemporary(ret);
2060 return sv_to<T>(ret);
2063 Long_t TClingCallFunc::ExecInt(
void *address)
2065 return ExecT<long>(address);
2068 long long TClingCallFunc::ExecInt64(
void *address)
2070 return ExecT<long long>(address);
2073 double TClingCallFunc::ExecDouble(
void *address)
2075 return ExecT<double>(address);
2078 void TClingCallFunc::ExecWithArgsAndReturn(
void *address,
const void *args[] ,
2079 int nargs ,
void *ret)
2083 ::Error(
"TClingCallFunc::ExecWithArgsAndReturn(address, args, ret)",
2084 "Called with no wrapper, not implemented!");
2087 (*fWrapper)(address, nargs,
const_cast<void **
>(args), ret);
2090 void TClingCallFunc::ExecWithReturn(
void *address,
void *ret)
2094 ::Error(
"TClingCallFunc::ExecWithReturn(address, ret)",
2095 "Called with no wrapper, not implemented!");
2101 void *TClingCallFunc::ExecDefaultConstructor(
const TClingClassInfo *info,
void *address ,
2102 unsigned long nary )
2104 if (!info->IsValid()) {
2105 ::Error(
"TClingCallFunc::ExecDefaultConstructor",
"Invalid class info!");
2108 tcling_callfunc_ctor_Wrapper_t wrapper = 0;
2110 R__LOCKGUARD_CLING(gInterpreterMutex);
2111 const Decl *D = info->GetDecl();
2120 map<const Decl *, void *>::iterator I = gCtorWrapperStore.find(D);
2121 if (I != gCtorWrapperStore.end()) {
2122 wrapper = (tcling_callfunc_ctor_Wrapper_t) I->second;
2124 wrapper = make_ctor_wrapper(info);
2128 ::Error(
"TClingCallFunc::ExecDefaultConstructor",
2129 "Called with no wrapper, not implemented!");
2133 (*wrapper)(&obj, address, nary);
2137 void TClingCallFunc::ExecDestructor(
const TClingClassInfo *info,
void *address ,
2138 unsigned long nary ,
bool withFree )
2140 if (!info->IsValid()) {
2141 ::Error(
"TClingCallFunc::ExecDestructor",
"Invalid class info!");
2145 tcling_callfunc_dtor_Wrapper_t wrapper = 0;
2147 R__LOCKGUARD_CLING(gInterpreterMutex);
2148 const Decl *D = info->GetDecl();
2149 map<const Decl *, void *>::iterator I = gDtorWrapperStore.find(D);
2150 if (I != gDtorWrapperStore.end()) {
2151 wrapper = (tcling_callfunc_dtor_Wrapper_t) I->second;
2153 wrapper = make_dtor_wrapper(info);
2157 ::Error(
"TClingCallFunc::ExecDestructor",
2158 "Called with no wrapper, not implemented!");
2161 (*wrapper)(address, nary, withFree);
2165 TClingCallFunc::FactoryMethod()
const
2167 return new TClingMethodInfo(*fMethod);
2170 void TClingCallFunc::Init()
2175 fMinRequiredArguments = -1;
2179 void TClingCallFunc::Init(
const TClingMethodInfo &minfo)
2182 fMethod = std::unique_ptr<TClingMethodInfo>(
new TClingMethodInfo(minfo));
2185 void TClingCallFunc::Init(std::unique_ptr<TClingMethodInfo> minfo)
2188 fMethod = std::move(minfo);
2191 void *TClingCallFunc::InterfaceMethod()
2197 const FunctionDecl *decl = GetDecl();
2199 R__LOCKGUARD_CLING(gInterpreterMutex);
2200 map<const FunctionDecl *, void *>::iterator I = gWrapperStore.find(decl);
2201 if (I != gWrapperStore.end()) {
2202 fWrapper = (tcling_callfunc_Wrapper_t) I->second;
2204 fWrapper = make_wrapper();
2207 return (
void *)fWrapper;
2210 bool TClingCallFunc::IsValid()
const
2215 return fMethod->IsValid();
2218 TInterpreter::CallFuncIFacePtr_t TClingCallFunc::IFacePtr()
2221 ::Error(
"TClingCallFunc::IFacePtr(kind)",
2222 "Attempt to get interface while invalid.");
2223 return TInterpreter::CallFuncIFacePtr_t();
2226 const FunctionDecl *decl = GetDecl();
2228 R__LOCKGUARD_CLING(gInterpreterMutex);
2229 map<const FunctionDecl *, void *>::iterator I = gWrapperStore.find(decl);
2230 if (I != gWrapperStore.end()) {
2231 fWrapper = (tcling_callfunc_Wrapper_t) I->second;
2233 fWrapper = make_wrapper();
2236 fReturnIsRecordType = decl->getReturnType().getCanonicalType()->isRecordType();
2238 return TInterpreter::CallFuncIFacePtr_t(fWrapper);
2242 void TClingCallFunc::ResetArg()
2247 void TClingCallFunc::SetArg(
unsigned long param)
2249 const ASTContext &C = fInterp->getCI()->getASTContext();
2250 fArgVals.push_back(cling::Value(C.UnsignedLongTy, *fInterp));
2251 fArgVals.back().getLL() = param;
2254 void TClingCallFunc::SetArg(
long param)
2256 const ASTContext &C = fInterp->getCI()->getASTContext();
2257 fArgVals.push_back(cling::Value(C.LongTy, *fInterp));
2258 fArgVals.back().getLL() = param;
2261 void TClingCallFunc::SetArg(
float param)
2263 const ASTContext &C = fInterp->getCI()->getASTContext();
2264 fArgVals.push_back(cling::Value(C.FloatTy, *fInterp));
2265 fArgVals.back().getFloat() = param;
2268 void TClingCallFunc::SetArg(
double param)
2270 const ASTContext &C = fInterp->getCI()->getASTContext();
2271 fArgVals.push_back(cling::Value(C.DoubleTy, *fInterp));
2272 fArgVals.back().getDouble() = param;
2275 void TClingCallFunc::SetArg(
long long param)
2277 const ASTContext &C = fInterp->getCI()->getASTContext();
2278 fArgVals.push_back(cling::Value(C.LongLongTy, *fInterp));
2279 fArgVals.back().getLL() = param;
2282 void TClingCallFunc::SetArg(
unsigned long long param)
2284 const ASTContext &C = fInterp->getCI()->getASTContext();
2285 fArgVals.push_back(cling::Value(C.UnsignedLongLongTy, *fInterp));
2286 fArgVals.back().getULL() = param;
2289 void TClingCallFunc::SetArgArray(
long *paramArr,
int nparam)
2292 for (
int i = 0; i < nparam; ++i) {
2293 SetArg(paramArr[i]);
2297 void TClingCallFunc::SetArgs(
const char *params)
2300 EvaluateArgList(params);
2303 void TClingCallFunc::SetFunc(
const TClingClassInfo *info,
const char *method,
const char *arglist,
2306 SetFunc(info, method, arglist,
false, poffset);
2309 void TClingCallFunc::SetFunc(
const TClingClassInfo *info,
const char *method,
const char *arglist,
2310 bool objectIsConst,
long *poffset)
2312 Init(std::unique_ptr<TClingMethodInfo>(
new TClingMethodInfo(fInterp)));
2317 if (!info->IsValid()) {
2318 ::Error(
"TClingCallFunc::SetFunc",
"Class info is invalid!");
2321 if (!strcmp(arglist,
")")) {
2325 *fMethod = info->GetMethodWithArgs(method, arglist, objectIsConst, poffset);
2326 if (!fMethod->IsValid()) {
2334 EvaluateArgList(arglist);
2337 void TClingCallFunc::SetFunc(
const TClingMethodInfo *info)
2339 Init(std::unique_ptr<TClingMethodInfo>(
new TClingMethodInfo(*info)));
2341 if (!fMethod->IsValid()) {
2346 void TClingCallFunc::SetFuncProto(
const TClingClassInfo *info,
const char *method,
2347 const char *proto,
long *poffset,
2348 EFunctionMatchMode mode)
2350 SetFuncProto(info, method, proto,
false, poffset, mode);
2353 void TClingCallFunc::SetFuncProto(
const TClingClassInfo *info,
const char *method,
2354 const char *proto,
bool objectIsConst,
long *poffset,
2355 EFunctionMatchMode mode)
2357 Init(std::unique_ptr<TClingMethodInfo>(
new TClingMethodInfo(fInterp)));
2362 if (!info->IsValid()) {
2363 ::Error(
"TClingCallFunc::SetFuncProto",
"Class info is invalid!");
2366 *fMethod = info->GetMethod(method, proto, objectIsConst, poffset, mode);
2367 if (!fMethod->IsValid()) {
2374 void TClingCallFunc::SetFuncProto(
const TClingClassInfo *info,
const char *method,
2375 const llvm::SmallVectorImpl<clang::QualType> &proto,
long *poffset,
2376 EFunctionMatchMode mode)
2378 SetFuncProto(info, method, proto,
false, poffset, mode);
2381 void TClingCallFunc::SetFuncProto(
const TClingClassInfo *info,
const char *method,
2382 const llvm::SmallVectorImpl<clang::QualType> &proto,
2383 bool objectIsConst,
long *poffset,
2384 EFunctionMatchMode mode)
2386 Init(std::unique_ptr<TClingMethodInfo>(
new TClingMethodInfo(fInterp)));
2391 if (!info->IsValid()) {
2392 ::Error(
"TClingCallFunc::SetFuncProto",
"Class info is invalid!");
2395 *fMethod = info->GetMethod(method, proto, objectIsConst, poffset, mode);
2396 if (!fMethod->IsValid()) {