entrylabs/entryjs

아두이노 블록 -> 파이썬 언어 변환 -> 아두이노 블록 순서로 코드변환시 파이썬 언어에서 원래 아두이노 블록이 아닌 orange보드의 블록으로 잘못변환

Opened this issue · 1 comments

entrylabs/entry-offline#116 의 root cause 찾는 과정에 발견된 이슈입니다. 이 이슈가 해결되면 해당 이슈는 자동해결 됩니다.

image

위에 버저 소리출력 아두이노 블록 -> 파이썬 언어변환 -> 다시 블록으로 되돌릴시,
내부적으로 arduino_ext_set_tone 인데 파이썬 언어갔다가 다시 블록으로 변환시, 아래의 첨부 이미지에서 보여지는 것처럼 orange_set_tone로 바뀌어 버림. 해당 블록 안에 4개의 인자 중 2개도 orange_tone_list, orange_octave_list로 바뀌어 버럼.

parser.js 148라인
result = this._execParser.Program(astArray);

image

디버깅 결과 root cause를 공유드리자면, 굉장히 오래된 legacy 버그로 블록<->파이썬 상호간의 변환을 위한 맵핑 테이블(key, value 형식)을 구축하는 아래 코드에서

syntaxPointer[syntaxKey] = result;

기존에 정상적으로 구축된 key값이 동일한 심볼명을 갖는 다른 하드웨어의 key값에 의해 덮어 씌워지는 문제로 인해 발생.

예를 들어, Arduino.digitalWrite(%1, %2) 파이썬 심볼에 대한 맵핑 key값은 본래 엔트리 기본 하드웨어인 Arduino 또는 ArduinoExt의 것으로 초기에 key값이 arduino_ext_toggle_led로 잘 설정되나, 이후 동일한 심볼명을 사용하는 여러 다른 하드웨어(예를들어 오렌지 보드 등)이 동일한 심볼명을 사용하고 있는 바람에 해당 키값을 자신의 것(orange_toggle_led)으로 덮어 씌우면서 발생하는 문제.

미해결시 예상결과: 이 legacy bug를 해결하지 않으면, 매우 드물게 발생하나 굉장히 찾아내기 힘든 버그를 양산할 수 있음.