Theory RTSCore

Up to index of Isabelle/HOL/SafeImp

theory RTSCore
imports JVMInstructions
begin

(* Title: Specification of SAFE RTS CORE
   Author: Delfin Ruperez and Ricardo Pe~na
   Copyright: July 2008, Universidad Complutense de Madrid
*)


header {* Specification Core RTS *}

theory RTSCore
imports "../JVMSAFE/JVMInstructions"
begin

-- "Run-time system class name"

constdefs
   System :: cname
  "System ≡ Cname ''java/lang/System''"
  objectC :: cname 
 "objectC ≡ Cname ''Object''"
  heapC :: cname
  "heapC ≡ Cname ''rtsCore/Heap''"
  stackC :: cname
  "stackC ≡ Cname ''rtsCore/Stack_S''"
  dirCellC :: cname
  "dirCellC ≡ Cname ''rtsCore/DirectoryCell''"
  consTableC :: cname
  "consTableC ≡ Cname ''rtsCore/ConsTable''"
  consDataC :: cname
  "consDataC ≡ Cname ''rtsCore/ConsData''"
  cellC :: cname
  "cellC ≡ Cname ''rtsCore/Cell''"


-- "Run-time system method name"
  Init :: mname
  "Init ≡ ''<init>''"
  exitM :: mname
   "exitM ≡ ''exit''"
  decregion :: mname
  "decregion ≡ ''decregion''"
  slide :: mname
  "slide ≡ ''slide''"
  pushRegion :: mname
  "pushRegion ≡ ''pushRegion''"
  popRegion :: mname
  "popRegion ≡ ''popRegion''"
  copyCell :: mname
  "copyCell ≡ ''copyCell''"
  copyCellAux :: mname
  "copyCellAux ≡ ''copyCellAux''"
  clone :: mname
  "clone ≡ ''clone''"
  copyRTS :: mname
  "copyRTS ≡ ''copy''"
  reserveCell :: mname
  "reserveCell ≡ ''reserveCell''"
  releaseCell :: mname
  "releaseCell ≡ ''releaseCell''"
  insertCell :: mname
  "insertCell ≡ ''insertCell''"
  makeHeap :: mname
  "makeHeap ≡ ''makeHeap''"
  makeDirectory :: mname
  "makeDirectory ≡ ''makeDirectory''"
  setmaxSize :: mname
  "setmaxSize ≡ ''setmaxSize''"
   makeConsTable :: mname
  "makeConsTable ≡ ''makeConsTable''"


-- " Run-time system field name"

constdefs 
  izqf :: vname
  "izqf ≡ VName ''izq''"
  derf :: vname
  "derf ≡ VName ''der''"
  idf :: vname
  "idf ≡ VName ''id''"
  freef :: vname
  "freef ≡ VName ''free''"
  tipoArgsf :: vname
  "tipoArgsf ≡ VName ''tipoArgs''"
  Sf :: vname
  "Sf ≡ VName ''S''"
  topf :: vname
  "topf ≡ VName ''top''"
  k0f :: vname
  "k0f ≡ VName ''k0''"
  kf :: vname
  "kf ≡ VName ''k''"
  regionsf :: vname
  "regionsf ≡ VName ''regions''"  
  safeDirf :: vname
  "safeDirf ≡ VName ''safeDir''"
  tagLf :: vname
  "tagLf ≡ VName ''tagL''"
  tagGf :: vname
  "tagGf ≡ VName ''tagG''"
  nargsf :: vname
  "nargsf ≡ VName ''nargs''" 
  tablef :: vname
  "tablef ≡ VName ''table''"
  arg1 :: vname
  "arg1 ≡ VName ''arg1''"
  arg2 :: vname
  "arg2 ≡ VName ''arg2''"
  arg3 :: vname
  "arg3 ≡ VName ''arg3''"
  arg4 :: vname
  "arg4 ≡ VName ''arg4''"
  arg5 :: vname
  "arg5 ≡ VName ''arg5''"
  arg6 :: vname
  "arg6 ≡ VName ''arg6''"
  arg7 :: vname
  "arg7 ≡ VName ''arg7''"
  arg8 :: vname
  "arg8 ≡ VName ''arg8''"

