verbrannt Posted July 17, 2018 Author Posted July 17, 2018 18 minutes ago, MasterToma said: Ok, now it works Fix of the select with one case in master. 18 minutes ago, MasterToma said: 1. (4*(talker.param2 % 10)) Modulo precedence fix in master. 19 minutes ago, MasterToma said: 2. ((Rand(3)+1)*4) This only will be problem if multiplication in NASC compiler has the same precedence as addition. 18 minutes ago, MasterToma said: if (a && c || d) This only will be problem if OR has the same precedence as AND.
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) 12 minutes ago, verbrannt said: This only will be problem if multiplication in NASC compiler has the same precedence as addition. This only will be problem if OR has the same precedence as AND. I understand it. But some of cases might like like with modulo. I wouldn't noticed difference in if (a && c || d) if NASC would generated same code. Could you please also add bracers for all nested expressions? According to leaked code, all nested expressions have (). I'm not sure about such thing as precedence in script-engine, I could show you their VM code, where arguments only taken from stack in such and order in which compiler pasted them. And NASC pasted them in opposite order :) (as I wrote in recent post) Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 (edited) 12 minutes ago, MasterToma said: I understand it. But some of cases might like like with modulo. With modulo was different case. Modulo has same precedence as multiplication and division. 12 minutes ago, MasterToma said: I wouldn't noticed difference in if (a && c || d) if NASC would generated same code. I've tested it: 1 && 2 || 3; (1 && 2) || 3; 1 || 2 && 3; 1 || (2 && 3); 1 && (2 || 3); (1 || 2) && 3; First two lines compiles in absolutely identical stack machine code. Also line 3 == line 4. 12 minutes ago, MasterToma said: According to leaked code, all nested expressions have () It's because the decompiler, that was used to produce that leaked code, has no checks of operator precedence. It just adds braces everywhere after each operands pop from stack. Edited July 17, 2018 by verbrannt
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) I never used shitty NASC decompilers :D No, Scripts from C0 were leaked. Real one with comments, etc. You should know it. Okay, I will find good example, where OBJ code differs. Or if you don't want to hear about bugs, just say it clearly ;) I'm comparing two obj's with diff, so code differs... And Im trying to find good example, like with modulo Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 6 minutes ago, MasterToma said: Or if you don't want to hear about bugs, just say it clearly ;) Idk what you're talking about :) I've fixed every bug from your feedback, even not bugs (like increment/decrement & select with one case). When you'll find another different obj code of course if will fix that.
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) Okay then... so as I told, nested bracers change resulted ai.obj Try this one (output https://pastebin.com/6Su1S470) EventHandler TALK_SELECTED(talker) { if ( HaveMemo(talker, @trial_of_scholar)==1 && OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1) { AddChoice(0,"Mention what Raut said"); } } and with additional bracers EventHandler TALK_SELECTED(talker) { if ( HaveMemo(talker, @trial_of_scholar)==1 && (OwnItemCount(talker, @dieters_diary) >= 1 || OwnItemCount(talker, @scripture_chapter_1) >= 1 || OwnItemCount(talker, @strong_liquor) >= 1)) { AddChoice(0,"Mention what Raut said"); } } https://pastebin.com/JL3sWgyz (output) Scroll to the end in pastebin, to see the difference The same in complex cases with + and * Take into account, that NASC is actually simple stream translator, so it doesn't have (almost) context like AST. It translates line by line (with special handling of loops and if/else) Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 (edited) 17 minutes ago, MasterToma said: so as I told, nested bracers change resulted ai.obj Yes, of course. I know this. I've tried compile-decompile-recompile this code class guard_babenco { handler: EventHandler TALK_SELECTED(talker) { if (1 && 2 || 3 || 4) { Say("Hello"); } if (1 && (2 || 3 || 4)) { Say("Hello"); } } } And nothing changed. I've got same obj file as before decompilation. But if you have any unfixed example of broken nesting of logical operators, provide an obj. Of course if in OBJ we have something like 1 && (2 || 3 || 4) but after decompilation got 1 && 2 || 3 || 4 - it's a bug, and I need example. But if we have (1 && 2) || 3 || 4 in OBJ and after decompilation got 1 && 2 || 3 || 4 - it's not a bug. Edited July 17, 2018 by verbrannt
MasterToma Posted July 17, 2018 Posted July 17, 2018 I think, I've provided it in recent post. Both, script code and 2 obj. results (links to pastebin)
MasterToma Posted July 17, 2018 Posted July 17, 2018 I've compiled your code with C1 NASC. Left - no bracers, right - with bracers.
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) Quote But if you have any unfixed example of broken nesting of logical operators, provide an obj. I sent you ai.obj from C1. Being decompiled (bracers are missed) and compiled back, ai.obj with mixed and/or is produced. I pasted in my recent posts. I have about 35 classes with such case. You can check drunkard_treaf for instance Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 (edited) 1 hour ago, MasterToma said: You can check drunkard_treaf for instance Ok here I see difference. Looks like not logical operators bug, but IF statement bug. Also if c1 ai.obj was compiled with another compiler than you have, this differences can occur. Anyway original OBJ and recompiled OBJ produces same decompiled code. Do you have leaked (original) source of this class? UPD original code that produces identical to your ai.obj result: (HaveMemo(talker, @trial_of_scholar) == 1 && (OwnItemCount(talker, @dieters_diary) >= 1 && OwnItemCount(talker, @scripture_chapter_1) >= 1 && OwnItemCount(talker, @strong_liquor) >= 1)) So there's useless braces in the original ai.obj. Edited July 17, 2018 by verbrannt
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) Looks like we lost and talking about different things. I really understand, that if there are only &&, no point in extra bracers... belive me, because I've decompiled most of L2, and it works (including NASC itself). But this info about extra scope () is present in ai.obj. I posted examples, where you can see the difference. I posted the difference in pastebin. NASC generates DIFFERENT code for (a && (b && c)) and for (a && b && c). But decompiler restores them in SAME way - no bracers. I don't know how to be more clear. I have two concerns about it. First - messed diff. I can't compare original and recompiled objs due to much more trash. Second - there is might be some weird context, which might lead to bug. OK, never-mind, you did great job anyway. I have at least two more bugs apart this: 1. some jump is just missed. Have no idea, but in original class's obj there is just 1 more jump instruction. I can't say nothing concrete, because diff produces too much mismatches due to my previous point. Could you just add those bracers? Or point me the function and I'll fix it by my own maybe :) 2. in some classes (e.g. pet_manager_martin) push_event // i5 push_const 212 add instead of push_reg_sp fetch_i Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 Original OBJ + Decompiled source + Recompiled OBJ: https://mega.nz/#!SSJ0FQ7L!EPXTDOTcGmy4QGJPIgZ7jMY7-AVQ9pcq_xfEHilwJzQ Almost no differences. Only missed jump, as you mentioned. Replaces made on both OBJs: L\d+ -> L0 S\d+ -> L0 \r\nL0\r\n -> \r\n Hope you would like the "((((((((((((((((((((((((((((((((((((((((" in decompiled source :D.
MasterToma Posted July 17, 2018 Posted July 17, 2018 (edited) Well I think it's not so hard to do proper (), if this info present in ai.obj. But I understand your sarcasm. Why should I replace labels If I ignore them during diff? I have 35 files with differences (labels are ignored, and few more filters are ignored), but you don't want to hear :) And it's not "only jump" Okay I will fix it manually, not a big deal. Tnx for your work, this decompiler at least somehow usefull Edited July 17, 2018 by MasterToma
verbrannt Posted July 17, 2018 Author Posted July 17, 2018 (edited) 47 minutes ago, MasterToma said: And it's not "only jump" I've shared compiled OBJs right before your post. There's only 19 differences, and all is missing jump. Those missing jumps might be a breaks inside if inside select. I have an old issue for it. Idk, may be we're using different decompilers or something :) Anyway, smiles mode now enabled by default in branch c1-support. And you have only 35 files of 2200, I think it's not so bad. Edited July 17, 2018 by verbrannt
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now