Browse Source

Added support for keeping ABI-specific function 'this' return information.

pull/355/head
triton 11 years ago
parent
commit
169a3fa610
  1. 2
      src/AST/Function.cs
  2. 1
      src/Core/Parser/ASTConverter.cs
  3. 1
      src/CppParser/AST.h
  4. 10
      src/CppParser/Bindings/CLI/AST.cpp
  5. 6
      src/CppParser/Bindings/CLI/AST.h
  6. 33
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs
  7. 33
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs
  8. 33
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs
  9. 12
      src/CppParser/Parser.cpp

2
src/AST/Function.cs

@ -115,6 +115,7 @@ namespace CppSharp.AST
Parameters = new List<Parameter>(); Parameters = new List<Parameter>();
ReturnType = function.ReturnType; ReturnType = function.ReturnType;
IsReturnIndirect = function.IsReturnIndirect; IsReturnIndirect = function.IsReturnIndirect;
HasThisReturn = function.HasThisReturn;
Parameters.AddRange(function.Parameters.Select(p => new Parameter(p))); Parameters.AddRange(function.Parameters.Select(p => new Parameter(p)));
IsVariadic = function.IsVariadic; IsVariadic = function.IsVariadic;
IsInline = function.IsInline; IsInline = function.IsInline;
@ -134,6 +135,7 @@ namespace CppSharp.AST
public QualifiedType ReturnType { get; set; } public QualifiedType ReturnType { get; set; }
public bool IsReturnIndirect { get; set; } public bool IsReturnIndirect { get; set; }
public bool HasThisReturn { get; set; }
public List<Parameter> Parameters { get; set; } public List<Parameter> Parameters { get; set; }
public bool IsVariadic { get; set; } public bool IsVariadic { get; set; }

1
src/Core/Parser/ASTConverter.cs

@ -874,6 +874,7 @@ namespace CppSharp
_function.ReturnType = typeConverter.VisitQualified(function.ReturnType); _function.ReturnType = typeConverter.VisitQualified(function.ReturnType);
_function.IsReturnIndirect = function.IsReturnIndirect; _function.IsReturnIndirect = function.IsReturnIndirect;
_function.HasThisReturn = function.HasThisReturn;
_function.IsVariadic = function.IsVariadic; _function.IsVariadic = function.IsVariadic;
_function.IsInline = function.IsInline; _function.IsInline = function.IsInline;
_function.IsPure = function.IsPure; _function.IsPure = function.IsPure;

1
src/CppParser/AST.h

@ -558,6 +558,7 @@ public:
QualifiedType ReturnType; QualifiedType ReturnType;
bool IsReturnIndirect; bool IsReturnIndirect;
bool HasThisReturn;
bool IsVariadic; bool IsVariadic;
bool IsInline; bool IsInline;

10
src/CppParser/Bindings/CLI/AST.cpp