text {* Cell Class *}

-- " Cell Field Declarations"
constdefs cellFdecl :: "fdecl list"
"cellFdecl ≡ [(izqf,RefT (ClassT cellC)),
              (derf,RefT (ClassT cellC)),
              (idf,PrimT Integer),
              (tagGf,PrimT Integer),
              (arg1,PrimT Integer),
              (arg2,PrimT Integer),
              (arg3,PrimT Integer),
              (arg4,PrimT Integer),
              (arg5,PrimT Integer),
              (arg6,PrimT Integer),
              (arg7,PrimT Integer),
              (arg8,PrimT Integer)]"

text {* ConsTable Class *}

-- "ConsTable Field Declarations"
constdefs consTableFdecl :: "fdecl list"
 "consTableFdecl ≡ [(tablef, RefT (ArrayT (RefT (ClassT consDataC))))]"



(* Specification instructions of makeConsTable method *)
constdefs 
 EndFor1 :: "int"
 "EndFor1 ≡ 12"
 bucle1 :: "int"
 "bucle1 ≡ - 14"
constdefs instMakeConsTable :: "instr list"
"instMakeConsTable ≡ 
              [Load 0,
               ArrNew (RefT (ClassT consDataC)),
               Putstatic tablef consTableC, (* table = new ConsData[maxCons] *)
               LitPush (Intg 0),           
               Store 1,                    (* i \<leftarrow> 0 *) 
               Load 1,
               Getstatic tablef consTableC,
               ArrLength,
               Ifcmp GreaterEqual EndFor1, (* i < table.length ? *)
               Getstatic tablef consTableC,
               Load 1,
               New consDataC,
               Dup,
               Invoke_special consDataC Init [],
               ArrStore,
               Load 1,
               LitPush (Intg 1),
               BinOp Add,
               Store 1,                  (* i \<leftarrow> i + 1 *)
               Goto bucle1,  
               Return_Void
                      ]"
text {* ConsData Class *}

-- " ConsData Field Declarations"

constdefs consDataFdecl :: "fdecl list"
 "consDataFdecl ≡ [(tagLf, PrimT Integer),
                   (nargsf, PrimT Integer),
                   (tipoArgsf, RefT (ArrayT (PrimT Integer)))]"

(* Specification instructions of ConsData constructor *)
constdefs instInitConsData :: "instr list"
 "instInitConsData ≡ [Load 0,                 (* Load this *)
                      LitPush (Intg 8),
                      ArrNew (PrimT Integer), (* tipoArgs \<leftarrow> new int[8] *)
                      Putfield tipoArgsf consDataC,
                      Return_Void]"

text {* Stack_S Class *}

-- "Stack_S Field Declarations"

constdefs stackSFdecl :: "fdecl list"
 "stackSFdecl ≡ [(Sf, RefT (ArrayT (PrimT Integer))),(topf, PrimT Integer)]"

(* Specification instructions of setmaxSize method *)
constdefs instSetMaxSize :: "instr list"
 "instSetMaxSize ≡ [Load 0,
                    ArrNew (PrimT Integer),
                    Putstatic Sf stackC,      (* S \<leftarrow> new int[maxSize]  *)
                    LitPush (Intg -1),
                    Putstatic topf stackC,    (* top \<leftarrow> -1 *)
                    Return_Void
                    ]"
(* Instructions of slide method *)
 constdefs 
 EndFor2 :: "int"
 "EndFor2 ≡ 16 "
 Bucle2 :: "int"
 "Bucle2 ≡ -17"
