/* duk_get_prop_lstring(), success cases */ static duk_ret_t test_getproplstring_a(duk_context *ctx, void *udata) { duk_ret_t rc; (void) udata; prep(ctx); rc = duk_get_prop_lstring(ctx, 0, "foox", 3); printf("obj.foo -> rc=%d, result='%s'\n", (int) rc, duk_to_string(ctx, -1)); duk_pop(ctx); rc = duk_get_prop_lstring(ctx, 0, "nonexistent", 11); printf("obj.nonexistent -> rc=%d, result='%s'\n", (int) rc, duk_to_string(ctx, -1)); duk_pop(ctx); rc = duk_get_prop_lstring(ctx, 0, "123", 3); printf("obj['123'] -> rc=%d, result='%s'\n", (int) rc, duk_to_string(ctx, -1)); duk_pop(ctx); rc = duk_get_prop_lstring(ctx, 0, "nul" "\x00" "key", 7); printf("obj['nul<NUL>key'] -> rc=%d, result='%s'\n", (int) rc, duk_to_string(ctx, -1)); duk_pop(ctx); printf("final top: %ld\n", (long) duk_get_top(ctx)); return 0; }
/* duk_get_prop_lstring(), DUK_INVALID_INDEX */ static duk_ret_t test_getproplstring_c(duk_context *ctx, void *udata) { duk_ret_t rc; (void) udata; prep(ctx); rc = duk_get_prop_lstring(ctx, DUK_INVALID_INDEX, "foox", 3); printf("obj.foo -> rc=%d, result='%s'\n", (int) rc, duk_to_string(ctx, -1)); duk_pop(ctx); printf("final top: %ld\n", (long) duk_get_top(ctx)); return 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; }