示例#1
0
static duk_ret_t test_putprop_shorthand_a(duk_context *ctx) {
	duk_eval_string(ctx, "({ foo: 123 })");

	duk_push_uint(ctx, 123);
	duk_put_prop_string(ctx, -2, "bar" "\x00" "quux");

	duk_push_uint(ctx, 234);
	duk_put_prop_index(ctx, -2, 2001);

	duk_push_uint(ctx, 345);
	duk_put_prop_lstring(ctx, -2, "nul" "\x00" "keyx", 7);

	duk_json_encode(ctx, -1);
	printf("%s\n", duk_to_string(ctx, -1));

	printf("final top: %ld\n", (long) duk_get_top(ctx));
	return 0;
}
示例#2
0
int main(int argc, const char *argv[]) {
	duk_context *ctx;
	int i;
	int mode;
	void *hptr1;
	void *hptr2;
	void *hptr3;
	void *hptr4;
	void *hptr5;
	void *hptr6;
	void *hptr7;
	void *hptr8;
	void *hptr9;
	void *hptr10;

	if (argc < 2) {
		return 1;
	}
	mode = atoi(argv[1]);

	ctx = duk_create_heap_default();

	duk_push_object(ctx);

	/* Push the strings we're dealing with, get their heapptrs, and keep
	 * them reachable throughout the test.  This is necessary for the
	 * heapptr test to work.  But we also want this so that the strings
	 * won't be freed and reallocated repeatedly during the test.  That
	 * might happen in real application code too, but this test focuses
	 * on the differences between the intern checks only, assuming the
	 * string itself is already in the string table.
	 */
	duk_push_string(ctx, "foo1");
	hptr1 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo2");
	hptr2 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo3");
	hptr3 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo4");
	hptr4 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo5");
	hptr5 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo6");
	hptr6 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo7");
	hptr7 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo8");
	hptr8 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo9");
	hptr9 = duk_get_heapptr(ctx, -1);
	duk_push_string(ctx, "foo10");
	hptr10 = duk_get_heapptr(ctx, -1);

	for (i = 0; i < 10000000; i++) {
		switch (mode) {
		case 0:
			duk_push_string(ctx, "foo1");
			duk_push_string(ctx, "foo2");
			duk_push_string(ctx, "foo3");
			duk_push_string(ctx, "foo4");
			duk_push_string(ctx, "foo5");
			duk_push_string(ctx, "foo6");
			duk_push_string(ctx, "foo7");
			duk_push_string(ctx, "foo8");
			duk_push_string(ctx, "foo9");
			duk_push_string(ctx, "foo10");
			break;
		case 1:
			duk_push_lstring(ctx, "foo1", 4);
			duk_push_lstring(ctx, "foo2", 4);
			duk_push_lstring(ctx, "foo3", 4);
			duk_push_lstring(ctx, "foo4", 4);
			duk_push_lstring(ctx, "foo5", 4);
			duk_push_lstring(ctx, "foo6", 4);
			duk_push_lstring(ctx, "foo7", 4);
			duk_push_lstring(ctx, "foo8", 4);
			duk_push_lstring(ctx, "foo9", 4);
			duk_push_lstring(ctx, "foo10", 5);
			break;
		case 2:
			duk_push_literal(ctx, "foo1");
			duk_push_literal(ctx, "foo2");
			duk_push_literal(ctx, "foo3");
			duk_push_literal(ctx, "foo4");
			duk_push_literal(ctx, "foo5");
			duk_push_literal(ctx, "foo6");
			duk_push_literal(ctx, "foo7");
			duk_push_literal(ctx, "foo8");
			duk_push_literal(ctx, "foo9");
			duk_push_literal(ctx, "foo10");
			break;
		case 3:
			duk_push_heapptr(ctx, hptr1);
			duk_push_heapptr(ctx, hptr2);
			duk_push_heapptr(ctx, hptr3);
			duk_push_heapptr(ctx, hptr4);
			duk_push_heapptr(ctx, hptr5);
			duk_push_heapptr(ctx, hptr6);
			duk_push_heapptr(ctx, hptr7);
			duk_push_heapptr(ctx, hptr8);
			duk_push_heapptr(ctx, hptr9);
			duk_push_heapptr(ctx, hptr10);
			break;
		case 10:
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo1");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo2");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo3");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo4");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo5");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo6");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo7");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo8");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo9");
			duk_push_uint(ctx, 123);
			duk_put_prop_string(ctx, 0, "foo10");
			duk_push_uint(ctx, 123);
			duk_get_prop_string(ctx, 0, "foo1");
			duk_get_prop_string(ctx, 0, "foo2");
			duk_get_prop_string(ctx, 0, "foo3");
			duk_get_prop_string(ctx, 0, "foo4");
			duk_get_prop_string(ctx, 0, "foo5");
			duk_get_prop_string(ctx, 0, "foo6");
			duk_get_prop_string(ctx, 0, "foo7");
			duk_get_prop_string(ctx, 0, "foo8");
			duk_get_prop_string(ctx, 0, "foo9");
			duk_get_prop_string(ctx, 0, "foo10");
			break;
		case 11:
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo1", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo2", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo3", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo4", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo5", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo6", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo7", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo8", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo9", 4);
			duk_push_uint(ctx, 123);
			duk_put_prop_lstring(ctx, 0, "foo10", 5);
			duk_push_uint(ctx, 123);
			duk_get_prop_lstring(ctx, 0, "foo1", 4);
			duk_get_prop_lstring(ctx, 0, "foo2", 4);
			duk_get_prop_lstring(ctx, 0, "foo3", 4);
			duk_get_prop_lstring(ctx, 0, "foo4", 4);
			duk_get_prop_lstring(ctx, 0, "foo5", 4);
			duk_get_prop_lstring(ctx, 0, "foo6", 4);
			duk_get_prop_lstring(ctx, 0, "foo7", 4);
			duk_get_prop_lstring(ctx, 0, "foo8", 4);
			duk_get_prop_lstring(ctx, 0, "foo9", 4);
			duk_get_prop_lstring(ctx, 0, "foo10", 5);
			break;
		case 12:
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo1");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo2");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo3");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo4");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo5");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo6");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo7");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo8");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo9");
			duk_push_uint(ctx, 123);
			duk_put_prop_literal(ctx, 0, "foo10");
			duk_push_uint(ctx, 123);
			duk_get_prop_literal(ctx, 0, "foo1");
			duk_get_prop_literal(ctx, 0, "foo2");
			duk_get_prop_literal(ctx, 0, "foo3");
			duk_get_prop_literal(ctx, 0, "foo4");
			duk_get_prop_literal(ctx, 0, "foo5");
			duk_get_prop_literal(ctx, 0, "foo6");
			duk_get_prop_literal(ctx, 0, "foo7");
			duk_get_prop_literal(ctx, 0, "foo8");
			duk_get_prop_literal(ctx, 0, "foo9");
			duk_get_prop_literal(ctx, 0, "foo10");
			break;
		case 13:
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr1);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr2);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr3);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr4);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr5);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr6);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr7);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr8);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr9);
			duk_push_uint(ctx, 123);
			duk_put_prop_heapptr(ctx, 0, hptr10);
			duk_push_uint(ctx, 123);
			duk_get_prop_heapptr(ctx, 0, hptr1);
			duk_get_prop_heapptr(ctx, 0, hptr2);
			duk_get_prop_heapptr(ctx, 0, hptr3);
			duk_get_prop_heapptr(ctx, 0, hptr4);
			duk_get_prop_heapptr(ctx, 0, hptr5);
			duk_get_prop_heapptr(ctx, 0, hptr6);
			duk_get_prop_heapptr(ctx, 0, hptr7);
			duk_get_prop_heapptr(ctx, 0, hptr8);
			duk_get_prop_heapptr(ctx, 0, hptr9);
			duk_get_prop_heapptr(ctx, 0, hptr10);
			break;
		case 20:
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo1");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo2");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo3");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo4");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo5");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo6");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo7");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo8");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo9");
			duk_push_uint(ctx, 123);
			duk_put_global_string(ctx, "foo10");
			duk_push_uint(ctx, 123);
			duk_get_global_string(ctx, "foo1");
			duk_get_global_string(ctx, "foo2");
			duk_get_global_string(ctx, "foo3");
			duk_get_global_string(ctx, "foo4");
			duk_get_global_string(ctx, "foo5");
			duk_get_global_string(ctx, "foo6");
			duk_get_global_string(ctx, "foo7");
			duk_get_global_string(ctx, "foo8");
			duk_get_global_string(ctx, "foo9");
			duk_get_global_string(ctx, "foo10");
			break;
		case 21:
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo1", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo2", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo3", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo4", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo5", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo6", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo7", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo8", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo9", 4);
			duk_push_uint(ctx, 123);
			duk_put_global_lstring(ctx, "foo10", 5);
			duk_push_uint(ctx, 123);
			duk_get_global_lstring(ctx, "foo1", 4);
			duk_get_global_lstring(ctx, "foo2", 4);
			duk_get_global_lstring(ctx, "foo3", 4);
			duk_get_global_lstring(ctx, "foo4", 4);
			duk_get_global_lstring(ctx, "foo5", 4);
			duk_get_global_lstring(ctx, "foo6", 4);
			duk_get_global_lstring(ctx, "foo7", 4);
			duk_get_global_lstring(ctx, "foo8", 4);
			duk_get_global_lstring(ctx, "foo9", 4);
			duk_get_global_lstring(ctx, "foo10", 5);
			break;
		case 22:
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo1");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo2");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo3");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo4");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo5");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo6");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo7");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo8");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo9");
			duk_push_uint(ctx, 123);
			duk_put_global_literal(ctx, "foo10");
			duk_push_uint(ctx, 123);
			duk_get_global_literal(ctx, "foo1");
			duk_get_global_literal(ctx, "foo2");
			duk_get_global_literal(ctx, "foo3");
			duk_get_global_literal(ctx, "foo4");
			duk_get_global_literal(ctx, "foo5");
			duk_get_global_literal(ctx, "foo6");
			duk_get_global_literal(ctx, "foo7");
			duk_get_global_literal(ctx, "foo8");
			duk_get_global_literal(ctx, "foo9");
			duk_get_global_literal(ctx, "foo10");
			break;
		case 23:
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr1);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr2);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr3);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr4);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr5);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr6);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr7);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr8);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr9);
			duk_push_uint(ctx, 123);
			duk_put_global_heapptr(ctx, hptr10);
			duk_push_uint(ctx, 123);
			duk_get_global_heapptr(ctx, hptr1);
			duk_get_global_heapptr(ctx, hptr2);
			duk_get_global_heapptr(ctx, hptr3);
			duk_get_global_heapptr(ctx, hptr4);
			duk_get_global_heapptr(ctx, hptr5);
			duk_get_global_heapptr(ctx, hptr6);
			duk_get_global_heapptr(ctx, hptr7);
			duk_get_global_heapptr(ctx, hptr8);
			duk_get_global_heapptr(ctx, hptr9);
			duk_get_global_heapptr(ctx, hptr10);
			break;
		default:
			return 1;
		}

		/* Keep strings and test object. */
		duk_set_top(ctx, 11);
	}

	duk_destroy_heap(ctx);
	return 0;
}