constdefs instSlide :: "instr list"
 "instSlide ≡ [Getstatic topf stackC,
               Load 0,                        (* Load local0 = m *)
               BinOp Substract,
               Load 1,                        (* Load local1 = n *)
               BinOp Substract,
               LitPush (Intg 1),
               BinOp Add,
               Store 2,                       (* local2\<leftarrow> top - m - n + 1 *)
               Getstatic topf stackC,
               Load 0,
               BinOp Substract,
               LitPush (Intg 1),
               BinOp Add,
               Store 3,                       (* local3 \<leftarrow>top - m + 1 *)
               Load 3,                        (* Label Bucle2 *) 
               Getstatic topf stackC,
               Ifcmp GreaterThan EndFor2,     (* local3 <= top ?      *)
               Getstatic Sf stackC,
               Load 2,
               Getstatic Sf stackC,
               Load 3,
               ArrLoad,
               ArrStore,                      (* S[local2] \<leftarrow> S[local3] *)
               Load 2,
               LitPush (Intg 1),
               BinOp Add,
               Store 2,                       (* local2 \<leftarrow> local2 + 1   *)
               Load 3,
               LitPush (Intg 1),
               BinOp Add,
               Store 3,                       (* local3 \<leftarrow> local3 + 1   *)
               Goto Bucle2,           
               Getstatic topf stackC,         (* Label EndFor2          *)
               Load 1,
               BinOp Substract,
               Putstatic topf stackC,         (* top \<leftarrow> top - n         *)
               Return_Void
               ]"

text {* DirectoryCell Class *}

-- "DirectoryCell Field Declarations"

constdefs dirCFdecl :: "fdecl list"
 "dirCFdecl ≡ [(safeDirf, RefT (ArrayT (RefT (ClassT cellC)))),
               (freef, RefT (ClassT cellC))]"


(* Instructions of makeDirectory Method *)
 constdefs 
  EndFor3 :: "int"
 "EndFor3 ≡ 77"
  If1 :: "int"
  "If1 ≡ 25"
  If2 :: "int"
  "If2 ≡ 19"
  If3 :: "int"
  "If3 ≡ 32"
  EndIf2 :: "int"
  "EndIf2 ≡ 38"
  Bucle3 :: "int"
 "Bucle3 ≡ -82"

-- "Instructions List"
constdefs instMakeDirectory :: "instr list"
 "instMakeDirectory ≡ [
             Load 0,
             ArrNew (Class cellC),
             Putstatic safeDirf dirCellC, (* safeDir \<leftarrow> new Cell[maxCell] *)
             LitPush (Intg 0),
             Store 1,                    (* i \<leftarrow> 0 *) 
             Load 1,
             Getstatic safeDirf dirCellC,
             ArrLength,
             Ifcmp GreaterEqual EndFor3, (* i < safeDir.length ? *)
             Getstatic safeDirf dirCellC,
             Load 1,
             New cellC,
             Dup,
             Invoke_special cellC Init [],
             ArrStore,                   (* safeDir[i] \<leftarrow> new Cell() *)
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Load 1,
             Putfield idf cellC,         (* safeDir[i].id \<leftarrow> i *)
             Load 1,
             LitPush (Intg 0),
             Ifcmp LessEqual If1,         (* i > 0 ? *)
             Load 1,
             Getstatic safeDirf dirCellC,
             ArrLength,
             LitPush (Intg 1),
             BinOp Substract,
             Ifcmp GreaterThan If2,       (* i < safeDir.length - 1 *)  
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Getstatic safeDirf dirCellC,
             Load 1,
             LitPush (Intg 1),
             BinOp Substract,
             ArrLoad,
             Putfield izqf cellC,        (* safeDir[i].izq \<leftarrow> safeDir[i - 1] *) 
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Getfield izqf cellC,
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Putfield derf cellC,        (* safeDir[i].izq.der \<leftarrow> safeDir[i] *)           
             Goto EndIf2,
             Load 1,
             Getstatic safeDirf dirCellC,
             ArrLength,
             LitPush (Intg 1),
             BinOp Substract,
             Ifcmp NotEqual If3,        (* i = safeDir.length - 1 ? *)
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Getstatic safeDirf dirCellC,
             Load 1,
             LitPush (Intg 1),
             BinOp Substract,
             ArrLoad,
             Putfield izqf cellC,       (* safeDir[i].izq \<leftarrow> safeDir[i - 1] *) 
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Getstatic izqf cellC,
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Putfield derf cellC,       (* safeDir[i].izq.der \<leftarrow> safeDir[i]  *)
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Getstatic safeDirf dirCellC,
             LitPush (Intg 0),
             ArrLoad,
             Putfield derf cellC,       (* safeDir[i].der \<leftarrow> safeDir[0] *)
             Getstatic safeDirf dirCellC,
             LitPush (Intg 0),
             ArrLoad,
             Getstatic safeDirf dirCellC,
             Load 1,
             ArrLoad,
             Putfield izqf cellC,       (* safeDir[0].izq \<leftarrow> safeDir[i] *)
             Load 1,
             LitPush (Intg 1),
             BinOp Add,
             Store 1,                   (* i \<leftarrow> i + 1 *)
             Goto Bucle3,
             Getstatic safeDirf dirCellC,
             LitPush (Intg 0),
             ArrLoad,
             Putstatic freef cellC,     (* free \<leftarrow> safeDir[0] *)
             Return_Void
               ]"

