mirror of https://github.com/exaloop/codon.git
Merge branch 'auto-class-deduction' of github.com:exaloop/codon into auto-class-deduction
commit
6f402ff810
|
@ -16,8 +16,16 @@ if(CODON_JUPYTER)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -pedantic -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-limit-debug-info")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -fvisibility-inlines-hidden -Wno-return-type-c-linkage -Wno-gnu-zero-variadic-macro-arguments")
|
||||||
|
else()
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
|
||||||
|
endif()
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "-g")
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-limit-debug-info")
|
||||||
|
endif()
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
||||||
include_directories(.)
|
include_directories(.)
|
||||||
|
|
||||||
|
|
|
@ -84,10 +84,11 @@ std::unique_ptr<codon::Compiler> processSource(const std::vector<const char *> &
|
||||||
bool standalone) {
|
bool standalone) {
|
||||||
llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"),
|
llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"),
|
||||||
llvm::cl::init("-"));
|
llvm::cl::init("-"));
|
||||||
|
auto regs = llvm::cl::getRegisteredOptions();
|
||||||
llvm::cl::opt<OptMode> optMode(
|
llvm::cl::opt<OptMode> optMode(
|
||||||
llvm::cl::desc("optimization mode"),
|
llvm::cl::desc("optimization mode"),
|
||||||
llvm::cl::values(
|
llvm::cl::values(
|
||||||
clEnumValN(Debug, "debug",
|
clEnumValN(Debug, regs.find("debug") != regs.end() ? "default" : "debug",
|
||||||
"Turn off compiler optimizations and show backtraces"),
|
"Turn off compiler optimizations and show backtraces"),
|
||||||
clEnumValN(Release, "release",
|
clEnumValN(Release, "release",
|
||||||
"Turn on compiler optimizations and disable debug info")),
|
"Turn on compiler optimizations and disable debug info")),
|
||||||
|
|
|
@ -500,9 +500,9 @@ void SimplifyVisitor::visit(CallExpr *expr) {
|
||||||
ctx->add(SimplifyItem::Var, varName, varName);
|
ctx->add(SimplifyItem::Var, varName, varName);
|
||||||
var = N<IdExpr>(varName);
|
var = N<IdExpr>(varName);
|
||||||
ctx->addBlock(); // prevent tmp vars from being toplevel vars
|
ctx->addBlock(); // prevent tmp vars from being toplevel vars
|
||||||
ex = N<StmtExpr>(
|
auto head =
|
||||||
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true)),
|
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true));
|
||||||
transform(ex));
|
ex = N<StmtExpr>(head, transform(ex));
|
||||||
ctx->popBlock();
|
ctx->popBlock();
|
||||||
}
|
}
|
||||||
std::vector<GeneratorBody> body;
|
std::vector<GeneratorBody> body;
|
||||||
|
|
|
@ -180,7 +180,9 @@ void SimplifyVisitor::visit(WhileStmt *stmt) {
|
||||||
transform(N<AssignStmt>(N<IdExpr>(breakVar), N<BoolExpr>(true), nullptr, true));
|
transform(N<AssignStmt>(N<IdExpr>(breakVar), N<BoolExpr>(true), nullptr, true));
|
||||||
}
|
}
|
||||||
ctx->loops.push_back(breakVar); // needed for transforming break in loop..else blocks
|
ctx->loops.push_back(breakVar); // needed for transforming break in loop..else blocks
|
||||||
StmtPtr whileStmt = N<WhileStmt>(transform(cond), transform(stmt->suite));
|
|
||||||
|
cond = transform(cond);
|
||||||
|
StmtPtr whileStmt = N<WhileStmt>(cond, transform(stmt->suite));
|
||||||
ctx->loops.pop_back();
|
ctx->loops.pop_back();
|
||||||
if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) {
|
if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) {
|
||||||
resultStmt =
|
resultStmt =
|
||||||
|
@ -232,7 +234,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
|
||||||
ctx->addBlock();
|
ctx->addBlock();
|
||||||
if (auto i = stmt->var->getId()) {
|
if (auto i = stmt->var->getId()) {
|
||||||
ctx->add(SimplifyItem::Var, i->value, ctx->generateCanonicalName(i->value));
|
ctx->add(SimplifyItem::Var, i->value, ctx->generateCanonicalName(i->value));
|
||||||
forStmt = N<ForStmt>(transform(stmt->var), clone(iter), transform(stmt->suite),
|
auto var = transform(stmt->var);
|
||||||
|
forStmt = N<ForStmt>(var, clone(iter), transform(stmt->suite),
|
||||||
nullptr, decorator, ompArgs);
|
nullptr, decorator, ompArgs);
|
||||||
} else {
|
} else {
|
||||||
std::string varName = ctx->cache->getTemporaryVar("for");
|
std::string varName = ctx->cache->getTemporaryVar("for");
|
||||||
|
@ -259,8 +262,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
|
||||||
|
|
||||||
void SimplifyVisitor::visit(IfStmt *stmt) {
|
void SimplifyVisitor::visit(IfStmt *stmt) {
|
||||||
seqassert(stmt->cond, "invalid if statement");
|
seqassert(stmt->cond, "invalid if statement");
|
||||||
resultStmt = N<IfStmt>(transform(stmt->cond), transform(stmt->ifSuite),
|
auto cond = transform(stmt->cond);
|
||||||
transform(stmt->elseSuite));
|
resultStmt = N<IfStmt>(cond, transform(stmt->ifSuite), transform(stmt->elseSuite));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimplifyVisitor::visit(MatchStmt *stmt) {
|
void SimplifyVisitor::visit(MatchStmt *stmt) {
|
||||||
|
|
|
@ -91,8 +91,10 @@ void TranslateVisitor::visit(IdExpr *expr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateVisitor::visit(IfExpr *expr) {
|
void TranslateVisitor::visit(IfExpr *expr) {
|
||||||
result = make<ir::TernaryInstr>(expr, transform(expr->cond), transform(expr->ifexpr),
|
auto cond = transform(expr->cond);
|
||||||
transform(expr->elsexpr));
|
auto ifexpr = transform(expr->ifexpr);
|
||||||
|
auto elsexpr = transform(expr->elsexpr);
|
||||||
|
result = make<ir::TernaryInstr>(expr, cond, ifexpr, elsexpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslateVisitor::visit(CallExpr *expr) {
|
void TranslateVisitor::visit(CallExpr *expr) {
|
||||||
|
|
|
@ -21,14 +21,14 @@ std::shared_ptr<TranslateItem> TranslateContext::find(const std::string &name) c
|
||||||
return t;
|
return t;
|
||||||
std::shared_ptr<TranslateItem> ret = nullptr;
|
std::shared_ptr<TranslateItem> ret = nullptr;
|
||||||
auto tt = cache->typeCtx->find(name);
|
auto tt = cache->typeCtx->find(name);
|
||||||
if (tt->isType() && tt->type->canRealize()) {
|
if (tt && tt->isType() && tt->type->canRealize()) {
|
||||||
ret = std::make_shared<TranslateItem>(TranslateItem::Type, bases[0]);
|
ret = std::make_shared<TranslateItem>(TranslateItem::Type, bases[0]);
|
||||||
seqassert(in(cache->classes, tt->type->getClass()->name) &&
|
seqassert(in(cache->classes, tt->type->getClass()->name) &&
|
||||||
in(cache->classes[tt->type->getClass()->name].realizations, name),
|
in(cache->classes[tt->type->getClass()->name].realizations, name),
|
||||||
"cannot find type realization {}", name);
|
"cannot find type realization {}", name);
|
||||||
ret->handle.type =
|
ret->handle.type =
|
||||||
cache->classes[tt->type->getClass()->name].realizations[name]->ir;
|
cache->classes[tt->type->getClass()->name].realizations[name]->ir;
|
||||||
} else if (tt->type->getFunc() && tt->type->canRealize()) {
|
} else if (tt && tt->type->getFunc() && tt->type->canRealize()) {
|
||||||
ret = std::make_shared<TranslateItem>(TranslateItem::Func, bases[0]);
|
ret = std::make_shared<TranslateItem>(TranslateItem::Func, bases[0]);
|
||||||
seqassert(
|
seqassert(
|
||||||
in(cache->functions, tt->type->getFunc()->ast->name) &&
|
in(cache->functions, tt->type->getFunc()->ast->name) &&
|
||||||
|
|
|
@ -381,6 +381,8 @@ print log(5.5) #: 1.70475
|
||||||
#%% import_c_dylib,barebones
|
#%% import_c_dylib,barebones
|
||||||
from internal.dlopen import dlext
|
from internal.dlopen import dlext
|
||||||
RT = "./libcodonrt." + dlext()
|
RT = "./libcodonrt." + dlext()
|
||||||
|
if RT[-3:] == ".so":
|
||||||
|
RT = "build/" + RT[2:]
|
||||||
from C import RT.seq_str_int(int) -> str as sp
|
from C import RT.seq_str_int(int) -> str as sp
|
||||||
print sp(65) #: 65
|
print sp(65) #: 65
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue