Jump to content

Recommended Posts

Posted
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.

Posted (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 by MasterToma
Posted (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 by verbrannt
Posted (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 by MasterToma
Posted
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.

Posted (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 by MasterToma
Posted (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 by verbrannt
Posted (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 by MasterToma
Posted (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 by verbrannt
Posted (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 by MasterToma
Posted

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.

Posted (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 by MasterToma
Posted (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 by verbrannt

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...