constdefs
 If4 :: "int"
 "If4 ≡ 18"
 EndIf4 :: "int"
 "EndIf4 ≡ 3"

constdefs instReserveCell :: "instr list"
 "instReserveCell ≡ [
      Getstatic freef cellC, 
      Getfield derf cellC,  
      Store 0,                 (* p \<leftarrow> free.der *)  
      Load 0,
      Getstatic freef cellC,
      Ifcmpeq If4,             (* p ≠ free   ? *)
      Load 0,
      Getfield derf cellC,
      Store 1,                 (* p2 \<leftarrow> p.der  *)
      Getstatic freef cellC,
      Load 1,
      Putfield derf cellC,     (* free.der \<leftarrow> p2 *)
      Load 1,
      Load 0,
      Getfield izqf cellC,
      Putfield izqf cellC,     (* p2.izq \<leftarrow> p.izq *)                   
      Load 0,
      Load 0,
      LitPush (Null),
      Dup_x1,
      Putfield derf cellC,    (* p.der \<leftarrow> null    *)
      Putfield izqf cellC,    (* p.izq \<leftarrow> null    *)
      Goto EndIf4,
      LitPush(Intg 1),
      Invoke_static System exitM [PrimT Integer],  (* Abort program *)
      Load 0,
      Getfield idf cellC,      
      Return                  (* return p.id      *)   
      ]"

constdefs instReleaseCell :: "instr list"
 "instReleaseCell ≡ [
         Getstatic safeDirf dirCellC,
         Load 0,
         ArrLoad,
         Store 1,             (* cell \<leftarrow> safeDir[index] *)
         Load 1,
         Getfield izqf cellC,
         Store 2,             (* temp1 \<leftarrow> cell.izq      *)
         Load 1,
         Getfield derf cellC,
         Store 3,             (* temp2 \<leftarrow> cell.der      *)
         Load 2,
         Load 1,
         Getfield derf cellC,
         Putfield derf cellC, (* temp1.der \<leftarrow> cell.der  *)
         Load 3,
         Load 1,
         Getfield izqf cellC,
         Putfield izqf cellC, (* temp2.izq \<leftarrow> cell.izq  *)
         Load 1,
         Getstatic freef dirCellC,
         Getfield derf cellC,
         Putfield derf cellC, (* cell.der \<leftarrow> free.der   *)
         Getstatic freef dirCellC,
         Getfield derf cellC,
         Load 1,
         Putfield izqf cellC, (* free.der.izq \<leftarrow> cell   *)
         Getstatic freef cellC,
         Load 1,
         Putfield derf cellC, (* free.der \<leftarrow> cell       *)
         Load 1,   
         Getstatic freef dirCellC,
         Putfield izqf cellC, (* cell.izq \<leftarrow> free       *) 
         Return_Void
         ]"

-- " Heap Field Declarations"

constdefs heapFdecl :: "fdecl list"
  "heapFdecl ≡ [(regionsf, RefT (ArrayT (RefT (ClassT cellC)))),
                 (kf, PrimT Integer),
                (k0f,PrimT Integer)]"

(* Instructions of MakeHeap Method *)
constdefs instMakeHeap :: "instr list"
 "instMakeHeap ≡ [
       Load 0,
       ArrNew (Class cellC),
       Putstatic regionsf heapC,    (* regions \<leftarrow> new Cell[maxRegions] *)
       LitPush (Intg -1),
       Putstatic kf heapC,          (* k \<leftarrow> -1 *)
       LitPush (Intg -1),
       Putstatic k0f heapC,         (* k0 \<leftarrow> -1 *)
       Return_Void      
         ]"

(* Instructions of Decregion Method *)
constdefs
  bucle5 :: "int"
  "bucle5 ≡ 3"
 endbucle5 :: "int"
  "endbucle5 ≡ -4" 

constdefs instDecregion :: "instr list"
 "instDecregion ≡ [
        Getstatic kf heapC,
        Getstatic k0f heapC,
        Ifcmp LessEqual bucle5,                (* k > k0 ?  *)
        Invoke_static heapC popRegion [],   (* call PopRegion() method *)
        Goto endbucle5,
        Return_Void
           ]"

(* Instructions of PushRegion Method *)

constdefs

labelEnd :: "int"
 "labelEnd ≡ 4"

constdefs instPushRegion :: "instr list"
 "instPushRegion ≡ [
       Getstatic kf heapC,
       LitPush (Intg 1),
       BinOp Add,
       Putstatic kf heapC,  (* k \<leftarrow> k + 1 *)
       Invoke_static dirCellC reserveCell [],
       Store 0,             (* cell \<leftarrow> reserveCell() *)
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       Getstatic safeDirf dirCellC,
       Load 0,
       ArrLoad,
       ArrStore,            (* regions[k] \<leftarrow> safeDir[cell] *)
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Dup_x1,
       Putfield izqf cellC, (* regions[k].izq \<leftarrow> regions[k] *)
       Putfield derf cellC, (* regions[k].der <- regions[k].izq *)
       Goto labelEnd,
       Store 0,             (* Exception e *)
       LitPush (Intg 1),
       Invoke_static System exitM [PrimT Integer],  (* Abort program with error *)
       Return_Void
       ]"
(* Instructions of PopRegion Method *)
constdefs instPopRegion :: "instr list"
 "instPopRegion ≡ [
       Getstatic freef dirCellC,
       Getfield izqf cellC,
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Putfield derf cellC,     (* free.izq.der \<leftarrow> regions[k] *)
       Getstatic freef dirCellC,
       Getfield izqf cellC,
       Store 0,                 (* c1 \<leftarrow> free.izq   *)
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Getfield izqf cellC,
       Store 1,                 (* c2 \<leftarrow> regions[k].izq *)
       Getstatic freef cellC,
       Load 1,
       Putfield izqf cellC,     (* free.izq \<leftarrow> c2       *)
       Load 1,
       Getstatic freef cellC,
       Putfield derf cellC,     (* c2.der \<leftarrow> free       *)
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       ArrLoad,
       Load 0,
       Putfield izqf cellC,     (* regions[k].izq \<leftarrow> c1 *)
       Getstatic regionsf heapC,
       Getstatic kf heapC,
       LitPush (Null),
       ArrStore,                (* regions[k] \<leftarrow> NULL   *)
       Getstatic kf heapC,
       LitPush(Intg 1),
       BinOp Substract,
       Putstatic kf heapC,      (* k \<leftarrow> k - 1           *)
       Return_Void
       ]"
(* Instructions of InsertCell Method *)
constdefs instInsertCell :: "instr list"
 "instInsertCell ≡ [
      Getstatic safeDirf dirCellC,
      Load 1,
      ArrLoad, 
      Store 2,                (* cell \<leftarrow> safeDir[p] *)
      Load 2,
      Getstatic regionsf heapC,
      Load 0,
      Getfield izqf cellC,
      Putfield izqf cellC,    (* cell.izq \<leftarrow> regions[r].izq *)
      Getstatic regionsf heapC,
      Load 0,
      ArrLoad,
      Getfield izqf cellC,
      Load 2,
      Putfield derf cellC,    (* regions[r].izq.der \<leftarrow> cell *)
      Getstatic regionsf heapC,
      Load 0,
      ArrLoad,
      Load 2,
      Putfield izqf cellC,    (* regions[r].izq \<leftarrow> cell     *)
      Load 2,
      Getstatic regionsf heapC,
      Load 0,
      ArrLoad,
      Putfield derf cellC,    (* cell.der \<leftarrow> regions[r]     *)
      Return_Void
  ]"
