Beispiel #1
0
Datei: vm.c Projekt: rjeli/vm
int main(int argc, char *argv[])
{
	printf("vm\n");
	if(argc < 2) {
		printf("usage: %s <vm-file>\n", argv[0]);
	} else {
		FILE *fp;
		fp = fopen(argv[1], "rb");
		if(fp == NULL) {
			printf("can't open file %s\n", argv[1]);
		} else {
			printf("opened file\n");
			struct fn_node fn_root;
			struct vm_env env;
			fn_root = load_bytecode(fp, &env);
			fclose(fp);
			printf("dump:\n\n");
			dump_bytecode(fn_root);
			eval_bc_fn(fn_root, &env, 0);
			free_bytecode(fn_root);
		}
	}
	return 0;
}
Beispiel #2
0
static void dump( FILE *sourcefh, EcInt level, EC_OBJ obj )
{
	EC_OBJ sub;
	EcInt  i;

	if (EC_NULLP(obj))
		return;

	if (EC_ARRAYP(obj))
	{
		IND0; ec_fprintf( stdout, "ARRAY %r:\n", obj ); fflush( stdout );
		if (option_all)
		{
			for (i = 0; i < EC_ARRAYLEN(obj); i++)
			{
				sub = EcArrayGet( obj, i );
				IND1; ec_fprintf( stdout, "ELEMENT %ld: %w\n", i, sub ); fflush( stdout );
				dump( sourcefh, level + 1, sub ); fflush( stdout );
			}
		}
	} else if (EC_PACKAGEP(obj))
	{
		IND0; ec_fprintf( stdout, "PACKAGE %r:\n", obj ); fflush( stdout );
		dump( sourcefh, level + 1, EC_PACKAGECODE(obj) ); fflush( stdout );
		if (option_all)
		{
			for (i = 0; i < EC_PACKAGENEXPORT(obj); i++)
			{
				ec_fprintf( stdout, "\n" ); fflush( stdout );
				sub = EcArrayGet( EC_PACKAGEFRAME(obj), EC_PACKAGEEXPORT(obj)[i].pos );
				IND1; ec_fprintf( stdout, "EXPORTED %k at %ld: %w\n", EC_PACKAGEEXPORT(obj)[i].sym, (long)i, sub ); fflush( stdout );
				dump( sourcefh, level + 1, sub ); fflush( stdout );
			}

			dump( sourcefh, level + 1, EC_PACKAGEFRAME(obj) ); fflush( stdout );
		}
	} else if (EC_COMPILEDP(obj))
	{
		IND0; ec_fprintf( stdout, "BYTECODE %r:\n", obj ); fflush( stdout );
		dump_bytecode( sourcefh, level + 1, obj, 0 ); fflush( stdout );
	} else if (EC_HANDLERP(obj))
	{
		IND0; ec_fprintf( stdout, "HANDLER %r:\n", obj ); fflush( stdout );
		if (option_all)
		{
			dump( sourcefh, level + 1, EC_HANDLERCODE(obj) ); fflush( stdout );
		}
	} else if (EC_CLASSP(obj))
	{
		IND0; ec_fprintf( stdout, "CLASS %r:\n", obj ); fflush( stdout );
		if (option_all)
		{
			EcUInt symid;

			for (i = 0; i < EC_CLASSNMETHODS(obj); i++)
			{
				symid = EC_CLASSMTABLE(obj)[i].symid;
				sub   = EC_CLASSMTABLE(obj)[i].impl;

				IND1; ec_fprintf( stdout, "METHOD %k: %w\n", symid, sub ); fflush( stdout );
				dump( sourcefh, level + 1, sub ); fflush( stdout );
			}

			for (i = 0; i < EC_CLASSNCMETHODS(obj); i++)
			{
				symid = EC_CLASSCMTABLE(obj)[i].symid;
				sub   = EC_CLASSCMTABLE(obj)[i].impl;

				IND1; ec_fprintf( stdout, "CLASS METHOD %k: %w\n", symid, sub ); fflush( stdout );
				dump( sourcefh, level + 1, sub ); fflush( stdout );
			}
		}
	}
	fflush( stdout );
}