mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
The previous implementation used brute-force approach where the parser made an initial pass scanning the AML bytestream and looking for method declaration opcodes. It then parsed out the method name and arg count and populated a map which was used to detect the number of arguments to be parsed upon encountering a method invocation. This approach proved to be error-prone and would lead to an incorrect parse tree in the following ASL example: Method (FOOF, 1, NotSerialized) { Return ("bar") } Method (TST0, 0, NotSerialized) { FOOF(0) \_SB.FOOF(2, 3) } Scope(\_SB){ // Another FOOF method in \_SB which takes a different arg count Method (FOOF, 2, NotSerialized) { Return ("something") } } In the above example the parser would correctly parse the first FOOF call in TST0 but fail to parse the second invocation since the method name contains a scope. The second invocation would actually yield the following incorrect entity list (arguments appear as sibling entities): Ref(\_SB.FOOF), Const(2), Const(3) The new approach gets rid of the brute-force method and instead modifies the initial parse of the tree not to parse the entities in the AML method bodies but to instead track the start and end offset in the AML stream for the body contents. In the second pass (where the parser normally resolves symbol references), the parser can properly parse the contents of method bodies since the entire AML tree is now known and the parser can use the regular scope lookup rules to find the correct method declaration for the invocation and figure out the argument count it needs to parse.