@@ -1207,13 +1207,11 @@ namespace Cpp {
12071207    return  0 ;
12081208  }
12091209
1210-   intptr_t  GetVariableOffset (TCppScope_t var)
1211-   {
1212-     if  (!var)
1210+   intptr_t  GetVariableOffsetImpl (compat::Interpreter& I, Decl* D) {
1211+     if  (!D)
12131212      return  0 ;
12141213
1215-     auto  *D = (Decl *) var;
1216-     auto  &C = getASTContext ();
1214+     auto & C = I.getSema ().getASTContext ();
12171215
12181216    if  (auto * FD = llvm::dyn_cast<FieldDecl>(D)) {
12191217      const  clang::RecordDecl* RD = FD->getParent ();
@@ -1242,7 +1240,7 @@ namespace Cpp {
12421240      compat::maybeMangleDeclName (GD, mangledName);
12431241      void * address = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol (
12441242          mangledName.c_str ());
1245-        auto  &I =  getInterp (); 
1243+ 
12461244      if  (!address)
12471245        address = I.getAddressOfGlobal (GD);
12481246      if  (!address) {
@@ -1292,6 +1290,11 @@ namespace Cpp {
12921290    return  0 ;
12931291  }
12941292
1293+   intptr_t  GetVariableOffset (TCppScope_t var) {
1294+     auto * D = static_cast <Decl*>(var);
1295+     return  GetVariableOffsetImpl (getInterp (), D);
1296+   }
1297+ 
12951298  //  Check if the Access Specifier of the variable matches the provided value.
12961299  bool  CheckVariableAccess (TCppScope_t var, AccessSpecifier AS)
12971300  {
@@ -1453,6 +1456,10 @@ namespace Cpp {
14531456    }
14541457  }
14551458
1459+   QualType GetBuiltinType (const  std::string& name, Sema& sema) {
1460+     return  findBuiltinType (name, sema.getASTContext ());
1461+   }
1462+ 
14561463  TCppType_t GetType (const  std::string &name) {
14571464    QualType builtin = findBuiltinType (name, getASTContext ());
14581465    if  (!builtin.isNull ())
@@ -2574,26 +2581,31 @@ namespace Cpp {
25742581    } //  namespace
25752582      //  End of JitCall Helper Functions
25762583
2577-   CPPINTEROP_API  JitCall MakeFunctionCallable ( TCppConstFunction_t func) {
2578-     auto * D = (const  clang::Decl*)func;
2579-     if  (!D)
2580-       return  {};
2584+      JitCall MakeFunctionCallableImpl (TInterp_t I,  TCppConstFunction_t func) {
2585+        auto * D = (const  clang::Decl*)func;
2586+        if  (!D)
2587+          return  {};
25812588
2582-     auto & I = getInterp ();
2583-     //  FIXME: Unify with make_wrapper.
2584-     if  (auto  *Dtor = dyn_cast<CXXDestructorDecl>(D)) {
2585-       if  (auto  Wrapper = make_dtor_wrapper (I, Dtor->getParent ()))
2586-         return  {JitCall::kDestructorCall , Wrapper, Dtor};
2589+       auto * interp = static_cast <compat::Interpreter*>(I);
2590+ 
2591+       //  FIXME: Unify with make_wrapper.
2592+       if  (const  auto * Dtor = dyn_cast<CXXDestructorDecl>(D)) {
2593+         if  (auto  Wrapper = make_dtor_wrapper (*interp, Dtor->getParent ()))
2594+           return  {JitCall::kDestructorCall , Wrapper, Dtor};
2595+         //  FIXME: else error we failed to compile the wrapper.
2596+         return  {};
2597+       }
2598+ 
2599+       if  (auto  Wrapper = make_wrapper (*interp, cast<FunctionDecl>(D))) {
2600+         return  {JitCall::kGenericCall , Wrapper, cast<FunctionDecl>(D)};
2601+       }
25872602      //  FIXME: else error we failed to compile the wrapper.
25882603      return  {};
25892604    }
25902605
2591-     if  ( auto  Wrapper =  make_wrapper (I, cast<FunctionDecl>(D)) ) {
2592-       return  {JitCall:: kGenericCall , Wrapper, cast<FunctionDecl>(D)} ;
2606+     CPPINTEROP_API JitCall  MakeFunctionCallable (TCppConstFunction_t func ) {
2607+       return  MakeFunctionCallableImpl (& getInterp (), func) ;
25932608    }
2594-     //  FIXME: else error we failed to compile the wrapper.
2595-     return  {};
2596-   }
25972609
25982610  namespace  {
25992611  static  std::string MakeResourcesPath () {
@@ -2842,8 +2854,9 @@ namespace Cpp {
28422854    return  DLM->searchLibrariesForSymbol (mangled_name, search_system);
28432855  }
28442856
2845-   bool  InsertOrReplaceJitSymbol (const  char * linker_mangled_name,
2846-                                 uint64_t  address) {
2857+   bool  InsertOrReplaceJitSymbolImpl (compat::Interpreter& I,
2858+                                     const  char * linker_mangled_name,
2859+                                     uint64_t  address) {
28472860    //  FIXME: This approach is problematic since we could replace a symbol
28482861    //  whose address was already taken by clients.
28492862    // 
@@ -2869,7 +2882,6 @@ namespace Cpp {
28692882    using  namespace  llvm ; 
28702883    using  namespace  llvm ::orc; 
28712884
2872-     auto & I = getInterp ();
28732885    auto  Symbol = compat::getSymbolAddress (I, linker_mangled_name);
28742886    llvm::orc::LLJIT& Jit = *compat::getExecutionEngine (I);
28752887    llvm::orc::ExecutionSession& ES = Jit.getExecutionSession ();
@@ -2930,6 +2942,12 @@ namespace Cpp {
29302942    return  false ;
29312943  }
29322944
2945+   bool  InsertOrReplaceJitSymbol (const  char * linker_mangled_name,
2946+                                 uint64_t  address) {
2947+     return  InsertOrReplaceJitSymbolImpl (getInterp (), linker_mangled_name,
2948+                                         address);
2949+   }
2950+ 
29332951  std::string ObjToString (const  char  *type, void  *obj) {
29342952    return  getInterp ().toString (type, obj);
29352953  }
@@ -2979,9 +2997,8 @@ namespace Cpp {
29792997    //  return C.getElaboratedType(ETK_None, NS, TT);
29802998  }
29812999
2982-   static  Decl* InstantiateTemplate (TemplateDecl* TemplateD,
2983-                                    ArrayRef<TemplateArgument> TemplateArgs,
2984-                                    Sema& S) {
3000+   Decl* InstantiateTemplate (TemplateDecl* TemplateD,
3001+                             ArrayRef<TemplateArgument> TemplateArgs, Sema& S) {
29853002    //  Create a list of template arguments.
29863003    TemplateArgumentListInfo TLI{};
29873004    for  (auto  TA : TemplateArgs)
@@ -3241,15 +3258,15 @@ namespace Cpp {
32413258  }
32423259
32433260  //  FIXME: Add optional arguments to the operator new.
3244-   TCppObject_t Construct ( TCppScope_t scope,
3245-                          void * arena/* =nullptr*/ 
3261+   TCppObject_t ConstructImpl (compat::Interpreter& interp,  TCppScope_t scope,
3262+                               void * arena  /* =nullptr*/ 
32463263    auto * Class = (Decl*) scope;
32473264    //  FIXME: Diagnose.
32483265    if  (!HasDefaultConstructor (Class))
32493266      return  nullptr ;
32503267
32513268    auto * const  Ctor = GetDefaultConstructor (Class);
3252-     if  (JitCall JC = MakeFunctionCallable ( Ctor)) {
3269+     if  (JitCall JC = MakeFunctionCallableImpl (&interp,  Ctor)) {
32533270      if  (arena) {
32543271        JC.Invoke (&arena, {}, (void *)~0 ); //  Tell Invoke to use placement new.
32553272        return  arena;
@@ -3262,15 +3279,24 @@ namespace Cpp {
32623279    return  nullptr ;
32633280  }
32643281
3265-   void  Destruct (TCppObject_t This, TCppScope_t scope, bool  withFree /* =true*/ 
3266-     Decl* Class = (Decl*)scope;
3267-     if  (auto  wrapper = make_dtor_wrapper (getInterp (), Class)) {
3282+   TCppObject_t Construct (TCppScope_t scope, void * arena /* =nullptr*/ 
3283+     return  ConstructImpl (getInterp (), scope, arena);
3284+   }
3285+ 
3286+   void  DestructImpl (compat::Interpreter& interp, TCppObject_t This, Decl* Class,
3287+                     bool  withFree) {
3288+     if  (auto  wrapper = make_dtor_wrapper (interp, Class)) {
32683289      (*wrapper)(This, /* nary=*/ 0 , withFree);
32693290      return ;
32703291    }
32713292    //  FIXME: Diagnose.
32723293  }
32733294
3295+   void  Destruct (TCppObject_t This, TCppScope_t scope, bool  withFree /* =true*/ 
3296+     auto * Class = static_cast <Decl*>(scope);
3297+     DestructImpl (getInterp (), This, Class, withFree);
3298+   }
3299+ 
32743300  class  StreamCaptureInfo  {
32753301    std::unique_ptr<FILE, decltype (std::fclose)*> m_TempFile;
32763302    int  m_FD = -1 ;
0 commit comments