Ejemplo n.º 1
0
static object *
amigalibs_addr(object *self, object *arg)
{
	if(arg)
	{
		if(PyInt_Check(arg))
			return newintobject((long) &((PyIntObject*)arg)->ob_ival);
		else if(PyFloat_Check(arg))
			return newintobject((long) &((PyFloatObject*)arg)->ob_fval);
		else if(PyString_Check(arg))
			return newintobject((long) &((PyStringObject*)arg)->ob_sval);
		else if(arg==Py_None)
			return newintobject(0);
	}
	return (object*)PyErr_BadArgument();
}
Ejemplo n.º 2
0
void init_all(int argc, char **argv) {
    // process command line arguments
    char *filename = NULL;
    FILE *fp = stdin;
    EmObject *ob;

    if (argc > 1)
        filename = argv[1];

    if (filename != NULL) {
        if ((fp = fopen(filename, "r")) == NULL) {
            fprintf(stderr, "Cannot open file %s\n", filename);
            exit(1);
        }
        source.type = SOURCE_TYPE_FILE;
    } else {
        source.type = SOURCE_TYPE_PROMPT;
    }
    source.filename = filename;
    source.fp = fp;

    // Constant hash table
    literalTable = newhashobject();
    // Add commonly used literals
    ob = newintobject(1);
    hashobject_insert_by_string(literalTable, "1", ob);
    DECREF(ob);
    ob = newintobject(-1);
    hashobject_insert_by_string(literalTable, "-1", ob);
    DECREF(ob);
    ob = newintobject(0);
    hashobject_insert_by_string(literalTable, "0", ob);
    DECREF(ob);

    ob = newstringobject("*");
    hashobject_insert_by_string(literalTable, "*", ob);
    DECREF(ob);

    hashobject_insert_by_string(literalTable, "null", &nulobj);


    // initialize the lexer
    lexer_init();

    // initialize the VM
    vm_init();
}
Ejemplo n.º 3
0
static object *
lib_getattr(amigalibobject *ao, char *name)
{
	if (strcmp(name, "base") == 0)
		return newintobject((long)ao->libbase);
	if (strcmp(name, "version") == 0)
		return mkvalue("(ii)", ao->libbase->lib_Version, ao->libbase->lib_Revision);

	return findmethod(lib_methods, (object *)ao, name);
}
Ejemplo n.º 4
0
static object *
amigalibs_obj2reg(object *self, object *arg)
{
	ULONG res;
	if(!arg)
		return (object*) PyErr_BadArgument();

	if(obj2reg(arg, &res))
		return newintobject(res);
	else
	{
		err_setstr(TypeError, "can't convert type to register ULONG");
		return NULL;
	}
}
Ejemplo n.º 5
0
/*
**	CALL - perform library call
*/
static object *
lib_call(amigalibobject *self, object *args)				// call
{
	object *dic;
	int LVO_value;
	ULONG regspec, orig_regspec;
	int pos=0;
	object *key, *value;

	/* the registers: */
	ULONG reg[16];

	if (!newgetargs(args, "(ii)O", &LVO_value, &regspec, &dic)) return NULL;

	if(!PyDict_Check(dic))
	{
		err_setstr(TypeError, "2nd arg must be dictionary");
		return NULL;
	}

	if(LVO_value>-30 || LVO_value%2)
	{
		err_setstr(ValueError, "illegal LVO value");
		return NULL;
	}

	if(regspec<0 || regspec >0xFFFF)
	{
		err_setstr(ValueError, "illegal regspec");
		return NULL;
	}
	
	orig_regspec=regspec;

	while(PyDict_Next(dic,&pos,&key,&value))
	{
		int regnr =  PyInt_AsLong(key);
		if(!PyInt_Check(key) || regnr<0 || regnr>15)
		{
			err_setstr(ValueError, "illegal key/regnr.");
			return NULL;
		}
		else
		{
			ULONG regval;
			if(!obj2reg(value,&regval))
			{
				err_setstr(ValueError, "illegal register value");
				return NULL;
			}

			/* OK: the register `regnr' must get the value `regval' */
			/* Check if register regnr indeed must get a value */
			if(regspec & (1<<regnr))
			{
				/* Yes, put value in register & clear register bit */
				reg[regnr]=regval;
				regspec &= ~(1<<regnr);
			}
			else
			{
				err_setstr(ValueError, "registers not consistent with LVO spec");
				return NULL;
			}
		}
	}

	/* Are there still registers to assign a value to? */
	if(regspec)
	{
		err_setstr(ValueError, "too few arguments provided");
		return NULL;
	}

	/* XXXX TODO: SHOULD PASS ARGUMENTS ALSO */
	return newintobject(
			amigalibs_calllib(self->libbase,
				LVO_value,orig_regspec,reg));
}