(* Instructions of CopyCell Method *)
constdefs instCopyCell :: "instr list"
 "instCopyCell ≡ [
       Invoke_static dirCellC reserveCell [],
       Store 1,                   (* freshCell \<leftarrow> reserveCell()   *)
       Getstatic safeDirf dirCellC,
       Load 1,
       ArrLoad,
       Store 2,                   (* target \<leftarrow> safeDir[freshCell] *)
       Getstatic safeDirf dirCellC,
       Load 0,
       ArrLoad,
       Store 3,                   (* source \<leftarrow> safeDir[p]         *)
       Load 3,
       Load 2,
       Invoke_static dirCellC copyCellAux [Class cellC,
                                           Class cellC],   (* copyCellAux(source,target) *)
       Load 0,
       Invoke_static dirCellC releaseCell [PrimT Integer], (* releaseCell(p) *)
       Load 2,
       Getfield derf cellC,
       Load 2,
       Putfield izqf cellC,       (* target.der.izq \<leftarrow> target *)
       Load 2,
       Getfield izqf cellC,
       Load 2,
       Putfield derf cellC,       (* target.izq.der \<leftarrow> target *)
       Load 1,
       Return                   (* devuelve freshCell       *) 
     ]"
(* Instructions of Clone Method *)
constdefs instClone :: "instr list"
 "instClone ≡ [
     Invoke_static dirCellC reserveCell [],
     Store 2,                 (*  freshCell \<leftarrow> reserveCell()  *)
     Getstatic safeDirf dirCellC,
     Load 2,
     ArrLoad,
     Store 3,                 (* target \<leftarrow> safeDir[freshCell] *)
     Getstatic safeDirf dirCellC,
     Load 1,
     ArrLoad,
     Store 4,                 (* source \<leftarrow> safeDir[p]         *)
     Load 4,
     Load 3,
     Invoke_static heapC copyCellAux [Class cellC, 
                                      Class cellC],  (* copyCellAux(source,target) *)
     Load 0,
     Load 2,
     Invoke_static heapC insertCell [PrimT Integer,
                                     PrimT Integer], (* insertCell(reg,freshCell)  *)
     Load 2,
     Return                   (* devuelve entero freshCell *) 
]"
(* Instructions of CopyCellAux Method *)
constdefs instCopyCellAux :: "instr list"
 "instCopyCellAux ≡ [
     Load 1,
     Load 0,
     Getfield derf cellC,
     Putfield derf cellC,       (* c2.der \<leftarrow> c1.der *)       
     Load 1,
     Load 0,
     Getfield izqf cellC,
     Putfield izqf cellC,       (* c2.izq \<leftarrow> c1.izq *)       
     Load 1,
     Load 0,
     Getfield tagGf cellC,
     Putfield tagGf cellC,       (* c2.tagG \<leftarrow> c1.tagG *)       
     Load 1,
     Load 0,
     Getfield arg1 cellC,
     Putfield arg1 cellC,       (* c2.arg1 \<leftarrow> c1.arg1 *)       
     Load 1,
     Load 0,
     Getfield arg2 cellC,
     Putfield arg2 cellC,       (* c2.arg2 \<leftarrow> c1.arg2 *)       
     Load 1,
     Load 0,
     Getfield arg3 cellC,
     Putfield arg3 cellC,       (* c2.arg3 \<leftarrow> c1.arg3 *)       
     Load 1,
     Load 0,
     Getfield arg4 cellC,
     Putfield arg4 cellC,       (* c2.arg4 \<leftarrow> c1.arg4 *)       
     Load 1,
     Load 0,
     Getfield arg5 cellC,
     Putfield arg5 cellC,       (* c2.arg5 \<leftarrow> c1.arg5 *)       
     Load 1,
     Load 0,
     Getfield arg6 cellC,
     Putfield arg6 cellC,       (* c2.arg6 \<leftarrow> c1.arg6 *)       
     Load 1,
     Load 0,
     Getfield arg7 cellC,
     Putfield arg7 cellC,       (* c2.arg7 \<leftarrow> c1.arg7 *)       
     Load 1,
     Load 0,
     Getfield arg8 cellC,
     Putfield arg8 cellC       (* c2.arg8 \<leftarrow> c1.arg8 *)       
]"


