cast.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. var Type = require("type.js");
  2. var ArrayType = Type.Array;
  3. var PointerType = Type.Pointer;
  4. function implicitCast(from, to){
  5. if (from == to)
  6. return true;
  7. //if (from instanceof VarParameter)
  8. // return implicitCast(from.type(), (to instanceof VarParameter) ? to.type() : to);
  9. if ((to === Type.basic.char) && (from instanceof Type.String)){
  10. var v = from.asChar();
  11. if (v !== undefined)
  12. return true;
  13. }
  14. else if (from instanceof ArrayType && to instanceof ArrayType)
  15. return implicitCast(from.elementsType(), to.elementsType());
  16. else if (from instanceof PointerType && to instanceof PointerType){
  17. toR = to.baseType();
  18. fromR = from.baseType();
  19. while (fromR && fromR != toR)
  20. fromR = fromR.baseType();
  21. if (fromR)
  22. return true;
  23. }
  24. else if (from == Type.nil
  25. && (to instanceof PointerType || to.isProcedure()))
  26. return true;
  27. else if (from.isProcedure() && to.isProcedure()){
  28. var fromArgs = from.arguments();
  29. var toArgs = to.arguments();
  30. if (fromArgs.length == toArgs.length){
  31. for(var i = 0; i < fromArgs.length; ++i){
  32. var fromArg = fromArgs[i];
  33. var toArg = toArgs[i];
  34. if (toArg.isVar != fromArg.isVar)
  35. return false;
  36. if ((toArg.type != to || fromArg.type != from)
  37. && !implicitCast(fromArg.type, toArg.type))
  38. return false;
  39. }
  40. var fromResult = from.result();
  41. var toResult = to.result();
  42. if (toResult == to && fromResult == from)
  43. return true;
  44. if (implicitCast(fromResult, toResult))
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50. exports.implicit = implicitCast;