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()
|
||||
|
||||
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_DEBUG "-g -fno-limit-debug-info")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||
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")
|
||||
include_directories(.)
|
||||
|
||||
|
|
|
@ -84,10 +84,11 @@ std::unique_ptr<codon::Compiler> processSource(const std::vector<const char *> &
|
|||
bool standalone) {
|
||||
llvm::cl::opt<std::string> input(llvm::cl::Positional, llvm::cl::desc("<input file>"),
|
||||
llvm::cl::init("-"));
|
||||
auto regs = llvm::cl::getRegisteredOptions();
|
||||
llvm::cl::opt<OptMode> optMode(
|
||||
llvm::cl::desc("optimization mode"),
|
||||
llvm::cl::values(
|
||||
clEnumValN(Debug, "debug",
|
||||
clEnumValN(Debug, regs.find("debug") != regs.end() ? "default" : "debug",
|
||||
"Turn off compiler optimizations and show backtraces"),
|
||||
clEnumValN(Release, "release",
|
||||
"Turn on compiler optimizations and disable debug info")),
|
||||
|
|
|
@ -500,9 +500,9 @@ void SimplifyVisitor::visit(CallExpr *expr) {
|
|||
ctx->add(SimplifyItem::Var, varName, varName);
|
||||
var = N<IdExpr>(varName);
|
||||
ctx->addBlock(); // prevent tmp vars from being toplevel vars
|
||||
ex = N<StmtExpr>(
|
||||
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true)),
|
||||
transform(ex));
|
||||
auto head =
|
||||
transform(N<AssignStmt>(clone(g->loops[0].vars), clone(var), nullptr, true));
|
||||
ex = N<StmtExpr>(head, transform(ex));
|
||||
ctx->popBlock();
|
||||
}
|
||||
std::vector<GeneratorBody> body;
|
||||
|
|
|
@ -180,7 +180,9 @@ void SimplifyVisitor::visit(WhileStmt *stmt) {
|
|||
transform(N<AssignStmt>(N<IdExpr>(breakVar), N<BoolExpr>(true), nullptr, true));
|
||||
}
|
||||
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();
|
||||
if (stmt->elseSuite && stmt->elseSuite->firstInBlock()) {
|
||||
resultStmt =
|
||||
|
@ -232,7 +234,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
|
|||
ctx->addBlock();
|
||||
if (auto i = stmt->var->getId()) {
|
||||
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);
|
||||
} else {
|
||||
std::string varName = ctx->cache->getTemporaryVar("for");
|
||||
|
@ -259,8 +262,8 @@ void SimplifyVisitor::visit(ForStmt *stmt) {
|
|||
|
||||
void SimplifyVisitor::visit(IfStmt *stmt) {
|
||||
seqassert(stmt->cond, "invalid if statement");
|
||||
resultStmt = N<IfStmt>(transform(stmt->cond), transform(stmt->ifSuite),
|
||||
transform(stmt->elseSuite));
|
||||
auto cond = transform(stmt->cond);
|
||||
resultStmt = N<IfStmt>(cond, transform(stmt->ifSuite), transform(stmt->elseSuite));
|
||||
}
|
||||
|
||||
void SimplifyVisitor::visit(MatchStmt *stmt) {
|
||||
|
|
|
@ -91,8 +91,10 @@ void TranslateVisitor::visit(IdExpr *expr) {
|
|||
}
|
||||
|
||||
void TranslateVisitor::visit(IfExpr *expr) {
|
||||
result = make<ir::TernaryInstr>(expr, transform(expr->cond), transform(expr->ifexpr),
|
||||
transform(expr->elsexpr));
|
||||
auto cond = transform(expr->cond);
|
||||
auto ifexpr = transform(expr->ifexpr);
|
||||
auto elsexpr = transform(expr->elsexpr);
|
||||
result = make<ir::TernaryInstr>(expr, cond, ifexpr, elsexpr);
|
||||
}
|
||||
|
||||
void TranslateVisitor::visit(CallExpr *expr) {
|
||||
|
|
|
@ -21,14 +21,14 @@ std::shared_ptr<TranslateItem> TranslateContext::find(const std::string &name) c
|
|||
return t;
|
||||
std::shared_ptr<TranslateItem> ret = nullptr;
|
||||
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]);
|
||||
seqassert(in(cache->classes, tt->type->getClass()->name) &&
|
||||
in(cache->classes[tt->type->getClass()->name].realizations, name),
|
||||
"cannot find type realization {}", name);
|
||||
ret->handle.type =
|
||||
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]);
|
||||
seqassert(
|
||||
in(cache->functions, tt->type->getFunc()->ast->name) &&
|
||||
|
|
|
@ -381,6 +381,8 @@ print log(5.5) #: 1.70475
|
|||
#%% import_c_dylib,barebones
|
||||
from internal.dlopen import dlext
|
||||
RT = "./libcodonrt." + dlext()
|
||||
if RT[-3:] == ".so":
|
||||
RT = "build/" + RT[2:]
|
||||
from C import RT.seq_str_int(int) -> str as sp
|
||||
print sp(65) #: 65
|
||||
|
||||
|
|
Loading…
Reference in New Issue