Changeset 2344


Ignore:
Timestamp:
Feb 6, 2007, 9:49:18 PM (14 years ago)
Author:
orlov
Message:
  • Advances in Java-bytecode generation.
File:
1 edited

Legend:

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

    r2338 r2344  
    77$import "org.objectweb.asm.ClassWriter";
    88$import "org.objectweb.asm.FieldVisitor";
     9$import "org.objectweb.asm.Label";
    910$import "org.objectweb.asm.MethodVisitor";
    1011$import "org.objectweb.asm.Opcodes";
     
    3334
    3435$func Module-To-JBC s.cw e.module = ;
     36
     37$func Func-To-JBC s.mv e.body = ;
    3538
    3639$func ASAIL-To-JBC e.body = e.java-code;
     
    109112  <"toByteArray" s.cw> e.java-module-name;
    110113
     114$table Vars;
     115$box Var-Idx;
     116
     117$func Bind-Vars s.type e.vars = ;
     118$func Bind-Var s.type t.var = s.i;
     119$func Lookup-Var t.var = s.type s.i;
     120
     121Bind-Vars s.type e.vars =
     122  {
     123    e.vars : e t.var e,
     124      <Bind-Var s.type t.var> : e,
     125      $fail;;
     126  };
     127
     128Bind-Var s.type t.var =
     129  <? &Var-Idx> : s.i,
     130  <Bind &Vars (t.var) (s.type s.i)>,
     131  <Store &Var-Idx <"+" s.i 1>>,
     132  s.i;
     133
     134Lookup-Var t.var = <Lookup &Vars t.var> : s.type s.i = s.type s.i;
     135
     136$table Labels;
     137
     138$func Bind-Label t.label = s.l;
     139$func Lookup-Label t.label = s.l;
     140
     141Bind-Label t.label =
     142  <Label> :: s.l,
     143  <Bind &Labels (t.label) (s.l)>,
     144  s.l;
     145
     146Lookup-Label t.label = <Lookup &Labels t.label> : s.l = s.l;
     147
    111148Module-To-JBC s.cw e.module, {
    112149  e.module : e t.item e, t.item : {
     
    116153                                FUNC? = 'Z';
    117154                        } : s.retType,
     155      <Clear-Table &Vars>,
     156      <Store &Var-Idx 0>,
     157      <Bind-Vars Expr e.args>,
     158      <Bind-Vars Result e.ress>,
     159      <Clear-Table &Labels>,
    118160      <"+" &"ACC_STATIC" <Access-Mode t.name>> :: s.accessMode,
    119161      <To-Word <Name-To-JBC t.name>> :: s.funcName,
     
    121163        <Replicate <Length e.ress> "Lorg/refal/plus/Result;">')' s.retType> :: s.desc,
    122164      <"visitMethod" s.cw s.accessMode s.funcName s.desc <Null> ("org/refal/plus/RefalException")> :: s.mv,
     165      <Func-To-JBC s.mv e.body>,
    123166      s.tag : {
    124167                                FUNC  = <MVvisitInsn s.mv &RETURN>;
     
    149192    (DECL-OBJ t.name) = ;
    150193    (DECL-FUNC t.name) = ;
     194    (TRACE t.name) =
     195      <Bind &RFP-Trace (t.name) ()>;
    151196  },
    152197    $fail;;
    153198};
    154199
    155 ASAIL-To-JBC s.cw e.module, {
    156   e.module : t.item e.rest, t.item : {
    157     (s.tag t.name (e.args) (e.ress) e.body),
    158       s.tag : \{
    159         FUNC  = ('void') /*empty*/;
    160         FUNC? = ('boolean') ('return true;');
    161       } :: (e.return-type) e.return =
    162       <Store &Ress e.ress>,
    163       <RFP-Clear-Table &Result>,
    164       { <? &Entry> : e t.name e = <Store &Entry-Name <Rfp2Java t.name>>;; },
    165 //      <RFP-Extract-Qualifiers t.name> :: (e.qualifiers) e.n,
    166       <Store &Func-Name <Name-To-JBC t.name>>,
    167       ()
    168       ('static '<Access-Mode t.name>' 'e.return-type' '
    169         <? &Func-Name>' ('<Var-Args-To-JBC Expr e.args Result e.ress>') throws RefalException')
    170         ('{' (<ASAIL-To-JBC e.body> e.return) '}');
    171     (TRACE t.name) =
    172       <Bind &RFP-Trace (t.name) ()>;
     200Func-To-JBC s.mv e.func-body, {
     201  e.func-body : e t.item e, <WriteLN> <WriteLN t.item>, t.item : {
     202    (DECL s.type t.var) =
     203      <Bind-Var s.type t.var> :: s.i,
     204      {
     205        s.type : Result =
     206          <MVvisitTypeInsn s.mv &NEW "org/refal/plus/Expr">,
     207          <MVvisitInsn s.mv &DUP>,
     208          <MVvisitMethodInsn s.mv &INVOKESPECIAL "org/refal/plus/Result" "<init>" "()V">,
     209          <MVvisitVarInsn s.mv &ASTORE s.i>;
     210        <MVvisitFieldInsn s.mv &GETSTATIC "org/refal/plus/Expr" "empty" "Lorg/refal/plus/Expr;">,
     211          <MVvisitVarInsn s.mv &ASTORE s.i>;
     212      };
     213    RETFAIL = <MVvisitInsn s.mv &"ICONST_0"> <MVvisitInsn s.mv &IRETURN>;
    173214    (IF (e.cond) e.body) =
    174215      <Box> :: s.acc,
     
    185226        <ASAIL-To-JBC e.body>
    186227      )'}' )
    187       e.if-not-assigns;
     228      e.if-not-assigns : e;
    188229    (FOR (e.cont-label) (e.break-label) (e.cond) (e.step) e.body) =
    189230      {
     
    206247        e.split-vars <? &Res-Assigns> <Store &Res-Assigns /*empty*/>
    207248        <ASAIL-To-JBC e.body>
    208       ) '}');
    209     (LABEL (e.label) e.body) =
    210       (<Rfp2Java (LABEL e.label)>': {' (<ASAIL-To-JBC e.body>) '}');
     249      ) '}') : e;
     250    (LABEL (t.label) e.body) =
     251      <Bind-Label t.label> :: s.l,
     252      <Func-To-JBC s.mv e.body>,
     253      <MVvisitLabel s.mv s.l>;
     254    (s.tag t.label), s.tag : \{ CONTINUE; BREAK; } =
     255      <MVvisitJumpInsn s.mv &GOTO <Lookup-Label t.label>>;
    211256    (TRY e.body) =
    212257      ('try') ('{' (
     
    216261        )   )
    217262        <ASAIL-To-JBC e.body>
    218       ) '}');
     263      ) '}') : e;
    219264    (CATCH-ERROR e.body) =
    220265      ('catch (RefalException error) {' (
    221266        ('Expr err = error.getExpr ();')
    222267        (<ASAIL-To-JBC e.body>)
    223       ) '}');
    224     RETFAIL = ('return false;');
     268      ) '}') : e;
    225269    FATAL =
    226       ('throw new RefalException ("'<? &Module-Name>'", "'<? &Func-Name>'", "Unexpected fail");');
     270      ('throw new RefalException ("'<? &Module-Name>'", "'<? &Func-Name>'", "Unexpected fail");') : e;
    227271    (LSPLIT t.name (e.min) t.var1 t.var2) =
    228272      <Expr-Ref-To-JBC t.name> :: e.a (e.n),
     
    232276      <Expr-Int-To-JBC s.acc e.min> :: e.min,
    233277      e.a <? s.acc>
    234       ('Expr.SplitIterator 'e.new-var' = 'e.n'.leftSplit('e.min');');
     278      ('Expr.SplitIterator 'e.new-var' = 'e.n'.leftSplit('e.min');') : e;
    235279    (RSPLIT t.name (e.min) t.var1 t.var2) =
    236280      <Expr-Ref-To-JBC t.name> :: e.a (e.n),
     
    240284      <Expr-Int-To-JBC s.acc e.min> :: e.min,
    241285      e.a <? s.acc>
    242       ('Expr.SplitIterator 'e.new-var' = 'e.n'.rightSplit('e.min');');
     286      ('Expr.SplitIterator 'e.new-var' = 'e.n'.rightSplit('e.min');') : e;
    243287    (ASSIGN t.var e.expr) =
    244288      <Expr-To-JBC () e.expr> :: e.a (e.j-expr),
     
    248292        e.a (<Lookup &Result t.var>'.assign ('e.j-expr');');
    249293        e.a (<Rfp2Java t.var>' = 'e.j-expr';');
    250       };
    251     (DECL s.type t.var) =
    252       <Rfp2Java t.var> :: e.j-var,
    253       {
    254         s.type : Result =
    255           <Bind &Result (t.var) (e.j-var)>,
    256           ('Result 'e.j-var' = new Result ();');
    257         <Unbind &Result t.var>,
    258           ('Expr 'e.j-var' = Expr.empty;');
    259       };
     294      } : e;
    260295    (INT t.var e.expr) =
    261296      <Box> :: s.acc,
    262297      <Expr-Int-To-JBC s.acc e.expr> :: e.expr,
    263       <? s.acc> ('int '<Rfp2Java t.var>' = 'e.expr';');
     298      <? s.acc> ('int '<Rfp2Java t.var>' = 'e.expr';') : e;
    264299    (EXPR t.var e.expr) =
    265300      <Unbind &Result t.var>,
    266301      <Expr-Ref-To-JBC e.expr> :: e.a (e.j-expr),
    267       e.a ('Expr '<Rfp2Java t.var>' = 'e.j-expr';');
     302      e.a ('Expr '<Rfp2Java t.var>' = 'e.j-expr';') : e;
    268303    (DEREF t.var e.expr (e.pos)) =
    269304      <Unbind &Result t.var>,
     
    271306      <Box> :: s.acc,
    272307      <Expr-Int-To-JBC s.acc e.pos> :: e.pos,
    273       e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = (Expr) 'e.j-expr'.at ('e.pos');');
     308      e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = (Expr) 'e.j-expr'.at ('e.pos');') : e;
    274309    (SUBEXPR t.var e.expr (e.pos) (e.len)) =
    275310      <Unbind &Result t.var>,
     
    278313      <Expr-Int-To-JBC s.acc e.pos> :: e.pos,
    279314      <Expr-Int-To-JBC s.acc e.len> :: e.len,
    280       e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = new Expr ('e.j-expr', 'e.pos', 'e.len');');
     315      e.a <? s.acc> ('Expr '<Rfp2Java t.var>' = new Expr ('e.j-expr', 'e.pos', 'e.len');') : e;
    281316    (DROP t.var) =
    282       (<Var-To-JBC t.var>'.drop ();');
    283     (CONTINUE t.label) =
    284       ('continue '<Rfp2Java (LABEL t.label)>';');
    285     (BREAK t.label) =
    286       ('break '<Rfp2Java (LABEL t.label)>';');
     317      (<Var-To-JBC t.var>'.drop ();') : e;
    287318    (ERROR e.expr) =
    288319      <Expr-Ref-To-JBC e.expr> :: e.a (e.j-expr),
    289       e.a ('throw new RefalException ('e.j-expr');');
    290     (CONSTEXPR s.linkage t.name (e.comment) e.expr) =
    291       {
    292         t.name : (STATIC e) = <Rfp2Java t.name>;
    293         //<RFP-Extract-Qualifiers t.name> :: (e.qualifiers) e.name = e.name;
    294         <Name-To-JBC t.name>;
    295       } :: e.n,
    296       <Const-Expr-To-JBC e.expr> :: e.a (e.j-expr),
    297       e.a ('static '<Access-Mode t.name>' final Expr 'e.n' = 'e.j-expr';');
    298     (OBJ s.linkage s.tag t.name) =
    299       <To-Chars s.tag> : s1 e2,
    300       'Named' s1 <To-Lower e2> :: e.class-name,
    301       <Bind &Inputs ('org.refal.plus.library.'e.class-name) ()>,
    302       <RFP-Extract-Qualifiers t.name> :: (e.qualifiers) e.n,
    303       ('static '<Access-Mode t.name>' final Expr '<Name-To-JBC t.name>
    304         ' = new Expr (new 'e.class-name' ("'e.n'"));');
    305     (DECL-OBJ t.name) = ;
    306     (DECL-FUNC t.name) = ;
     320      e.a ('throw new RefalException ('e.j-expr');') : e;
    307321    /*
    308322     * s.call can be CALL or TAILCALL or TAILCALL?
     
    317331        e.arrays e.decls (e.c';') <? &Res-Assigns>
    318332          <Store &Res-Assigns /*empty*/>;
    319       };
    320   } :: e.java-item,
    321     {
    322       e.java-item : ('break ' e) = e.java-item;
    323       e.java-item <ASAIL-To-JBC e.rest>;
    324     };
    325   /*empty*/;
    326 };
     333      } : e;
     334  },
     335    $fail;;
     336};
     337
     338ASAIL-To-JBC e = ;
    327339
    328340Declare-Results {
Note: See TracChangeset for help on using the changeset viewer.