@ -1747,6 +1747,16 @@ void CppSharp::Parser::AST::Function::IsReturnIndirect::set(bool value)
((::CppSharp::CppParser::AST::Function*)NativePtr)->IsReturnIndirect = value; ((::CppSharp::CppParser::AST::Function*)NativePtr)->IsReturnIndirect = value;
} }
bool CppSharp::Parser::AST::Function::HasThisReturn::get()
{
return ((::CppSharp::CppParser::AST::Function*)NativePtr)->HasThisReturn;
}
void CppSharp::Parser::AST::Function::HasThisReturn::set(bool value)
{
((::CppSharp::CppParser::AST::Function*)NativePtr)->HasThisReturn = value;
}
bool CppSharp::Parser::AST::Function::IsVariadic::get() bool CppSharp::Parser::AST::Function::IsVariadic::get()
{ {
return ((::CppSharp::CppParser::AST::Function*)NativePtr)->IsVariadic; return ((::CppSharp::CppParser::AST::Function*)NativePtr)->IsVariadic;

6
src/CppParser/Bindings/CLI/AST.h

@ -1287,6 +1287,12 @@ namespace CppSharp
void set(bool); void set(bool);
} }
property bool HasThisReturn
{
bool get();
void set(bool);
}
property bool IsVariadic property bool IsVariadic
{ {
bool get(); bool get();

33
src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs

@ -4309,15 +4309,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(93)] [FieldOffset(93)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(94)] [FieldOffset(94)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(95)] [FieldOffset(95)]
public bool IsPure; public bool IsInline;
[FieldOffset(96)] [FieldOffset(96)]
public bool IsPure;
[FieldOffset(97)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(100)] [FieldOffset(100)]
@ -4518,6 +4521,21 @@ namespace CppSharp
} }
} }
public bool HasThisReturn
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->HasThisReturn;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->HasThisReturn = value;
}
}
public bool IsVariadic public bool IsVariadic
{ {
get get
@ -4666,15 +4684,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(93)] [FieldOffset(93)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(94)] [FieldOffset(94)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(95)] [FieldOffset(95)]
public bool IsPure; public bool IsInline;
[FieldOffset(96)] [FieldOffset(96)]
public bool IsPure;
[FieldOffset(97)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(100)] [FieldOffset(100)]

33
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs

@ -4309,15 +4309,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(129)] [FieldOffset(129)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(130)] [FieldOffset(130)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(131)] [FieldOffset(131)]
public bool IsPure; public bool IsInline;
[FieldOffset(132)] [FieldOffset(132)]
public bool IsPure;
[FieldOffset(133)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(136)] [FieldOffset(136)]
@ -4518,6 +4521,21 @@ namespace CppSharp
} }
} }
public bool HasThisReturn
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->HasThisReturn;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->HasThisReturn = value;
}
}
public bool IsVariadic public bool IsVariadic
{ {
get get
@ -4666,15 +4684,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(129)] [FieldOffset(129)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(130)] [FieldOffset(130)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(131)] [FieldOffset(131)]
public bool IsPure; public bool IsInline;
[FieldOffset(132)] [FieldOffset(132)]
public bool IsPure;
[FieldOffset(133)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(136)] [FieldOffset(136)]

33
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs

@ -4308,15 +4308,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(129)] [FieldOffset(129)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(130)] [FieldOffset(130)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(131)] [FieldOffset(131)]
public bool IsPure; public bool IsInline;
[FieldOffset(132)] [FieldOffset(132)]
public bool IsPure;
[FieldOffset(133)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(136)] [FieldOffset(136)]
@ -4517,6 +4520,21 @@ namespace CppSharp
} }
} }
public bool HasThisReturn
{
get
{
var __ptr = (Internal*)__Instance.ToPointer();
return __ptr->HasThisReturn;
}
set
{
var __ptr = (Internal*)__Instance.ToPointer();
__ptr->HasThisReturn = value;
}
}
public bool IsVariadic public bool IsVariadic
{ {
get get
@ -4665,15 +4683,18 @@ namespace CppSharp
public bool IsReturnIndirect; public bool IsReturnIndirect;
[FieldOffset(129)] [FieldOffset(129)]
public bool IsVariadic; public bool HasThisReturn;
[FieldOffset(130)] [FieldOffset(130)]
public bool IsInline; public bool IsVariadic;
[FieldOffset(131)] [FieldOffset(131)]
public bool IsPure; public bool IsInline;
[FieldOffset(132)] [FieldOffset(132)]
public bool IsPure;
[FieldOffset(133)]
public bool IsDeleted; public bool IsDeleted;
[FieldOffset(136)] [FieldOffset(136)]

12
src/CppParser/Parser.cpp

@ -41,6 +41,7 @@
#include <CodeGen/CodeGenTypes.h> #include <CodeGen/CodeGenTypes.h>
#include <CodeGen/TargetInfo.h> #include <CodeGen/TargetInfo.h>
#include <CodeGen/CGCall.h> #include <CodeGen/CGCall.h>
#include <CodeGen/CGCXXABI.h>
using namespace CppSharp::CppParser; using namespace CppSharp::CppParser;
@ -2216,6 +2217,17 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F,
ParamStartLoc = VD->getLocEnd(); ParamStartLoc = VD->getLocEnd();
} }
auto& CXXABI = CodeGenTypes->getCXXABI();
bool HasThisReturn = false;
if (auto CD = dyn_cast<CXXConstructorDecl>(FD))
HasThisReturn = CXXABI.HasThisReturn(GlobalDecl(CD, Ctor_Complete));
else if (auto DD = dyn_cast<CXXDestructorDecl>(FD))
HasThisReturn = CXXABI.HasThisReturn(GlobalDecl(DD, Dtor_Complete));
else
HasThisReturn = CXXABI.HasThisReturn(FD);
F->HasThisReturn = HasThisReturn;
bool IsMicrosoftABI = C->getASTContext().getTargetInfo().getCXXABI().isMicrosoft(); bool IsMicrosoftABI = C->getASTContext().getTargetInfo().getCXXABI().isMicrosoft();
bool CheckCodeGenInfo = !FD->isDependentContext() && !FD->isInvalidDecl(); bool CheckCodeGenInfo = !FD->isDependentContext() && !FD->isInvalidDecl();
CheckCodeGenInfo &= CanCheckCodeGenInfo(C->getSema(), FD->getReturnType().getTypePtr(), CheckCodeGenInfo &= CanCheckCodeGenInfo(C->getSema(), FD->getReturnType().getTypePtr(),

Loading…
Cancel
Save