✨ add windows code page manager
This commit is contained in:
parent
4ac4675491
commit
f6d4d79c51
|
@ -1,10 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ast_visitor.h"
|
#include "ast_visitor.h"
|
||||||
|
#include "util/util.h"
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
@ -93,19 +90,10 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void dump(code_block* root) {
|
void dump(code_block* root) {
|
||||||
#ifdef _WIN32
|
util::windows_code_page_manager wcpm;
|
||||||
// store previous code page
|
wcpm.set_utf8_output();
|
||||||
auto cp = GetConsoleOutputCP();
|
|
||||||
// allow 65001 code page
|
|
||||||
SetConsoleOutputCP(CP_UTF8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
root->accept(this);
|
root->accept(this);
|
||||||
|
wcpm.restore_code_page();
|
||||||
#ifdef _WIN32
|
|
||||||
// restore previous code page
|
|
||||||
SetConsoleOutputCP(cp);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -301,17 +301,17 @@ void gc::info() const {
|
||||||
for(usize i = 0; i<indent; ++i) {
|
for(usize i = 0; i<indent; ++i) {
|
||||||
indent_string += "-";
|
indent_string += "-";
|
||||||
}
|
}
|
||||||
auto last_line = indent_string + "+" +
|
const auto last_line = "+" + indent_string + "+" +
|
||||||
indent_string + "-" + indent_string + "-" + indent_string;
|
indent_string + "-" + indent_string + "-" + indent_string + "+";
|
||||||
indent_string = indent_string + "+" +
|
indent_string = indent_string + "+" +
|
||||||
indent_string + "+" + indent_string + "+" + indent_string;
|
indent_string + "+" + indent_string + "+" + indent_string;
|
||||||
|
|
||||||
std::clog << "\n" << indent_string << "\n";
|
std::clog << "\n+" << indent_string << "+\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "object type";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "object type";
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << "gc count";
|
std::clog << " | " << left << setw(indent) << setfill(' ') << "gc count";
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << "alloc count";
|
std::clog << " | " << left << setw(indent) << setfill(' ') << "alloc count";
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << "memory size";
|
std::clog << " | " << left << setw(indent) << setfill(' ') << "memory size";
|
||||||
std::clog << "\n" << indent_string << "\n";
|
std::clog << " |\n+" << indent_string << "+\n";
|
||||||
|
|
||||||
double total = 0;
|
double total = 0;
|
||||||
for(u8 i = 0; i<gc_type_size; ++i) {
|
for(u8 i = 0; i<gc_type_size; ++i) {
|
||||||
|
@ -319,32 +319,32 @@ void gc::info() const {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
total += static_cast<f64>(gcnt[i]);
|
total += static_cast<f64>(gcnt[i]);
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << name[i];
|
std::clog << "| " << left << setw(indent) << setfill(' ') << name[i];
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << gcnt[i];
|
std::clog << " | " << left << setw(indent) << setfill(' ') << gcnt[i];
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << acnt[i];
|
std::clog << " | " << left << setw(indent) << setfill(' ') << acnt[i];
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << size[i];
|
std::clog << " | " << left << setw(indent) << setfill(' ') << size[i];
|
||||||
std::clog << "\n";
|
std::clog << " |\n";
|
||||||
}
|
}
|
||||||
std::clog << indent_string << "\n";
|
std::clog << "+" << indent_string << "+\n";
|
||||||
|
|
||||||
auto den = std::chrono::high_resolution_clock::duration::period::den;
|
auto den = std::chrono::high_resolution_clock::duration::period::den;
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "detail";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "detail";
|
||||||
std::clog << " | " << left << setw(indent) << setfill(' ') << "time spend";
|
std::clog << " | " << left << setw(indent) << setfill(' ') << "time spend";
|
||||||
std::clog << " | " << left << setw(indent) << setfill('x') << "x";
|
std::clog << " | " << left << setw(indent) << setfill('x') << "x";
|
||||||
std::clog << " | " << left << setw(indent) << setfill('x') << "x";
|
std::clog << " | " << left << setw(indent) << setfill('x') << "x";
|
||||||
std::clog << "\n" << indent_string << "\n";
|
std::clog << " |\n+" << indent_string << "+\n";
|
||||||
|
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "gc time";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "gc time";
|
||||||
std::clog << " | " << worktime*1.0/den*1000 << " ms\n";
|
std::clog << " | " << worktime*1.0/den*1000 << " ms\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "avg time";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "avg time";
|
||||||
std::clog << " | " << worktime*1.0/den*1000/total << " ms\n";
|
std::clog << " | " << worktime*1.0/den*1000/total << " ms\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "max gc";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "max gc";
|
||||||
std::clog << " | " << max_time*1.0/den*1000 << " ms\n";
|
std::clog << " | " << max_time*1.0/den*1000 << " ms\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "max mark";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "max mark";
|
||||||
std::clog << " | " << max_mark_time*1.0/den*1000 << " ms\n";
|
std::clog << " | " << max_mark_time*1.0/den*1000 << " ms\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "max sweep";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "max sweep";
|
||||||
std::clog << " | " << max_sweep_time*1.0/den*1000 << " ms\n";
|
std::clog << " | " << max_sweep_time*1.0/den*1000 << " ms\n";
|
||||||
std::clog << " " << left << setw(indent) << setfill(' ') << "concurrent";
|
std::clog << "| " << left << setw(indent) << setfill(' ') << "concurrent";
|
||||||
std::clog << " | " << (flag_concurrent_mark_triggered? "true\n":"false\n");
|
std::clog << " | " << (flag_concurrent_mark_triggered? "true\n":"false\n");
|
||||||
std::clog << last_line << "\n";
|
std::clog << last_line << "\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
#include "nasal.h"
|
#include "nasal.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
@ -38,4 +42,32 @@ f64 dec_to_f64(const char*);
|
||||||
|
|
||||||
f64 str_to_num(const char*);
|
f64 str_to_num(const char*);
|
||||||
|
|
||||||
|
class windows_code_page_manager {
|
||||||
|
private:
|
||||||
|
u32 code_page;
|
||||||
|
|
||||||
|
public:
|
||||||
|
windows_code_page_manager() {
|
||||||
|
#ifdef _WIN32
|
||||||
|
code_page = GetConsoleOutputCP();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_utf8_output() {
|
||||||
|
#ifdef _WIN32
|
||||||
|
// store previous code page
|
||||||
|
code_page = GetConsoleOutputCP();
|
||||||
|
// allow 65001 code page
|
||||||
|
SetConsoleOutputCP(CP_UTF8);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void restore_code_page() {
|
||||||
|
#ifdef _WIN32
|
||||||
|
// restore previous code page
|
||||||
|
SetConsoleOutputCP(code_page);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue