Package erjang.beam

Source Code of erjang.beam.SymbolicBeamFileData

/**
* This file is part of Erjang - A JVM-based Erlang VM
*
* Copyright (c) 2009 by Trifork
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/

package erjang.beam;

import erjang.EAtom;
import erjang.EList;
import erjang.EObject;
import erjang.ERT;
import erjang.ESeq;
import erjang.ESmall;
import erjang.ETuple;
import erjang.NotImplemented;

import erjang.beam.repr.CodeTables;
import erjang.beam.repr.Insn;

public class SymbolicBeamFileData implements BeamFileData {

  private static final EAtom BEAM_FILE = EAtom.intern("beam_file");
  private static final EAtom MODULE = EAtom.intern("module");
  private static final EAtom EXPORTS = EAtom.intern("exports");
  private static final EAtom ATTRIBUTES = EAtom.intern("attributes");
  private static final EAtom COMP_INFO = EAtom.intern("comp_info");
  private static final EAtom CODE = EAtom.intern("code");

  private EAtom module;
  private ESeq exports;
  private ESeq attributes;
  private ESeq comp_info;
  private ESeq code;

  public SymbolicBeamFileData(ETuple data) {
    assert (data.elm(1) == BEAM_FILE);

    module = data.elm(2).testAtom();
    exports = data.elm(3).testSeq();
    attributes = data.elm(4).testSeq();
    comp_info = data.elm(5).testSeq();
    code = data.elm(6).testSeq();
  }

  public void accept(ModuleVisitor v) {
    v.visitModule(module);

    visit_exports(v);

    visit_attributes(v);

    try {
      for (ESeq exp = (ESeq) code; exp != ERT.NIL; exp = exp.tail()) {
        ETuple fun = (ETuple) exp.head();

        visit_function(v, fun);
      }
    } finally {
      v.visitEnd();
    }
  }

  private void visit_function(ModuleVisitor v, ETuple fun) {

    EAtom name = (EAtom) fun.elm(2);
    int ary = fun.elm(3).asInt();
    int entry = fun.elm(4).asInt();
    EList insns = (EList) fun.elm(5);

    FunctionVisitor fv = v.visitFunction(name, ary, entry);

    visit_insns(insns, fv);

    fv.visitEnd();
  }

  private void visit_insns(EList insns, FunctionVisitor fv) {
    throw new NotImplemented();
    /*
    BlockVisitor bbv = null;

    for (ESeq insn = (ESeq) insns; insn != ERT.NIL; insn = insn.tail()) {

      EObject i = insn.head();

      if (i instanceof EAtom) {
        BeamOpcode opcode = BeamOpcode.get((EAtom) i);
        bbv.visitInsn(opcode, ETuple.make(new EObject[] { i }));

      } else if (i instanceof ETuple) {
        ETuple et = (ETuple) i;
        BeamOpcode opcode = BeamOpcode.get((EAtom) et.elm(1));

        if (opcode == BeamOpcode.label) {
          ESmall label = (ESmall) et.elm(2);

          if (bbv != null) {
            bbv.visitEnd();
          }

          bbv = fv.visitLabeledBlock(label.asInt());
        } else {
          bbv.visitInsn(opcode, et);
        }
      } else {
        throw new IllegalArgumentException();
      }
    }
    if (bbv != null) {
      bbv.visitEnd();
    }
    */
  }

  private void visit_attributes(ModuleVisitor v) {
    for (ESeq exp = (ESeq) attributes; exp != ERT.NIL; exp = exp.tail()) {
      ETuple one = (ETuple) exp.head();
      v.visitAttribute((EAtom) one.elm(1), one.elm(2));
    }
  }

  private void visit_exports(ModuleVisitor v) {
    for (ESeq exp = (ESeq) exports; exp != ERT.NIL; exp = exp.tail()) {
      ETuple one = (ETuple) exp.head();
      v.visitExport((EAtom) one.elm(1), one.elm(2).asInt(), one.elm(3)
          .asInt());
    }
  }

}
TOP

Related Classes of erjang.beam.SymbolicBeamFileData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.