Skip to content

Commit

Permalink
BUGFIX: Исправлена ошибка, связанная с пустыми функциями и компилято…
Browse files Browse the repository at this point in the history
…ром Visual C++.

Компоновщик компилятора Visual C++ при использовании опции /Gy (enable
function-level linking), при обнаружении нескольких функций с идентичным
телом, в целевой исполнимый файл помещал только одну из них, заменяя ссылки
на остальные ссылками на эту функцию. Соответственно, все ссылки на пустые
функции становились идентичными, что прямо противоречит их целевому
предназначению.

Кроме того, данная ошибка, помимо проблем с пустыми функциями, могла приводить
к нарушению семантики сравнения на равенство вложенных функций, а именно пункт 4
раздела 3.3.3 на странице 15:

«Два замыкания, построенные из текстуально разных функциональных блоков, не равны».

Исправленно внедрением костыля: теперь возвращаемое значение каждой функции
при неуспехе сопоставления формируется как

  refalrts::cRecognitionImpossible | (__LINE__ << 8),

из-за чего все пустые функции становятся гарантированно различными
(т.к. возвращают разные значения). Рантайм в возвращаемом значении функций
игнорирует все биты кроме младших восьми.

Соответственно, упоминание об этой ошибке удалено из руководства пользователя
(разделы 3.2.4 и 3.3.3).
  • Loading branch information
Mazdaywik committed Sep 25, 2015
1 parent 12964e3 commit 7eb13e0
Showing 15 changed files with 1,404 additions and 408 deletions.
420 changes: 315 additions & 105 deletions bootstrap/Algorithm.cpp

Large diffs are not rendered by default.

64 changes: 48 additions & 16 deletions bootstrap/Context.cpp
Original file line number Diff line number Diff line change
@@ -4,17 +4,23 @@

static refalrts::FnResult Context(refalrts::Iter, refalrts::Iter) {
refalrts::this_is_generated_function();
return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult FreeVarsSent(refalrts::Iter, refalrts::Iter) {
refalrts::this_is_generated_function();
return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult FreeVarsFunc(refalrts::Iter, refalrts::Iter) {
refalrts::this_is_generated_function();
return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

refalrts::FnResult Cntx_Create(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -61,7 +67,9 @@ refalrts::FnResult Cntx_Create(refalrts::Iter arg_begin, refalrts::Iter arg_end)
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

refalrts::FnResult Cntx_Destroy(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -98,7 +106,9 @@ refalrts::FnResult Cntx_Destroy(refalrts::Iter arg_begin, refalrts::Iter arg_end
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

//$LABEL CSuccess
@@ -501,7 +511,9 @@ refalrts::FnResult Cntx_AddVariable(refalrts::Iter arg_begin, refalrts::Iter arg
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult ShiftVariable_Aux(refalrts::Iter arg_begin, refalrts::Iter arg_end);
@@ -738,7 +750,9 @@ static refalrts::FnResult ShiftVariable(refalrts::Iter arg_begin, refalrts::Iter
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult ShiftVariable_Aux(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -913,7 +927,9 @@ static refalrts::FnResult ShiftVariable_Aux(refalrts::Iter arg_begin, refalrts::
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

//$LABEL CExistVariable
@@ -1316,7 +1332,9 @@ refalrts::FnResult Cntx_AddNewVariable(refalrts::Iter arg_begin, refalrts::Iter
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult SetAsBoundVariable_RemoveFromFree(refalrts::Iter arg_begin, refalrts::Iter arg_end);
@@ -1578,7 +1596,9 @@ static refalrts::FnResult SetAsBoundVariable(refalrts::Iter arg_begin, refalrts:
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult SetAsBoundVariable_RemoveFromFree(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -1723,7 +1743,9 @@ static refalrts::FnResult SetAsBoundVariable_RemoveFromFree(refalrts::Iter arg_b
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

refalrts::FnResult Cntx_CheckVariable(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -2111,7 +2133,9 @@ refalrts::FnResult Cntx_CheckVariable(refalrts::Iter arg_begin, refalrts::Iter a
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult Unique(refalrts::Iter arg_begin, refalrts::Iter arg_end);
@@ -2277,7 +2301,9 @@ refalrts::FnResult Cntx_ResetAfterSentence(refalrts::Iter arg_begin, refalrts::I
}
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

static refalrts::FnResult Unique(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -2425,7 +2451,9 @@ static refalrts::FnResult Unique(refalrts::Iter arg_begin, refalrts::Iter arg_en
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

refalrts::FnResult Cntx_PushScope(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -2518,7 +2546,9 @@ refalrts::FnResult Cntx_PushScope(refalrts::Iter arg_begin, refalrts::Iter arg_e
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}

refalrts::FnResult Cntx_PopScope(refalrts::Iter arg_begin, refalrts::Iter arg_end) {
@@ -2603,7 +2633,9 @@ refalrts::FnResult Cntx_PopScope(refalrts::Iter arg_begin, refalrts::Iter arg_en
#endif
} while ( 0 );

return refalrts::cRecognitionImpossible;
return refalrts::FnResult(
refalrts::cRecognitionImpossible | (__LINE__ << 8)
);
}


Loading

0 comments on commit 7eb13e0

Please sign in to comment.