/src/org/ooc/backend/cdirty/CastWriter.java

http://github.com/nddrylliog/ooc · Java · 51 lines · 43 code · 7 blank · 1 comment · 8 complexity · 8bfdaae873024e31266f17e203c38b89 MD5 · raw file

  1. package org.ooc.backend.cdirty;
  2. import java.io.IOException;
  3. import org.ooc.frontend.model.ArrayAccess;
  4. import org.ooc.frontend.model.Cast;
  5. import org.ooc.frontend.model.Expression;
  6. import org.ooc.frontend.model.VariableAccess;
  7. public class CastWriter {
  8. public static void write(Cast cast, CGenerator cgen) throws IOException {
  9. if(cast.getType().equals(cast.getInner().getType())) {
  10. cast.getInner().accept(cgen);
  11. return;
  12. }
  13. if(cast.getInner().getType().isGeneric() && cast.getInner().getType().getPointerLevel() == 0) {
  14. Expression expr = cast.getInner();
  15. if(expr instanceof VariableAccess) {
  16. VariableAccess access = (VariableAccess) expr;
  17. cgen.current.app("*((");
  18. cast.getType().accept(cgen);
  19. cgen.current.app("*)(");
  20. AccessWriter.write(access, false, cgen);
  21. cgen.current.app("))");
  22. return;
  23. } else if(expr instanceof ArrayAccess) {
  24. ArrayAccess access = (ArrayAccess) expr;
  25. cgen.current.app("*((");
  26. cast.getType().accept(cgen);
  27. cgen.current.app("*) (");
  28. access.getVariable().accept(cgen);
  29. cgen.current.app(" + ");
  30. // FIXME that's.. probably not quite right =)
  31. assert(access.getIndices().size() == 1);
  32. access.getIndices().getFirst().accept(cgen);
  33. cgen.current.app(" * ").app(cast.getType().getMangledName());
  34. cgen.current.app("_class()->size))");
  35. return;
  36. }
  37. }
  38. cgen.current.app("((");
  39. cast.getType().accept(cgen);
  40. cgen.current.app(") (");
  41. cast.getInner().accept(cgen);
  42. cgen.current.app("))");
  43. }
  44. }