(* Intructions of Copy Method *)
    constdefs
     endBucle6 :: "int"
    "endBucle6 ≡ 72"
     If5 :: "int"
     "If5 ≡ 62 "
    lab1 :: "int"
    "lab1 ≡ 1"
    endlab1 :: "int"
    "endlab1 ≡ 49"
    lab2 :: "int"
    "lab2 ≡ lab1 + 7"
    endlab2 :: "int"
    "endlab2 ≡ endlab1 - 7"
    lab3 :: "int"
    "lab3 ≡ lab2 + 7"
    endlab3 :: "int"
    "endlab3 ≡ endlab2 - 7"
    lab4 :: "int"
    "lab4 ≡ lab3 + 7"
    endlab4 :: "int"
    "endlab4 ≡ endlab3 - 7"
    lab5 :: "int"
    "lab5 ≡ lab4 + 7"
    endlab5 :: "int"
    "endlab5 ≡ endlab4 - 7"
    lab6 :: "int"
    "lab6 ≡ lab5 + 7"     
    endlab6 :: "int"
    "endlab6 ≡ endlab5 - 7"
    lab7 :: "int"
    "lab7 ≡ lab6 + 7"
    endlab7 :: "int"
    "endlab7 ≡ endlab6 - 7"
    lab8 :: "int"
    "lab8 ≡ lab7 + 7"
    ldef :: "int"
    "ldef ≡ lab8 + 6"
    bucle6 :: "int"
    "bucle6 ≡ -77"
  constdefs instCopy :: "instr list"
 "instCopy ≡ [
    Load 1,
    Load 0,
    Invoke_static heapC clone [PrimT Integer, 
                               PrimT Integer],   
    Store 2,                (* target \<leftarrow> clone (j,b) *)
    Getstatic safeDirf dirCellC,
    Load 0,
    ArrLoad,
    Store 3,                (* source \<leftarrow> safeDir[b]  *)
    Getstatic tablef consDataC,
    Load 3,
    Getfield tagGf cellC,
    ArrLoad,
    Store 4,                (* info \<leftarrow> table[source.tagG] *)
    LitPush (Intg 0),
    Store 5,                (* i \<leftarrow> 0 *)
    Load 5,
    Load 4,
    Getfield nargsf consDataC,
    Ifcmp GreaterEqual  endBucle6,        (* i < info.nargs ?           *)
    Load 4,
    Getfield tipoArgsf consDataC,
    Load 5,
    ArrLoad,                (* Integer Array  *)
    Store 6,                (* tipo \<leftarrow> info.tipoArgs[i]   *)
    Load 6,
    LitPush (Intg 4),
    Ifcmp NotEqual If5, 
    Getstatic safeDirf dirCellC,
    Load 2,
    ArrLoad,
    Store 7,               (* targ \<leftarrow> safeDir[target]     *)
    Load 5,                (* Load local5 = i    *)
    Tableswitch 0 7 [lab1,
                     lab2,
                     lab3,
                     lab4,
                     lab5,
                     lab6,
                     lab7,
                     lab8,
                     ldef], 

     Load 7,              (* label 1  *)
     Load 3,
     Getfield arg1 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg1 cellC, (* targ.arg1 \<leftarrow> copy(source.arg1,j) *)
     Goto endlab1,        (* end label 1 *)
    
     Load 7,              (* label 2  *)
     Load 3,
     Getfield arg2 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg2 cellC, (* targ.arg2 \<leftarrow> copy(source.arg2,j) *)
     Goto endlab2,        (* end label 2 *)



     Load 7,              (* label 3  *)
     Load 3,
     Getfield arg3 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg3 cellC, (* targ.arg3 \<leftarrow> copy(source.arg3,j) *)
     Goto endlab3,        (* end label 3 *)



     Load 7,              (* label 4  *)
     Load 3,
     Getfield arg4 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg4 cellC, (* targ.arg4 \<leftarrow> copy(source.arg4,j) *)
     Goto endlab4,        (* end label 4 *)

     Load 7,              (* label 5  *)
     Load 3,
     Getfield arg5 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg5 cellC, (* targ.arg5 \<leftarrow> copy(source.arg5,j) *)
     Goto endlab5,        (* end label 5 *)


     Load 7,              (* label 6  *)
     Load 3,
     Getfield arg6 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg6 cellC, (* targ.arg6 \<leftarrow> copy(source.arg6,j) *)
     Goto endlab6,        (* end label 6 *)

     Load 7,              (* label 7  *)
     Load 3,
     Getfield arg7 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg7 cellC, (* targ.arg1 \<leftarrow> copy(source.arg1,j) *)
     Goto endlab7,        (* end label 7 *)
     
     Load 7,              (* label 8  *)
     Load 3,
     Getfield arg8 cellC,
     Load 1,
     Invoke_static heapC copyRTS [PrimT Integer, 
                               PrimT Integer],
     Putfield arg8 cellC, (* targ.arg8 \<leftarrow> copy(source.arg8,j) *)
     Load 5,
     LitPush (Intg 1),
     BinOp Add,
     Store 5,             (* i \<leftarrow> i + 1 *)
     Goto bucle6,
     Load 2,
     Return               (* return target *) 
 ]"


