Changeset 93

Show
Ignore:
Timestamp:
03/29/07 01:34:45 (20 months ago)
Author:
gnue
Message:

named and numbered magic pointer were made to be able to coexist.

Location:
NEWT0/trunk/src
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • NEWT0/trunk/src/newt_core/NewtBC.c

    r77 r93  
    18161816            NBCGenCodeL(kNBCFindVar, lvalue); 
    18171817    } 
    1818     else if (NewtRefIsMagicPointer(lvalue)) 
     1818#ifdef __NAMED_MAGIC_POINTER__ 
     1819    else if (NewtRefIsNamedMP(lvalue)) 
    18191820    { 
    1820 #ifdef __NAMED_MAGIC_POINTER__ 
    18211821        newtRefVar  sym; 
    18221822 
     
    18241824        NBCGenFunc2(stree, NSSYM0(defMagicPointer), sym, expr); 
    18251825        NVCGenNoResult(ret); 
    1826 #else 
     1826    } 
     1827#endif /* __NAMED_MAGIC_POINTER__ */ 
     1828    else if (NewtRefIsNumberedMP(lvalue)) 
     1829    { 
    18271830        int32_t index; 
    18281831 
     
    18301833        NBCGenFunc2(stree, NSSYM0(defMagicPointer), NewtMakeInteger(index), expr); 
    18311834        NVCGenNoResult(ret); 
    1832 #endif 
    18331835    } 
    18341836    else if (NPSRefIsSyntaxNode(lvalue)) 
  • NEWT0/trunk/src/newt_core/NewtEnv.c

    r78 r93  
    3030#define GLOBAL_FNS          (newt_env.global_fns)               ///< グローバル関数テーブル 
    3131#define MAGIC_POINTERS      (newt_env.magic_pointers)           ///< マジックポインタテーブル 
     32#define NAMED_MPS           (newt_env.named_mps)                ///< 名前付マジックポインタテーブル 
    3233 
    3334#define INITSYM2(sym, str)  sym = NewtMakeSymbol(str)           ///< よく使うシンボルの初期化 
     
    4849static void     NewtInitVersInfo(void); 
    4950static void     NewtInitEnv(int argc, const char * argv[], int n); 
     51 
     52static newtRef  NcResolveNamedMP(newtRefArg r); 
     53static newtRef  NsDefNamedMP(newtRefArg rcvr, newtRefArg r, newtRefArg v); 
     54 
    5055 
    5156 
     
    183188    INITSYM(global_fns); 
    184189    INITSYM(magic_pointers); 
     190#ifdef __NAMED_MAGIC_POINTER__ 
     191    INITSYM(named_mps); 
     192#endif /* __NAMED_MAGIC_POINTER__ */ 
    185193 
    186194    // for print 
     
    377385    GLOBAL_FNS = NcMakeFrame(); 
    378386    // マジックポインタテーブルの作成 
    379 #ifdef __NAMED_MAGIC_POINTER__ 
    380     MAGIC_POINTERS = NcMakeFrame(); 
    381 #else 
    382387    MAGIC_POINTERS = NewtMakeArray(kNewtRefUnbind, 0); 
    383 #endif 
    384388 
    385389    // ルートフレームに各テーブルを格納 
     
    388392    NcSetSlot(ROOT, NSSYM0(magic_pointers), MAGIC_POINTERS); 
    389393    NcSetSlot(ROOT, NSSYM0(sym_table), SYM_TABLE); 
     394 
     395#ifdef __NAMED_MAGIC_POINTER__ 
     396    // 名前付マジックポインタテーブルの作成 
     397    NAMED_MPS = NcMakeFrame(); 
     398    // ルートフレームに名前付マジックポインタテーブルの格納 
     399    NcSetSlot(ROOT, NSSYM0(named_mps), NAMED_MPS); 
     400#endif /* __NAMED_MAGIC_POINTER__ */ 
    390401 
    391402    // 環境変数の初期化 
     
    675686 
    676687/*------------------------------------------------------------------------*/ 
    677 /** マジックポインタの参照を解決する 
     688/** 名前付マジックポインタの参照を解決する 
    678689 * 
    679690 * @param r         [in] マジックポインタ 
     
    682693 */ 
    683694 
    684 newtRef NcResolveMagicPointer(newtRefArg r) 
     695newtRef NcResolveNamedMP(newtRefArg r) 
    685696{ 
    686697    newtRefVar  sym; 
    687698 
    688     if (! NewtRefIsMagicPointer(r)) 
     699    if (! NewtRefIsNamedMP(r)) 
    689700        return r; 
    690701 
    691702    sym = NewtMPToSymbol(r); 
    692703 
    693     if (NewtHasSlot(MAGIC_POINTERS, sym)) 
    694         return NcGetSlot(MAGIC_POINTERS, sym); 
     704    if (NewtHasSlot(NAMED_MPS, sym)) 
     705        return NcGetSlot(NAMED_MPS, sym); 
    695706    else 
    696707        return r; 
     
    699710 
    700711/*------------------------------------------------------------------------*/ 
    701 /** マジックポインタの定義 
     712/** 名前付マジックポインタの定義 
    702713 * 
    703714 * @param rcvr      [in] レシーバ 
     
    708719 */ 
    709720 
    710 newtRef NsDefMagicPointer(newtRefArg rcvr, newtRefArg r, newtRefArg v) 
     721newtRef NsDefNamedMP(newtRefArg rcvr, newtRefArg r, newtRefArg v) 
    711722{ 
    712723    newtRefVar  sym; 
    713724 
    714     if (NewtRefIsMagicPointer(r)) 
     725    if (NewtRefIsNamedMP(r)) 
    715726    { 
    716727        sym = NewtMPToSymbol(r); 
     
    725736    } 
    726737 
    727     return NcSetSlot(MAGIC_POINTERS, sym, v); 
    728 } 
    729  
    730  
    731 #else 
     738    return NcSetSlot(NAMED_MPS, sym, v); 
     739} 
     740 
     741#endif /* __NAMED_MAGIC_POINTER__ */ 
     742 
    732743 
    733744/*------------------------------------------------------------------------*/ 
     
    744755    int32_t index; 
    745756 
    746     if (! NewtRefIsMagicPointer(r)) 
     757    if (! NewtRefIsNumberedMP(r)) 
     758    { 
     759#ifdef __NAMED_MAGIC_POINTER__ 
     760        return NcResolveNamedMP(r); 
     761#else 
    747762        return r; 
     763#endif 
     764    } 
    748765 
    749766    table = NewtMPToTable(r); 
     
    784801    int32_t index; 
    785802 
    786     if (NewtRefIsMagicPointer(r)) 
     803    if (NewtRefIsNumberedMP(r)) 
    787804    { 
    788805        table = NewtMPToTable(r); 
     
    800817    else 
    801818    { 
     819#ifdef __NAMED_MAGIC_POINTER__ 
     820        return NsDefNamedMP(rcvr, r, v); 
     821#else 
    802822        return kNewtRefUnbind; 
     823#endif 
    803824    } 
    804825 
     
    811832} 
    812833 
    813 #endif 
    814  
    815834 
    816835#pragma mark - 
  • NEWT0/trunk/src/newt_core/NewtObj.c

    r78 r93  
    992992{ 
    993993#ifdef __NAMED_MAGIC_POINTER__ 
    994     if (NewtRefIsMagicPointer(r)) 
     994    if (NewtRefIsNamedMP(r)) 
    995995        return false; 
    996996#endif /* __NAMED_MAGIC_POINTER__ */ 
  • NEWT0/trunk/src/newt_core/NewtPrint.c

    r68 r93  
    3636static void         NIOPrintReal(newtStream_t * f, newtRefArg r); 
    3737static void         NIOPrintObjCharacter(newtStream_t * f, newtRefArg r); 
     38static void         NIOPrintObjNamedMP(newtStream_t * f, newtRefArg r); 
    3839static void         NIOPrintObjMagicPointer(newtStream_t * f, newtRefArg r); 
    3940static void         NIOPrintObjBinary(newtStream_t * f, newtRefArg r); 
     
    376377 
    377378/*------------------------------------------------------------------------*/ 
    378 /** 出力ファイルにマジックポインタをプリントする 
    379  * 
    380  * @param f         [in] 出力ファイル 
    381  * @param r         [in] オブジェクト 
    382  * 
    383  * @return          なし 
    384  * 
    385  * @note            newtStream_t を使用 
    386  */ 
    387  
    388 void NIOPrintObjMagicPointer(newtStream_t * f, newtRefArg r) 
     379/** 出力ファイルに名前付マジックポインタをプリントする 
     380 * 
     381 * @param f         [in] 出力ファイル 
     382 * @param r         [in] オブジェクト 
     383 * 
     384 * @return          なし 
     385 * 
     386 * @note            newtStream_t を使用 
     387 */ 
     388 
     389void NIOPrintObjNamedMP(newtStream_t * f, newtRefArg r) 
    389390{ 
    390391    newtRefVar  sym; 
     
    396397} 
    397398 
    398 #else 
     399#endif /* __NAMED_MAGIC_POINTER__ */ 
     400 
    399401 
    400402/*------------------------------------------------------------------------*/ 
     
    420422} 
    421423 
    422 #endif 
    423424 
    424425/*------------------------------------------------------------------------*/ 
     
    815816            } 
    816817 
     818#ifdef __NAMED_MAGIC_POINTER__ 
     819            if (NewtRefIsNamedMP(r)) 
     820            {   // Named Magic Ponter 
     821                NIOPrintObjNamedMP(f, r); 
     822                break; 
     823            } 
     824#endif /* __NAMED_MAGIC_POINTER__ */ 
     825 
    817826            NIOPrintObjMagicPointer(f, r); 
    818827            break; 
  • NEWT0/trunk/src/newt_core/incs/NewtEnv.h

    r68 r93  
    7676    newtRefVar  magic_pointers; ///< マジックポインタテーブル 
    7777 
     78#ifdef __NAMED_MAGIC_POINTER__ 
     79    newtRefVar  named_mps;      ///< 名前付マジックポインタテーブル 
     80#endif /* __NAMED_MAGIC_POINTER__ */ 
     81 
    7882    // メモリ関係 
    7983    newtPool    pool;           ///< メモリプール 
     
    187191    newtRefVar  global_fns;         ///< global_fns 
    188192    newtRefVar  magic_pointers;     ///< magic_pointers 
     193    newtRefVar  named_mps;          ///< named_mps 
    189194 
    190195    // for print 
  • NEWT0/trunk/src/newt_core/incs/NewtObj.h

    r78 r93  
    4040#define NewtRefToSpecial(r)         (int32_t)((uint32_t)r >> 2)         ///< オブジェクト参照を特殊値に変換 
    4141 
    42 #define NewtRefIsMagicPointer(r)    ((r & 3) == 3)                      ///< マジックポインタか? 
     42#define NewtRefIsMagicPointer(r)    ((r & 3) == 3)                                      ///< マジックポインタか?(数値および名前付) 
    4343 
    4444#ifdef __NAMED_MAGIC_POINTER__ 
    45     #define NewtMakeNamedMP(r)          ((newtRef)((uint32_t)NewtMakeSymbol(r) | 3))        ///< 名前付マジックポインタを作成 
    46     #define NewtMPToSymbol(r)           ((newtRef)((uint32_t)r & 0xFFFFFFFD))               ///< 名前付マジックポインタをシンボルに変換 
    47     #define NewtSymbolToMP(r)           ((newtRef)((uint32_t)r | 3))                        ///< シンボルを名前付マジックポインタに変換 
    48 #else 
    49     #define NewtMakeMagicPointer(t, i)  ((newtRef)((t << 14) | ((i & 0x03ff) << 2) | 3))    ///< マジックポインタを作成 
    50     #define NewtMPToTable(r)            ((int32_t)((uint32_t)r >> 14))                      ///< マジックポインタのテーブル番号を取得 
    51     #define NewtMPToIndex(r)            ((int32_t)(((uint32_t)r >> 2) & 0x03ff))            ///< マジックポインタのインデックスを取得 
    52 #endif 
     45#   define NewtRefIsNamedMP(r)      ((r & 0x80000003) == 0x80000003)                    ///< 名前付マジックポインタか? 
     46#   define NewtMakeNamedMP(r)       NewtSymbolToMP(NewtMakeSymbol(r))                   ///< 名前付マジックポインタを作成 
     47#   define NewtMPToSymbol(r)        ((newtRef)((((uint32_t)r << 1) & 0xFFFFFFF8) | 1))  ///< 名前付マジックポインタをシンボルに変換 
     48#   define NewtSymbolToMP(r)        ((newtRef)(((uint32_t)r >> 1) | 0x80000003))        ///< シンボルを名前付マジックポインタに変換 
     49#endif /* __NAMED_MAGIC_POINTER__ */ 
     50 
     51#define NewtRefIsNumberedMP(r)      ((r & 0x80000003) == 3)                             ///< 数値マジックポインタか? 
     52#define NewtMakeMagicPointer(t, i)  ((newtRef)((t << 14) | ((i & 0x03ff) << 2) | 3))    ///< マジックポインタを作成 
     53#define NewtMPToTable(r)            ((int32_t)((uint32_t)r >> 14))                      ///< マジックポインタのテーブル番号を取得 
     54#define NewtMPToIndex(r)            ((int32_t)(((uint32_t)r >> 2) & 0x03ff))            ///< マジックポインタのインデックスを取得 
    5355 
    5456#define NewtRefIsNotNIL(v)          (! NewtRefIsNIL(v))                             ///< NIL 以外か? 
  • NEWT0/trunk/src/parser/newt.l

    r71 r93  
    656656 
    657657/*------------------------------------------------------------------------*/ 
    658 /** マジックポインタトークンの作成 
    659  * 
    660  * @param n         [in] マジックポインタ番号 
    661  * 
    662  * @return          トークンID 
    663  */ 
    664  
    665 int lex_makemagicpointer(int n) 
    666 { 
    667     return lex_update_tokenpos(kERROR); 
    668 } 
    669  
    670  
    671 /*------------------------------------------------------------------------*/ 
    672658/** 名前付マジックポインタの作成 
    673659 * 
     
    699685 
    700686#else 
     687 
     688/*------------------------------------------------------------------------*/ 
     689/** 名前付マジックポインタの作成 
     690 * 
     691 * @param s         [in] 文字列 
     692 * @param trunc     [in] 前後の切り詰め 
     693 * 
     694 * @return          トークンID 
     695 */ 
     696 
     697int lex_makenamedmp(char *s, bool trunc) 
     698{ 
     699    return lex_update_tokenpos(kERROR); 
     700} 
     701 
     702#endif 
     703 
    701704 
    702705/*------------------------------------------------------------------------*/ 
     
    722725 
    723726 
    724 /*------------------------------------------------------------------------*/ 
    725 /** 名前付マジックポインタの作成 
    726  * 
    727  * @param s         [in] 文字列 
    728  * @param trunc     [in] 前後の切り詰め 
    729  * 
    730  * @return          トークンID 
    731  */ 
    732  
    733 int lex_makenamedmp(char *s, bool trunc) 
    734 { 
    735     return lex_update_tokenpos(kERROR); 
    736 } 
    737  
    738 #endif 
    739  
    740  
    741727#pragma mark - 
    742728/*------------------------------------------------------------------------*/ 
  • NEWT0/trunk/src/version.h

    r83 r93  
    1717#define NEWT_NAME       "newt"                                  ///< コマンド名 
    1818#define NEWT_PROTO      "/0"                                    ///< プロト 
    19 #define NEWT_VERSION    "0.1.2"                                 ///< バージョン 
     19#define NEWT_VERSION    "0.1.3"                                 ///< バージョン 
    2020#define NEWT_COPYRIGHT  "Copyright (C) 2003-2007 Makoto Nukui"  ///< コピーライト 
    21 #define NEWT_BUILD      "2007-03-24-1"                          ///< ビルド番号 
     21#define NEWT_BUILD      "2007-03-29-1"                          ///< ビルド番号 
    2222#define NEWT_PARAMS     "[switches] [--] [programfile]"         ///< 引数 
    2323