swmaestro06-apus / apus

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

Jeongmin/vm/supporting struct #118

Closed jeongmincha closed 9 years ago

jeongmincha commented 9 years ago

회의시간에 논의된 부분까지 작성하였습니다.

  1. struct 내부의 원소가 작성된 순서대로 자식 DataType을 가져오는 것이 중요한 일이므로, DataType클래스에서 offset을 기준으로 자식 DataType을 반환하는 메서드를 추가하였습니다.
  2. Variable 클래스에서 struct variable도 처리할 수 있도록, 자식 variable을 가질 수 있는 map구조를 추가하였습니다. 또, 그 map을 외부에서도 접근할 수 있도록 하는 public 메서드도 추가하였습니다.
  3. 2에 대한 유닛 테스트 코드를 추가하였습니다.

부족한 점 있으면 알려주시기 바랍니다. 감사합니다.

namhyung commented 9 years ago

Variable 의 생성자 내부에서 CreateChildVariables()가 자동으로 불리지 않나요?

jeongmincha commented 9 years ago

@namhyung 생성자 내부에 호출하게 되어 있습니다. 다만, 생성자 중에서 data type명시하지 않는 경우도 있기 때문에, 그런 경우 사용할 수 있도록 public method로 만들었습니다.

namhyung commented 9 years ago

어떤 경우에 data type이 없이 생성되나요? 만약 data type이 있다면 CreateChildVariables() 함수가 중복되어 두번 불리는 것 아닌가요?

jeongmincha commented 9 years ago

일단 생성자를 유연하게 제공해야 한다고 생각해서 그렇게 제공했고, 실제로는 생성자로만 그 함수가 호출될 겁니다.

jeongmincha commented 9 years ago

정 아니면, Variable에서 생성자를 오로지 data type과 name을 명시하는 생성자만 작성하게 하는 것도 방법인데, 어떤 것을 하는 것이 더 좋을지는 선택하기 나름인거 같습니다

namhyung commented 9 years ago

제가 얘기한 이유는, CreateChildVariables() 함수 내에서 자식 variable을 생성한 후에 해당 variable에 대해 다시 CreateChildVarialbes() 함수를 직접 호출해주고 있는데, 그렇게 되면 중복되어 실행되는 것 아닌가 하는 점이었습니다.

jeongmincha commented 9 years ago

재귀적으로 함수를 짠게 문제가 되는건가요? 일단 로직 상에는 무한루프 돌거나 하는 문제는 발생 안할텐데요... (STRUCT가 아니면 아무런 수행도 하지 않습니다)

jeongmincha commented 9 years ago

struct A { u8 a c8 b } var struct A aa 이런 경우 aa라는 variable에 대해서 CreateChildVariables가 수행되고, 그로 인해 a, b variable도 CreateChildVariables가 수행되지만, 어차피 STRUCT가 아니므로 아무런 수행도 하지 않습니다.

namhyung commented 9 years ago

그럼 이 경우는 어떤가요?

struct A {
  u8 a
  c8 b
}
struct B {
  struct A aa
  struct A bb
}
namhyung commented 9 years ago

무한루프는 아니겠지만 하나의 struct variable (A)에 대해서 CreateChildVariables()가 두번씩 호출되지는 않을까요?

jeongmincha commented 9 years ago

variable이 없는데... 어떤 경우를 말씀하시는지.. 만약에 저기에서 var struct B bb 이렇게 된다고 해도, aa랑 bb에 대해서는 당연히 중복되게 호출을 해야 하지 않나요? variable은 완전히 똑같은 데이터 타입이어도 메모리를 다르게 가져야 한다고 생각합니다.

jeongmincha commented 9 years ago

저기서 중복되게 호출되는게 왜 문제가 되는지 이해가 가지 않습니다. 당연히 제가 봤을때는 만약에 bb.aa.a랑 bb.bb.a랑은 비록 U8로서 동일한 타입이지만, variable객체로서 다르게 존재해야 한다고 생각합니다.

jeongmincha commented 9 years ago

어차피 variable객체 내부에서 data type에 대한 것은 레퍼런스로 갖고 있기에, data type자체는 중복되지 않고 동일한 인스턴스를 가리키게 됩니다.

namhyung commented 9 years ago

네.. var struct B bbb 경우를 말한다는 것이 빼먹었네요. 제말은 bbb에 대한 변수 생성 시 aa와 bb에 대해서 각각 생성자를 호출하고 CreateChildVariables()를 호출하는데 aa 생성자 내부에서 다시 CreateChildVariables()를 호출하고 있으니 aa에 대해서 (bb도 마찬가지고..) 이 함수가 두번 호출되는 것이 아니냐하는 말이었습니다.

jeongmincha commented 9 years ago

네 맞습니다. 제 말씀은 그것이 왜 문제가 되는지 이해가 가지 않는다는 말씀이었어요 ㅎㅎ 제가 재귀적으로 짠것을 보시면 아시겠지만 저 함수는 궁극적으로 자신이 스트럭쳐일 때, 자신의 스트럭쳐 자식들에 대해서도 전부 variable객체로 만들어주는 함수입니다.

비록 구조가 완전히 똑같은(타입이 같은) 변수이지만, 일단 다른 변수이기 때문에, 두번 호출되는게 맞는거 같습니다. (bbb 안에 있는 aa나 bbb안에 있는 bb나 구조가 완전 같으나, 다른 변수라는 말씀입니다)

namhyung commented 9 years ago

제 말은 aa에게 한번, bb에게 한번씩 호출된다는 것이 아니고, aa에게 두번, bb에게 두번 호출되는것 아니냐는 말이었습니다.

jeongmincha commented 9 years ago

그렇지는 않습니다. bbb->aa->a bbb->aa->b bbb->bb->a bbb->bb->b 이런식으로 호출이 되겠죠

jeongmincha commented 9 years ago

부모 변수에서 이 함수가 호출이 한번되면 자식들에 대해서도 "한번씩" 호출을 합니다. 또 그 자식들은 다시 자신의 자식들에 대해서도 "한번씩" 호출을 할테구요.

namhyung commented 9 years ago

그런데 자식을 만들때 생성자 내부에서 자동으로 호출하고 그 이후에 직접 한번 더 호출하지 않나요?

가령 bbb가 생성될 때 aa를 만드는데 aa 생성자 내부에서 CreateChildVariables()를 호출하고 다시 그 이후에 bbb 생성자 내부에서 aa에 대해 명시적으로 CreateChildVariables()를 다시 호출하는 것처럼 보여서 말하는 것입니다.

jeongmincha commented 9 years ago

아, 그 말씀을 하시는거군요... 이해했습니다

jeongmincha commented 9 years ago

offset을 index로 수정했습니다