Skip to content

Commit

Permalink
Merge pull request #300 from polystat/char
Browse files Browse the repository at this point in the history
char v1
  • Loading branch information
IngeniariusSoftware committed Aug 14, 2022
2 parents cc0704f + 50a82ca commit 7dc91d1
Show file tree
Hide file tree
Showing 25 changed files with 238 additions and 30 deletions.
1 change: 1 addition & 0 deletions citation.cff
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ authors:
orcid: "https://orcid.org/0000-0002-4957-5695"
- family-names: "Ryabtsev"
given-names: "Yaroslav"
orcid: "https://orcid.org/0000-0001-5530-3752"
- family-names: "Kamensky"
given-names: "Andrey"
title: "c2eo: C to EO transpiler"
Expand Down
14 changes: 14 additions & 0 deletions project/src/transpiler/aliases.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@ std::map<std::string, std::string> known_aliases = {
{"as-bool", "+alias c2eo.coperators.as-bool"},
{"as-float32", "+alias c2eo.coperators.as-float32"},
{"as-float64", "+alias c2eo.coperators.as-float64"},
{"as-int8", "+alias c2eo.coperators.as-int8"},
{"as-int16", "+alias c2eo.coperators.as-int16"},
{"as-int32", "+alias c2eo.coperators.as-int32"},
{"as-int64", "+alias c2eo.coperators.as-int64"},
{"as-uint8", "+alias c2eo.coperators.as-uint8"},
{"as-uint16", "+alias c2eo.coperators.as-uint16"},
{"as-uint32", "+alias c2eo.coperators.as-uint32"},
{"bit-and", "+alias c2eo.coperators.bit-and"},
Expand Down Expand Up @@ -85,34 +87,42 @@ std::map<std::string, std::string> known_aliases = {
{"pos", "+alias c2eo.coperators.pos"},
{"post-dec-float32", "+alias c2eo.coperators.post-dec-float32"},
{"post-dec-float64", "+alias c2eo.coperators.post-dec-float64"},
{"post-dec-int8", "+alias c2eo.coperators.post-dec-int8"},
{"post-dec-int16", "+alias c2eo.coperators.post-dec-int16"},
{"post-dec-int32", "+alias c2eo.coperators.post-dec-int32"},
{"post-dec-int64", "+alias c2eo.coperators.post-dec-int64"},
{"post-dec-ptr", "+alias c2eo.coperators.post-dec-ptr"},
{"post-dec-uint8", "+alias c2eo.coperators.post-dec-uint8"},
{"post-dec-uint16", "+alias c2eo.coperators.post-dec-uint16"},
{"post-dec-uint32", "+alias c2eo.coperators.post-dec-uint32"},
{"post-inc-float32", "+alias c2eo.coperators.post-inc-float32"},
{"post-inc-float64", "+alias c2eo.coperators.post-inc-float64"},
{"post-inc-int8", "+alias c2eo.coperators.post-inc-int8"},
{"post-inc-int16", "+alias c2eo.coperators.post-inc-int16"},
{"post-inc-int32", "+alias c2eo.coperators.post-inc-int32"},
{"post-inc-int64", "+alias c2eo.coperators.post-inc-int64"},
{"post-inc-ptr", "+alias c2eo.coperators.post-inc-ptr"},
{"post-inc-uint8", "+alias c2eo.coperators.post-inc-uint8"},
{"post-inc-uint16", "+alias c2eo.coperators.post-inc-uint16"},
{"post-inc-uint32", "+alias c2eo.coperators.post-inc-uint32"},
{"pre-dec-float32", "+alias c2eo.coperators.pre-dec-float32"},
{"pre-dec-float64", "+alias c2eo.coperators.pre-dec-float64"},
{"pre-dec-int8", "+alias c2eo.coperators.pre-dec-int8"},
{"pre-dec-int16", "+alias c2eo.coperators.pre-dec-int16"},
{"pre-dec-int32", "+alias c2eo.coperators.pre-dec-int32"},
{"pre-dec-int64", "+alias c2eo.coperators.pre-dec-int64"},
{"pre-dec-ptr", "+alias c2eo.coperators.pre-dec-ptr"},
{"pre-dec-uint8", "+alias c2eo.coperators.pre-dec-uint8"},
{"pre-dec-uint16", "+alias c2eo.coperators.pre-dec-uint16"},
{"pre-dec-uint32", "+alias c2eo.coperators.pre-dec-uint32"},
{"pre-inc-float32", "+alias c2eo.coperators.pre-inc-float32"},
{"pre-inc-float64", "+alias c2eo.coperators.pre-inc-float64"},
{"pre-inc-int8", "+alias c2eo.coperators.pre-inc-int8"},
{"pre-inc-int16", "+alias c2eo.coperators.pre-inc-int16"},
{"pre-inc-int32", "+alias c2eo.coperators.pre-inc-int32"},
{"pre-inc-int64", "+alias c2eo.coperators.pre-inc-int64"},
{"pre-inc-ptr", "+alias c2eo.coperators.pre-inc-ptr"},
{"pre-inc-uint8", "+alias c2eo.coperators.pre-inc-uint8"},
{"pre-inc-uint16", "+alias c2eo.coperators.pre-inc-uint16"},
{"pre-inc-uint32", "+alias c2eo.coperators.pre-inc-uint32"},
{"printf", "+alias c2eo.coperators.printf"},
Expand All @@ -122,11 +132,13 @@ std::map<std::string, std::string> known_aliases = {
{"read-as-bool", "+alias c2eo.coperators.read-as-bool"},
{"read-as-float32", "+alias c2eo.coperators.read-as-float32"},
{"read-as-float64", "+alias c2eo.coperators.read-as-float64"},
{"read-as-int8", "+alias c2eo.coperators.read-as-int8"},
{"read-as-int16", "+alias c2eo.coperators.read-as-int16"},
{"read-as-int32", "+alias c2eo.coperators.read-as-int32"},
{"read-as-int64", "+alias c2eo.coperators.read-as-int64"},
{"read-as-ptr", "+alias c2eo.coperators.read-as-ptr"},
{"read-as-string", "+alias c2eo.coperators.read-as-string"},
{"read-as-uint8", "+alias c2eo.coperators.read-as-uint8"},
{"read-as-uint16", "+alias c2eo.coperators.read-as-uint16"},
{"read-as-uint32", "+alias c2eo.coperators.read-as-uint32"},
{"shift-left", "+alias c2eo.coperators.shift-left"},
Expand All @@ -136,11 +148,13 @@ std::map<std::string, std::string> known_aliases = {
{"write-as-bool", "+alias c2eo.coperators.write-as-bool"},
{"write-as-float32", "+alias c2eo.coperators.write-as-float32"},
{"write-as-float64", "+alias c2eo.coperators.write-as-float64"},
{"write-as-int8", "+alias c2eo.coperators.write-as-int8"},
{"write-as-int16", "+alias c2eo.coperators.write-as-int16"},
{"write-as-int32", "+alias c2eo.coperators.write-as-int32"},
{"write-as-int64", "+alias c2eo.coperators.write-as-int64"},
{"write-as-ptr", "+alias c2eo.coperators.write-as-ptr"},
{"write-as-string", "+alias c2eo.coperators.write-as-string"},
{"write-as-uint8", "+alias c2eo.coperators.write-as-uint8"},
{"write-as-uint16", "+alias c2eo.coperators.write-as-uint16"},
{"write-as-uint32", "+alias c2eo.coperators.write-as-uint32"},
};
Expand Down
9 changes: 0 additions & 9 deletions project/src/transpiler/record_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,6 @@ RecordType *RecordManager::GetById(int64_t id) {
return nullptr;
}

__attribute__((unused)) size_t RecordManager::GetShift(
int64_t id, const std::string &member) {
RecordType *rt = GetById(id);
if (rt != nullptr) {
return rt->fields[member].second;
}
return -1;
}

EOObject RecordManager::GetShiftAlias(int64_t id, const std::string &member) {
RecordType *rt = GetById(id);
if (rt != nullptr) {
Expand Down
2 changes: 0 additions & 2 deletions project/src/transpiler/record_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ struct RecordManager {
std::map<std::string, std::pair<clang::QualType, size_t>> fields,
bool is_local);
RecordType *GetById(int64_t id);
__attribute__((unused)) size_t GetShift(int64_t id,
const std::string &member);
[[nodiscard]] std::vector<RecordType>::const_iterator begin() const;
[[nodiscard]] std::vector<RecordType>::const_iterator end() const;

Expand Down
2 changes: 1 addition & 1 deletion project/src/transpiler/recorddecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ std::vector<RecordType> ProcessRecordType(const clang::RecordDecl *RD,
auto *field = llvm::dyn_cast<clang::FieldDecl>(*it);

if (field == nullptr) {
return {};
continue;
}
std::string field_name;
if (!field->isUnnamedBitfield() && !field->getNameAsString().empty()) {
Expand Down
30 changes: 21 additions & 9 deletions project/src/transpiler/transpile_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ EOObject GetSwitchEOObject(const SwitchStmt *p_stmt);
EOObject GetCaseCondEOObject(const vector<const Expr *> &all_cases,
const EOObject &switch_exp, size_t i);

EOObject GetCharacterLiteralEOObject(const clang::CharacterLiteral *p_literal);
void AppendDeclStmt(const DeclStmt *stmt);

extern UnitTranspiler transpiler;
Expand Down Expand Up @@ -364,6 +365,10 @@ EOObject GetStmtEOObject(const Stmt *stmt) {
const auto *op = dyn_cast<IntegerLiteral>(stmt);
return GetIntegerLiteralEOObject(op);
}
if (stmt_class == Stmt::CharacterLiteralClass) {
const auto *op = dyn_cast<clang::CharacterLiteral>(stmt);
return GetCharacterLiteralEOObject(op);
}
if (stmt_class == Stmt::FloatingLiteralClass) {
const auto *op = dyn_cast<FloatingLiteral>(stmt);
return GetFloatingLiteralEOObject(op);
Expand Down Expand Up @@ -438,7 +443,14 @@ EOObject GetStmtEOObject(const Stmt *stmt) {

return EOObject(EOObjectType::EO_PLUG);
}

EOObject GetCharacterLiteralEOObject(const clang::CharacterLiteral *p_literal) {
if (p_literal != nullptr) {
unsigned int an_int = p_literal->getValue();
std::string str_val{std::to_string(an_int)};
return EOObject{str_val, EOObjectType::EO_LITERAL};
}
return EOObject{EOObjectType::EO_PLUG};
}
EOObject GetInitListEOObject(const clang::InitListExpr *list) {
EOObject eoList{"*", EOObjectType::EO_EMPTY};
clang::QualType qualType = list->getType().getDesugaredType(*context);
Expand Down Expand Up @@ -1393,10 +1405,10 @@ std::string GetPostfix(QualType qual_type) {
if (!type_ptr->isSignedIntegerType()) {
str += "u";
}
if (type_ptr->isCharType()) {
str += "char";
return str;
}
// if (type_ptr->isCharType()) {
// str += "int8";
// return str;
// }
if (type_ptr->isIntegerType()) {
str += "int" + std::to_string(type_size);
return str;
Expand Down Expand Up @@ -1428,10 +1440,10 @@ std::string GetTypeName(QualType qual_type) {
if (!type_ptr->isSignedIntegerType()) {
str += "u";
}
if (type_ptr->isCharType()) {
str += "char";
return str;
}
// if (type_ptr->isCharType()) {
// str += "char";
// return str;
// }
if (type_ptr->isIntegerType()) {
str += "int" + std::to_string(type_size);
return str;
Expand Down
16 changes: 8 additions & 8 deletions project/src/transpiler/vardecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ EOObject InitValueEOObj(const VarDecl *VD, bool is_init) {

EOObject InitValueAnalysis(const VarDecl *VD) {
auto qual_type = VD->getType();
const auto *type_ptr = qual_type.getTypePtr();
// const auto *type_ptr = qual_type.getTypePtr();

auto type_info = VD->getASTContext().getTypeInfo(qual_type);
auto size = type_info.Width;
Expand All @@ -106,13 +106,13 @@ EOObject InitValueAnalysis(const VarDecl *VD) {
std::string str;
if (init_val->isInt()) {
auto int_value = init_val->getInt().getExtValue();
if (type_ptr->isCharType()) {
str = "'";
str += static_cast<char>(int_value);
str += "'";
} else {
str = std::to_string(int_value);
}
// if (type_ptr->isCharType()) {
// str = "'";
// str += static_cast<char>(int_value);
// str += "'";
// } else {
str = std::to_string(int_value);
// }
} else if (init_val->isFloat() && (size == double_size)) {
auto float_value = init_val->getFloat().convertToDouble();
str = std::to_string(float_value);
Expand Down
10 changes: 10 additions & 0 deletions project/tests/in_progress/for_main/bugs/for01.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "stdio.h"
int main() {
for (int i = 0; i < 1; i++)
printf("%d\n", i);
for (int i = 0; i < 1; i++)
printf("%d\n", i);
for (int i = 0; i < 1; i++)
printf("%d\n", i);
return 0;
}
59 changes: 59 additions & 0 deletions project/tests/main/char/char01.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include "stdio.h"
char c = 5;
unsigned char uc = 5;
int main() {
char lc = 5;
unsigned char ulc = 5;

printf("%d\n", c);
printf("%d\n", uc);
printf("%d\n", lc);
printf("%d\n", ulc);

c++;
uc++;
lc++;
ulc++;

printf("%d\n", c);
printf("%d\n", uc);
printf("%d\n", lc);
printf("%d\n", ulc);

c--;
uc--;
lc--;
ulc--;

printf("%d\n", c);
printf("%d\n", uc);
printf("%d\n", lc);
printf("%d\n", ulc);

c += 1000;
uc += 1000;
lc += 1000;
ulc += 1000;

printf("%d\n", c);
printf("%d\n", uc);
printf("%d\n", lc);
printf("%d\n", ulc);

c -= 2000;
uc -= 2000;
lc -= 2000;
ulc -= 2000;

printf("%d\n", c);
printf("%d\n", uc);
printf("%d\n", lc);
printf("%d\n", ulc);

// printf("%c\n", c);
// printf("%c\n", uc);
// printf("%c\n", lc);
// printf("%c\n", ulc);

return 0;
}
16 changes: 16 additions & 0 deletions project/tests/main/char/char02.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include "stdio.h"
char c[] = {3, 4, 5, 6, 7, 8, 9};
char str[] = "hell";
char str2[] = {'h', 1, 2, 3, 'k'};
unsigned char str3[] = {'h', -1, -2, 3, 'k'};
int main() {
for (int i = 0; i < 8; i++)
printf("%d\n", c[i]);
for (int i = 0; i < 5; i++)
printf("%d\n", str[i]);
for (int j = 0; j < 5; j++)
printf("%d\n", str2[j]);
for (int j = 0; j < 5; j++)
printf("%d\n", str3[j]);
return 0;
}
10 changes: 10 additions & 0 deletions result/eo/c2eo/coperators/as-int8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
+alias org.eolang.math.number

+package c2eo.coperators

[a] > as-int8
(number a).as-int > value!
if. > @
(value.as-bytes.slice 7 1).as-int.gte 0
(00-00-00-00-00-00-00.concat (value.as-bytes.slice 7 1)).as-int
(FF-FF-FF-FF-FF-FF-FF.concat (value.as-bytes.slice 7 1)).as-int
6 changes: 6 additions & 0 deletions result/eo/c2eo/coperators/as-uint8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
+alias org.eolang.math.number

+package c2eo.coperators

[a] > as-uint8
(00-00-00-00-00-00-00.concat ((number a).as-int.as-bytes.slice 7 1)).as-int > @
9 changes: 9 additions & 0 deletions result/eo/c2eo/coperators/post-dec-int8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+alias c2eo.coperators.read-as-int8
+alias c2eo.coperators.write-as-int8

+package c2eo.coperators

[a] > post-dec-int8
seq > @
write-as-int8 a ((read-as-int8 a).minus 1)
(read-as-int8 a).plus 1
9 changes: 9 additions & 0 deletions result/eo/c2eo/coperators/post-dec-uint8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+alias c2eo.coperators.read-as-uint8
+alias c2eo.coperators.write-as-uint8

+package c2eo.coperators

[a] > post-dec-uint8
seq > @
write-as-uint8 a ((read-as-uint8 a).minus 1)
(read-as-uint8 a).plus 1
9 changes: 9 additions & 0 deletions result/eo/c2eo/coperators/post-inc-int8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+alias c2eo.coperators.read-as-int8
+alias c2eo.coperators.write-as-int8

+package c2eo.coperators

[a] > post-inc-int8
seq > @
write-as-int8 a ((read-as-int8 a).plus 1)
(read-as-int8 a).minus 1
9 changes: 9 additions & 0 deletions result/eo/c2eo/coperators/post-inc-uint8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
+alias c2eo.coperators.read-as-uint8
+alias c2eo.coperators.write-as-uint8

+package c2eo.coperators

[a] > post-inc-uint8
seq > @
write-as-uint8 a ((read-as-uint8 a).plus 1)
(read-as-uint8 a).minus 1
7 changes: 7 additions & 0 deletions result/eo/c2eo/coperators/pre-dec-int8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
+alias c2eo.coperators.read-as-int8
+alias c2eo.coperators.write-as-int8

+package c2eo.coperators

[a] > pre-dec-int8
write-as-int8 a ((read-as-int8 a).minus 1) > @
7 changes: 7 additions & 0 deletions result/eo/c2eo/coperators/pre-dec-uint8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
+alias c2eo.coperators.read-as-uint8
+alias c2eo.coperators.write-as-uint8

+package c2eo.coperators

[a] > pre-dec-uint8
write-as-uint8 a ((read-as-uint8 a).minus 1) > @
7 changes: 7 additions & 0 deletions result/eo/c2eo/coperators/pre-inc-int8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
+alias c2eo.coperators.read-as-int8
+alias c2eo.coperators.write-as-int8

+package c2eo.coperators

[a] > pre-inc-int8
write-as-int8 a ((read-as-int8 a).plus 1) > @
7 changes: 7 additions & 0 deletions result/eo/c2eo/coperators/pre-inc-uint8.eo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
+alias c2eo.coperators.read-as-uint8
+alias c2eo.coperators.write-as-uint8

+package c2eo.coperators

[a] > pre-inc-uint8
write-as-uint8 a ((read-as-uint8 a).plus 1) > @

1 comment on commit 7dc91d1

@0pdd
Copy link
Member

@0pdd 0pdd commented on 7dc91d1 Aug 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't able to retrieve PDD puzzles from the code base and submit them to github. If you think that it's a bug on our side, please submit it to yegor256/0pdd:

set -x && set -e && set -o pipefail && cd /tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ && pdd -v -f /tmp/20220814-21770-pf732w [1]: + set -e + set -o pipefail + cd /tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ + pdd -v -f...

Please, copy and paste this stack trace to GitHub:

UserError
set -x && set -e && set -o pipefail && cd /tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ && pdd -v -f /tmp/20220814-21770-pf732w [1]:
+ set -e
+ set -o pipefail
+ cd /tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ
+ pdd -v -f /tmp/20220814-21770-pf732w

My version is 0.21.3
Ruby version is 2.7.5 at x86_64-linux
Reading from root dir /tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ
/tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ/.gitmodules is a binary file (0 bytes)
/tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ/project/scripts/data/skips/test.txt is a binary file (0 bytes)
/tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ/project/tests/in_progress/for_main/.gitkeep is a binary file (0 bytes)
/tmp/0pdd20220814-14-1qot1ap/Z2l0QGdpdGh1Yi5jb206cG9seXN0YXQvYzJlby5naXQ/result/eo/c2eo/src/.gitkeep is a binary file (0 bytes)
Reading .gitignore ...
Reading .gitattributes ...
Reading Dockerfile ...
Reading .rultor.yml ...
Reading project/CMakeLists.txt ...
Reading project/scripts/build_c2eo.py ...
Reading project/scripts/build_eo.py ...
Reading project/scripts/code_lines.py ...
Reading project/scripts/c2eo-all.py ...
Reading project/scripts/clang_tidy.py ...
Reading project/scripts/compile.py ...
Reading project/scripts/readme.md ...
Reading project/scripts/clean_before_transpilation.py ...
Reading project/scripts/tools.py ...
Reading project/scripts/update-release.py ...
Reading project/scripts/test.py ...
Reading project/scripts/transpile.py ...
Reading project/scripts/codecov.py ...
Reading project/scripts/data/settings.yml ...
Reading project/scripts/data/meta/run.sh.txt ...
Reading project/scripts/data/meta/plug.txt ...
Reading project/scripts/data/skips/gcc.txt ...
Reading project/scripts/data/skips/testcuite.txt ...
ERROR: project/scripts/data/skips/testcuite.txt; PDD::Error at project/scripts/data/skips/testcuite.txt:2: TODO found, but puzzle can't be parsed, most probably because TODO is not followed by a puzzle marker, as this page explains: https://github.com/cqfn/pdd#how-to-format
If you can't understand the cause of this issue or you don't know how to fix it, please submit a GitHub issue, we will try to help you: https://github.com/cqfn/pdd/issues. This tool is still in its beta version and we will appreciate your feedback. Here is where you can find more documentation: https://github.com/cqfn/pdd/blob/master/README.md.
Exit code is 1

/app/objects/git_repo.rb:73:in `rescue in block in xml'
/app/objects/git_repo.rb:70:in `block in xml'
/app/vendor/ruby-2.7.5/lib/ruby/2.7.0/tempfile.rb:291:in `open'
/app/objects/git_repo.rb:69:in `xml'
/app/objects/puzzles.rb:41:in `deploy'
/app/objects/jobs/job.rb:38:in `proceed'
/app/objects/jobs/job_starred.rb:32:in `proceed'
/app/objects/jobs/job_recorded.rb:31:in `proceed'
/app/objects/jobs/job_emailed.rb:33:in `proceed'
/app/objects/jobs/job_commiterrors.rb:33:in `proceed'
/app/objects/jobs/job_detached.rb:48:in `exclusive'
/app/objects/jobs/job_detached.rb:36:in `block in proceed'
/app/objects/jobs/job_detached.rb:36:in `fork'
/app/objects/jobs/job_detached.rb:36:in `proceed'
/app/0pdd.rb:519:in `process_request'
/app/0pdd.rb:356:in `block in <top (required)>'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1686:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1686:in `block in compile!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1023:in `block (3 levels) in route!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1042:in `route_eval'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1023:in `block (2 levels) in route!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1071:in `block in process_route'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1069:in `catch'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1069:in `process_route'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1021:in `block in route!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1018:in `each'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1018:in `route!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1140:in `block in dispatch!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `block in invoke'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `catch'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `invoke'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1135:in `dispatch!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:949:in `block in call!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `block in invoke'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `catch'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1112:in `invoke'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:949:in `call!'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:938:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/xss_header.rb:18:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/path_traversal.rb:16:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/json_csrf.rb:26:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/base.rb:50:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/base.rb:50:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-protection-2.2.2/lib/rack/protection/frame_options.rb:31:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-2.2.4/lib/rack/logger.rb:17:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-2.2.4/lib/rack/common_logger.rb:38:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:255:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:248:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-2.2.4/lib/rack/head.rb:12:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-2.2.4/lib/rack/method_override.rb:24:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:218:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1993:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1553:in `block in call'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1769:in `synchronize'
/app/vendor/bundle/ruby/2.7.0/gems/sinatra-2.2.2/lib/sinatra/base.rb:1553:in `call'
/app/vendor/bundle/ruby/2.7.0/gems/rack-2.2.4/lib/rack/handler/webrick.rb:95:in `service'
/app/vendor/ruby-2.7.5/lib/ruby/2.7.0/webrick/httpserver.rb:140:in `service'
/app/vendor/ruby-2.7.5/lib/ruby/2.7.0/webrick/httpserver.rb:96:in `run'
/app/vendor/ruby-2.7.5/lib/ruby/2.7.0/webrick/server.rb:307:in `block in start_thread'

Please sign in to comment.