swmaestro06-apus / apus

apus program. it's a binary parser using programmable formats.
10 stars 1 forks source link

Value: Added helper functions on Value #84

Closed enghqii closed 9 years ago

enghqii commented 9 years ago

Value에 정적 멤버 함수로 helper 함수들을 만들었습니다.

  1. Value::IsTrue 어떤 값이 true값인지 아닌지를 판단하는 함수로, ForStatement나 IfStatement의 Execute로직 처럼 expression을 이용해서 조건 판단을 하는경우 사용할 수 있습니다
  2. Value::CreateInitial 매개변수로 주어진 TypeSpecifier에 해당하는 초기화 값을 반환하는 함수로, VarDefStatement에서 사용할 수 있습니다.
namhyung commented 9 years ago

초기값이 없으면 자동으로 0으로 초기화한다는 의미인가요?

enghqii commented 9 years ago

네 그렇습니다. 여기서 안 해주면 VarDefExpression에서 저 switch문을 넣어도 됩니다. 하지만 그러면 좀 복잡해질것 같아서 빼냈습니다.

namhyung commented 9 years ago

암묵적으로 제공되는 초기값 0을 기반으로 스크립트를 작성할 수 있다는 단점은 있을테지만 일단 구현이 간단해 진다면 0으로 초기화하는 것에 반대는 없습니다.

namhyung commented 9 years ago

참.. 그러면 배열이나 struct 같은 변수들도 다 0으로 초기화해야 할 것 같네요.

namhyung commented 9 years ago

그냥 초기값이 없으면 undefined 상태로 두고, 나중에 혹시 값을 참조하려고 할 때 오류를 발생시키는 것은 어떨까요? 그 편이 구현이 더 간단하지 않을까요?

enghqii commented 9 years ago

네 그게 구현하긴 훨씬 편하긴 합니다. 그러면 자바에서처럼 클래스 인스턴스 생성 안 해주면 사용 못하는 식이 되겠네요.

var U8 a;
var U16 b = a + 3 // err
namhyung commented 9 years ago

비슷한 개념이 되겠네요. 어쨌든 값이 정해지지 않았을 때 해당 변수를 읽으려고 시도하면 오류를 내는 것은 자연스러운 개념 아닐까요?

$ echo 'int main(void) { int a; int b = a + 1; return 0; }' | gcc -xc -W -
<stdin>: In function ‘main’:
<stdin>:1:29: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
<stdin>:1:22: note: ‘a’ was declared here
$ echo 'b = a + 1' | python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
enghqii commented 9 years ago

일단 실제로 VarDefStatement에서 이 함수를 사용하고 있는건 아니니 선언부와 정의부만 빼서 다시 올리겠습니다.