mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
Table of opcodes is incomplete
This commit is contained in:
@@ -127,7 +127,69 @@ TODO
|
||||
|
||||
### Opcodes
|
||||
|
||||
TODO
|
||||
TODO: finish these
|
||||
|
||||
|Toy_Opcode|Value|Description|
|
||||
|---|---|---|
|
||||
|TOY_OP_EOF|0|End of File signal. Used internally as an OK signal.|
|
||||
|TOY_OP_PASS|1|Does nothing - a no-op.|
|
||||
|TOY_OP_ASSERT|2|Pops `rhs`, `lhs`\* from the stack. `rhs` must be a string, identifiers are not accepted. If `lhs` is `null` or `false`, prints `rhs` to the assert output, and cancels the script.|
|
||||
|TOY_OP_PRINT|3|Pops one\* literal from the stack, and prints it to the print output.|
|
||||
|TOY_OP_LITERAL|4|Read one byte as an index; retrieve the given index's literal from the cache, and push it to the stack.|
|
||||
|TOY_OP_LITERAL_LONG|5|Same as `TOY_OP_LITERAL`, except you read two bytes at a time.|
|
||||
|TOY_OP_LITERAL_RAW|6|Pops one literal from the stack. If it's an identifier, explicitly replace it with it's value. Push the literal to the stack.|
|
||||
|TOY_OP_NEGATE|7|Pops one\* literal from the stack. If it's an integer or float\*\*, push the negative value to the stack.|
|
||||
|TOY_OP_ADDITION|8|Pops `rhs`\*, `lhs`\* from the stack. If both are strings, attempts to concatenate them, and push the result to the stack\*\*. Otherwise, will attempt\*\* to add `lhs` to `rhs` (coercing integers to floats if needed), and push the result to the stack.|
|
||||
|TOY_OP_SUBTRACTION|9|Pops `rhs`\*, `lhs`\* from the stack. Attempts\*\* to subtract `rhs` from `lhs` (coercing integers to floats if needed), and push the result to the stack.|
|
||||
|TOY_OP_MULTIPLICATION|10|Pops `rhs`\*, `lhs`\* from the stack. Attempts\*\* to multiply `lhs` by `rhs` (coercing integers to floats if needed), and push the result to the stack.|
|
||||
|TOY_OP_DIVISION|11|Pops `rhs`\*, `lhs`\* from the stack. Attempts\*\* to divide `lhs` by `rhs` (coercing integers to floats if needed), and push the result to the stack.|
|
||||
|TOY_OP_MODULO|12|Pops `rhs`\*, `lhs`\* from the stack. Attempts\*\* to modulo `lhs` by `rhs`, and push the result to the stack.|
|
||||
|TOY_OP_GROUPING_BEGIN|13|Begin operating on a group; analagous to the `(` operator.|
|
||||
|TOY_OP_GROUPING_END|14|Finish operating on a group; analagous to the `)` operator.|
|
||||
|TOY_OP_SCOPE_BEGIN|15|Push an inner-scope onto the stack; analogous to the `{` operator.|
|
||||
|TOY_OP_SCOPE_END|16|Push an inner-scope off of the stack; analogous to the `}` operator.|
|
||||
|TOY_OP_TYPE_DECL|17|Not used.|
|
||||
|TOY_OP_TYPE_DECL_LONG|18|Not used.|
|
||||
|TOY_OP_VAR_DECL|19|Read one byte, retrieving that literal from the cache as `identifier`, and then read the next byte, retrieving that literal from the cache as `type`. Attempt\*\* to declare a variable with `identifier` as its name and `type` as its type, then pop the top of the stack\* as it's value (cooerce integer values to floats if `type` specifies a float).|
|
||||
|TOY_OP_VAR_DECL_LONG|20|Same as `TOY_OP_VAR_DECL`, except you read two bytes at a time.|
|
||||
|TOY_OP_FN_DECL|21|Read one byte, retrieving that literal from the cache as `identifier`, and then read the next byte, retrieving that literal from the cache as `function`. Attempt\*\* to declare a variable with `identifier` as its name and `fn const` as it's type, then set `function` as its value. The function's scope has the current scope as its ancestor.|
|
||||
|TOY_OP_FN_DECL_LONG|22|Same as `TOY_OP_FN_DECL`, except you read two bytes at a time.|
|
||||
|TOY_OP_VAR_ASSIGN|23|Pops `rhs`*, `lhs` from the stack. `lhs` must be an identifier. Attempts\*\* to store the value of `rhs`, with `lhs` as it's identifier.|
|
||||
|TOY_OP_VAR_ADDITION_ASSIGN|24|Equivilent of `TOY_OP_ADDITION` followed by `TOY_OP_VAR_ASSIGN`.|
|
||||
|TOY_OP_VAR_SUBTRACTION_ASSIGN|25|Equivilent of `TOY_OP_SUBTRACTION` followed by `TOY_OP_VAR_ASSIGN`.|
|
||||
|TOY_OP_VAR_MULTIPLICATION_ASSIGN|26|Equivilent of `TOY_OP_MULTIPLICATION` followed by `TOY_OP_VAR_ASSIGN`.|
|
||||
|TOY_OP_VAR_DIVISION_ASSIGN|27|Equivilent of `TOY_OP_DIVISION` followed by `TOY_OP_VAR_ASSIGN`.|
|
||||
|TOY_OP_VAR_MODULO_ASSIGN|28|Equivilent of `TOY_OP_MODULO` followed by `TOY_OP_VAR_ASSIGN`.|
|
||||
|TOY_OP_TYPE_CAST|29|Pops `val`\*, `type`\* from the stack. Attempts** to change the type of `val` to `type`, and push the result to the stack. Only works on `bool`, `int`, `float` and `string` types, and only if the value is in the correct format.|
|
||||
|TOY_OP_TYPE_OF|30|Pops `rhs` from the stack. If `rhs` is an identifier, it determines the the type of the variable specified, otherwise it determines the type of `rhs` directly. The result is pushed to the stack.|
|
||||
|TOY_OP_IMPORT|31|Pops `alias` and `identifier` from the stack. Attempts\*\* to invoke a hook specified by `identifier`, with the given `alias`.|
|
||||
|TOY_OP_EXPORT_removed|32|Removed.|
|
||||
|TOY_OP_INDEX|33|Pops `third`\*, `second`\*, `first`\* and `compound`\* from the stack. Pushes the value specified by `compound[first : second : third]` onto the stack.
|
||||
|TOY_OP_INDEX_ASSIGN|34|Pops `assign`\*, `third`\*, `second`\*, `first`\* and `compound`\* from the stack. Sets the value specified by `compound[first : second : third]` to be `assign`.|
|
||||
|TOY_OP_INDEX_ASSIGN_INTERMEDIATE|35|Due to the unfortunately bonkers nature of indexing, this is needed as part of `TOY_OP_INDEX_ASSIGN`. It acts the same as `TOY_OP_INDEX`, but leaves an additional copy of some variables on the stack for `TOY_OP_INDEX_ASSIGN` to process.
|
||||
|TOY_OP_DOT|36|
|
||||
|TOY_OP_COMPARE_EQUAL|37|
|
||||
|TOY_OP_COMPARE_NOT_EQUAL|38|
|
||||
|TOY_OP_COMPARE_LESS|39|
|
||||
|TOY_OP_COMPARE_LESS_EQUAL|40|
|
||||
|TOY_OP_COMPARE_GREATER|41|
|
||||
|TOY_OP_COMPARE_GREATER_EQUAL|42|
|
||||
|TOY_OP_INVERT|43|
|
||||
|TOY_OP_AND|44|
|
||||
|TOY_OP_OR|45|
|
||||
|TOY_OP_JUMP|46|
|
||||
|TOY_OP_IF_FALSE_JUMP|47|
|
||||
|TOY_OP_FN_CALL|48|
|
||||
|TOY_OP_FN_RETURN|49|
|
||||
|TOY_OP_POP_STACK|50|
|
||||
|TOY_OP_TERNARY|51|
|
||||
|TOY_OP_FN_END|52|
|
||||
|TOY_OP_SECTION_END|255|
|
||||
|TOY_OP_PREFIX|256|Used internally.|
|
||||
|TOY_OP_POSTFIX|257|Used internally.|
|
||||
|
||||
\*If this literal is an identifier, it is instead replaced with the correct given value from the current scope.
|
||||
\*\*On failure, the script will print an error message to the error output and exit.
|
||||
|
||||
## Function Internal Structure
|
||||
|
||||
|
||||
Reference in New Issue
Block a user