-- " Program RTS with all Class declarations"
constdefs  Prog_RTS :: "jvm_prog"

"Prog_RTS ≡ 
(let
  classCell = (cellC,objectC,cellFdecl,[]);
  consTableMethod = ((makeConsTable,[PrimT Integer]), PrimT Void,(4,2,instMakeConsTable,[]));
  classConsTable = (consTableC,objectC,consTableFdecl,[consTableMethod]);
  initConsDataMethod = ( (Init, []), PrimT Void, (2,1,instInitConsData,[]));
  classConsData =(consDataC,objectC,consDataFdecl,[initConsDataMethod]);
  setMaxSizeM = ((setmaxSize,[PrimT Integer]), PrimT Void, (1,1,instSetMaxSize,[]));
  slideM = ((slide,[PrimT Integer,PrimT Integer]), PrimT Void, (4,4,instSlide,[]));
  classStackS = (stackC, objectC,stackSFdecl,[setMaxSizeM,slideM]); 
  makeDirM = ((makeDirectory, [PrimT Integer]), PrimT Void, (4,2,instMakeDirectory,[]));
  reserM = ((reserveCell,[]), PrimT Integer, (4,2,instReserveCell ,[]));
  releaM = ((releaseCell,[PrimT Integer]), PrimT Void, (2,4,instReleaseCell ,[]));
  classDir = (dirCellC, objectC,dirCFdecl,[makeDirM,reserM,releaM]);
  makeHeapM = ((makeHeap,[PrimT Integer]),PrimT Void, (1,1,instMakeHeap,[]));
  decregionM = ((decregion,[]),PrimT Void,(2,0,instDecregion,[]));
  pushRegionM = ((pushRegion,[]),PrimT Void,(4,1,instPushRegion,[(0,23,26,
                  Xcpt ArrayIndexOutOfBounds)]));
  popRegionM = ((popRegion,[]),PrimT Void,(3,2,instPopRegion,[]));
  insertCellM = ((insertCell,[PrimT Integer,PrimT Integer]), PrimT Void,(3,3,instInsertCell,[]));
  copyCellM = ((copyCell,[PrimT Integer]),PrimT Integer,(2,4,instCopyCell,[]));
  cloneM = ((clone,[PrimT Integer,PrimT Integer]),PrimT Integer,(2,5,instClone,[]));
  copyCellAuxM = ((copyCellAux,[RefT (ClassT cellC),RefT (ClassT cellC)]),
                 PrimT Void,(2,2,instCopyCellAux,[]));
  copyM = ((copyRTS,[PrimT Integer,PrimT Integer]),PrimT Integer,(3,8,instCopy,[]));       
  classHeap = (heapC, objectC, heapFdecl,[makeHeapM,decregionM,pushRegionM,popRegionM,
               insertCellM,copyCellM,cloneM,copyCellAuxM,copyM])
 in [classCell,classConsTable,classConsData,classStackS,classDir,classHeap])"
                   
end