root/NEWT0/trunk/src/newt_core/NewtEnv.c

Revision 113, 20.4 kB (checked in by gnue, 17 months ago)

'#pragma mark' is invalidated by '#if 0'

Line 
1/*------------------------------------------------------------------------*/
2/**
3 * @file    NewtEnv.c
4 * @brief   実行環境
5 *
6 * @author  M.Nukui
7 * @date    2003-11-07
8 *
9 * Copyright (C) 2003-2004 M.Nukui All rights reserved.
10 */
11
12
13/* ヘッダファイル */
14#include <string.h>
15#include <errno.h>
16
17#include "version.h"
18#include "NewtEnv.h"
19#include "NewtObj.h"
20#include "NewtFns.h"
21#include "NewtGC.h"
22#include "NewtStr.h"
23#include "NewtFile.h"
24
25
26/* マクロ */
27#define SYM_TABLE           (newt_env.sym_table)                ///< シンボルテーブル
28#define ROOT                (newt_env.root)                     ///< ルートオブジェクト
29#define GLOBALS             (newt_env.globals)                  ///< グローバル変数テーブル
30#define GLOBAL_FNS          (newt_env.global_fns)               ///< グローバル関数テーブル
31#define MAGIC_POINTERS      (newt_env.magic_pointers)           ///< マジックポインタテーブル
32#define NAMED_MPS           (newt_env.named_mps)                ///< 名前付マジックポインタテーブル
33
34#define INITSYM2(sym, str)  sym = NewtMakeSymbol(str)           ///< よく使うシンボルの初期化
35#define INITSYM(name)       INITSYM2(newt_sym.name, #name)      ///< よく使うシンボルの初期化(特殊文字なし)
36
37
38/* グローバル変数 */
39newt_env_t  newt_env;       ///< 実行環境
40newt_sym_t  newt_sym;       ///< よく使うシンボルの保管場所
41
42
43/* 関数プロトタイプ */
44char *  replacechr(char * str, char srch, char repl);
45
46static void     NewtInitSYM(void);
47static void     NewtInitSysEnv(void);
48static void     NewtInitARGV(int argc, const char * argv[], int n);
49static void     NewtInitVersInfo(void);
50static 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
55
56#if 0
57#pragma mark -
58#endif
59/*------------------------------------------------------------------------*/
60/** 文字列の文字を指定された文字で置き換える
61 *
62 * @param str       [i/o]文字列
63 * @param src       [in] 置換えられる文字
64 * @param dest      [in] 置換える文字
65 *
66 * @return          置き換えられた文字列
67 */
68
69char * replacechr(char * str, char src, char dest)
70{
71    char *  s;
72
73    for (s = str; *s; s++)
74    {
75        if (*s == src) *s = dest;
76    }
77
78    return str;
79}
80
81
82#if 0
83#pragma mark -
84#endif
85/*------------------------------------------------------------------------*/
86/** 環境変数からデフォルトエンコーディングを取得
87 *
88 * @return          デフォルトエンコーディング(文字列)
89 */
90
91char * NewtDefaultEncoding(void)
92{
93    char *  encoding = NULL;
94    char *  lang;
95
96    lang = (char *)getenv("LANG");
97    if (! lang) lang = (char *)getenv("LC_ALL");
98    if (lang) encoding = strchr(lang, '.');
99
100    if (encoding)
101        encoding++;
102    else
103        encoding = NEWT_DEFAULT_ENCODING;
104
105    return encoding;
106}
107
108
109#if 0
110#pragma mark -
111#endif
112/*------------------------------------------------------------------------*/
113/** よく使うシンボルの初期化
114 *
115 * @return          なし
116 */
117
118void NewtInitSYM(void)
119{
120    // frame
121    INITSYM(_proto);
122    INITSYM(_parent);
123
124    // function
125    INITSYM(_implementor);
126    INITSYM(_nextArgFrame);
127    INITSYM(CodeBlock);
128    INITSYM2(NS_CLASS, "class");
129    INITSYM(instructions);
130    INITSYM(literals);
131    INITSYM(argFrame);
132    INITSYM(numArgs);
133    INITSYM(indefinite);
134
135    // native function
136    INITSYM(_function.native0);
137    INITSYM(_function.native);
138    INITSYM(funcPtr);
139    INITSYM(docString);
140
141    // classes or types
142    INITSYM(binary);
143    INITSYM(string);
144    INITSYM(real);
145    INITSYM(array);
146    INITSYM(frame);
147    INITSYM2(NS_INT, "int");
148    INITSYM(int32);
149    INITSYM(pathExpr);
150
151    // for loop
152    INITSYM(collect);
153    INITSYM(deeply);
154
155    // class
156    INITSYM2(NS_CHAR, "char");
157    INITSYM(boolean);
158    INITSYM(weird_immediate);
159    INITSYM(forEachState);
160
161    // functions(必須)
162    INITSYM(hasVariable);
163    INITSYM(hasVar);
164    INITSYM(defGlobalFn);
165    INITSYM(defGlobalVar);
166//    INITSYM(and);
167//    INITSYM(or);
168    INITSYM(mod);
169    INITSYM(shiftLeft);
170    INITSYM(shiftRight);
171    INITSYM(objectEqual);
172    INITSYM(defMagicPointer);
173    INITSYM(makeRegex);
174
175    // exception type
176    INITSYM(type.ref);
177    INITSYM(ext.ex.msg);
178
179    // exception frame
180    INITSYM(name);
181    INITSYM(data);
182    INITSYM(message);
183    INITSYM(error);
184
185    INITSYM(errorCode);
186    INITSYM(symbol);
187    INITSYM(value);
188    INITSYM(index);
189
190    // root
191    INITSYM(sym_table);
192    INITSYM(globals);
193    INITSYM(global_fns);
194    INITSYM(magic_pointers);
195#ifdef __NAMED_MAGIC_POINTER__
196    INITSYM(named_mps);
197#endif /* __NAMED_MAGIC_POINTER__ */
198
199    // for print
200    INITSYM(printDepth);
201    INITSYM(printLength);
202
203    // for regex
204    INITSYM(protoREGEX);
205    INITSYM(regex);
206    INITSYM(pattern);
207    INITSYM(option);
208
209    // for require
210    INITSYM(requires);
211
212    // ENV
213    INITSYM(_ENV_);
214    INITSYM(NEWTLIB);
215
216    // ARGV
217    INITSYM(_ARGV_);
218    INITSYM(_EXEDIR_);
219
220    // stdout, stderr
221    INITSYM(_STDOUT_);
222    INITSYM(_STDERR_);
223}
224
225
226/*------------------------------------------------------------------------*/
227/** システム環境変数の初期化
228 *
229 * @return          なし
230 */
231
232void NewtInitSysEnv(void)
233{
234    struct {
235        char *          name;
236        newtRefVar      slot;
237        const char *    defaultValue;
238    } envs[] = {
239        {"NEWTLIB",     NSSYM0(NEWTLIB),    __LIBDIR__ ":."},
240        {"PLATFORM",    NSSYM(PLATFORM),    __PLATFORM__},
241        {"DYLIBSUFFIX", NSSYM(DYLIBSUFFIX), __DYLIBSUFFIX__},
242        {NULL,          kNewtRefUnbind,     NULL}
243    };
244
245    newtRefVar  env;
246    newtRefVar  proto;
247    newtRefVar  v;
248    uint16_t    i;
249
250    env = NcMakeFrame();
251    proto = NcMakeFrame();
252
253    for (i = 0; envs[i].name != NULL; i++)
254    {
255        NcSetSlot(proto, envs[i].slot, NewtMakeString(envs[i].defaultValue, true));
256    }
257
258    /* NEWTLIB is a special case, it can be overridden from the value in
259       the global variables. */
260    v = NewtGetEnv("NEWTLIB");
261    if (NewtRefIsString(v))
262    {
263        v = NcSplit(v, NewtMakeCharacter(':'));
264        NcSetSlot(proto, NSSYM0(NEWTLIB), v);
265    }
266    else
267    {
268        newtRefVar default_newtlib_array[] = {NSSTR(__LIBDIR__), NSSTR(".")};
269        newtRefVar default_newtlib = NewtMakeArray2(
270                kNewtRefNIL,
271                sizeof(default_newtlib_array) / sizeof(newtRefVar),
272                default_newtlib_array);
273        NcSetSlot(proto, NSSYM0(NEWTLIB), default_newtlib);
274    }
275
276    NcSetSlot(env, NSSYM0(_proto), NewtPackLiteral(proto));
277    NcSetSlot(GLOBALS, NSSYM0(_ENV_), env);
278}
279
280
281/*------------------------------------------------------------------------*/
282/** コマンドライン引数の初期化
283 *
284 * @param argc      [in] コマンドライン引数の数
285 * @param argv      [in] コマンドライン引数の配列
286 * @param n         [in] コマンドライン引数の位置
287 *
288 * @return          なし
289 */
290 
291void NewtInitARGV(int argc, const char * argv[], int n)
292{
293    newtRefVar  exepath = kNewtRefUnbind;
294    newtRefVar  r;
295    uint16_t    j;
296    uint16_t    i;
297
298    r = NewtMakeArray(kNewtRefUnbind, argc - n);
299    NcSetSlot(GLOBALS, NSSYM0(_ARGV_), r);
300
301    for (i = n, j = 0; i < argc; i++, j++)
302    {
303        NewtSetArraySlot(r, j, NewtMakeString(argv[i], true));
304    }
305
306#ifdef __WIN32__
307    {
308        char    sep;
309
310        sep = NewtGetFileSeparator();
311
312        if (sep != '\\')
313        {
314            char *  path;
315
316            path = strdup(argv[0]);
317
318            if (path)
319            {
320                replacechr(path, '\\', sep);
321                exepath = NewtExpandPath(path);
322                free(path);
323            }
324            else
325            {
326                exit(errno);
327            }
328        }
329    }
330#endif
331
332    if (NewtRefIsNIL(exepath))
333        exepath = NewtExpandPath(argv[0]);
334
335    NcSetSlot(GLOBALS, NSSYM0(_EXEDIR_), NcDirName(exepath));
336}
337
338
339/*------------------------------------------------------------------------*/
340/** バージョン情報の初期化
341 *
342 * @return          なし
343 */
344
345void NewtInitVersInfo(void)
346{
347    newtRefVar  versInfo;
348
349    versInfo = NcMakeFrame();
350
351    // プロダクト名
352    NcSetSlot(versInfo, NSSYM(name), NewtMakeString(NEWT_NAME, true));
353    // プロト番号
354    NcSetSlot(versInfo, NSSYM(proto), NewtMakeString(NEWT_PROTO, true));
355    // バージョン番号
356    NcSetSlot(versInfo, NSSYM(version), NewtMakeString(NEWT_VERSION, true));
357    // ビルド番号
358    NcSetSlot(versInfo, NSSYM(build), NewtMakeString(NEWT_BUILD, true));
359    // コピーライト
360    NcSetSlot(versInfo, NSSYM(copyright), NewtMakeString(NEWT_COPYRIGHT, true));
361    // スタッフロール
362    NcSetSlot(versInfo, NSSYM(staff), NewtMakeString(NEWT_STAFF, true));
363
364    // リードオンリーにしてグローバル変数に入れる
365    NcSetSlot(GLOBALS, NSSYM(_VERSION_), NewtPackLiteral(versInfo));
366}
367
368
369/*------------------------------------------------------------------------*/
370/** 実行環境の初期化
371 *
372 * @param argc      [in] コマンドライン引数の数
373 * @param argv      [in] コマンドライン引数の配列
374 * @param n         [in] コマンドライン引数の位置
375 *
376 * @return          なし
377 */
378
379void NewtInitEnv(int argc, const char * argv[], int n)
380{
381    // シンボルテーブルの作成
382    SYM_TABLE = NewtMakeArray(kNewtRefUnbind, 0);
383    NewtInitSYM();
384
385    // ルートフレームの作成
386    ROOT = NcMakeFrame();
387    // グローバル変数テーブルの作成
388    GLOBALS = NcMakeFrame();
389    // グローバル関数テーブルの作成
390    GLOBAL_FNS = NcMakeFrame();
391    // マジックポインタテーブルの作成
392    MAGIC_POINTERS = NewtMakeArray(kNewtRefUnbind, 0);
393
394    // ルートフレームに各テーブルを格納
395    NcSetSlot(ROOT, NSSYM0(globals), GLOBALS);
396    NcSetSlot(ROOT, NSSYM0(global_fns), GLOBAL_FNS);
397    NcSetSlot(ROOT, NSSYM0(magic_pointers), MAGIC_POINTERS);
398    NcSetSlot(ROOT, NSSYM0(sym_table), SYM_TABLE);
399
400#ifdef __NAMED_MAGIC_POINTER__
401    // 名前付マジックポインタテーブルの作成
402    NAMED_MPS = NcMakeFrame();
403    // ルートフレームに名前付マジックポインタテーブルの格納
404    NcSetSlot(ROOT, NSSYM0(named_mps), NAMED_MPS);
405#endif /* __NAMED_MAGIC_POINTER__ */
406
407    // 環境変数の初期化
408    NewtInitSysEnv();
409    // ARGV の初期化
410    NewtInitARGV(argc, argv, n);
411    // バージョン情報の初期化
412    NewtInitVersInfo();
413}
414
415
416/*------------------------------------------------------------------------*/
417/** インタプリタの初期化
418 *
419 * @param argc      [in] コマンドライン引数の数
420 * @param argv      [in] コマンドライン引数の配列
421 * @param n         [in] コマンドライン引数の位置
422 *
423 * @return          なし
424 */
425
426void NewtInit(int argc, const char * argv[], int n)
427{
428    // メモリプールの確保
429    NEWT_POOL = NewtPoolAlloc(NEWT_POOL_EXPANDSPACE);
430    // 実行環境の初期化
431    NewtInitEnv(argc, argv, n);
432}
433
434
435/*------------------------------------------------------------------------*/
436/** インタプリタの後始末
437 *
438 * @return          なし
439 */
440
441void NewtCleanup(void)
442{
443    // 後始末をすること
444
445    // メモリプールの解放
446    if (NEWT_POOL != NULL)
447    {
448        NewtPoolRelease(NEWT_POOL);
449        NewtMemFree(NEWT_POOL);
450        NEWT_POOL = NULL;
451    }
452}
453
454
455#if 0
456#pragma mark -
457#endif
458/*------------------------------------------------------------------------*/
459/** シンボルテーブルからシンボルを検索する
460 *
461 * @param name      [in] シンボルの名前
462 *
463 * @return          シンボルオブジェクト
464 */
465
466newtRef NewtLookupSymbolTable(const char * name)
467{
468    return NewtLookupSymbol(SYM_TABLE, name, 0, 0);
469}
470
471
472#if 0
473#pragma mark -
474#endif
475/*------------------------------------------------------------------------*/
476/** グローバル関数の有無を調べる
477 *
478 * @param r         [in] シンボルオブジェクト
479 *
480 * @retval          true    グローバル関数が存在する
481 * @retval          false   グローバル関数が存在しない
482 */
483
484bool NewtHasGlobalFn(newtRefArg r)
485{
486    return NewtHasSlot(GLOBAL_FNS, r);
487}
488
489
490/*------------------------------------------------------------------------*/
491/** グローバル変数の有無を調べる
492 *
493 * @param r         [in] シンボルオブジェクト
494 *
495 * @retval          true    グローバル変数が存在する
496 * @retval          false   グローバル変数が存在しない
497 */
498
499bool NewtHasGlobalVar(newtRefArg r)
500{
501    return NewtHasSlot(GLOBALS, r);
502}
503
504
505#if 0
506#pragma mark -
507#endif
508/*------------------------------------------------------------------------*/
509/** グローバル関数の有無を調べる
510 *
511 * @param rcvr      [in] レシーバ
512 * @param r         [in] シンボルオブジェクト
513 *
514 * @retval          TRUE    グローバル関数が存在する
515 * @retval          NIL     グローバル関数が存在しない
516 *
517 * @note            スクリプトからの呼出し用
518 */
519
520newtRef NsGlobalFnExists(newtRefArg rcvr, newtRefArg r)
521{
522    return NewtMakeBoolean(NewtHasGlobalFn(r));
523}
524
525
526#ifdef __USE_OBSOLETE_STYLE__
527/*------------------------------------------------------------------------*/
528/** グローバル関数の有無を調べる (OBSOLETE)
529 *
530 * @param rcvr      [in] レシーバ
531 * @param r         [in] シンボルオブジェクト
532 *
533 * @retval          TRUE    グローバル関数が存在する
534 * @retval          NIL     グローバル関数が存在しない
535 *
536 * @note            スクリプトからの呼出し用
537 */
538
539newtRef NsHasGlobalFn(newtRefArg rcvr, newtRefArg r)
540{
541    return NewtMakeBoolean(NewtHasGlobalFn(r));
542}
543#endif /* __USE_OBSOLETE_STYLE__ */
544
545
546/*------------------------------------------------------------------------*/
547/** グローバル関数の取得
548 *
549 * @param rcvr      [in] レシーバ
550 * @param r         [in] シンボルオブジェクト
551 *
552 * @return          関数オブジェクト
553 */
554
555newtRef NsGetGlobalFn(newtRefArg rcvr, newtRefArg r)
556{
557    return NcGetSlot(GLOBAL_FNS, r);
558}
559
560
561/*------------------------------------------------------------------------*/
562/** グローバル関数の定義
563 *
564 * @param rcvr      [in] レシーバ
565 * @param r         [in] シンボルオブジェクト
566 * @param fn        [in] 関数オブジェクト
567 *
568 * @return          関数オブジェクト
569 */
570
571newtRef NsDefGlobalFn(newtRefArg rcvr, newtRefArg r, newtRefArg fn)
572{
573    return NcSetSlot(GLOBAL_FNS, r, fn);
574}
575
576
577/*------------------------------------------------------------------------*/
578/** Undefine a global function.
579 *
580 * @param rcvr      [in] レシーバ
581 * @param r         [in] シンボルオブジェクト
582 *
583 * @return          NIL
584 */
585
586newtRef NsUndefGlobalFn(newtRefArg rcvr, newtRefArg r)
587{
588    (void) NcRemoveSlot(GLOBAL_FNS, r);
589    return kNewtRefNIL;
590}
591
592
593/*------------------------------------------------------------------------*/
594/** グローバル変数の有無を調べる
595 *
596 * @param rcvr      [in] レシーバ
597 * @param r         [in] シンボルオブジェクト
598 *
599 * @retval          TRUE    グローバル変数が存在する
600 * @retval          NIL     グローバル変数が存在しない
601 *
602 * @note            スクリプトからの呼出し用
603 */
604
605newtRef NsGlobalVarExists(newtRefArg rcvr, newtRefArg r)
606{
607    return NewtMakeBoolean(NewtHasGlobalVar(r));
608}
609
610
611#ifdef __USE_OBSOLETE_STYLE__
612/*------------------------------------------------------------------------*/
613/** グローバル変数の有無を調べる (OBSOLETE)
614 *
615 * @param rcvr      [in] レシーバ
616 * @param r         [in] シンボルオブジェクト
617 *
618 * @retval          TRUE    グローバル変数が存在する
619 * @retval          NIL     グローバル変数が存在しない
620 *
621 * @note            スクリプトからの呼出し用
622 */
623
624newtRef NsHasGlobalVar(newtRefArg rcvr, newtRefArg r)
625{
626    return NsGlobalVarExists(rcvr, r);
627}
628#endif /* __USE_OBSOLETE_STYLE__ */
629
630
631/*------------------------------------------------------------------------*/
632/** グローバル変数の取得
633 *
634 * @param rcvr      [in] レシーバ
635 * @param r         [in] シンボルオブジェクト
636 *
637 * @return          オブジェクト
638 */
639
640newtRef NsGetGlobalVar(newtRefArg rcvr, newtRefArg r)
641{
642    return NcGetSlot(GLOBALS, r);
643}
644
645
646/*------------------------------------------------------------------------*/
647/** グローバル変数に値をセットする
648 *
649 * @param rcvr      [in] レシーバ
650 * @param r         [in] シンボルオブジェクト
651 * @param v         [in] 値オブジェクト
652 *
653 * @return          オブジェクト
654 */
655
656newtRef NsDefGlobalVar(newtRefArg rcvr, newtRefArg r, newtRefArg v)
657{
658    return NcSetSlot(GLOBALS, r, v);
659}
660
661
662#ifdef __USE_OBSOLETE_STYLE__
663/*------------------------------------------------------------------------*/
664/** グローバル変数に値をセットする (OBSOLETE)
665 *
666 * @param rcvr      [in] レシーバ
667 * @param r         [in] シンボルオブジェクト
668 * @param v         [in] 値オブジェクト
669 *
670 * @return          オブジェクト
671 */
672
673newtRef NsSetGlobalVar(newtRefArg rcvr, newtRefArg r, newtRefArg v)
674{
675    return NcSetSlot(GLOBALS, r, v);
676}
677#endif /* __USE_OBSOLETE_STYLE__ */
678
679
680/*------------------------------------------------------------------------*/
681/** Undefine a global variable.
682 *
683 * @param rcvr      [in] レシーバ
684 * @param r         [in] シンボルオブジェクト
685 *
686 * @return          NIL
687 */
688
689newtRef NsUndefGlobalVar(newtRefArg rcvr, newtRefArg r)
690{
691    (void) NcRemoveSlot(GLOBALS, r);
692    return kNewtRefNIL;
693}
694
695
696#ifdef __NAMED_MAGIC_POINTER__
697
698/*------------------------------------------------------------------------*/
699/** 名前付マジックポインタの参照を解決する
700 *
701 * @param r         [in] マジックポインタ
702 *
703 * @return          オブジェクト
704 */
705
706newtRef NcResolveNamedMP(newtRefArg r)
707{
708    newtRefVar  sym;
709
710    if (! NewtRefIsNamedMP(r))
711        return r;
712
713    sym = NewtMPToSymbol(r);
714
715    if (NewtHasSlot(NAMED_MPS, sym))
716        return NcGetSlot(NAMED_MPS, sym);
717    else
718        return r;
719}
720
721
722/*------------------------------------------------------------------------*/
723/** 名前付マジックポインタの定義
724 *
725 * @param rcvr      [in] レシーバ
726 * @param r         [in] マジックポインタ
727 * @param v         [in] オブジェクト
728 *
729 * @return          オブジェクト
730 */
731
732newtRef NsDefNamedMP(newtRefArg rcvr, newtRefArg r, newtRefArg v)
733{
734    newtRefVar  sym;
735
736    if (NewtRefIsNamedMP(r))
737    {
738        sym = NewtMPToSymbol(r);
739    }
740    else if (NewtRefIsSymbol(r))
741    {
742        sym = r;
743    }
744    else
745    {
746        return r;
747    }
748
749    return NcSetSlot(NAMED_MPS, sym, v);
750}
751
752#endif /* __NAMED_MAGIC_POINTER__ */
753
754
755/*------------------------------------------------------------------------*/
756/** マジックポインタの参照を解決する
757 *
758 * @param r         [in] マジックポインタ
759 *
760 * @return          オブジェクト
761 */
762
763newtRef NcResolveMagicPointer(newtRefArg r)
764{
765    int32_t table = 0;
766    int32_t index;
767
768    if (! NewtRefIsNumberedMP(r))
769    {
770#ifdef __NAMED_MAGIC_POINTER__
771        return NcResolveNamedMP(r);
772#else
773        return r;
774#endif
775    }
776
777    table = NewtMPToTable(r);
778    index = NewtMPToIndex(r);
779
780    if (table != 0)
781    {   // テーブル番号 0 以外は未サポート
782        return r;
783    }
784
785    if (index < NewtLength(MAGIC_POINTERS))
786    {
787        newtRefVar  result;
788
789        result = NewtGetArraySlot(MAGIC_POINTERS, index);
790
791        if (result != kNewtRefUnbind)
792            return result;
793    }
794
795    return r;
796}
797
798
799/*------------------------------------------------------------------------*/
800/** マジックポインタの定義
801 *
802 * @param rcvr      [in] レシーバ
803 * @param r         [in] マジックポインタ
804 * @param v         [in] オブジェクト
805 *
806 * @return          オブジェクト
807 */
808
809newtRef NsDefMagicPointer(newtRefArg rcvr, newtRefArg r, newtRefArg v)
810{
811    int32_t table = 0;
812    int32_t index;
813
814    if (NewtRefIsNumberedMP(r))
815    {
816        table = NewtMPToTable(r);
817        index = NewtMPToIndex(r);
818
819        if (table != 0)
820        {   // テーブル番号 0 以外は未サポート
821            return kNewtRefUnbind;
822        }
823    }
824    else if (NewtRefIsInteger(r))
825    {
826        index = NewtRefToInteger(r);
827    }
828    else
829    {
830#ifdef __NAMED_MAGIC_POINTER__
831        return NsDefNamedMP(rcvr, r, v);
832#else
833        return kNewtRefUnbind;
834#endif
835    }
836
837    if (NewtLength(MAGIC_POINTERS) <= index)
838    {   // テーブルの長さを拡張
839        NewtSetLength(MAGIC_POINTERS, index + 1);
840    }
841
842    return NewtSetArraySlot(MAGIC_POINTERS, index, v);
843}
844
845
846#if 0
847#pragma mark -
848#endif
849/*------------------------------------------------------------------------*/
850/** ルートオブジェクトの取得
851 *
852 * @param rcvr      [in] レシーバ
853 *
854 * @return          ルートオブジェクト
855 */
856
857newtRef NsGetRoot(newtRefArg rcvr)
858{
859    return ROOT;
860}
861
862
863/*------------------------------------------------------------------------*/
864/** グローバル変数テーブルの取得
865 *
866 * @param rcvr      [in] レシーバ
867 *
868 * @return          グローバル変数テーブル
869 */
870
871newtRef NsGetGlobals(newtRefArg rcvr)
872{
873    return GLOBALS;
874}
875
876
877/*------------------------------------------------------------------------*/
878/** グローバル関数テーブルの取得
879 *
880 * @param rcvr      [in] レシーバ
881 *
882 * @return          グローバル関数テーブル
883 */
884
885newtRef NsGetGlobalFns(newtRefArg rcvr)
886{
887    return GLOBAL_FNS;
888}
889
890
891/*------------------------------------------------------------------------*/
892/** マジックポインタ関数テーブルの取得
893 *
894 * @param rcvr      [in] レシーバ
895 *
896 * @return          マジックポインタ関数テーブル
897 */
898
899newtRef NsGetMagicPointers(newtRefArg rcvr)
900{
901    return MAGIC_POINTERS;
902}
903
904
905/*------------------------------------------------------------------------*/
906/** シンボルテーブルの取得
907 *
908 * @param rcvr      [in] レシーバ
909 *
910 * @return          シンボルテーブル
911 */
912
913newtRef NsGetSymTable(newtRefArg rcvr)
914{
915    return SYM_TABLE;
916}
Note: See TracBrowser for help on using the browser.