From 128caac78281a0a433e2fb6ac223cbb1d91f4b90 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Fri, 15 Jan 2021 16:20:39 -0600 Subject: [PATCH] ir: Don't hardcode menu opcodes (#39) Instead, we use similar logic to upstream. --- src/compiler/irgen.js | 146 ++++++------------------------------------ 1 file changed, 18 insertions(+), 128 deletions(-) diff --git a/src/compiler/irgen.js b/src/compiler/irgen.js index 33da72d4..86cdb7de 100644 --- a/src/compiler/irgen.js +++ b/src/compiler/irgen.js @@ -185,12 +185,6 @@ class ScriptTreeGenerator { }; } - case 'control_create_clone_of_menu': - return { - kind: 'constant', - value: block.fields.CLONE_OPTION.value - }; - case 'data_variable': return { kind: 'var.get', @@ -225,12 +219,6 @@ class ScriptTreeGenerator { list: this.descendVariable(block, 'LIST', LIST_TYPE) }; - case 'event_broadcast_menu': - return { - kind: 'constant', - value: block.fields.BROADCAST_OPTION.value - }; - case 'looks_backdropnumbername': if (block.fields.NUMBER_NAME.value === 'number') { return { @@ -240,16 +228,6 @@ class ScriptTreeGenerator { return { kind: 'looks.backdropName' }; - case 'looks_backdrops': - return { - kind: 'constant', - value: block.fields.BACKDROP.value - }; - case 'looks_costume': - return { - kind: 'constant', - value: block.fields.COSTUME.value - }; case 'looks_costumenumbername': if (block.fields.NUMBER_NAME.value === 'number') { return { @@ -268,21 +246,6 @@ class ScriptTreeGenerator { return { kind: 'motion.direction' }; - case 'motion_glideto_menu': - return { - kind: 'constant', - value: block.fields.TO.value - }; - case 'motion_goto_menu': - return { - kind: 'constant', - value: block.fields.TO.value - }; - case 'motion_pointtowards_menu': - return { - kind: 'constant', - value: block.fields.TOWARDS.value - }; case 'motion_xposition': return { kind: 'motion.x' @@ -292,23 +255,6 @@ class ScriptTreeGenerator { kind: 'motion.y' }; - case 'music_menu_DRUM': - return { - kind: 'constant', - value: block.fields.DRUM.value - }; - case 'music_menu_INSTRUMENT': - return { - kind: 'constant', - value: block.fields.INSTRUMENT.value - }; - - case 'note': - return { - kind: 'constant', - value: block.fields.NOTE.value - }; - case 'operator_add': return { kind: 'op.add', @@ -536,12 +482,6 @@ class ScriptTreeGenerator { right: this.descendInputOfBlock(block, 'NUM2') }; - case 'pen_menu_colorParam': - return { - kind: 'constant', - value: block.fields.colorParam.value - }; - case 'sensing_answer': return { kind: 'sensing.answer' @@ -591,21 +531,11 @@ class ScriptTreeGenerator { return { kind: 'sensing.daysSince2000' }; - case 'sensing_distancetomenu': - return { - kind: 'constant', - value: block.fields.DISTANCETOMENU.value - }; case 'sensing_distanceto': return { kind: 'sensing.distance', target: this.descendInputOfBlock(block, 'DISTANCETOMENU') }; - case 'sensing_keyoptions': - return { - kind: 'constant', - value: block.fields.KEY_OPTION.value - }; case 'sensing_keypressed': return { kind: 'keyboard.pressed', @@ -623,11 +553,6 @@ class ScriptTreeGenerator { return { kind: 'mouse.y' }; - case 'sensing_of_object_menu': - return { - kind: 'constant', - value: block.fields.OBJECT.value - }; case 'sensing_of': return { kind: 'sensing.of', @@ -648,73 +573,38 @@ class ScriptTreeGenerator { kind: 'sensing.touching', object: this.descendInputOfBlock(block, 'TOUCHINGOBJECTMENU') }; - case 'sensing_touchingobjectmenu': - return { - kind: 'constant', - value: block.fields.TOUCHINGOBJECTMENU.value - }; case 'sensing_username': return { kind: 'sensing.username' }; - case 'sound_sounds_menu': - return { - kind: 'constant', - value: block.fields.SOUND_MENU.value - }; - - case 'text2speech_menu_languages': - return { - kind: 'constant', - value: block.fields.languages.value - }; - case 'text2speech_menu_voices': - return { - kind: 'constant', - value: block.fields.voices.value - }; - - case 'translate_menu_languages': - return { - kind: 'constant', - value: block.fields.languages.value - }; - case 'tw_getLastKeyPressed': return { kind: 'tw.lastKeyPressed' }; - case 'tw_menu_mouseButton': - return { - kind: 'constant', - value: block.fields.mouseButton.value - }; - case 'videoSensing_menu_ATTRIBUTE': - return { - kind: 'constant', - value: block.fields.ATTRIBUTE.value - }; - case 'videoSensing_menu_SUBJECT': - return { - kind: 'constant', - value: block.fields.SUBJECT.value - }; - case 'videoSensing_menu_VIDEO_STATE': - return { - kind: 'constant', - value: block.fields.VIDEO_STATE.value - }; - - default: - // It might be a block that uses the compatibility layer - if (compatBlocks.inputs.includes(block.opcode)) { - return this.descendCompatLayer(block); + default: { + const opcodeFunction = this.runtime.getOpcodeFunction(block.opcode); + if (opcodeFunction) { + // It might be a block that uses the compatibility layer + if (compatBlocks.inputs.includes(block.opcode)) { + return this.descendCompatLayer(block); + } + } else { + // It might be a menu + const inputs = Object.keys(block.inputs); + const fields = Object.keys(block.fields); + if (inputs.length === 0 && fields.length === 1) { + return { + kind: 'constant', + value: block.fields[fields[0]].value + }; + } } log.warn(`IR: Unknown input: ${block.opcode}`, block); throw new Error(`IR: Unknown input: ${block.opcode}`); } + } } /**