Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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();
}
Example #5
0
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);
}
Example #6
0
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);
}
Example #7
0
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));
}
Example #8
0
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;
}
Example #9
0
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;
}