newtRef NsPrimClassOf(newtRefArg rcvr, newtRefArg r) { newtRefVar klass; if (NewtRefIsPointer(r)) { switch (NewtGetRefType(r, true)) { case kNewtFrame: klass = NSSYM0(frame); break; case kNewtArray: klass = NSSYM0(array); break; default: klass = NSSYM0(binary); break; } } else { klass = NSSYM(immediate); } return klass; }
newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name) { newtRefVar current; newtRefVar left = start; if (! NewtRefIsFrame(start)) return kNewtRefUnbind; while (NewtRefIsNotNIL(left)) { current = left; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return current; current = NcGetSlot(current, NSSYM0(_proto)); } left = NcGetSlot(left, NSSYM0(_parent)); } return kNewtRefUnbind; }
newtRef NewtObjClassOf(newtRefArg r) { newtObjRef obj; newtRefVar klass = kNewtRefNIL; obj = NewtRefToPointer(r); if (obj != NULL) { if (NewtObjIsFrame(obj)) { // klass = NewtObjGetSlot(obj, NS_CLASS); klass = NcProtoLookup(r, NS_CLASS); if (NewtRefIsNIL(klass)) klass = NSSYM0(frame); } else { klass = obj->as.klass; if (klass == kNewtSymbolClass) klass = NSSYM0(symbol); else if (NewtRefIsNIL(klass)) klass = NewtRefTypeToClass(NewtGetObjectType(obj, true)); } } return klass; }
void NewtInitEnv(int argc, const char * argv[], int n) { // シンボルテーブルの作成 SYM_TABLE = NewtMakeArray(kNewtRefUnbind, 0); NewtInitSYM(); // ルートフレームの作成 ROOT = NcMakeFrame(); // グローバル変数テーブルの作成 GLOBALS = NcMakeFrame(); // グローバル関数テーブルの作成 GLOBAL_FNS = NcMakeFrame(); // マジックポインタテーブルの作成 MAGIC_POINTERS = NewtMakeArray(kNewtRefUnbind, 0); // ルートフレームに各テーブルを格納 NcSetSlot(ROOT, NSSYM0(globals), GLOBALS); NcSetSlot(ROOT, NSSYM0(global_fns), GLOBAL_FNS); NcSetSlot(ROOT, NSSYM0(magic_pointers), MAGIC_POINTERS); NcSetSlot(ROOT, NSSYM0(sym_table), SYM_TABLE); #ifdef __NAMED_MAGIC_POINTER__ // 名前付マジックポインタテーブルの作成 NAMED_MPS = NcMakeFrame(); // ルートフレームに名前付マジックポインタテーブルの格納 NcSetSlot(ROOT, NSSYM0(named_mps), NAMED_MPS); #endif /* __NAMED_MAGIC_POINTER__ */ // 環境変数の初期化 NewtInitSysEnv(); // ARGV の初期化 NewtInitARGV(argc, argv, n); // バージョン情報の初期化 NewtInitVersInfo(); }
newtRef NsMakeRegex(newtRefArg rcvr, newtRefArg pattern, newtRefArg opt) { newtRefVar v[] = { NSSYM0(_proto), NSNAMEDMP0(protoREGEX), NSSYM0(pattern), pattern, NSSYM0(option), opt, }; return NewtMakeFrame2(sizeof(v) / (sizeof(newtRefVar) * 2), v); }
void NewtInitSysEnv(void) { struct { char * name; newtRefVar slot; const char * defaultValue; } envs[] = { {"NEWTLIB", NSSYM0(NEWTLIB), __LIBDIR__ ":."}, {"PLATFORM", NSSYM(PLATFORM), __PLATFORM__}, {"DYLIBSUFFIX", NSSYM(DYLIBSUFFIX), __DYLIBSUFFIX__}, {NULL, kNewtRefUnbind, NULL} }; newtRefVar env; newtRefVar proto; newtRefVar v; uint16_t i; env = NcMakeFrame(); proto = NcMakeFrame(); for (i = 0; envs[i].name != NULL; i++) { NcSetSlot(proto, envs[i].slot, NewtMakeString(envs[i].defaultValue, true)); } /* NEWTLIB is a special case, it can be overridden from the value in the global variables. */ v = NewtGetEnv("NEWTLIB"); if (NewtRefIsString(v)) { v = NcSplit(v, NewtMakeCharacter(':')); NcSetSlot(proto, NSSYM0(NEWTLIB), v); } else { newtRefVar default_newtlib_array[] = {NSSTR(__LIBDIR__), NSSTR(".")}; newtRefVar default_newtlib = NewtMakeArray2( kNewtRefNIL, sizeof(default_newtlib_array) / sizeof(newtRefVar), default_newtlib_array); NcSetSlot(proto, NSSYM0(NEWTLIB), default_newtlib); } NcSetSlot(env, NSSYM0(_proto), NewtPackLiteral(proto)); NcSetSlot(GLOBALS, NSSYM0(_ENV_), env); }
void NewtInitARGV(int argc, const char * argv[], int n) { newtRefVar exepath = kNewtRefUnbind; newtRefVar r; uint16_t j; uint16_t i; r = NewtMakeArray(kNewtRefUnbind, argc - n); NcSetSlot(GLOBALS, NSSYM0(_ARGV_), r); for (i = n, j = 0; i < argc; i++, j++) { NewtSetArraySlot(r, j, NewtMakeString(argv[i], true)); } #ifdef __WIN32__ { char sep; sep = NewtGetFileSeparator(); if (sep != '\\') { char * path; path = strdup(argv[0]); if (path) { replacechr(path, '\\', sep); exepath = NewtExpandPath(path); free(path); } else { exit(errno); } } } #endif if (NewtRefIsNIL(exepath)) exepath = NewtExpandPath(argv[0]); NcSetSlot(GLOBALS, NSSYM0(_EXEDIR_), NcDirName(exepath)); }
newtRef NewtRefTypeToClass(uint16_t type) { newtRefVar klass = kNewtRefUnbind; switch (type) { case kNewtInt30: case kNewtInt32: klass = NS_INT; break; case kNewtCharacter: klass = NS_CHAR; break; case kNewtTrue: klass = NSSYM0(boolean); break; case kNewtSpecial: case kNewtNil: case kNewtUnbind: klass = NSSYM0(weird_immediate); break; case kNewtFrame: klass = NSSYM0(frame); break; case kNewtArray: klass = NSSYM0(array); break; case kNewtReal: klass = NSSYM0(real); break; case kNewtSymbol: klass = NSSYM0(symbol); break; case kNewtString: klass = NSSYM0(string); break; case kNewtBinary: klass = NSSYM0(binary); break; } return klass; }
newtRef NcLexicalLookup(newtRefArg start, newtRef name) { newtRefVar current = start; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return NcGetSlot(current, name); current = NcGetSlot(current, NSSYM0(_nextArgFrame)); } return kNewtRefUnbind; }