Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package codegeneration;
- import ast.definition.FuncDefinition;
- import ast.definition.VarDefinition;
- import ast.statement.Statement;
- import ast.type.FunctionType;
- import ast.type.RecordField;
- import ast.type.RecordType;
- import visitor.TraversingVisitor;
- public class OffsetVisitor extends TraversingVisitor {
- private int globalBytes = 0, localBytes = 0;
- //Parameters offset
- @Override
- public Object visit (FunctionType f, Object o) {
- localBytes = 0;
- super.visit(f, o);
- for(int i = f.getParameters().size()-1; i >= 0 ; i--) {
- f.getParameters().get(i).setOffset(f.bytesParamsSum);
- f.bytesParamsSum += f.getParameters().get(i).getType().numberOfBytes();
- }
- return null;
- }
- //Record fields offset
- @Override
- public Object visit (RecordType rt, Object o) {
- super.visit(rt, o);
- int fieldsBytes = 0;
- for(RecordField field : rt.getFields()) {
- field.setOffset(fieldsBytes);
- fieldsBytes+=field.getFieldType().numberOfBytes();
- }
- return null;
- }
- //Variables offset
- @Override
- public Object visit (VarDefinition v, Object o) {
- super.visit(v, o);
- //Global variables
- if(v.getScope() == 0) {
- v.setOffset(globalBytes);
- globalBytes+=v.getType().numberOfBytes();
- }
- //Local variables are computed inside function definition
- return null;
- }
- @Override
- public Object visit (FuncDefinition fd, Object o) {
- super.visit(fd, o);
- //Go over all the variables and traverse with this offset visitor.
- for(Statement s : fd.getStatements())
- if(s instanceof VarDefinition)
- ((VarDefinition) s).setOffset(localBytes -= ((VarDefinition) s).getType().numberOfBytes());
- fd.getType().bytesLocalSum = localBytes;
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement