Changeset 2351


Ignore:
Timestamp:
Feb 8, 2007, 6:41:54 PM (14 years ago)
Author:
yura
Message:
  • Advances in Java-bytecode generation.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/compiler/rfp_asail_jbc.rf

    r2347 r2351  
    3333$box Res-Assigns;
    3434
    35 $table Iter-Vars;
    36 
    3735$func Module-To-JBC s.cw e.module = ;
    3836
     
    4543$func Expr-Int-To-JBC e.ASAIL-Expr-Int = ;
    4644
    47 $func Step-To-JBC e.step-operators = e.java-step-operators;
     45$func Step-To-JBC e.step-operators = ;
    4846
    4947$func Const-Expr-To-JBC e.ASAIL-const-expr = e.aux-arrays (e.JAVA-const-expr);
     
    5149$func Expr-Args-To-JBC e.args = e.aux-arrays (e.java-args);
    5250
    53 $func Int-Args-To-JBC s.acc e.args = e.java-args;
    54 
    5551$func Symbol-To-JBC s.RFP-Symbol = e.JAVA-String;
    5652
     
    5955$func Var-To-JBC t.var = ;
    6056
    61 $func Cond-To-JBC s.acc e.cond = e.JAVA-Cond;
     57$func Cond-To-JBC t.cond = s.if;
    6258
    6359$func Infix-To-JBC s.func-for-converting-args-to-java s.op e.args = ;
     
    7369RFP-ASAIL-To-JBC (e.module-name) (e.package) (e.exports) e.module =
    7470  <Store &Free-Idx>,
    75   <RFP-Clear-Table &Iter-Vars>,
    7671  <RFP-Clear-Table &Inputs>,
    7772  {
     
    109104
    110105$table Vars;
     106$table Iter-Vars;
    111107$box Var-Idx;
    112108
     
    114110$func Bind-Var s.type t.var = s.i;
    115111$func Lookup-Var t.var = s.type s.i;
     112$func Bind-Iter-Var e.expr t.var1 t.var2 = s.i;
     113$func Lookup-Iter-Var e.expr = s.i s.i1 s.i2;
    116114
    117115Bind-Vars s.type e.vars =
     
    124122Bind-Var s.type t.var =
    125123  <? &Var-Idx> : s.i,
     124  <Store &Var-Idx <"+" s.i 1>>,
    126125  <Bind &Vars (t.var) (s.type s.i)>,
     126  s.i;
     127
     128Lookup-Var t.var = <Lookup &Vars t.var> : s.type s.i = s.type s.i;
     129
     130Bind-Iter-Var e.expr t.var1 t.var2 =
     131  <? &Var-Idx> : s.i,
    127132  <Store &Var-Idx <"+" s.i 1>>,
     133  <Bind-Var Expr t.var1> :: s.i1,
     134  <Bind-Var Expr t.var2> :: s.i2,
     135  <Bind &Iter-Vars (e.expr) (s.i s.i1 s.i2)>,
    128136  s.i;
    129137
    130 Lookup-Var t.var = {
    131   <Lookup &Vars t.var> : s.type s.i = s.type s.i;
    132   Expr 0; // TODO - remove
    133 };
     138Lookup-Iter-Var e.expr = <Lookup &Iter-Vars e.expr> : s.i s.i1 s.i2 = s.i s.i1 s.i2;
     139
    134140
    135141$table Labels;
     
    159165      } : s.retType,
    160166      <Clear-Table &Vars>,
     167      <Clear-Table &Iter-Vars>,
     168      <Clear-Table &Labels>,
    161169      <Store &Var-Idx 0>,
    162170      <Bind-Vars Expr e.args>,
    163171      <Bind-Vars Result e.ress>,
    164       <Clear-Table &Labels>,
    165172      <"+" &"ACC_STATIC" <Access-Mode t.name>> :: s.accessMode,
    166173      <To-Word <Name-To-JBC t.name>> :: s.funcName,
     
    173180        FUNC? = <MVvisitInsn <MV> &"ICONST_1"> <MVvisitInsn <MV> &IRETURN>;
    174181      },
     182        <MVvisitMaxs <MV> 0 0>,
    175183      <MVvisitEnd <MV>>;
    176184    (CONSTEXPR s.linkage t.name (e.comment) e.expr) =
     
    207215    (DECL s.type t.var) =
    208216      <Bind-Var s.type t.var> :: s.i,
    209       {
    210         s.type : Result =
     217      s.type : {
     218        Result =
    211219          <MVvisitTypeInsn <MV> &NEW "org/refal/plus/Expr">,
    212220          <MVvisitInsn <MV> &DUP>,
    213221          <MVvisitMethodInsn <MV> &INVOKESPECIAL "org/refal/plus/Result" "<init>" "()V">,
    214222          <MVvisitVarInsn <MV> &ASTORE s.i>;
    215         <MVvisitFieldInsn <MV> &GETSTATIC "org/refal/plus/Expr" "empty" "Lorg/refal/plus/Expr;">,
     223        Expr =
     224          <MVvisitFieldInsn <MV> &GETSTATIC "org/refal/plus/Expr" "empty" "Lorg/refal/plus/Expr;">,
    216225          <MVvisitVarInsn <MV> &ASTORE s.i>;
    217226      };
    218     RETFAIL = <MVvisitInsn <MV> &"ICONST_0"> <MVvisitInsn <MV> &IRETURN>;
    219     (IF (e.cond) e.body) =
    220       <Box> :: s.acc,
    221       <Cond-To-JBC s.acc e.cond> :: e.j-cond,
    222       {
    223         e.cond : (NOT (CALL e)) =
    224           () (<? &Res-Assigns> <Store &Res-Assigns /*empty*/>);
    225         (<? &Res-Assigns> <Store &Res-Assigns /*empty*/>) ();
    226       } :: (e.if-yes-assigns) (e.if-not-assigns),
    227       <? s.acc>
    228       ('if ('e.j-cond')')
    229       ('{' (
    230         e.if-yes-assigns
    231         <ASAIL-To-JBC-Temp e.body>
    232       )'}' )
    233       e.if-not-assigns : e;
    234     (FOR (e.cont-label) (e.break-label) (e.cond) (e.step) e.body) =
     227    (ASSIGN t.var e.expr) =
     228      <Lookup-Var t.var> :: s.type s.i,
     229      s.type : {
     230        Result =
     231          <MVvisitVarInsn <MV> &ALOAD s.i>,
     232          <Expr-Ref-To-JBC e.expr>,
     233          <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Result" "assign" "(Lorg/refal/plus/Expr;)V">;
     234        Expr =
     235          <Expr-Ref-To-JBC e.expr>,
     236          <MVvisitVarInsn <MV> &ASTORE s.i>;
     237      };
     238    (INT t.var e.expr) =
     239      <Bind-Var Int t.var> :: s.i,
     240      <Expr-Int-To-JBC e.expr>,
     241      <MVvisitVarInsn <MV> &ISTORE s.i>;
     242    (EXPR t.var e.expr) =
     243      <Bind-Var Expr t.var> :: s.i,
     244      <Expr-Ref-To-JBC e.expr>,
     245      <MVvisitVarInsn <MV> &ASTORE s.i>;
     246    (DEREF t.var e.expr (e.pos)) =
     247      <Bind-Var Expr t.var> :: s.i,
     248      <Expr-Ref-To-JBC e.expr>,
     249      <Expr-Int-To-JBC e.pos>,
     250      <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "at" "(I)Ljava/lang/Object;">,
     251      <MVvisitTypeInsn <MV> &CHECKCAST "org/refal/plus/Expr">,
     252      <MVvisitVarInsn <MV> &ASTORE s.i>;
     253    (SUBEXPR t.var e.expr (e.pos) (e.len)) =
     254      <Bind-Var Expr t.var> :: s.i,
     255      <MVvisitTypeInsn <MV> &NEW "org/refal/plus/Expr">,
     256      <MVvisitInsn <MV> &DUP>,
     257      <Expr-Ref-To-JBC e.expr>,
     258      <Expr-Int-To-JBC e.pos>,
     259      <Expr-Int-To-JBC e.len>,
     260      <MVvisitMethodInsn <MV> &INVOKESPECIAL "org/refal/plus/Expr" "<init>" "(Lorg/refal/plus/Expr;II)V">,
     261      <MVvisitVarInsn <MV> &ASTORE s.i>;
     262    (LSPLIT t.name (e.min) t.var1 t.var2) =
     263      <Bind-Iter-Var t.name t.var1 t.var2> :: s.i,
     264      <Expr-Ref-To-JBC t.name>,
     265      <Expr-Int-To-JBC e.min>,
     266      <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "leftSplit" "(I)Lorg/refal/plus/Expr$SplitIterator;">,
     267      <MVvisitVarInsn <MV> &ASTORE s.i>;
     268    (RSPLIT t.name (e.min) t.var1 t.var2) =
     269      <Bind-Iter-Var t.name t.var1 t.var2> :: s.i,
     270      <Expr-Ref-To-JBC t.name>,
     271      <Expr-Int-To-JBC e.min>,
     272      <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "rightSplit" "(I)Lorg/refal/plus/Expr$SplitIterator;">,
     273      <MVvisitVarInsn <MV> &ASTORE s.i>;
     274    (IF-INT-CMP s.op (e.arg1) (e.arg2) e.body) =
     275      <Label> :: s.label,
     276      <Expr-Int-To-JBC e.arg1>,
     277      <Expr-Int-To-JBC e.arg2>,
     278      s.op : {
     279        "!=" = &"IF_ICMPEQ";
     280        "<" = &"IF_ICMPGE";
     281        ">" = &"IF_ICMPLE";
     282      } :: s.op,
     283      <MVvisitJumpInsn <MV> s.op s.label>,
     284      <ASAIL-To-JBC e.body>,
     285      <MVvisitLabel <MV> s.label>;
     286    (IF t.cond e.body) =
     287      <Label> :: s.label,
     288      <Cond-To-JBC t.cond> :: s.if,
     289      <MVvisitJumpInsn <MV> s.if s.label>,
     290      <ASAIL-To-JBC e.body>,
     291      <MVvisitLabel <MV> s.label>;
     292    (FOR (e.cont-label) (e.break-label) () (e.step) e.body) =
    235293      {
    236294        e.cont-label : t.label = <Bind-Label t.label>;
     
    243301      <Label> :: s.for-label,
    244302      <MVvisitLabel <MV> s.for-label>,
    245       //<Cond-To-JBC s.acc e.cond> : e,
    246       <MVvisitJumpInsn <MV> &IFEQ s.break-label>,
     303      {
     304        e.step : (s.tag e.expr), s.tag : \{ INC-ITER; DEC-ITER; } =
     305          <Lookup-Iter-Var e.expr> : s.i s.i1 s.i2,
     306          <MVvisitVarInsn <MV> &ALOAD s.i>,
     307          <MVvisitInsn <MV> &DUP>,
     308          <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr$SplitIterator" "getLeft" "()Lorg/refal/plus/Expr;">,
     309          <MVvisitVarInsn <MV> &ASTORE s.i1>,
     310          <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr$SplitIterator" "getRight" "()Lorg/refal/plus/Expr;">,
     311          <MVvisitVarInsn <MV> &ASTORE s.i2>;;
     312      },
    247313      <ASAIL-To-JBC e.body>,
    248314      <MVvisitLabel <MV> s.cont-label>,
    249       //<Step-To-JBC e.step> : e,
     315      <Step-To-JBC e.step>,
    250316      <MVvisitJumpInsn <MV> &GOTO s.for-label>,
    251317      <MVvisitLabel <MV> s.break-label>;
     
    256322    (s.tag t.label), s.tag : \{ CONTINUE; BREAK; } =
    257323      <MVvisitJumpInsn <MV> &GOTO <Lookup-Label t.label>>;
     324    RETFAIL = <MVvisitInsn <MV> &"ICONST_0"> <MVvisitInsn <MV> &IRETURN>;
    258325    (TRY e.body) =
    259326      ('try') ('{' (
     
    271338    FATAL =
    272339      ('throw new RefalException ("'<? &Module-Name>'", "'<? &Func-Name>'", "Unexpected fail");') : e;
    273     (LSPLIT t.name (e.min) t.var1 t.var2) =
    274       <Expr-Ref-To-JBC t.name>;/* :: e.a (e.n),
    275       '_va_' <Free-Index> :: e.new-var,
    276       <Bind &Iter-Vars (t.name) (e.new-var t.var1 t.var2)>,
    277       <Box> :: s.acc,
    278       <Expr-Int-To-JBC s.acc e.min> :: e.min,
    279       e.a <? s.acc>
    280       ('Expr.SplitIterator 'e.new-var' = 'e.n'.leftSplit('e.min');') : e;*/
    281     (RSPLIT t.name (e.min) t.var1 t.var2) =
    282       <Expr-Ref-To-JBC t.name>;/* :: e.a (e.n),
    283       '_va_' <Free-Index> :: e.new-var,
    284       <Bind &Iter-Vars (t.name) (e.new-var t.var1 t.var2)>,
    285       <Box> :: s.acc,
    286       <Expr-Int-To-JBC s.acc e.min> :: e.min,
    287       e.a <? s.acc>
    288       ('Expr.SplitIterator 'e.new-var' = 'e.n'.rightSplit('e.min');') : e;*/
    289     (ASSIGN t.var e.expr) =
    290       <Expr-Ref-To-JBC e.expr>; /*:: e.a (e.j-expr),
    291       {
    292         <? &Ress> : e t.var e =
    293           e.a (<Rfp2Java t.var>'.assign ('e.j-expr');');
    294         e.a (<Lookup &Result t.var>'.assign ('e.j-expr');');
    295         e.a (<Rfp2Java t.var>' = 'e.j-expr';');
    296       } : e;*/
    297     (INT t.var e.expr) =
    298       <Expr-Int-To-JBC e.expr>;/* :: e.expr,
    299       <? s.acc> ('int '<Rfp2Java t.var>' = 'e.expr';') : e;*/
    300     (EXPR t.var e.expr) =
    301       <Expr-Ref-To-JBC e.expr>; /* :: e.a (e.j-expr),
    302       e.a ('Expr '<Rfp2Java t.var>' = 'e.j-expr';') : e;*/
    303     (DEREF t.var e.expr (e.pos)) =
    304       <Expr-Ref-To-JBC e.expr>; /* :: e.a (e.j-expr),
    305       <Box> :: s.acc,
    306       <Expr-Int-To-JBC s.acc e.pos> :: e.pos,
    307       e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = (Expr) 'e.j-expr'.at ('e.pos');') : e;*/
    308     (SUBEXPR t.var e.expr (e.pos) (e.len)) =
    309       <Expr-Ref-To-JBC e.expr>,
    310       <Expr-Int-To-JBC e.pos>,
    311       <Expr-Int-To-JBC e.len>;
    312       //e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = new Expr ('e.j-expr', 'e.pos', 'e.len');') : e;
    313     (DROP t.var) =
    314       (<Var-To-JBC t.var>'.drop ();') : e;
    315340    (ERROR e.expr) =
    316341      <Expr-Ref-To-JBC e.expr>;
     
    418443};
    419444
    420 Cond-To-JBC s.acc expr = expr : {
    421   /*empty*/ = /*empty*/;
    422   (CALL t.name (e.args) (e.ress)) =
    423     <Declare-Results (e.ress)> :: e.decls (e.ress),
    424     <Expr-Args-To-JBC e.args Result e.ress> :: e.arrays (e.args),
    425     <Put s.acc e.arrays e.decls>,
    426     <Name-To-JBC t.name>' ('e.args')';
    427   (SYMBOL? e.expr (e.pos)) =
    428     <Expr-Ref-To-JBC e.expr>;/* :: e.a (e.j-expr),
    429     <Put s.acc e.a>,
    430     e.j-expr'.symbolAt ('<Expr-Int-To-JBC s.acc e.pos>')';*/
    431   (CHECK-ITER e.expr) = ;
    432     //<Middle 0 2 <Lookup &Iter-Vars e.expr>>'.isValid ()';
    433   (EQ e.expr1 (e.expr2) (e.pos)) =
    434     <Expr-Ref-To-JBC e.expr1>,// :: e.a1 (e.j-expr1),
    435     <Expr-Ref-To-JBC e.expr2>;/* :: e.a2 (e.j-expr2),
    436     <Put s.acc e.a1 e.a2>,
    437     e.j-expr1'.eq ('e.j-expr2', '<Expr-Int-To-JBC s.acc e.pos>')'; */
    438   (TERM-EQ e.expr1 (e.expr2) (e.pos)) =
    439     <Expr-Ref-To-JBC e.expr1>,// :: e.a1 (e.j-expr1),
    440     <Expr-Ref-To-JBC e.expr2>;/* :: e.a2 (e.j-expr2),
    441     <Put s.acc e.a1 e.a2>,
    442     e.j-expr1'.eq ('e.j-expr2', '<Expr-Int-To-JBC s.acc e.pos> ')'; */
    443   (NOT e.cond) =
    444     '!' <Cond-To-JBC s.acc e.cond> : e;
    445   (INFIX s.op e.args) =
    446     {
    447       s.op : \{ "+"; "-"; "%"; "*"; "/"; },
    448         <Infix-To-JBC &Expr-Int-To-JBC s.op e.args>' != 0' : e;
    449       s.op : \{ "&&"; "||"; },
    450         <Infix-To-JBC &Cond-To-JBC s.op e.args>;
    451       s.op : \{ "<"; ">"; "<="; ">="; "=="; "!="; },
    452         <Infix-To-JBC &Expr-Int-To-JBC s.op e.args>;
    453     };
    454   expr = '(' <Infix-To-JBC s.acc &Cond-To-JBC "&&" <Paren expr>> ')';
    455 };
    456 
    457445Infix-To-JBC s.arg2java s.op (e.arg) e.args =
    458446  s.op : \{
     
    462450    "*" = &IMUL;
    463451    "/" = &IDIV;
    464     s = &IAND;
    465452  } :: s.jbcop,
    466453  <Apply s.arg2java e.arg> : e,
     
    472459  };
    473460
     461Cond-To-JBC {
     462  (CALL-FAILS (CALL t.name (e.exprs) (e.ress))) = &IFEQ; /*
     463    '!RF_CALL (' <Name-To-CPP t.name> ', '
     464          <Args-To-CPP () Exprs e.exprs> ', '
     465          <Args-To-CPP () Vars e.ress>   ')';*/
     466  (SYMBOL? e.expr (e.pos)) =
     467    <Expr-Ref-To-JBC e.expr>,
     468    <Expr-Int-To-JBC e.pos>,
     469    <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "symbolAt" "(I)Z">,
     470    &IFEQ;
     471  (ITER-FAILS e.expr) =
     472    <Lookup-Iter-Var e.expr> :: s.i s s,
     473    <MVvisitVarInsn <MV> &ALOAD s.i>,
     474    <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr$SplitIterator" "isValid" "()Z">,
     475    &IFNE;
     476  (EQ e.expr1 (e.expr2) (e.pos)) =
     477    <Expr-Ref-To-JBC e.expr1>,
     478    <Expr-Ref-To-JBC e.expr2>,
     479    <Expr-Int-To-JBC e.pos>,
     480    <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "eq" "(Lorg/refal/plus/Expr;I)Z">,
     481    &IFEQ;
     482  (TERM-EQ e.expr1 (e.expr2) (e.pos)) =
     483    <Expr-Ref-To-JBC e.expr1>,
     484    <Expr-Ref-To-JBC e.expr2>,
     485    <Expr-Int-To-JBC e.pos>,
     486    <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr" "term_eq" "(Lorg/refal/plus/Expr;I)Z">,
     487    &IFEQ;
     488  (NOT t.cond) =
     489    <Cond-To-JBC t.cond> : {
     490      &IFEQ = &IFNE;
     491      &IFNE = &IFEQ;
     492    };
     493};
     494
     495
    474496Step-To-JBC {
    475497  /*empty*/ = /*empty*/;
    476   (INC-ITER e.expr) = <Middle 0 2 <Lookup &Iter-Vars e.expr>>'.next ()';
    477   (DEC-ITER e.expr) = <Middle 0 2 <Lookup &Iter-Vars e.expr>>'.prev ()';
     498  (s.tag e.expr),
     499    s.tag : {
     500      INC-ITER = "next";
     501      DEC-ITER = "prev";
     502    } :: s.m =
     503    <Lookup-Iter-Var e.expr> :: s.i s s,
     504    <MVvisitVarInsn <MV> &ALOAD s.i>,
     505    <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Expr$SplitIterator" s.m "()Lorg/refal/plus/Expr$SplitIterator;">,
     506    <MVvisitInsn <MV> &POP>;
    478507};
    479508
     
    557586};
    558587
    559 Int-Args-To-JBC s.acc e.args =
    560   e.args (/*e.java-args*/) $iter {
    561     e.args : (e.arg) e.rest =
    562       {
    563         e.rest : v = ', ';
    564         /*empty*/;
    565       } :: e.comma,
    566       e.rest (e.java-args <Expr-Int-To-JBC s.acc e.arg> e.comma);
    567     } :: e.args (e.java-args),
    568   e.args : /*empty*/ =
    569   e.java-args;
    570 
    571588Expr-Args-To-JBC e.args =
    572589  e.args (/*e.type*/) (/*e.java-args*/) (/*e.arrays*/) $iter {
     
    599616Var-To-JBC t.var =
    600617  <Lookup-Var t.var> :: s.type s.i,
    601   <MVvisitVarInsn <MV> &ALOAD s.i>,
    602   {
    603     s.type : Result =
    604       <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Result" "getExpr" "()Lorg/refal/plus/Expr;">;;
     618  s.type : {
     619    Result =
     620      <MVvisitVarInsn <MV> &ALOAD s.i>,
     621      <MVvisitMethodInsn <MV> &INVOKEVIRTUAL "org/refal/plus/Result" "getExpr" "()Lorg/refal/plus/Expr;">;
     622    Expr =
     623      <MVvisitVarInsn <MV> &ALOAD s.i>;
     624    Int =
     625      <MVvisitVarInsn <MV> &ILOAD s.i>;
    605626  };
    606627
Note: See TracChangeset for help on using the changeset viewer.