NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
runtime.h
Go to the documentation of this file.
1#pragma once
2#ifndef INCLUDED_RUNTIME_CPP_
3#define INCLUDED_RUNTIME_CPP_
4
5#include <sys/time.h>
6#include <ffi.h>
7#include <dlfcn.h>
8#include <cstring>
9
10#include "nlc-rt.h"
11
12#include "term.h"
13#include "diag.h"
14#include "module.h"
15#include "context.h"
16
17
18using namespace newlang;
19
20ObjPtr CreateTensor(torch::Tensor tensor);
21void ConvertStringToTensor(const std::string &from, torch::Tensor &to, ObjType type);
22
23namespace newlang {
24
25#ifdef __GNUC__
26 extern "C" int nlc_prinft_sub_(char const *format, ...) __attribute__ ((format(printf, 1, 2)));
27#else
28 EXTERN_C int nlc_prinft_sub_(char const *format, ...);
29#endif
30
31 int RunMain(const int arg, const char** argv, const char** penv);
32
33 std::string GetFileExt(const char * str);
34 std::string AddDefaultFileExt(const char * str, const char *ext_default);
35 std::string ReplaceFileExt(const char * str, const char *ext_old, const char *ext_new);
36 std::string ReadFile(const char *fileName);
37
38 std::string GetDoc(std::string name);
39
40 std::string MakeConstructorName(std::string name);
41
42 std::string MakeLocalName(std::string name);
43
44 /*
45 * Последовательность работы к кодом:
46 * 1. Лексер (последовательность токенов) - использовать только для отладки макросов
47 * 2. Парсер - AST раскрытие макросов и чтение файлов модулей (или их загрузка с созданим иерархии имен объектов).
48 *
49 * 3. Выполнение интерпретатора - пошаговое выполнение AST (реальное создание объектов и выполнение операторов)
50 *
51 * 4. Генерация кода - обход AST для генерации промежуточного код на языке LLVM-IR
52 * 5. Оптимиация кода для NewLang (согласно типам данных и взаимодействия в нативными функциями)
53 * 6. Оптимиация кода для LLVM-IR
54 * 7. Сохрнение промежуточного кода в файл модуля.
55 * 8. Компиляция промежуточного кода в машинный код (или выполнение в режиме интерпретатора)
56 *
57 *
58 * В Runtime хранятся глобальные объекты, память под которые выделяется во время компиляции программы
59 * В Context хрантся локальны объекты, память под которые выделяется только во ремя выполнения
60 * Объект Context создается для основонго потока, а так же по одному объекту для каждого потока программы.
61 *
62 *
63 https://ps-group.github.io/compilers/llvm_ir_translator
64 * В интерпретаторе был использован паттерн “Интерпретатор”,
65 * т.е. каждый узел AST имел метод, который принимал контекст выполнения и выполнял рекурсивное
66 * вычисление узла с учётом текущего контекста выполнения:
67 *
68 * // Вычисление выражения возвращает результат в виде CValue
69 * class IExpressionAst
70 * {
71 * public:
72 * virtual ~IExpressionAst() = default;
73 * virtual CValue Evaluate(CInterpreterContext& context) const = 0;
74 * };
75 *
76 * // Выполнение инструкции результата не возвращает
77 * class IStatementAst
78 * {
79 * public:
80 * virtual ~IStatementAst() = default;
81 * virtual void Execute(CInterpreterContext& context) const = 0;
82 * };
83 *
84 * // Вычисление функции требует список аргументов и возвращает результат в виде CValue
85 * class IFunctionAst
86 * {
87 * public:
88 * virtual ~IFunctionAst() = default;
89 * virtual CValue Call(CInterpreterContext& context, std::vector<CValue> const& arguments) const = 0;
90 * virtual unsigned GetNameId() const = 0;
91 * };
92 *
93 * Такой паттерн подходит для интерпретатора, где входные данные поступают вместе с исходным кодом программы
94 * и могут быть сразу использованы для вычисления.
95 *
96 * Процессы внутри компилятора выглядят сложнее:
97 * - сначала должна произойти проверка типов и других семантических правил путём обхода AST
98 * - затем путём ещё одного обхода AST нужно сгенерировать промежуточный код на языке LLVM-IR
99 * - уже после генерации промежуточного кода он может быть превращён в машинный
100 * (это тема следующих статей) и использован для обработки входных данных
101 *
102 * Для множественной обработки AST лучше подходит паттерн “Посетитель”, который позволяет абстрагироваться от узлов AST.
103 * Для реализации паттерна достаточно создать у каждого узла дерева метод, например void Accept(IVisitor&),
104 * который будет вызывать правильную перегрузку метода IVisitor::Visit, соответствующую типу текущего узла,
105 * и рекурсивно вызывать Accept для дочерних узлов:
106 *
107 * Генерация кода выражений
108 *
109 * Для генерации кода выражений мы реализуем интерфейс IExpressionVisitor
110 * class CExpressionCodeGenerator : protected IExpressionVisitor
111 * {
112 * public:
113 * CExpressionCodeGenerator(llvm::IRBuilder<>& builder, CFrontendContext& context);
114 *
115 * // Can throw std::exception.
116 * llvm::Value* Codegen(IExpressionAST& ast);
117 * protected:
118 * void Visit(CBinaryExpressionAST& expr) override;
119 * void Visit(CUnaryExpressionAST& expr) override;
120 * void Visit(CLiteralAST& expr) override;
121 * void Visit(CCallAST& expr) override;
122 * void Visit(CVariableRefAST& expr) override;
123 * private:
124 * // Стек используется для временного хранения
125 * // по мере рекурсивного обхода дерева выражения.
126 * std::vector<llvm::Value*> m_values;
127 * CFrontendContext& m_context;
128 * llvm::IRBuilder<>& m_builder;
129 * };
130 *
131 *
132 */
133
134 struct FileModule {
135 std::string name;
136 std::string include;
137 std::string source;
138 std::string bytecode;
139 };
140
141 /*
142 *
143 *
144 *
145 */
146
147 struct Func {
148 };
149
150 /*
151 *
152 *
153 *
154 */
155
156#ifdef BUILD_DEBUG
157 typedef std::shared_timed_mutex Lock;
158#ifndef DEADLOCK_TIMEOUT
159#define DEADLOCK_TIMEOUT std::chrono::seconds(5)
160#endif
161#else
162 typedef std::shared_mutex Lock;
163#ifdef DEADLOCK_TIMEOUT
164#error The release build does not support DEADLOCK TIMEOUT, as it uses a lock without a time limit, which is faster!
165#endif
166#endif
167
168 typedef std::unique_lock< Lock > WriteLock;
169 typedef std::shared_lock< Lock > ReadLock;
170
171
172#define SCOPE_LOCK_DEADLOCK_MESSAGE(THIS) LOG_RUNTIME("Deadlock timeout!")
173
174#define SCOPE_LOCK_READ_NAME(THIS, VARNAME) ReadLock VARNAME(*THIS, std::defer_lock);\
175 if (!VARNAME.try_lock_for(DEADLOCK_TIMEOUT)) \
176 SCOPE_LOCK_DEADLOCK_MESSAGE(THIS)
177
178#define SCOPE_LOCK_WRITE_NAME(THIS, VARNAME) WriteLock VARNAME(*THIS, std::defer_lock);\
179 if (!VARNAME.try_lock_for(DEADLOCK_TIMEOUT)) \
180 SCOPE_LOCK_DEADLOCK_MESSAGE(THIS)
181
182#define SCOPE_LOCK_READ(THIS) SCOPE_LOCK_READ_NAME(THIS, r_lock)
183#define SCOPE_LOCK_WRITE(THIS) SCOPE_LOCK_WRITE_NAME(THIS, w_lock)
184
185 /*
186 *
187 *
188 */
189 class RunTime : public GlobalObjects, public std::enable_shared_from_this<RunTime>, protected Lock {
190 private:
191
192 // void ReadFunction() {
193 // ReadLock rr_lock(*this, std::defer_lock);
194 // if (!rr_lock.try_lock_for(DEADLOCK_TIMEOUT)) {
195 // LOG_RUNTIME("Deadlock timeout!");
196 // }
197 // //Do reader stuff
198 // SCOPE_LOCK_READ(this);
199 // }
200 //
201 // void WriteFunction() {
202 // WriteLock ww_lock(*this, std::defer_lock);
203 // if (!ww_lock.try_lock_for(DEADLOCK_TIMEOUT)) {
204 // }
205 //
206 // SCOPE_LOCK_WRITE(this);
207 // }
208
209
210
211 public:
212
213 // bool MakeFullNames(TermPtr ast);
214
215
217 bool RegisterSystemFunc(const char *source);
218 // bool RegisterBuildin(BuildinPtr module);
219 // bool RegisterModule(ModulePtr module);
220
221 virtual void Clear();
222
223 // bool RegisterNativeObj(TermPtr term);
224
225 bool RegisterBuildinFunc(std::string proto, void * func);
226 // bool RegisterSystemBuildin(const char *text);
227 // bool RegisterSystemObj(ObjPtr obj);
228 // std::vector<ObjPtr> m_sys_obj;
229
230 static ObjPtr CreateNative(const char *proto, const char *module = nullptr, bool lazzy = false, const char *mangle_name = nullptr);
231 static ObjPtr CreateNative(TermPtr proto, const char *module = nullptr, bool lazzy = false, const char *mangle_name = nullptr);
232 static ObjPtr CreateNative(TermPtr proto, void *addr);
233 ObjPtr CreateFunction(TermPtr proto, TermPtr block);
234 ObjPtr CreateFunction(TermPtr proto, void *addr);
235
236
237 static std::string Escape(const std::string_view str);
238 /*
239 * class A {
240 public:
241 static std::shared_ptr<A> create();
242 private:
243 A() = default;
244 friend struct make_shared_enabler;
245 };
246
247 struct make_shared_enabler : A {
248 template<typename... Args>
249 make_shared_enabler(Args&&... args)
250 : A(std::forward<Args>(args)...) {
251 }
252 };
253
254 static std::shared_ptr<A> A::create() {
255 return std::make_shared<make_shared_enabler>();
256 }
257
258 */
259 RunTime(const StringArray &args = {});
260
261 virtual ~RunTime();
262
263
264
265
266 typedef ffi_status ffi_prep_cif_type(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes);
267 typedef ffi_status ffi_prep_cif_var_type(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes);
268 typedef void ffi_call_type(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
269
270 static std::string ffi_file;
271 static void * m_ffi_handle;
272 static ffi_type * m_ffi_type_void;
273 static ffi_type * m_ffi_type_uint8;
274 static ffi_type * m_ffi_type_sint8;
275 static ffi_type * m_ffi_type_uint16;
276 static ffi_type * m_ffi_type_sint16;
277 static ffi_type * m_ffi_type_uint32;
278 static ffi_type * m_ffi_type_sint32;
279 static ffi_type * m_ffi_type_uint64;
280 static ffi_type * m_ffi_type_sint64;
281 static ffi_type * m_ffi_type_float;
282 static ffi_type * m_ffi_type_double;
283 static ffi_type * m_ffi_type_pointer;
284
288
290 static ffi_type * m_wide_char_type_ffi;
292
293 void InitInternal(const StringArray args);
294 static RuntimePtr Init(StringArray args);
295 static RuntimePtr Init(int argc = 0, const char** argv = nullptr, const char** penv = nullptr);
296 // static RuntimePtr Init(std::vector<const char *> args, bool ignore_error = true);
297
298 static std::string NativeNameMangling(const Term *term, RunTime *rt);
299 static std::string NativeNameMangling(std::string_view name);
300
301 // static void * GetDirectAddressFromLibrary(void *handle, std::string_view name);
302
303
304 // ModulePtr CheckLoadModule(TermPtr &term);
305 bool LoadModuleFromFile(const char *name_str, bool init);
306
309
310 bool UnLoadModule(const char *name_str, bool deinit);
311 ObjPtr ExecModule(const char *module, const char *output, bool cached, Context * ctx);
312
313 // bool CreateModule(const TermPtr &ast, const std::string_view source, const std::string_view module_name, const std::string_view filename, llvm::Module *bc = nullptr);
314
315 static bool ModuleSave(const FileModule &data, const std::string_view filename, const std::string_view module_name = "");
316 static bool ModuleRead(FileModule &data, const std::string_view filename, const std::string_view modulename = "");
317
318
319 // static void * GetNativeAddr(const char * name, void *module = nullptr);
320
321 static std::string GetLastErrorMessage();
322
330 // static ModulePtr CreateNameHierarchy(Term ast, RuntimePtr rt);
331
340 bool RegisterBuildinType(ObjType type, std::vector<std::string> parents);
341
342 static ObjType BaseTypeFromString(RunTime * rt, const std::string_view text, bool *has_error = nullptr);
343 ObjPtr GetTypeFromString(const std::string_view type, bool *has_error = nullptr);
344
345 static bool pred_compare(const std::string &find, const std::string &str) {
346 size_t pos = 0;
347 while (pos < find.size() && pos < str.size()) {
348 if (find[pos] != str[pos]) {
349
350 return false;
351 }
352 pos++;
353 }
354 return find.empty() || (pos && find.size() == pos);
355 }
356
357 std::vector<std::wstring> SelectPredict(std::wstring wstart, size_t overage_count = 0) {
358
359 return SelectPredict(utf8_encode(wstart), overage_count);
360 }
361 std::vector<std::wstring> SelectPredict(std::string start, size_t overage_count = 0);
362
363 // ObjPtr Eval(const TermPtr &term, Runner *runner = nullptr);
364
365 void CreateArgs_(ObjPtr &args, const TermPtr &term, Context *runner = nullptr);
366 ObjPtr CreateDict(const TermPtr &term, Context *runner = nullptr);
367 ObjPtr CreateTensor(const TermPtr &term, Context *runner = nullptr);
368
369
370
371
372 // LLVMBuilderRef m_llvm_builder;
373
374 // ModulePtr m_buildin_obj;
375 // ModulePtr m_main_module;
376
379
380// std::map<std::string, VariablePairPtr> m_buildin_pair;
381
382 std::string m_work_dir;
383 std::string m_exec_dir;
384 std::string m_cache_dir;
385 std::string m_temp_dir;
386 std::string m_user_dir;
387 std::vector<std::string> m_search_dir;
398 // ObjPtr m_cmd_args;
399 // ObjPtr m_main_args;
400 // MacroPtr m_macro;
401 public:
403
405 // RunnerPtr m_main_runner;
406
407 static bool ExpandFileName(std::string &filename);
408
409 int RunMain();
410 bool CompileCppSource(const std::string_view source, std::string &out, std::vector<std::string> opts = {});
411
412
413 TermPtr ParseBuildin(const std::string_view src);
414 // ParserPtr GetParser();
415
416 static void * GetNativeAddress(void * handle, const std::string_view name);
417
418 static StringArray MakeMainArgs(int argc, const char** argv, const char** penv) {
420 for (int i = 0; i < argc; i++) {
421 result.push_back(std::string(argv[i]));
422 }
423 return result;
424 }
425
426 static ObjPtr MakeObjArgs(int argc, const char** argv) {
428 for (int i = 0; i < argc; i++) {
429 result->push_back(Obj::CreateString(argv[i]));
430 }
431 return result;
432 }
433
434 static std::vector<std::string> SplitChar(std::string_view str, const std::string_view delimiter) {
435 std::vector<std::string> result;
436 while (!str.empty()) {
437 size_t pos = str.find_first_of(delimiter.begin());
438 if (pos == 0) {
439 pos = str.find_first_not_of(delimiter.begin());
440 if (pos == std::string::npos) {
441 break;
442 }
443 str.remove_prefix(pos);
444 } else {
445 if (pos == std::string::npos) {
446 result.push_back(std::string(str.begin(), str.end()));
447 break;
448 }
449 result.push_back(std::string(str.begin(), str.begin() + pos));
450 str.remove_prefix(pos);
451 }
452 }
453 return result;
454 }
455
456 static std::vector<std::string> SplitString(const std::string_view str, const std::string_view delim) {
457
458 std::vector<std::string> result;
459 std::string s(str);
460
461 size_t pos;
462 s.erase(0, s.find_first_not_of(delim.begin()));
463 while (!s.empty()) {
464 pos = s.find(delim.begin());
465 if (pos == std::string::npos) {
466 result.push_back(s);
467 break;
468 } else {
469 result.push_back(s.substr(0, pos));
470 s.erase(0, pos);
471 }
472 s.erase(0, s.find_first_not_of(delim.begin()));
473 }
474 return result;
475 }
476
477 protected:
478
480
481 std::vector<std::string> load;
482
483 for (int i = 0; i < args.size(); i++) {
484
485 // m_cmd_args->push_back(Obj::CreateString(args[i]));
486
487 if (args[i].find("--nlc-search=") == 0) {
488 std::string list;
489 list = args[i].substr(strlen("--nlc-search="));
490 m_search_dir = SplitString(list.c_str(), ";");
491 } else if (args[i].find("--nlc-cache-dir=") == 0) {
492 m_cache_dir = args[i].substr(strlen("--nlc-cache-dir="));
493 } else if (args[i].find("--nlc-temp-dir=") == 0) {
494 m_temp_dir = args[i].substr(strlen("--nlc-temp-dir="));
495 } else if (args[i].find("--nlc-user-dir=") == 0) {
496 m_user_dir = args[i].substr(strlen("--nlc-user-dir="));
497 } else if (args[i].compare("--nlc-no-link-rt") == 0) {
498 m_link_rt = false;
499 m_link_jit = false;
500 } else if (args[i].compare("--nlc-no-link-jit") == 0) {
501 m_link_jit = false;
502 } else if (args[i].compare("--nlc-no-runtime") == 0) {
503 m_load_runtime = false;
504 } else if (args[i].compare("--nlc-no-dsl") == 0) {
505 m_load_dsl = false;
506 // } else if (args[i].compare("--nlc-main-arg=") == 0 || strcmp(arg_test, "--nlc-main-args=") == 0) {
507 //
508 // std::string temp(arg_test);
509 // std::string call("(");
510 //
511 // call += temp.substr(temp.find("=") + 1);
512 // call += ",)";
513 // m_main_args = EvalStatic(MakeAst(call, true), false);
514
515 } else if (args[i].compare("--nlc-embed-source") == 0) {
516 LOG_RUNTIME("Flag '--nlc-embed-source' not implemented!");
517 m_embed_source = true;
518 } else if (args[i].compare("--nlc-no-embed-source") == 0) {
519 m_embed_source = false;
520 } else if (args[i].compare("--nlc-no-import-module") == 0) {
521 m_import_module = false;
522 } else if (args[i].compare("--nlc-no-import-native") == 0) {
523 m_import_native = false;
524 } else if (args[i].compare("--nlc-no-eval-enable") == 0) {
525 m_eval_enable = false;
526 } else if (args[i].compare("--nlc-no-assert") == 0) {
527 m_assert_enable = false;
528 } else if (args[i].find("--nlc-error-limit=") == 0) {
529 std::string value(args[i]);
530 m_diag->m_error_limit = parseInteger(value.substr(strlen("--nlc-error-limit=")).c_str());
531 // } else if (args[i].compare("--nlc-load=") == arg_test) {
532 // load.push_back(std::string(arg_test).substr(strlen("--nlc-load=")));
533 } else {
534 LOG_RUNTIME("System argument '%s' not recognized!", args[i].c_str());
535 }
536 }
537
538
539 // llvm::SmallString<1024> path;
540 // auto error = llvm::sys::fs::current_path(path);
541 // if (error) {
542 // LOG_RUNTIME("%s", error.message().c_str());
543 // }
544 // m_work_dir = path.c_str();
545 // // LOG_DEBUG("work_dir: %s", m_work_dir.c_str());
546 //
547 // path = llvm::sys::fs::getMainExecutable(nullptr, nullptr);
548 // // LOG_DEBUG("%s", path.c_str());
549 //
550 // llvm::sys::path::remove_filename(path);
551 // m_exec_dir = path.c_str();
552 // // LOG_DEBUG("exec_dir: %s", m_exec_dir.c_str());
553
554 m_search_dir.push_back(m_work_dir);
555 m_search_dir.push_back(m_exec_dir);
556
557 for (auto &elem : load) {
558
559 }
560
561 return true;
562 }
563
564 //SCOPE(private) :
565 public:
566 RunTime(const RunTime&) = delete;
567 const RunTime& operator=(const RunTime&) = delete;
568
569 };
570
571 /*
572 *
573 *
574 *
575 */
576 ObjType typeFromString(TermPtr &term, RunTime *rt, bool *has_error);
577}
578
579
580#endif //INCLUDED_RUNTIME_CPP_
static ObjPtr CreateString(const std::string_view str, Sync *sync=nullptr)
Definition object.h:1596
static ObjPtr CreateDict(Sync *sync=nullptr)
Definition object.h:1625
static ffi_type * m_ffi_type_uint64
Definition runtime.h:279
bool m_embed_source
Definition runtime.h:390
std::string m_cache_dir
Definition runtime.h:384
static StringArray MakeMainArgs(int argc, const char **argv, const char **penv)
Definition runtime.h:418
TermPtr m_main
Definition runtime.h:377
static ffi_type * m_ffi_type_float
Definition runtime.h:281
std::string m_user_dir
Definition runtime.h:386
static ffi_prep_cif_type * m_ffi_prep_cif
Definition runtime.h:285
ObjPtr GetTypeFromString(const std::string_view type, bool *has_error=nullptr)
Definition runtime.cpp:1494
const RunTime & operator=(const RunTime &)=delete
static ffi_prep_cif_var_type * m_ffi_prep_cif_var
Definition runtime.h:286
DiagPtr m_diag
Definition runtime.h:402
bool RegisterBuildinType(ObjType type, std::vector< std::string > parents)
Definition runtime.cpp:1438
static std::string Escape(const std::string_view str)
Definition runtime.cpp:2186
static ObjType BaseTypeFromString(RunTime *rt, const std::string_view text, bool *has_error=nullptr)
Definition runtime.cpp:1525
static ffi_type * m_ffi_type_uint32
Definition runtime.h:277
static ffi_type * m_wide_char_type_ffi
Definition runtime.h:290
ObjPtr CreateDict(const TermPtr &term, Context *runner=nullptr)
static std::vector< std::string > SplitString(const std::string_view str, const std::string_view delim)
Definition runtime.h:456
bool CompileCppSource(const std::string_view source, std::string &out, std::vector< std::string > opts={})
static std::string GetLastErrorMessage()
Definition runtime.cpp:2269
static ffi_call_type * m_ffi_call
Definition runtime.h:287
std::string m_exec_dir
Definition runtime.h:383
void GlobalNameBuildinRegister()
Definition runtime.cpp:1336
static ffi_type * m_ffi_type_sint64
Definition runtime.h:280
static ffi_type * m_ffi_type_pointer
Definition runtime.h:283
bool m_import_native
Definition runtime.h:392
static ffi_type * m_ffi_type_sint8
Definition runtime.h:274
ObjPtr ExecModule(const char *module, const char *output, bool cached, Context *ctx)
Definition runtime.cpp:1190
static ffi_type * m_ffi_type_uint16
Definition runtime.h:275
static ObjType m_integer_type
Definition runtime.h:291
bool ParseArgs(StringArray args)
Definition runtime.h:479
void ffi_call_type(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
Definition runtime.h:268
static ffi_type * m_ffi_type_void
Definition runtime.h:272
static void * GetNativeAddress(void *handle, const std::string_view name)
Definition jit.cpp:2796
ObjPtr CreateFunction(TermPtr proto, TermPtr block)
Definition runtime.cpp:1740
static bool pred_compare(const std::string &find, const std::string &str)
Definition runtime.h:345
static ObjType m_wide_char_type
Definition runtime.h:289
bool RegisterSystemFunc(const char *source)
Definition runtime.cpp:1412
static ffi_type * m_ffi_type_uint8
Definition runtime.h:273
virtual ~RunTime()
Definition runtime.cpp:2285
TermPtr ParseBuildin(const std::string_view src)
Definition runtime.cpp:1303
bool LoadModuleFromFile(const char *name_str, bool init)
Definition runtime.cpp:999
TermPtr m_main_ast
Definition runtime.h:404
static void * m_ffi_handle
Definition runtime.h:271
ffi_status ffi_prep_cif_var_type(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes)
Definition runtime.h:267
static bool ModuleRead(FileModule &data, const std::string_view filename, const std::string_view modulename="")
Definition runtime.cpp:2090
void CreateArgs_(ObjPtr &args, const TermPtr &term, Context *runner=nullptr)
bool m_import_module
Definition runtime.h:391
ObjPtr OpLoadModule(TermPtr term)
Definition runtime.cpp:1965
static ObjPtr MakeObjArgs(int argc, const char **argv)
Definition runtime.h:426
static ffi_type * m_ffi_type_double
Definition runtime.h:282
bool m_assert_enable
Definition runtime.h:388
ObjPtr CreateTensor(const TermPtr &term, Context *runner=nullptr)
bool m_load_runtime
Definition runtime.h:394
StringArray m_module_loader
Definition runtime.h:378
static std::string NativeNameMangling(const Term *term, RunTime *rt)
std::string m_temp_dir
Definition runtime.h:385
static RuntimePtr Init(StringArray args)
Definition runtime.cpp:1222
static ObjPtr CreateNative(const char *proto, const char *module=nullptr, bool lazzy=false, const char *mangle_name=nullptr)
Definition runtime.cpp:1755
static std::string ffi_file
Definition runtime.h:270
RunTime(const StringArray &args={})
Definition runtime.cpp:2293
RunTime(const RunTime &)=delete
std::string m_work_dir
Definition runtime.h:382
static bool ExpandFileName(std::string &filename)
Definition runtime.cpp:1318
static std::vector< std::string > SplitChar(std::string_view str, const std::string_view delimiter)
Definition runtime.h:434
void InitInternal(const StringArray args)
Definition runtime.cpp:1226
virtual void Clear()
Definition runtime.cpp:74
ObjPtr ObjFromModule(ModulePtr module, TermPtr term)
static bool ModuleSave(const FileModule &data, const std::string_view filename, const std::string_view module_name="")
Definition runtime.cpp:2032
ffi_status ffi_prep_cif_type(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes)
Definition runtime.h:266
static ffi_type * m_ffi_type_sint32
Definition runtime.h:278
static ffi_type * m_ffi_type_sint16
Definition runtime.h:276
bool RegisterBuildinFunc(std::string proto, void *func)
Definition runtime.cpp:1295
bool UnLoadModule(const char *name_str, bool deinit)
Definition runtime.cpp:1121
std::vector< std::string > m_search_dir
Definition runtime.h:387
std::vector< std::wstring > SelectPredict(std::wstring wstart, size_t overage_count=0)
Definition runtime.h:357
int result
Definition lexer.l:367
__attribute__((weak)) std
Definition logger.cpp:264
#define LOG_RUNTIME(format,...)
Definition logger.h:26
Definition nlc.h:59
std::shared_ptr< Module > ModulePtr
Definition types.h:167
std::string GetDoc(std::string name)
Definition runtime.cpp:2251
std::unique_lock< Lock > WriteLock
Definition runtime.h:168
std::shared_lock< Lock > ReadLock
Definition runtime.h:169
std::shared_ptr< Term > TermPtr
Definition variable.h:33
int64_t parseInteger(const char *str)
Definition types.h:998
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
std::shared_ptr< RunTime > RuntimePtr
Definition types.h:242
std::vector< std::string > StringArray
Definition types.h:148
EXTERN_C int nlc_prinft_sub_(char const *format,...)
std::shared_timed_mutex Lock
Definition runtime.h:157
std::string MakeLocalName(std::string name)
std::string ReadFile(const char *fileName)
Definition runtime.cpp:1952
ObjType typeFromString(TermPtr &term, RunTime *rt, bool *has_error)
Definition runtime.cpp:2243
std::shared_ptr< Diag > DiagPtr
Definition types.h:243
std::string ReplaceFileExt(const char *str, const char *ext_old, const char *ext_new)
Definition runtime.cpp:1937
ObjType
Definition types.h:524
int RunMain(const int arg, const char **argv, const char **penv)
Definition runtime.cpp:69
std::string GetFileExt(const char *str)
Definition runtime.cpp:1917
std::string utf8_encode(const std::wstring wstr)
Definition variable.cpp:10
std::string MakeConstructorName(std::string name)
Definition runtime.cpp:2256
std::string AddDefaultFileExt(const char *str, const char *ext_default)
Definition runtime.cpp:1927
ObjPtr CreateTensor(torch::Tensor tensor)
Definition object.cpp:52
void ConvertStringToTensor(const std::string &from, torch::Tensor &to, ObjType type)
Definition object.cpp:2151
std::string include
Definition runtime.h:136
std::string bytecode
Definition runtime.h:138
std::string name
Definition runtime.h:135
std::string source
Definition runtime.h:137