Пример #1
0
int _tmain(int argc, _TCHAR* argv[])
{
	if(argc < 2){
		printf("ObjctScript " OS_VERSION " Copyright (C) 2012 Evgeniy Golovin ([email protected])\n");
		printf("Latest version and source code: https://github.com/unitpoint/objectscript\n");
		printf("\n");
		printf("Usage: %s script [args]\n", argv[0]);
		exit(1);
	}

	// craete ObjectScript instance
	OS * os = OS::create();
	// save allocated memory at start point
	int start_mem_usage = os->getAllocatedBytes();
	// set needed settings
	os->setSetting(OS_SETTING_CREATE_DEBUG_INFO, true);
	os->setSetting(OS_SETTING_CREATE_DEBUG_OPCODES, true);
	os->setSetting(OS_SETTING_CREATE_COMPILED_FILE, true);
	// create program arguments
	os->newObject();
	for(int i = 0; i < argc; i++){
		os->pushStackValue(-1);
		os->pushNumber(i-1);
		os->pushString(getString(os, argv[i]));
		os->setProperty();
	}
	// we can use the program arguments as global arg variable inside of our script
	os->setGlobal("arg");
	// set global getTimeSec function so we can check time inside of our script
	os->setGlobal(def("getTimeSec", getTimeSec));
	// run main stript
	// os->require("c:\\Sources\\OS\\proj.win32\\profile_benchmark\\scripts\\n-body.os"); // getString(os, argv[1]));
	// os->require("c:\\Sources\\OS\\unit-tests-os\\operators.os"); // getString(os, argv[1]));
	// os->require(getString(os, argv[1]));
	os->require(getString(os, argv[1]), true, 0, OS_SOURCECODE_AUTO);
	{
		int mem_allocated = os->getAllocatedBytes()/1024;
		int mem_cached = os->getCachedBytes()/1024;
		// run gc full step
		os->gcFull();
		int after_mem_allocated = os->getAllocatedBytes()/1024;
		int after_mem_cached = os->getCachedBytes()/1024;
		// output some debug memory usage info
		printf("\n\n[before GC] memory used: %d Kb, cached: %d Kb, allocated: %d Kb\n[after  GC] memory used: %d Kb, cached: %d Kb, allocated: %d Kb\n", 
			mem_allocated - mem_cached, 
			mem_cached, 
			mem_allocated, 
			after_mem_allocated - after_mem_cached,
			after_mem_cached,
			after_mem_allocated
			);
#ifdef OS_DEBUG
		printf("\nNotice: debug build uses much more memory than release build\n");
#endif
	}
	// release the ObjectScript instance
	os->release();
	return 0;
}
Пример #2
0
int _tmain(int argc, _TCHAR* argv[])
{
    // craete ObjectScript instance
    OS * os = OS::create();

    /*
    	Part 1: let's simulate following OS code:

    	print("10 * (3+2) = ", 10 * (3+2))
    */
    // prepare function call
    os->getGlobal("print");	// #1 - stack values, it's print function from standart library
    os->pushNull();			// #2 - null, it's function this, each call of function must have this
    // push the first argument
    os->pushString("10 * (3+2) = ");	// #3 - we have 3 stack values here
    // prepare second argument
    os->pushNumber(10);		// #4
    os->pushNumber(3);		// #5
    os->pushNumber(2);		// #6
    os->runOp(OP_ADD);		// #5 - 3+2
    os->runOp(OP_MUL);		// #4 - 10 * (3+2)
    // we have 4 stack values here:
    // #1 - function
    // #2 - function this, it's null here
    // #3 - string "10 * (3+2) = "
    // #4 - number, it's result of 10 * (3+2), it's 50
    // we are ready to call function with arguments
    os->call(2); // call function with 2 arguments
    // #0 - called function remove all used stack values
    // please see console to view output of this example

    /*
    	Part 2: let's simulate following OS code:

    	bar = {firsname="James", lastname="Bond"}
    	bar.profession = "actor"
    	print bar
    */

    os->newObject();		// #1 - new object

    os->pushStackValue(-1);		// #2 - the same object, -1 - is relative pointer to the top stack value
    os->pushString("firsname");	// #3 - property key
    os->pushString("James");	// #4 - property value
    os->setProperty();			// #1 - setProperty uses 3 stack values and pop them

    // second way of same functionality
    os->pushString("Bond");		// #2 - property value
    os->setProperty(-2, "lastname"); // #1

    os->setGlobal("bar");		// #0 - assign object value to global bar variable, pop value

    // let's do bar.profession = "actor"
    os->getGlobal("bar");		// #1 - our global a variable
    os->pushString("actor");	// #2 - property value
    os->setProperty(-2, "profession"); // #1
    os->pop();					// #0

    // let's do print bar
    os->getGlobal("print");		// #1
    os->pushNull();				// #2
    os->getGlobal("bar");		// #3
    os->call(1);				// #0

    /*
    	Part 3: let's simulate following OS code:

    	print(concat(5, " big differences"))
    */
    os->getGlobal("print");		// #1 - print function
    os->pushNull();				// #2 - this for print
    os->getGlobal("concat");	// #3 - concat function
    os->pushNull();				// #4 - this for concat
    os->pushNumber(5);			// #5
    os->pushString(" big differences"); // #6
    // call concat function with 2 arguments and 1 requested result value
    // the call pops 2 arguments + 1 this + 1 function and pushes 1 result value
    os->call(2, 1);				// #3 - result is already at the top of stack
    // call print function with 1 arguments and 0 requested result values
    os->call(1);				// #0

    // release the ObjectScript instance
    os->release();
    return 0;
}