Top > Shiba > Shiba VM > メモ

メモ Edit

ver2.0用の情報だったり古い情報だったり Edit

インスタンスの生成手順 Edit

  • メモリ領域は確保済みとする。
  • 1) .initデータを領域にコピー。
  • 2) コンストラクタがあれば実行。
  • 3) invariantがあれば実行。
  • 4) scopeなclassもしくはstructなオブジェクトならデストラクタスタックに自身を追加

関数に入るときの手順 Edit

  • 1) 関数スタックにプッシュ

関数から抜けるときの手順 Edit

  • 1) 関数スタックの情報を元に,デストラクタスタックに積まれているオブジェクトを必要なだけポップ&実行
  • 2) 関数スタックからポップ

メンバ関数に入るときの手順 Edit

  • 1) publicなメンバ関数の呼び出しならinvariantがあれば実行。
  • 2) 『関数に入るときの手順』を実行

メンバ関数から抜けるときの手順 Edit

  • 1) 『関数から抜けるときの手順』を実行
  • 2) publicな関数の呼び出しならinvariantがあれば実行。

コンストラクタの手順 Edit

  • 1) 『関数に入るときの手順』を実行
  • 2) structメンバ変数をデストラクタスタックにプッシュ
  • 3) 関数本体を実行
  • 4) invariantがあれば実行
  • 5) コンストラクトが正常に終了したと判断したので,デストラクタスタックに追加済みのstructメンバ変数をポップ。
  • 6) 『関数から抜けるときの手順』を実行

デストラクタの手順 Edit

  • 1) 『関数に入るときの手順』を実行
  • 2) invariantがあれば実行
  • 3) 関数本体を実行
  • 4) 『関数から抜けるときの手順』を実行

tryキーワードの手順 Edit

  • 1) catchポイントを関数スタックにプッシュ

catchキーワードの手順 Edit

  • 1) catchポイントを関数スタックからポップ
  • 2) 必要な数だけデストラクタスタックをポップ&実行

finalyキーワードの手順 Edit

  • 1) catchポイントを関数スタックからポップ

throwキーワードの手順 Edit

  • 1) throwされたStd.IExceptionをひかえておく
  • 2) 関数スタックをなめていき,該当するcatchポイントを探す。見つからなければContext停止。
  • 3) 該当のcatchポイントまで関数スタックをポップ&デストラクタスタックのポップ&実行を繰り返す。
  • このとき,デストラクタ実行中に新しい例外がthrowされたら再び1に戻り,古いStd.IExceptionは上書きされる。(C#の挙動にあわせた)

メモ Edit

例外発生時のデストラクトでさらに例外が発生したとき Edit

C#の挙動にあわせよう。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 
 
 
 
 
 
-
|
-
|
-
|
-
!
!
|
-
|
-
!
!
|
|
-
|
|
-
|
!
|
|
-
|
|
|
!
!
|
-
|
-
|
-
|
-
|
|
|
!
!
!
|
-
|
!
|
-
|
!
|
-
!
!
!
!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace CSharpTest
{
    class Program
    {
        class ExceptionA : Exception
        {
            public ExceptionA( string msg ) : base( "ExceptionA:" + msg)
            {
            }
        };
        class ExceptionB : Exception
        {
            public ExceptionB( string msg ) : base( "ExceptionB:" + msg)
            {
            }
        };
 
        class Hoge : IDisposable
        {
            string str;
            public Hoge(string aStr)
            {
                str = aStr;
            }
 
            public void Dispose()
            {
                System.Console.WriteLine(str + " Hoge Dispose Enter");
                throw new ExceptionA(str + " hoge dispose exp");
                System.Console.WriteLine(str + " Hoge Dispose Exit");
            }
        };
        static void Main(string[] args)
        {
            try
            {
                using (var hogeA = new Hoge("a"))
                {
                    using (var hogeB = new Hoge("b"))
                    {
                        System.Console.WriteLine("Enter Scope");
                        throw new ExceptionB("throw exp");
                        System.Console.WriteLine("Exit Scope");
                    }
                }
            }
            catch (ExceptionA exp)
            {
                System.Console.WriteLine("Catch A");
            }
            catch (ExceptionB exp)
            {
                System.Console.WriteLine("Catch B");
            }
            finally
            {
            }
        }
    }
}

実行結果

  0
  1
  2
  3
Enter Scope
b Hoge Dispose Enter
a Hoge Dispose Enter
Catch A
続行するには何かキーを押してください . . .

ってことで最後に投げられた例外が有効になるみたい。


リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sun, 01 Aug 2010 02:54:34 JST (5011d)