bool TestExtJson::test_json_decode() { Array arr = CREATE_MAP1("fbid", 101501853510151001LL); VS(f_json_decode(f_json_encode(arr), true), arr); VS(f_json_decode("{\"0\":{\"00\":0}}", true), CREATE_MAP1("0", CREATE_MAP1("00", 0))); VS(f_json_decode("{\"a\":1,\"b\":2.3,\"3\":\"test\"}", true), CREATE_MAP3("a", 1, "b", 2.3, 3, "test")); VS(f_json_decode("[\"a\",1,true,false,null]", true), CREATE_VECTOR5("a", 1, true, false, null)); Object obj = f_json_decode("{\"a\":1,\"b\":2.3,\"3\":\"test\"}"); Object obj2(SystemLib::AllocStdClassObject()); obj2->o_set("a", 1); obj2->o_set("b", 2.3); obj2->o_set("3", "test"); VS(obj.toArray(), obj2.toArray()); obj = f_json_decode("[\"a\",1,true,false,null]"); VS(obj.toArray(), CREATE_VECTOR5("a", 1, true, false, null)); VS(f_json_decode("{z:1}", true), null); VS(f_json_decode("{z:1}", true, k_JSON_FB_LOOSE), CREATE_MAP1("z", 1)); VS(f_json_decode("{z:\"z\"}", true), null); VS(f_json_decode("{z:\"z\"}", true, k_JSON_FB_LOOSE), CREATE_MAP1("z", "z")); VS(f_json_decode("{'x':1}", true), null); VS(f_json_decode("{'x':1}", true, k_JSON_FB_LOOSE), CREATE_MAP1("x", 1)); VS(f_json_decode("{y:1,}", true), null); VS(f_json_decode("{y:1,}", true, k_JSON_FB_LOOSE), CREATE_MAP1("y", 1)); VS(f_json_decode("{,}", true), null); VS(f_json_decode("{,}", true, k_JSON_FB_LOOSE), null); VS(f_json_decode("[1,2,3,]", true), null); VS(f_json_decode("[1,2,3,]", true, k_JSON_FB_LOOSE), CREATE_VECTOR3(1,2,3)); VS(f_json_decode("[,]", true), null); VS(f_json_decode("[,]", true, k_JSON_FB_LOOSE), null); VS(f_json_decode("[]", true), Array::Create()); VS(f_json_decode("[]", true, k_JSON_FB_LOOSE), Array::Create()); VS(f_json_decode("{}", true), Array::Create()); VS(f_json_decode("{}", true, k_JSON_FB_LOOSE), Array::Create()); VS(f_json_decode("test", true), null); VS(f_json_decode("test", true, k_JSON_FB_LOOSE), "test"); VS(f_json_decode("'test'", true), null); VS(f_json_decode("'test'", true, k_JSON_FB_LOOSE), "test"); VS(f_json_decode("\"test\"", true), "test"); VS(f_json_decode("\"test\"", true, k_JSON_FB_LOOSE), "test"); VS(f_json_decode("[{\"a\":\"apple\"},{\"b\":\"banana\"}]", true), CREATE_VECTOR2(CREATE_MAP1("a", "apple"), CREATE_MAP1("b", "banana"))); Variant a = "[{\"a\":[{\"n\":\"1st\"}]},{\"b\":[{\"n\":\"2nd\"}]}]"; VS(f_json_decode(a, true), CREATE_VECTOR2 (CREATE_MAP1("a", CREATE_VECTOR1(CREATE_MAP1("n", "1st"))), CREATE_MAP1("b", CREATE_VECTOR1(CREATE_MAP1("n", "2nd"))))); return Count(true); }
bool TestExtJson::test_json_encode() { VS(f_json_encode(CREATE_MAP3("a", 1, "b", 2.3, 3, "test")), "{\"a\":1,\"b\":2.3,\"3\":\"test\"}"); VS(f_json_encode(CREATE_VECTOR5("a", 1, true, false, uninit_null())), "[\"a\",1,true,false,null]"); VS(f_json_encode("a\xE0"), "null"); VS(f_json_encode("a\xE0", k_JSON_FB_LOOSE), "\"a?\""); VS(f_json_encode(CREATE_MAP2("0", "apple", "1", "banana")), "[\"apple\",\"banana\"]"); VS(f_json_encode(CREATE_VECTOR1(CREATE_MAP1("a", "apple"))), "[{\"a\":\"apple\"}]"); VS(f_json_encode(CREATE_VECTOR1(CREATE_MAP1("a", "apple")), k_JSON_PRETTY_PRINT), "[\n {\n \"a\": \"apple\"\n }\n]"); VS(f_json_encode(CREATE_VECTOR4(1, 2, 3, CREATE_VECTOR3(1, 2, 3)), k_JSON_PRETTY_PRINT), "[\n" " 1,\n" " 2,\n" " 3,\n" " [\n" " 1,\n" " 2,\n" " 3\n" " ]\n" "]"); Array arr = CREATE_MAP3( "a", 1, "b", CREATE_VECTOR2(1, 2), "c", CREATE_MAP1("d", 42) ); VS(f_json_encode(arr, k_JSON_PRETTY_PRINT), "{\n" " \"a\": 1,\n" " \"b\": [\n" " 1,\n" " 2\n" " ],\n" " \"c\": {\n" " \"d\": 42\n" " }\n" "}"); return Count(true); }
bool TestExtVariable::test_var_export() { { Variant v = CREATE_MAP3("a","apple","b",2,"c",CREATE_VECTOR3(1,"y",3)); VS(f_var_export(v, true), "array (\n" " 'a' => 'apple',\n" " 'b' => 2,\n" " 'c' => \n" " array (\n" " 0 => 1,\n" " 1 => 'y',\n" " 2 => 3,\n" " ),\n" ")"); } { String current_locale = f_setlocale(2, k_LC_ALL, "0"); if (f_setlocale(2, k_LC_ALL, CREATE_VECTOR5("de","de_DE","de_DE.ISO8859-1","de_DE.ISO_8859-1","de_DE.UTF-8"))) { Variant v = CREATE_MAP3("a", -1, "b", 10.5, "c", 5.6); VS(f_var_export(v, true), "array (\n" " 'a' => -1,\n" " 'b' => 10.5,\n" " 'c' => 5.6,\n" ")"); f_setlocale(2, k_LC_ALL, current_locale); } else { SKIP("setlocale() failed"); } } { const char cs[] = "'\0\\"; const char cr[] = "'\\'' . \"\\0\" . '\\\\'"; String s(cs, sizeof(cs) - 1, CopyString); String r(cr, sizeof(cr) - 1, CopyString); VS(f_var_export(s, true), cr); } { Variant v = CREATE_MAP3(String("\0", 1, CopyString), "null", "", "empty", "0", "nul"); VS(f_var_export(v, true), "array (\n" " '' . \"\\0\" . '' => 'null',\n" " '' => 'empty',\n" " 0 => 'nul',\n" ")"); } return Count(true); }
bool EventHook::RunInterceptHandler(ActRec* ar) { const Func* func = ar->m_func; if (LIKELY(func->maybeIntercepted() == 0)) return true; Variant *h = get_intercept_handler(func->fullNameRef(), &func->maybeIntercepted()); if (!h) return true; Transl::VMRegAnchor _; PC savePc = g_vmContext->m_pc; Variant doneFlag = true; Variant called_on; if (ar->hasThis()) { called_on = Variant(ar->getThis()); } else if (ar->hasClass()) { // For static methods, give handler the name of called class called_on = Variant(const_cast<StringData*>(ar->getClass()->name())); } Array intArgs = CREATE_VECTOR5(ar->m_func->fullNameRef(), called_on, get_frame_args_with_ref(ar), h->asCArrRef()[1], ref(doneFlag)); Variant ret = vm_call_user_func(h->asCArrRef()[0], intArgs); if (doneFlag.toBoolean()) { Offset pcOff; ActRec* outer = g_vmContext->getPrevVMState(ar, &pcOff); assert(outer); frame_free_locals_inl_no_hook<true>(ar, ar->m_func->numLocals()); Stack& stack = g_vmContext->getStack(); stack.top() = (Cell*)(ar + 1); tvDup(ret.asTypedValue(), stack.allocTV()); g_vmContext->m_fp = outer; g_vmContext->m_pc = outer->m_func->unit()->at(pcOff); return false; } g_vmContext->m_fp = ar; g_vmContext->m_pc = savePc; return true; }
bool EventHook::RunInterceptHandler(ActRec* ar) { const Func* func = ar->m_func; if (LIKELY(func->maybeIntercepted() == 0)) return true; Variant *h = get_intercept_handler(func->fullNameRef(), &func->maybeIntercepted()); if (!h) return true; Transl::VMRegAnchor _; PC savePc = g_vmContext->m_pc; Offset pcOff; ActRec* outer = g_vmContext->getPrevVMState(ar, &pcOff); assert(outer); g_vmContext->m_fp = outer; g_vmContext->m_pc = outer->m_func->unit()->at(pcOff); try { Variant doneFlag = true; Variant obj = ar->hasThis() ? Variant(Object(ar->getThis())) : uninit_null(); Array intArgs = CREATE_VECTOR5(ar->m_func->fullNameRef(), obj, get_frame_args_with_ref(ar), h->asCArrRef()[1], ref(doneFlag)); Variant ret = vm_call_user_func(h->asCArrRef()[0], intArgs); if (doneFlag.toBoolean()) { frame_free_locals_inl_no_hook(ar, ar->m_func->numLocals()); Stack& stack = g_vmContext->getStack(); stack.top() = (Cell*)(ar + 1); tvDup(ret.asTypedValue(), stack.allocTV()); return false; } g_vmContext->m_fp = ar; g_vmContext->m_pc = savePc; } catch (...) { g_vmContext->m_fp = ar; g_vmContext->m_pc = savePc; g_vmContext->m_stack.top() = Stack::frameStackBase(ar); throw; } return true; }
bool TestExtJson::test_json_encode() { VS(f_json_encode(CREATE_MAP3("a", 1, "b", 2.3, 3, "test")), "{\"a\":1,\"b\":2.3,\"3\":\"test\"}"); VS(f_json_encode(CREATE_VECTOR5("a", 1, true, false, null)), "[\"a\",1,true,false,null]"); VS(f_json_encode("a\xE0"), "null"); VS(f_json_encode("a\xE0", k_JSON_FB_LOOSE), "\"a?\""); VS(f_json_encode(CREATE_MAP2("0", "apple", "1", "banana")), "[\"apple\",\"banana\"]"); VS(f_json_encode(CREATE_VECTOR1(CREATE_MAP1("a", "apple"))), "[{\"a\":\"apple\"}]"); return Count(true); }